Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Nextcloud Talk

Intégration de Nextcloud Talk via le protocole de webhook Talk Bot. Auto-hébergé, fédéré et compatible E2E : une autre option de communication souveraine aux côtés de Matrix et Mattermost.

Qui peut parler à l’agent

Les expéditeurs entrants sont filtrés par rapport au peer set résolu pour l’agent lié, issu de la configuration peer_groups à laquelle l’agent appartient. La correspondance supprime le @ initial et est insensible à la casse par rapport à l’identifiant d’expéditeur natif du canal. Un ensemble vide refuse tout le monde ; un ensemble contenant "*" accepte n’importe qui ; sinon, seuls les pairs externes listés (et les agents pairs) sont acceptés. Ceci est distinct de l’appairage de la passerelle (gateway.require_pairing), qui authentifie les clients HTTP/WebSocket, et non les expéditeurs des canaux de discussion.

Un groupe de pairs pour nextcloud définit channel à nextcloud, liste les expéditeurs autorisés dans external_peers (pour nextcloud, l’ID d’acteur Nextcloud ; ["*"] accepte tout le monde), nomme éventuellement des agents pairs pour la distribution inter-agents, une liste de blocage ignore, et un output_modality (mirror, voice ou text). Consultez Peer Groups pour la référence des champs.

Où définir ce paramètre :

Tableau de bord de la passerelle

Ouvrez /config/peer_groups dans le tableau de bord web.

zerocode

Dans le volet Config, sous Peer groups.

Ce que fait cette intégration

  • Reçoit les événements Talk entrants via POST /nextcloud-talk/<alias> sur la passerelle (/nextcloud-talk seul fonctionne toujours comme solution de repli dépréciée)
  • Requiert et vérifie les signatures de webhook (HMAC-SHA256) avec le secret du bot installé
  • Envoie des réponses dans les salons Talk via l’API signée Nextcloud Talk Bot

Prérequis

  • Serveur Nextcloud 27.1 ou version ultérieure avec Talk 17.1 ou version ultérieure. Il s’agit d’un minimum strict, pas d’une recommandation : l’API signée Talk Bot que cette intégration utilise pour envoyer des réponses a été introduite dans Talk 17.1, et occ talk:bot:install ci-dessous n’est pas disponible dans les versions antérieures.

  • Bot installé avec les fonctionnalités webhook et response, qui permettent à Nextcloud de transmettre les messages de la salle à ZeroClaw et à ZeroClaw d’envoyer des réponses :

    sudo -u www-data php occ talk:bot:install \
      -f webhook -f response \
      zeroclaw-bot '<shared-secret>' \
      'https://<your-public-url>/nextcloud-talk/<alias>'
    
  • Secret du bot de cette installation. Nextcloud émet un secret partagé par bot, utilisé à la fois pour vérifier les signatures des webhooks entrants et pour signer les réponses sortantes de l’API du bot. Définissez-le avec webhook_secret, qui est le nom canonique. bot_token est un alias obsolète pour la même valeur : si les deux sont définis, ils doivent être identiques. Il ne peut pas contenir un secret sortant différent. Les valeurs non vides en conflit ne sont pas résolues silencieusement en faveur de l’une d’elles ; le conflit est consigné et l’alias ne se résout vers aucun secret, si bien que le canal se comporte alors exactement comme s’il n’était pas configuré : 401 en entrée, aucun envoi sortant.

  • Passerelle accessible publiquement : voir Configuration → Conteneur pour les options de tunnel en cas d’auto-hébergement

Les deux sens échouent en mode fermé en cas de secret manquant, et il n’existe aucun mode non authentifié :

  • Entrant : la vérification de signature est obligatoire. Sans secret résolu, le point de terminaison webhook renvoie 401 et n’atteint jamais l’agent. Il n’existe pas de mode « public » acceptant les webhooks non vérifiés.
  • Sortant : aucune requête n’est envoyée, de sorte qu’une mauvaise configuration ne transmet jamais sur le réseau une requête non signée ou incorrectement signée.

