Developer and self-hosted
ClickClack
ClickClack verbindt OpenClaw via volwaardige ClickClack-bottokens met een zelf gehoste ClickClack-werkruimte.
Gebruik dit wanneer je wilt dat een OpenClaw-agent als een ClickClack-botgebruiker verschijnt. ClickClack ondersteunt onafhankelijke servicebots en bots die eigendom zijn van gebruikers; bots die eigendom zijn van gebruikers behouden een owner_user_id en ontvangen alleen de tokenbereiken die je toekent.
Snelle installatie
Open in ClickClack Workspace settings → Integrations → OpenClaw, maak een bot met Setup code (recommended) en kopieer de gegenereerde opdracht:
openclaw channels add clickclack --code 'https://clickclack.example.com/#XXXX-XXXX-XXXX'Voor afzonderlijke frontend- en API-origins of een API die onder een pad is gekoppeld, geeft ClickClack in plaats daarvan een exact claimendpoint:
openclaw channels add clickclack --code 'https://api.example.com/services/clickclack/api/bot-setup-codes/claim#XXXX-XXXX-XXXX'De installatiecode kan één keer worden gebruikt en verloopt na 10 minuten. OpenClaw claimt deze, ontvangt het nieuw aangemaakte bottoken en de werkruimte-instellingen, slaat het account op, verifieert de verbinding en meldt of de actieve Gateway deze heeft opgepikt. Voor exacte endpoints met een versie valideert en bewaart OpenClaw de canonieke API- basis die ClickClack retourneert, inclusief eventuele padprefix. De installatiecode zelf wordt niet opgeslagen in de OpenClaw-configuratie.
Claims met een installatiecode gebruiken HTTPS voor openbare servers. Platte HTTP wordt ook ondersteund voor
lokale installaties op loopback-adressen zoals localhost en 127.0.0.1.
Als OpenClaw al actief is, maakt ClickClack automatisch verbinding en is geen tweede opdracht nodig. Start het anders met:
openclaw gatewayJe kunt de code ook afzonderlijk van de server-URL doorgeven:
openclaw channels add clickclack --code XXXX-XXXX-XXXX --base-url https://clickclack.example.comVoer voor begeleide installatie het volgende uit:
openclaw onboardSelecteer ClickClack en voer vervolgens de server-URL, het bottoken en de werkruimte in wanneer daarom wordt gevraagd. De begeleide installatie controleert na het opslaan de server, het token en de werkruimte; een mislukte controle verwijdert de configuratie niet.
Alternatief: handmatig token
Kies Manual token in ClickClack wanneer je een niet-OpenClaw-client configureert of wanneer je het token uitdrukkelijk zelf moet beheren:
openclaw channels add clickclack --base-url https://clickclack.example.com --token ccb_... --workspace defaultworkspace accepteert een werkruimte-id (wsp_...), slug of weergavenaam.
--code kan niet worden gecombineerd met --token, --token-file of --use-env.
Alternatief: omgevingsvariabele voor token
Het standaardaccount kan CLICKCLACK_BOT_TOKEN lezen in plaats van een token
in de configuratie op te slaan:
export CLICKCLACK_BOT_TOKEN="ccb_..."openclaw channels add clickclack --base-url https://clickclack.example.com --workspace default --use-envopenclaw gatewayBenoemde accounts moeten een geconfigureerd token of tokenbestand gebruiken; de gedeelde omgevingsvariabele is bewust beperkt tot het standaardaccount.
JSON5-referentie
De equivalente configuratiestructuur is:
{ channels: { clickclack: { enabled: true, baseUrl: "https://clickclack.example.com", token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", defaultTo: "channel:general", }, },}Een account geldt alleen als geconfigureerd wanneer baseUrl, een tokenbron en
workspace allemaal zijn ingesteld. Een tokenbron kan voor het standaardaccount token, tokenFile of
CLICKCLACK_BOT_TOKEN zijn. workspace accepteert een werkruimte-
id (wsp_...), slug of naam; de Gateway zet deze bij het opstarten om naar de id.
Configuratiesleutels voor accounts
| Sleutel | Standaard | Opmerkingen |
|---|---|---|
baseUrl |
geen (vereist) | Openbare ClickClack-URL die wordt gebruikt voor links voor de browser. |
apiBaseUrl |
baseUrl |
Optioneel server-naar-server-endpoint voor REST- en realtime WebSocket-verkeer. |
token |
geen | Bottoken als platte tekenreeks of geheime verwijzing (source: "env" | "file" | "exec"). |
tokenFile |
geen | Pad naar een bottokenbestand; heeft voorrang op token. |
workspace |
geen (vereist) | Werkruimte-id, slug of naam. |
replyMode |
"agent" |
"agent" voert de volledige agentpijplijn uit; "model" verzendt korte rechtstreekse modelaanvullingen. |
defaultTo |
"channel:general" |
Doel dat wordt gebruikt wanneer een uitgaand pad geen doel opgeeft. |
allowFrom |
["*"] |
Toelatingslijst met gebruikers-id's voor inkomende DM's en kanaalberichten. |
botUserId |
automatisch gedetecteerd | Bij het opstarten afgeleid van de identiteit van het bottoken. |
agentId |
standaardroute | Zet de inkomende berichten van dit account vast op één agent. |
toolsAllow |
geen | Toelatingslijst met tools voor agentantwoorden vanuit dit account. |
model, systemPrompt |
geen | Gebruikt door replyMode: "model"-aanvullingen. |
commandMenu |
true |
Publiceer systeemeigen opdrachten in de automatische aanvulling van de ClickClack-composer. |
reconnectMs |
1500 |
Vertraging voor realtime opnieuw verbinden (100 tot 60000). |
discussions |
uitgeschakeld | Beheerde kanaalinstellingen per sessie; zie Sessiediscussies. |
Een door authenticatie afgeschermde openbare hostnaam behouden
Gebruik apiBaseUrl wanneer ClickClack en de OpenClaw-Gateway op dezelfde host draaien,
maar de openbare ClickClack-hostnaam wordt beschermd door een authenticatiegateway,
zoals Cloudflare Access:
{ channels: { clickclack: { baseUrl: "https://clack.openclaw.ai", apiBaseUrl: "http://127.0.0.1:8484", token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", }, },}De openbare hostnaam kan voor browsergebruikers volledig door authenticatie afgeschermd blijven. OpenClaw
gebruikt het loopback-endpoint voor REST-verzoeken, installatieverificatie en de
realtime WebSocket, terwijl embedUrl- en openUrl-links van discussies
de openbare baseUrl blijven gebruiken. Als apiBaseUrl wordt weggelaten, gebruikt al het verkeer
baseUrl, waardoor het bestaande gedrag behouden blijft.
Als plugins.allow een niet-lege beperkende lijst is, wordt bij het expliciet selecteren van
ClickClack tijdens de kanaalinstallatie of bij het uitvoeren van openclaw plugins enable clickclack
clickclack aan die lijst toegevoegd. Installatie via onboarding gebruikt hetzelfde
gedrag voor expliciete selectie. Deze paden overschrijven plugins.deny of een
globale plugins.enabled: false-instelling niet. Rechtstreeks
openclaw plugins install @openclaw/clickclack volgt het normale
beleid voor Plugin-installatie en registreert ClickClack ook in een bestaande toelatingslijst.
Meerdere bots
Elk account opent zijn eigen realtime ClickClack-verbinding en gebruikt zijn eigen bottoken.
{ 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", }, }, }, },}Sessiediscussies
Schakel discussies in voor één ClickClack-account om elke OpenClaw-sessie een
speciaal ClickClack-kanaal te geven. Het accounttoken moet
channels:write bevatten (de bundel bot:admin bevat dit); het normale installatietoken bot:write
kan geen kanalen maken of synchroniseren.
{ channels: { clickclack: { enabled: true, baseUrl: "https://clickclack.example.com", token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", discussions: { enabled: true, workspace: "default", controlUrlBase: "https://team.openclaw.ai", section: "Sessions", }, }, },}discussions.workspace accepteert dezelfde werkruimte-id, slug of weergavenaam
als workspace op accountniveau en gebruikt standaard die waarde. section bepaalt
de sectie in de ClickClack-zijbalk en is standaard Sessions. Wanneer
controlUrlBase is ingesteld, linkt het beheerde kanaal terug naar de echte sessieroute
van de Control UI, /chat?session=<encoded-session-key>.
Schakel discussies in voor exact één ClickClack-account. De Gateway-provider heeft geen accountselector, dus meerdere ingeschakelde discussieaccounts worden geweigerd in plaats van er één te kiezen op basis van de configuratievolgorde.
Bij het openen van een discussie wordt een openbaar ClickClack-kanaal gemaakt dat als extern beheerd is gemarkeerd. De Plugin houdt het sessielabel, de categorie en de archiefstatus gesynchroniseerd. Het herstellen van een sessie herstelt het bijbehorende kanaal; het wissen van de sessiecategorie verplaatst het kanaal terug naar de geconfigureerde standaardsectie. Bij het verwijderen van een OpenClaw-sessie wordt het ClickClack-kanaal gearchiveerd in plaats van verwijderd, zodat de geschiedenis beschikbaar blijft. De Plugin brengt koppelingen opnieuw in overeenstemming wanneer discussie-RPC's worden gebruikt en ongeveer eenmaal per minuut zolang er koppelingen bestaan.
Inkomende berichten in een beheerd kanaal gebruiken een deterministische nevensessie onder
dezelfde agent-id als de gekoppelde hoofdsessie. De nevenagent krijgt te horen welke
hoofdsessie moet worden geobserveerd en kan sessions_history en session_status gebruiken
(changesSince is nuttig voor incrementele controles). Deze gebruikt sessions_send alleen
wanneer mensen in de discussie vragen om informatie door te geven aan of sturing te geven aan de hoofdsessie.
De koppeling, de verwijzing naar beheerd eigendom en de peeridentiteit van de nevensessie bevatten
de concrete OpenClaw-sessie-id samen met de vastgezette ClickClack-server en
het kanaal. Het opnieuw instellen van een herbruikbare sessiesleutel of het opnieuw richten van een account trekt het
oude kanaal lokaal in, archiveert het wanneer de oude referentie nog bruikbaar is en
kan het bijbehorende nevengesprek niet hergebruiken. Berichten die binnenkomen via een
gearchiveerde, opnieuw ingestelde, uitgeschakelde of opnieuw gerichte koppeling worden verwijderd in plaats van terug te
vallen op de normale kanaalroutering van het account. Vrijgegeven koppelingen laten een duurzame
markering voor een ingetrokken kanaal achter, zodat vertraagde realtime-gebeurtenissen gesloten blijven bij fouten. Eigendom
op afstand wordt bepaald door de ClickClack-server en kanaal-id, zodat het hernoemen van het lokale
account een beheerd kanaal niet in een gewoon kanaal kan veranderen.
Laat tools.sessions.visibility op de veiligere standaardwaarde tree staan. De Plugin
installeert uitsluitend een hostgebonden toekenning tussen elke nevensessie en de gekoppelde
hoofdsessie, plus een hook voor toolbeleid die sessiedetectie en
sessieoverschrijdende doelen blokkeert. Deze staat sessions_history, session_status en
sessions_send alleen toe voor de gekoppelde hoofdsessie en voorkomt dat de statusaanroep
het model van die sessie wijzigt. Die tools moeten nog steeds aanwezig zijn in de
effectieve tooltoelatingslijst van de agent. De systeemprompt is een richtlijn; de hosttoekenning
en hook vormen de autorisatiegrens.
De ClickClack-server moet velden voor beheerde kanalen (external_managed,
external_ref, external_url en sidebar_section) ondersteunen bij het maken en
bijwerken van kanalen en deze retourneren in kanaalresponsen. OpenClaw verifieert dat contract
voordat een binding wordt opgeslagen. Als een respons op het maken verloren gaat, neemt de volgende opening
het kanaal over op basis van de door de server afgedwongen external_ref, in plaats van nog een kanaal te maken.
Totdat die uitkomst is afgestemd, plaatst de openstaande reservering
anderszins niet-gebonden gebeurtenissen in de doelwerkruimte in quarantaine. De globale reconciler
neemt het kanaal over wanneer dezelfde sessie nog actief is of archiveert het na een
reset; de reservering wordt verwijderd wanneer er geen extern kanaal is gemaakt.
Die referentie bevat een duurzame naamruimte per OpenClaw-installatie plus een
hash van de sessiesleutel, de concrete sessie-id, de ClickClack-bestemming en de duurzame
bindinggeneratie. Afzonderlijke gateways kunnen elkaars kanalen niet overnemen,
geresette sessies kunnen geen oude kanaalgeschiedenis overnemen en een heen-en-terugwijziging
van account of werkruimte kan een eerder kanaal niet opnieuw overnemen. Bindingen zijn ook gekoppeld aan de
geconfigureerde ClickClack-server-URL en worden ongeldig gemaakt als het account
op een ander doel wordt ingesteld. Het wijzigen of verwijderen van controlUrlBase werkt de koppeling met het beheerde
kanaal bij of verwijdert deze tijdens de volgende afstemmingsronde. Het wijzigen van
discussions.workspace archiveert de oude binding en geeft deze vrij voordat een kanaal
in de nieuwe werkruimte kan worden geopend, wanneer de referentie voor de oude werkruimte geconfigureerd blijft.
Als het token is vervangen door een werkruimtegebonden referentie die
geen toegang tot de oude werkruimte heeft, registreert OpenClaw het oude kanaal als ingetrokken en
geeft het de binding vrij zonder het vervangende token te proberen; archiveer dat overgebleven
kanaal vanuit ClickClack.
De gekoppelde hoofdsessie krijgt ook een alleen-lezen discussion-tool. Deze leest
de nieuwste berichten en recente antwoorden in threads als één geëscapete record met bronvermelding
per bericht en heeft geen neveneffecten voor schrijven of de levenscyclus. Zoekacties voor kanaalhoofdberichten en threads
hebben vaste aanvraagbudgetten; het resultaat waarschuwt expliciet wanneer door die
veiligheidsgrens een oudere actieve thread kan worden weggelaten.
Antwoordmodi
replyMode: "agent"(standaard) verwerkt inkomende berichten via de normale agentpijplijn, inclusief sessieregistratie en toolbeleid.replyMode: "model"slaat de agentpijplijn over en gebruikt dellm.completevan de Plugin-runtime voor rechtstreekse botantwoorden, eventueel vormgegeven doormodelensystemPrompt. De geselecteerde provider en het geselecteerde model bepalen het voltooiingsbudget.
De modelmodus voert voltooiingen uit voor de opgeloste botagent-id, waarvoor
de expliciete vertrouwensbit plugins.entries.clickclack.llm.allowAgentIdOverride: true
vereist is:
{ plugins: { entries: { clickclack: { llm: { allowAgentIdOverride: true, }, }, }, },}Laat de vertrouwensbit uitgeschakeld als je alleen de standaardantwoordmodus agent gebruikt; deze is
daar niet nodig.
Opdrachtmenu
Bij het starten van de Gateway publiceert elk geconfigureerd account de native opdrachten van OpenClaw naar ClickClack. Ze verschijnen in de automatische aanvulling van het invoerveld, gelabeld met de handle van de bot. De gepubliceerde set wordt bij elke start volledig vervangen, waarbij ook een verouderd menu wordt verwijderd wanneer de catalogus met native opdrachten leeg is.
Synchronisatie van het opdrachtmenu is standaard ingeschakeld. Stel commandMenu: false in voor een account
om dit uit te schakelen:
{ channels: { clickclack: { enabled: true, token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", commandMenu: false, }, },}Het token heeft commands:write nodig. De huidige ClickClack-bundels bot:write en
bot:admin bevatten dat bereik en het kan ook afzonderlijk worden toegekend.
Voor tokens die zijn gemaakt voordat opdrachtmenu's werden geïntroduceerd, moet het
bereik mogelijk worden toegevoegd of is een vervangend token nodig.
Synchronisatie gebeurt naar beste vermogen en wordt eenmaal per start van de Gateway uitgevoerd. Bij een ontbrekend bereik of een netwerkfout wordt een waarschuwing gelogd; bij een oudere ClickClack-server zonder het eindpunt wordt dit op debugniveau gelogd. Geen van deze fouten blokkeert het realtime opstarten. Menu's blijven beschikbaar terwijl de agent offline is en worden verwijderd wanneer de bot de werkruimte verlaat.
Deze release publiceert alleen native opdrachtspecificaties. Aliassen en catalogi met Skills, Plugins of aangepaste opdrachten worden niet aan het menu toegevoegd. Als een naam ook als HTTP-slashopdracht is geregistreerd, verwerkt ClickClack die registratie eerst; andere menuopdrachten blijven via de normale berichtbezorging lopen.
Gebruik de modus agent voor bewijs van correlatie tussen services. Voor een gezaghebbende
ClickClack-bericht-id in de canonieke vorm msg_<ulid> leidt het kanaal
de deterministische OpenClaw-uitvoerings-id clickclack:<message-id> af. Elke modelaanroep is
vervolgens in diagnostiek zichtbaar als clickclack:<message-id>:model:<n>; wanneer die
beurt ClawRouter gebruikt, wordt dezelfde modelaanroep-id verzonden als X-Request-ID.
De modus model omzeilt de normale diagnostiek voor agentuitvoeringen en sessies en is daarom
niet geschikt voor dit bewijsproces.
Wanneer een realtime gebeurtenis een gevalideerde payload.correlation_id bevat,
neemt het kanaal deze mee als X-Correlation-ID bij het ophalen van het gezaghebbende bericht en
de resulterende ClickClack-antwoordverzoeken. Waarden gebruiken ClickClacks veilige
set van 128 tekens (A-Z, a-z, 0-9, ., _, : en -); ongeldige waarden
worden weggelaten. Deze koppelingen bevatten alleen identificatoren, nooit berichtinhoud,
prompts, voltooiingen, referenties of tooluitvoer.
Duurzame medialevering
Agentantwoorden met media gebruiken verplichte duurzame levering. OpenClaw wijst vóór de eerste ClickClack-schrijfactie stabiele bericht- en uploadnonces per onderdeel toe, zodat bij een nieuwe poging dezelfde upload en hetzelfde bericht worden hergebruikt in plaats van opslagquotum te verbruiken of duplicaten te publiceren. Als een upload na een herstart al bestaat, leest OpenClaw het oorspronkelijke lokale pad of de externe media-URL niet opnieuw.
Dit herstelcontract vereist een ClickClack-server die het volgende ondersteunt:
GET /api/uploads/by-noncemetX-ClickClack-Upload-Nonce: supportedvoor gevonden en ontbrekende resultaten.GET /api/messages/by-noncemetX-ClickClack-Message-Nonce: supportedvoor gevonden en ontbrekende resultaten.- Idempotent maken van berichten en koppelen van bijlagen voor dezelfde eigenaarsgebonden nonce en upload.
Een generieke 404 van een oudere server wordt niet beschouwd als bewijs dat een verzending ontbreekt. OpenClaw laat de levering onopgelost in plaats van het risico op een duplicaat te nemen; werk ClickClack bij voordat je agentantwoorden inschakelt die media produceren.
Rijen met agentactiviteit
Standaard toont een ClickClack-kanaal niets terwijl een agentbeurt wordt uitgevoerd; alleen het uiteindelijke antwoord wordt geplaatst. Stel agentActivity: true in voor een account om duurzame berichtrijen voor agent_commentary en agent_tool te publiceren terwijl de beurt wordt uitgevoerd:
{ channels: { clickclack: { enabled: true, token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", agentActivity: true, }, },}Vereisten en gedrag:
- Standaard uitgeschakeld. Standaardconfiguraties en oudere ClickClack-servers blijven ongewijzigd.
- Vereist het tokenbereik
agent_activity:write. Dit bereik staat los vanbot:writeen wordt er niet door overgenomen; maak het bottoken met--scopes bot:write,agent_activity:write(of ken het bereik toe aan een bestaand token) voordat je de optie inschakelt. - Degradatie naar beste vermogen. Als het token
agent_activity:writeniet heeft of de server schrijfacties voor activiteit weigert, worden fouten gelogd en wordt het uiteindelijke antwoord nog steeds normaal geleverd; er verschijnen geen activiteitsrijen. - Rijen worden per beurt gegroepeerd (
turn_id) en samengevoegd zodat één logische stap één rij vormt. Toolrijen gebruiken dezelfde voortgangsopmaak als Discord/Slack/Telegram (toolnaam plus opdrachtdetails). - Toeschrijvingsmetadata. Door agents geschreven berichten (activiteitsrijen en het uiteindelijke antwoord) bevatten de velden
author_modelenauthor_thinking, bepaald op basis van het model dat daadwerkelijk voor de beurt is gebruikt (ook na een fallback). Servers die deze kolommen niet definiëren, negeren de onbekende JSON-velden; servers die ze opslaan, kunnen per bericht antwoord geven op de vraag "welk model zei deze regel, op welk denkniveau".
Doelen
channel:<name-or-id>verzendt naar een werkruimtekanaal. Kale doelen gebruiken standaardchannel:.dm:<user_id>maakt of hergebruikt een rechtstreeks gesprek met die gebruiker.thread:<message_id>antwoordt in de thread die bij dat bericht begint.
Expliciete uitgaande doelen kunnen ook het providerprefix clickclack: of cc: bevatten.
Uitgaande media gebruiken ClickClacks upload-API en koppelen vervolgens de duurzame upload aan het gemaakte kanaalbericht, het antwoord in de thread of het privébericht. Lokale bestanden en ondersteunde externe media-URL's volgen het normale mediatoegangsbeleid van OpenClaw, met een limiet van 64 MiB per bestand. Duurzame verzendingen in de wachtrij gebruiken afzonderlijke eigenaarsgebonden nonces voor elke upload en elk berichtonderdeel en proberen vervolgens opnieuw de bijlage aan dezelfde objecten te koppelen. Zie Duurzame medialevering voor het servercontract en het herstelgedrag.
Voorbeelden:
openclaw message send --channel clickclack --target channel:general --message "hello"openclaw message send --channel clickclack --target dm:usr_123 --message "hello"openclaw message send --channel clickclack --target thread:msg_123 --message "following up"Machtigingen
ClickClack-tokenbereiken worden afgedwongen door de ClickClack-API.
bot:read: werkruimte-, kanaal-, bericht-, thread-, privébericht-, realtime- en profielgegevens lezen.bot:write:bot:readplus kanaalberichten, antwoorden in threads, privéberichten, uploads en publicatie van opdrachtmenu's.bot:admin:bot:writeplus het maken van kanalen.commands:write: het opdrachtmenu van de bot publiceren. Opgenomen in de huidige bundelsbot:writeenbot:adminen afzonderlijk toekenbaar.agent_activity:write: duurzame rijen met agentactiviteit (agent_commentary/agent_tool). Wordt niet overgenomen doorbot:writeofbot:admin; alleen vereist wanneeragentActivity: trueis ingesteld.
OpenClaw heeft alleen het huidige bot:write nodig voor normale agentchat en synchronisatie van het opdrachtmenu. Voeg agent_activity:write toe wanneer je rijen met agentactiviteit inschakelt.
Probleemoplossing
ClickClack is not configured for account "<id>": stel voor dat accountbaseUrl,token(bijvoorbeeld viaCLICKCLACK_BOT_TOKEN) enworkspacein.ClickClack workspace not found: <value>: stelworkspacein op de werkruimte-id, slug of naam die ClickClack retourneert.- Geen inkomende antwoorden: controleer of het token realtime leestoegang heeft en houd er rekening mee dat de bot zijn eigen berichten en berichten van andere bots negeert.
- Verzending naar kanalen mislukt: controleer of de bot lid is van de werkruimte en
bot:writeheeft. - Geen opdrachtmenu: controleer of
commandMenunietfalseis, of de ClickClack-serverPUT /api/bots/self/commandsondersteunt en of het tokencommands:writeheeft.