Developer and self-hosted
ClickClack
ClickClack connecte OpenClaw à un espace de travail ClickClack auto-hébergé au moyen de jetons de bot ClickClack de première classe.
Utilisez cette intégration lorsque vous souhaitez qu’un agent OpenClaw apparaisse comme un utilisateur bot ClickClack. ClickClack prend en charge les bots de service indépendants et les bots appartenant à des utilisateurs ; ces derniers conservent un owner_user_id et reçoivent uniquement les portées de jeton que vous leur accordez.
Configuration rapide
Dans ClickClack, ouvrez Workspace settings → Integrations → OpenClaw, créez un bot et copiez son jeton. Configurez ensuite le canal :
openclaw channels add clickclack --base-url https://clickclack.example.com --token ccb_... --workspace defaultworkspace accepte un identifiant d’espace de travail (wsp_...), un slug ou un nom d’affichage.
channels add vérifie le serveur, le jeton et l’espace de travail après l’enregistrement, puis
indique si le Gateway en cours d’exécution a pris en compte le nouveau compte. Si OpenClaw est
déjà en cours d’exécution, ClickClack se connecte automatiquement et aucune deuxième commande
n’est nécessaire. Sinon, démarrez-le avec :
openclaw gatewayPour une configuration guidée, exécutez :
openclaw onboardSélectionnez ClickClack, puis saisissez l’URL du serveur, le jeton du bot et l’espace de travail lorsque vous y êtes invité. La configuration guidée vérifie le serveur, le jeton et l’espace de travail après l’enregistrement ; un échec de vérification ne supprime pas la configuration.
Alternative : jeton basé sur une variable d’environnement
Le compte par défaut peut lire CLICKCLACK_BOT_TOKEN au lieu de stocker un jeton
dans la configuration :
export CLICKCLACK_BOT_TOKEN="ccb_..."openclaw channels add clickclack --base-url https://clickclack.example.com --workspace default --use-envopenclaw gatewayLes comptes nommés doivent utiliser un jeton configuré ou un fichier de jeton ; la variable d’environnement partagée est volontairement limitée au compte par défaut.
Référence JSON5
La structure de configuration équivalente est :
{ channels: { clickclack: { enabled: true, baseUrl: "https://clickclack.example.com", token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", defaultTo: "channel:general", }, },}Un compte n’est considéré comme configuré que lorsque baseUrl, une source de jeton et
workspace sont tous définis. Une source de jeton peut être token, tokenFile ou
CLICKCLACK_BOT_TOKEN pour le compte par défaut. workspace accepte un identifiant d’espace de travail
(wsp_...), un slug ou un nom ; le Gateway le résout en identifiant au démarrage.
Clés de configuration du compte
| Clé | Valeur par défaut | Remarques |
|---|---|---|
baseUrl |
aucune (obligatoire) | URL du serveur ClickClack. |
token |
aucune | Jeton du bot sous forme de chaîne simple ou de référence de secret (source: "env" | "file" | "exec"). |
tokenFile |
aucune | Chemin vers un fichier de jeton de bot ; prioritaire sur token. |
workspace |
aucune (obligatoire) | Identifiant, slug ou nom de l’espace de travail. |
replyMode |
"agent" |
"agent" exécute le pipeline complet de l’agent ; "model" envoie de courtes complétions directes du modèle. |
defaultTo |
"channel:general" |
Cible utilisée lorsqu’un chemin sortant ne fournit aucune cible. |
allowFrom |
["*"] |
Liste d’identifiants utilisateur autorisés pour les messages privés et les messages de canal entrants. |
botUserId |
détecté automatiquement | Résolu à partir de l’identité du jeton du bot au démarrage. |
agentId |
valeur par défaut de la route | Épingle les messages entrants de ce compte à un seul agent. |
toolsAllow |
aucune | Liste d’outils autorisés pour les réponses de l’agent provenant de ce compte. |
model, systemPrompt |
aucune | Utilisés par les complétions replyMode: "model". |
commandMenu |
true |
Publie les commandes natives dans la saisie semi-automatique de l’éditeur ClickClack. |
reconnectMs |
1500 |
Délai de reconnexion en temps réel (100 à 60000). |
Si plugins.allow est une liste restrictive non vide, sélectionner explicitement
ClickClack dans la configuration du canal ou exécuter openclaw plugins enable clickclack
ajoute clickclack à cette liste. L’installation lors de l’intégration utilise le même
comportement de sélection explicite. Ces chemins ne remplacent pas plugins.deny ni un
paramètre global plugins.enabled: false. L’exécution directe de
openclaw plugins install @openclaw/clickclack suit la politique normale
d’installation des plugins et enregistre également ClickClack dans une liste d’autorisation existante.
Plusieurs bots
Chaque compte ouvre sa propre connexion ClickClack en temps réel et utilise son propre jeton de bot.
{ channels: { clickclack: { enabled: true, baseUrl: "https://clickclack.example.com", defaultAccount: "service", accounts: { service: { token: { source: "env", provider: "default", id: "CLICKCLACK_SERVICE_BOT_TOKEN" }, workspace: "default", defaultTo: "channel:general", agentId: "service-bot", }, support: { token: { source: "env", provider: "default", id: "CLICKCLACK_SUPPORT_BOT_TOKEN" }, workspace: "default", defaultTo: "dm:usr_...", agentId: "support-bot", }, }, }, },}Modes de réponse
replyMode: "agent"(par défaut) transmet les messages entrants au pipeline normal de l’agent, notamment l’enregistrement de la session et la politique des outils.replyMode: "model"contourne le pipeline de l’agent et utilise lellm.completede l’environnement d’exécution du plugin pour les réponses directes du bot, éventuellement structurées parmodeletsystemPrompt. Le fournisseur et le modèle sélectionnés déterminent le budget de complétion.
Le mode modèle exécute les complétions avec l’identifiant résolu de l’agent du bot, ce qui nécessite
le bit de confiance explicite plugins.entries.clickclack.llm.allowAgentIdOverride: true :
{ plugins: { entries: { clickclack: { llm: { allowAgentIdOverride: true, }, }, }, },}Laissez le bit de confiance désactivé si vous utilisez uniquement le mode de réponse agent par défaut ; il
n’y est pas nécessaire.
Menu des commandes
Au démarrage du Gateway, chaque compte configuré publie les commandes natives d’OpenClaw dans ClickClack. Elles apparaissent dans la saisie semi-automatique de l’éditeur avec le pseudo du bot comme libellé. L’ensemble publié est entièrement remplacé à chaque démarrage, y compris par la suppression d’un menu obsolète lorsque le catalogue des commandes natives est vide.
La synchronisation du menu des commandes est activée par défaut. Définissez commandMenu: false sur un compte
pour la désactiver :
{ channels: { clickclack: { enabled: true, token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", commandMenu: false, }, },}Le jeton nécessite commands:write. Les offres ClickClack bot:write et
bot:admin actuelles incluent cette portée, qui peut également être accordée
individuellement. Les jetons créés avant l’introduction des menus de commandes peuvent nécessiter
l’ajout de cette portée ou un jeton de remplacement.
La synchronisation s’effectue au mieux et s’exécute une fois par démarrage du Gateway. Une portée manquante ou une défaillance réseau consigne un avertissement ; un ancien serveur ClickClack dépourvu du point de terminaison consigne le problème au niveau débogage. Aucun de ces échecs ne bloque le démarrage en temps réel. Les menus restent disponibles lorsque l’agent est hors ligne et sont supprimés lorsque le bot quitte l’espace de travail.
Cette version publie uniquement les spécifications des commandes natives. Les alias et les catalogues de commandes de Skills, de plugins ou personnalisées ne sont pas ajoutés au menu. Si un nom est également enregistré comme commande HTTP avec barre oblique, ClickClack traite d’abord cet enregistrement ; les autres commandes du menu continuent d’être transmises par la voie normale des messages.
Utilisez le mode agent pour les éléments de preuve de corrélation entre services. À partir d’un
identifiant de message ClickClack faisant autorité dans sa forme canonique msg_<ulid>, le canal dérive
l’identifiant d’exécution OpenClaw déterministe clickclack:<message-id>. Chaque appel de modèle est
alors visible dans les diagnostics sous la forme clickclack:<message-id>:model:<n> ; lorsque ce
tour utilise ClawRouter, le même identifiant d’appel de modèle est envoyé comme X-Request-ID.
Le mode model contourne les diagnostics normaux d’exécution et de session de l’agent et ne convient donc
pas à ce parcours de preuve.
Lorsqu’un événement en temps réel contient un payload.correlation_id validé, le
canal le transmet comme X-Correlation-ID lors de la récupération du message faisant autorité et
des requêtes de réponse ClickClack qui en résultent. Les valeurs utilisent le jeu sécurisé de
128 caractères de ClickClack (A-Z, a-z, 0-9, ., _, : et -) ; les valeurs non valides
sont omises. Ces jointures ne contiennent que des identifiants, jamais le corps des messages,
les prompts, les complétions, les identifiants d’authentification ni la sortie des outils.
Livraison durable des médias
Les réponses de l’agent contenant des médias utilisent obligatoirement une livraison durable. OpenClaw attribue des nonces stables par partie pour les messages et les téléversements avant la première écriture ClickClack, afin qu’une nouvelle tentative réutilise le même téléversement et le même message au lieu de consommer le quota de stockage ou de publier des doublons. Si un téléversement existe déjà après un redémarrage, OpenClaw ne relit ni le chemin local d’origine ni l’URL distante du média.
Ce contrat de récupération nécessite un serveur ClickClack prenant en charge :
GET /api/uploads/by-nonceavecX-ClickClack-Upload-Nonce: supportedpour les résultats trouvés et manquants.GET /api/messages/by-nonceavecX-ClickClack-Message-Nonce: supportedpour les résultats trouvés et manquants.- La création idempotente des messages et l’association des pièces jointes pour le même nonce limité au propriétaire et le même téléversement.
Une erreur 404 générique d’un ancien serveur n’est pas considérée comme la preuve qu’un envoi est absent. OpenClaw laisse la livraison non résolue plutôt que de risquer un doublon ; mettez à jour ClickClack avant d’activer les réponses d’agent produisant des médias.
Lignes d’activité de l’agent
Par défaut, un canal ClickClack n’affiche rien pendant l’exécution d’un tour de l’agent ; seule la réponse finale apparaît. Définissez agentActivity: true sur un compte pour publier des lignes de message durables agent_commentary et agent_tool pendant le déroulement du tour :
{ channels: { clickclack: { enabled: true, token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", agentActivity: true, }, },}Exigences et comportement :
- Désactivé par défaut. Les configurations standard et les anciens serveurs ClickClack ne sont pas affectés.
- Nécessite la portée de jeton
agent_activity:write. Cette portée est distincte debot:writeet n’en est pas héritée ; créez le jeton du bot avec--scopes bot:write,agent_activity:write(ou accordez cette portée à un jeton existant) avant d’activer l’option. - Dégradation au mieux. Si le jeton ne dispose pas de
agent_activity:writeou si le serveur rejette les écritures d’activité, les échecs sont consignés et la réponse finale est tout de même livrée normalement ; aucune ligne d’activité n’apparaît. - Les lignes sont regroupées par tour (
turn_id), fusionnées afin qu’une étape logique corresponde à une ligne, et les lignes d’outil utilisent la même mise en forme de progression que Discord/Slack/Telegram (nom de l’outil suivi des détails de la commande). - Métadonnées d’attribution. Les publications rédigées par l’agent (lignes d’activité et réponse finale) comportent les champs
author_modeletauthor_thinking, résolus à partir du modèle réellement utilisé pour le tour (y compris après un repli). Les serveurs qui ne définissent pas ces colonnes ignorent les champs JSON inconnus ; ceux qui les conservent peuvent déterminer « quel modèle a produit cette ligne, et à quel niveau de réflexion » pour chaque message.
Cibles
channel:<name-or-id>envoie vers un canal de l’espace de travail. Les cibles sans préfixe utilisentchannel:par défaut.dm:<user_id>crée ou réutilise une conversation directe avec cet utilisateur.thread:<message_id>répond dans le fil de discussion dont ce message est la racine.
Les cibles sortantes explicites peuvent également comporter le préfixe de fournisseur clickclack: ou cc:.
Pour les médias sortants, l’API de téléversement de ClickClack est utilisée, puis le téléversement durable est joint au message de canal, à la réponse dans le fil de discussion ou au message privé créé. Les fichiers locaux et les URL de médias distants pris en charge suivent la politique habituelle d’accès aux médias d’OpenClaw, avec une limite de 64 MiB par fichier. Les envois durables mis en file d’attente utilisent des nonces distincts propres au propriétaire pour chaque téléversement et chaque partie de message, puis réessaient d’associer la pièce jointe à ces mêmes objets. Consultez Distribution durable des médias pour connaître le contrat du serveur et le comportement de récupération.
Exemples :
openclaw message send --channel clickclack --target channel:general --message "bonjour"openclaw message send --channel clickclack --target dm:usr_123 --message "bonjour"openclaw message send --channel clickclack --target thread:msg_123 --message "je reviens vers vous"Autorisations
Les portées des jetons ClickClack sont appliquées par l’API ClickClack.
bot:read: lecture des données de l’espace de travail, des canaux, des messages, des fils de discussion, des messages privés, du temps réel et des profils.bot:write:bot:read, ainsi que les messages de canal, les réponses dans les fils de discussion, les messages privés, les téléversements et la publication du menu de commandes.bot:admin:bot:write, ainsi que la création de canaux.commands:write: publication du menu de commandes du bot. Inclus dans les ensemblesbot:writeetbot:adminactuels et pouvant être accordé individuellement.agent_activity:write: lignes durables d’activité de l’agent (agent_commentary/agent_tool). Non hérité parbot:writenibot:admin; requis uniquement lorsqueagentActivity: trueest défini.
OpenClaw a uniquement besoin de la portée bot:write actuelle pour les conversations normales avec l’agent et la synchronisation du menu de commandes. Ajoutez agent_activity:write lors de l’activation des lignes d’activité de l’agent.
Dépannage
ClickClack is not configured for account "<id>": définissezbaseUrl,token(par exemple viaCLICKCLACK_BOT_TOKEN) etworkspacepour ce compte.ClickClack workspace not found: <value>: définissezworkspacesur l’identifiant, le slug ou le nom de l’espace de travail renvoyé par ClickClack.- Aucune réponse entrante : vérifiez que le jeton dispose d’un accès en lecture en temps réel et notez que le bot ignore ses propres messages ainsi que ceux des autres bots.
- Échec des envois vers les canaux : vérifiez que le bot est membre de l’espace de travail et dispose de
bot:write. - Aucun menu de commandes : vérifiez que
commandMenun’est pasfalse, que le serveur ClickClack prend en chargePUT /api/bots/self/commandset que le jeton dispose decommands:write.