La mise à niveau est une modification non rétrocompatible. Un déploiement qui fonctionnait auparavant sans secret acceptait les webhooks ; il les rejette désormais tous avec 401. Installez le bot avec occ talk:bot:install, puis définissez ce secret comme valeur de webhook_secret avant la mise à niveau, sinon les messages entrants cesseront d’être traités.

Configuration

app_token 🔑 secret · default null

Obsolète, inutilisé. Les envois Nextcloud Talk ne s’authentifient pas via l’authentification bearer OCS (voir webhook_secret) ; ce champ n’est accepté que pour que les configurations existantes qui le définissent ne provoquent pas d’échec d’analyse. Vous pouvez le supprimer de votre configuration sans risque.

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.app_token.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.app_token.

zeroclaw config

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

URL de base de Nextcloud (par ex. "https://cloud.example.com").

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.base_url.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.base_url.

zeroclaw config

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

Nom d’affichage du bot dans Nextcloud Talk (p. ex. “zeroclaw”). Utilisé pour filtrer les propres messages du bot et éviter les boucles de rétroaction. Si non défini, la valeur par défaut est une chaîne vide (pas de filtrage des messages du bot par nom).

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.bot_name.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.bot_name.

zeroclaw config

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

Alias OBSOLÈTE de webhook_secret, conservé pour la migration. Nextcloud émet UN SEUL secret par bot installé et l’utilise dans les deux sens ; il ne peut donc pas contenir un secret sortant différent. Lorsque les deux sont définis avec des valeurs différentes et non vides, le canal journalise le conflit et échoue de manière sécurisée en les considérant comme non configurés : 401 entrant et aucun envoi sortant. Préférez webhook_secret ; cet alias sera supprimé. Pour mettre à niveau une configuration bot_token-seule : copiez le secret du bot installé dans webhook_secret, vérifiez que les réponses sont toujours envoyées, puis supprimez bot_token.

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.bot_token.

zerocode

Dans le panneau Config, définissez le champ channels.nextcloud_talk.<alias>.bot_token.

zeroclaw config

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

Conservé pour la compatibilité de la configuration. Actuellement sans effet tant que les mises à jour des brouillons sont désactivées pour ce canal. Par défaut : 1000 ms.

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.draft_update_interval_ms.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.draft_update_interval_ms.

zeroclaw config

zeroclaw config set channels.nextcloud_talk.<alias>.draft_update_interval_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__nextcloud_talk__<alias>__draft_update_interval_ms=
excluded_tools string[] · default []

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/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.excluded_tools.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.excluded_tools.

zeroclaw config

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

URL de proxy par canal (http, https, socks5, socks5h). Remplace le paramètre global [proxy] pour ce canal uniquement.

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.proxy_url.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.proxy_url.

zeroclaw config

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

Conservé pour la compatibilité de configuration. L’API bot de Nextcloud Talk ne fournit pas d’identifiants de message ni d’opérations de modification/suppression, les mises à jour de brouillons sont donc désactivées et les réponses sont actuellement envoyées sous forme d’un message final unique pour chaque valeur.

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.stream_mode.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.stream_mode.

zeroclaw config

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

Le secret de bot que Nextcloud a installé pour ce bot. Champ canonique. Utilisé dans les DEUX directions : pour vérifier les signatures des webhooks entrants et pour signer les requêtes bot-API sortantes. Lorsqu’il n’est pas défini, les webhooks entrants sont rejetés et aucune requête sortante n’est envoyée (fail closed). Peut aussi être défini via ZEROCLAW_NEXTCLOUD_TALK_WEBHOOK_SECRET.

Posez-le sur n’importe quelle surface :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk et définissez le champ channels.nextcloud_talk.<alias>.webhook_secret.

zerocode

Dans le volet Config, définissez le champ channels.nextcloud_talk.<alias>.webhook_secret.

zeroclaw config

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

Le canal est lu depuis l’alias default. Définissez-le via n’importe quelle surface de configuration :

Tableau de bord de la passerelle

Ouvrez /config/channels/nextcloud_talk dans le tableau de bord web.

zerocode

Dans le volet Config, sous Channels.

webhook_secret peut également être fourni à l’exécution via la surcharge d’environnement générique ZEROCLAW_channels__nextcloud_talk__default__webhook_secret, utile pour le renouveler sans modifier la configuration.

app_token est déprécié et inutilisé (les réponses ne passent plus par l’authentification OCS bearer) ; il est uniquement encore accepté pour que les anciennes configurations qui le définissent ne provoquent pas d’erreur d’analyse.

Point de terminaison de passerelle

sh

zeroclaw daemon

Configurez l’URL du webhook de votre bot Talk pour qu’elle pointe vers l’alias de l’instance [channels.nextcloud_talk.<alias>] qui doit le recevoir :

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

Par exemple, [channels.nextcloud_talk.work] reçoit POST /nextcloud-talk/work. Ce routage par alias (#6312) vous permet d’exécuter plusieurs bots Talk côte à côte et de transmettre les webhooks de chacun à la bonne instance.

Le chemin simple https://<your-public-url>/nextcloud-talk fonctionne toujours mais est déprécié : il pointe vers le premier alias dans l’ordre lexicographique (déterministe entre les redémarrages) et renvoie un en-tête de réponse X-Zeroclaw-Deprecation. Les déploiements à instance unique peuvent continuer à l’utiliser sans modification. Un alias inconnu renvoie 404.

Développement local ? Configurez [tunnel] dans votre configuration (ngrok, Cloudflare ou Tailscale) et la passerelle s’expose automatiquement au démarrage : voir Operations → Network deployment.

Vérification de la signature

Les requêtes entrantes doivent comporter :

  • En-tête X-Nextcloud-Talk-Random
  • En-tête X-Nextcloud-Talk-Signature

ZeroClaw vérifie :

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

Sans secret résolu, ZeroClaw renvoie 401 avant d’analyser ou de distribuer le webhook. Il n’existe aucun mode qui accepte une requête non vérifiée.

Routage des messages

  • Les événements provenant de bots (actorType = "bots") sont ignorés : évite les boucles de rétroaction
  • Les événements système (entrées, sorties, modifications d’appartenance) sont ignorés
  • Les événements non liés à un message sont ignorés
  • Les messages utilisateur sont envoyés à la boucle de l’agent.
  • Les réponses sont renvoyées à la salle d’origine via le token présent dans la charge utile du webhook.

Validation rapide

  1. Définissez external_peers = ["*"] dans le groupe de pairs pour les premiers tests
  2. Envoyer un message de test dans la salle Talk configurée
  3. Confirmez que ZeroClaw reçoit et répond dans la même salle.
  4. Restreindre le groupe de pairs à des identifiants d’acteurs explicites (par ex. ["alice", "bob"])

Dépannage

  • 404 Nextcloud Talk not configured : section [channels.nextcloud_talk.default] manquante ou enabled = false
  • 401 Invalid signature : secret non concordant, en-tête aléatoire incorrect, ou bug de signature du corps. Vérifiez que c’est bien le corps brut qui est signé (et non le JSON analysé)
  • Aucune réponse, webhook 200 : l’événement a été filtré. Vérifiez les journaux pour “actorType = bots” ou un expéditeur absent de l’ensemble de pairs
  • Réponses livrées mais semblant incorrectes : vérifiez le contexte du fil de discussion ; les réponses Talk sont actuellement limitées au niveau racine

Diffusion en continu

Nextcloud Talk ne prend pas en charge les modifications de messages via l’API Bot, donc les mises à jour de brouillons en continu sont désactivées pour ce canal. Les réponses sont envoyées uniquement à la fin du flux.

Notes d’auto-hébergement

  • TLS : terminaison au niveau de votre proxy inverse ; la vérification de la signature du webhook fonctionne sur la boucle de bouclage HTTP-vers-conteneur
  • Les réponses sortantes s’authentifient via la signature HMAC de la Bot API (webhook_secret/bot_token), et non via un jeton porteur ; il n’existe pas d’informations d’authentification OCS distinctes à gérer
  • Les limites de taux dépendent du serveur Nextcloud ; le bot par défaut ne les atteint pas dans des cadences de conversation normales.
  • Proxy par canal : définissez proxy_url pour remplacer le paramètre global [proxy] uniquement pour Nextcloud Talk (http://, https://, socks5://, socks5h://)

Voir aussi