OpenClaw ClickClack 通道插件实战:自托管工作区机器人接入、会话讨论与权限配置全指南
2026/9/10 1:28:51 网站建设 项目流程

OpenClaw ClickClack 通道插件实战:自托管工作区机器人接入、会话讨论与权限配置全指南

【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw

ClickClack 是 OpenClaw 的官方通道插件,让 OpenClaw Agent 以 ClickClack 机器人(Bot)身份接入自托管的 ClickClack 工作区。本文以 docs/plugins/reference/clickclack.md 为核心骨架,结合 docs/channels/clickclack.md 的完整配置说明与 extensions/clickclack 的源码实现,系统讲解插件分发与安装、三种凭据接入方式、账号配置键、多机器人、Session discussions 会话讨论通道、回复模式、命令菜单、持久化媒体投递、原生进度与活动行、群组提及门控、目标语法、令牌权限与故障排查,读完即可完成从接入到生产环境的全套配置。

一、插件概述与分发

ClickClack 通道插件使 OpenClaw 以 ClickClack Bot 用户身份出现在工作区中。ClickClack 支持独立服务机器人(independent service bots)与用户自有机器人(user-owned bots)两类:用户自有机器人保留owner_user_id,且只接收你授予的令牌范围(token scopes)。

分发信息(Distribution)

  • 包名:@openclaw/clickclack
  • 安装途径:npm 或 ClawHub,clawhub:@openclaw/clickclack

能力表面(Surface)

  • 通道(Channels):clickclack
  • 契约(Contracts):tools(具体提供只读discussion工具)

从 extensions/clickclack/package.json 可以确认这些元数据:

  • 运行时依赖仅有ws(实时 WebSocket)与zod(配置校验),保持轻量;
  • 插件清单 extensions/clickclack/openclaw.plugin.json 声明channels: ["clickclack"]contracts.tools: ["discussion"],与文档 Surface 一致;
  • 安装规格install.clawhubSpec = "clawhub:@openclaw/clickclack"install.npmSpec = "@openclaw/clickclack",默认选择 npm 途径(defaultChoice: "npm");
  • 兼容约束compat.pluginApi >= 2026.9.3,peer 依赖要求 OpenClaw>=2026.9.3,最小宿主版本>=2026.6.9install.minHostVersion);
  • 声明doctorContract.configRepair = true,意味着openclaw doctor可以修复该通道的配置;
  • 激活策略activation.onStartup = false,插件不随网关启动而强制激活。

安装命令:

openclaw plugins install @openclaw/clickclack

插件安装还遵循 OpenClaw 的插件允许列表策略:如果网关配置了非空的限制性plugins.allow列表,在通道设置中显式选择 ClickClack,或运行openclaw plugins enable clickclack,会把clickclack追加进该列表;openclaw onboard引导安装走同样的显式选择逻辑。这些路径不会覆盖plugins.deny或全局plugins.enabled: false;直接openclaw plugins install @openclaw/clickclack则遵循常规插件安装策略,同时也会把 ClickClack 记录进已有的允许列表。

二、快速接入:三种凭据方式

ClickClack 支持三种凭据接入方式:推荐的一次性设置码(setup code)、手动令牌(manual token)与环境变量令牌(env-based token)。

方式一:设置码(推荐)

在 ClickClack 中打开工作区设置 → 集成(Integrations)→ OpenClaw,选择Setup code(推荐)创建机器人,并复制生成的命令:

openclaw channels add clickclack --code 'https://clickclack.example.com/#XXXX-XXXX-XXXX'

对于前端与 API 分离(不同源)或 API 挂在路径下的部署,ClickClack 会给出精确声明端点(exact claim endpoint):

openclaw channels add clickclack --code 'https://api.example.com/services/clickclack/api/bot-setup-codes/claim#XXXX-XXXX-XXXX'

设置码的关键行为:

  • 一次性使用,自生成起10 分钟内有效;
  • OpenClaw 声明(claim)后收到新铸造的机器人令牌与工作区设置,保存账号、验证连接,并报告运行中的网关是否拾取(pick up)了它;
  • 对版本化精确端点,OpenClaw 会校验并保存 ClickClack 返回的规范 API 基址(含路径前缀);
  • 设置码本身不会存入 OpenClaw 配置

设置码声明对公网服务器使用 HTTPS;本地环回地址(localhost127.0.0.1)的本地安装也支持纯 HTTP。

如果 OpenClaw 网关已在运行,ClickClack 会自动连接,无需第二条命令;否则先启动网关:

openclaw gateway

也可以把设置码与服务器 URL 分开传递:

openclaw channels add clickclack --code XXXX-XXXX-XXXX --base-url https://clickclack.example.com

需要引导式安装时运行:

openclaw onboard

选择 ClickClack 后按提示输入服务器 URL、机器人令牌与工作区。引导式安装会在保存后校验服务器、令牌与工作区;校验失败不会丢弃已保存的配置

方式二:手动令牌

当配置非 OpenClaw 客户端,或需要自行管理令牌时,在 ClickClack 中选择Manual token

openclaw channels add clickclack --base-url https://clickclack.example.com --token ccb_... --workspace default
  • workspace接受工作区 id(wsp_...)、slug 或显示名称;
  • --code不能--token--token-file--use-env组合使用。

方式三:基于环境变量的令牌

默认账号可以从环境变量CLICKCLACK_BOT_TOKEN读取令牌,无需把令牌写入配置:

export CLICKCLACK_BOT_TOKEN="ccb_..." openclaw channels add clickclack --base-url https://clickclack.example.com --workspace default --use-env openclaw gateway

注意:命名账号(named accounts)必须使用配置的令牌或令牌文件;共享环境变量有意限定于默认账号使用。

从 extensions/clickclack/src/accounts.ts 的源码可以看到"账号已配置"的判定逻辑(hasImplicitDefaultAccount):仅当baseUrl非空、且令牌来源有效(配置了tokentokenFile或环境变量CLICKCLACK_BOT_TOKEN三者之一),并且workspace非空时,该账号才算配置完成——与文档"baseUrl、令牌来源与workspace三者齐备才算 configured"的表述完全对应。

JSON5 配置参考

命令行的等价配置形状:

{ channels: { clickclack: { enabled: true, baseUrl: "https://clickclack.example.com", token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", defaultTo: "channel:general", }, }, }
  • 一个账号只有在baseUrl、令牌来源与workspace都设置后才算 configured;
  • 令牌来源可以是tokentokenFile,或默认账号的CLICKCLACK_BOT_TOKEN
  • workspace接受 id、slug 或名称,网关在启动时将其解析为工作区 id。

三、账号配置键全解

以下是 docs/channels/clickclack.md 的完整账号配置键表(全量收录并补充说明):

Key默认值说明
baseUrl无(必填)面向浏览器的公开 ClickClack URL,用于生成浏览器打开的链接。
apiBaseUrlbaseUrl可选的服务端到服务端端点,用于 REST 与实时 WebSocket 流量。
token机器人令牌,可为明文串或密钥引用(source: "env" \| "file" \| "exec" \| "store")。
tokenFile机器人令牌文件路径;优先级高于token
workspace无(必填)工作区 id、slug 或名称。
replyMode"agent""agent"走完整 Agent 管线;"model"发送短模型直答。
defaultTo"channel:general"出站路径未给出目标时使用的默认目标。
allowFrom["*"]入站 DM 与频道消息的用户 id 允许列表。
allowBotsfalse是否接纳其他 ClickClack 机器人消息:true放行所有机器人消息,"mentions"仅群组中提及本机时放行。
botLoopProtection内置默认应用于已接纳机器人消息的滑动窗口机器人对循环防护。
botUserId自动探测启动时从机器人令牌身份解析。
agentId路由默认将该账号的入站消息固定路由到一个 Agent。
toolsAllow该账号 Agent 回复的工具允许列表。
modelsystemPromptreplyMode: "model"直答使用的模型与系统提示。
commandMenutrue是否向 ClickClack 输入框自动补全发布原生命令。
reconnectMs1500实时重连延迟(100~60000)。
discussions禁用托管式按会话通道设置,详见下文「Session discussions」。
requireMentionfalse群组消息是否需要被直接提及才分发。
mentionPatterns[]该账号在群组通道中的提及模式。
groups{}按 ClickClack 通道 id 键控的群组策略覆盖。

这些键的取值约束在 extensions/clickclack/src/config-schema.ts 中有严格定义,例如reconnectMs为整数且取值范围min(100).max(60_000)(默认1500,见 accounts.ts 中的DEFAULT_RECONNECT_MS);replyMode枚举为["agent", "model"]groups记录中的每个子对象为.strict()模式,未知键会导致校验失败;discussions子对象(enabled/workspace/controlUrlBase/section)同样为严格模式。openclaw doctor与配置校验正是使用这份导出的 Zod schema(clickClackConfigSchema)识别默认与命名账号的。

保持鉴权保护的公开主机名

当 ClickClack 与 OpenClaw 网关运行在同一主机、但公开 ClickClack 主机名受 Cloudflare Access 等认证网关保护时,使用apiBaseUrl分流服务端流量:

{ 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", }, }, }
  • 公开主机名可以继续对浏览器用户保持完全鉴权保护;
  • OpenClaw 使用环回端点进行 REST 请求、设置验证与实时 WebSocket,而讨论的embedUrlopenUrl链接仍使用公开baseUrl
  • 省略apiBaseUrl时所有流量都走baseUrl,保持既有行为不变。

四、多机器人(Multiple bots)

每个账号各自建立自己的 ClickClack 实时连接,并使用各自的机器人令牌:

{ 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", }, }, }, }, }

从源码看,账号解析(accounts.ts)通过createAccountListHelpers<ClickClackAccountConfig>("clickclack", ...)实现根级通道配置与命名账号覆盖的合并;nestedObjectKeys: ["botLoopProtection", "discussions"]表明这两个子对象在合并时按嵌套键深度合并;groups则经mergeClickClackGroups合并通道级与账号级的群组策略(账号级优先)。密钥引用统一走resolveSecretInputString解析(支持 env/file/exec/store 四类来源),令牌文件的优先级高于token配置。

五、Session discussions:为每个会话创建托管讨论通道

启用某个 ClickClack 账号的讨论功能后,每个 OpenClaw 会话都会获得一个专属的 ClickClack 通道。注意:账号令牌必须包含channels:write权限(bot:admin权限包包含),普通bot:write设置令牌无法创建或同步通道。

{ 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接受与账号级workspace相同的 id、slug 或显示名,默认取账号级值;
  • section控制 ClickClack 侧边栏分组,默认Sessions
  • 设置controlUrlBase时,托管通道会回链到规范的 Control UI 会话路径(形如/chat/<agent>/<session-ref>,保留基路径;主会话用/chat/<agent>);
  • 只能在恰好一个 ClickClack 账号上启用讨论。因为网关的讨论提供方没有账号选择器,多个账号启用讨论会被直接拒绝,而不是按配置顺序挑选一个。

通道生命周期与绑定语义

打开讨论会创建一个标记为"外部托管"(externally managed)的公开ClickClack 通道。插件保持会话标签与分类同步,但通道生命周期完全独立

  • 清除会话分类会把通道移回配置的默认分组;
  • 归档、重置或删除 OpenClaw 会话绝不会归档或替换 ClickClack 通道——通道的归档与恢复由 ClickClack 独立掌管;
  • 插件在使用讨论 RPC 时以及存在绑定时大约每分钟执行一次绑定对账(reconcile)。

绑定(binding)把持久化的房间身份可替换的会话附着(session attachment)分离:

  • 副会话(side session)的 peer 身份与作用域授权包含精确的具体 OpenClaw 会话 id;重置可复用会话键会轮换附着关系,且无法复用旧的副会话记录。ClickClack 通道 id、URL、历史与所有权引用保持不变;
  • 通过不活跃、已禁用或被重新定向的附着到达的消息会被丢弃,而不是回退到该账号的正常通道路由;
  • 释放的绑定会留下持久的撤销通道标记(revoked-channel marker),使延迟的实时事件保持失败关闭(fail-closed);
  • 远端所有权以 ClickClack 服务器 + 通道 id 键控,因此重命名本地账号不会把托管通道变成普通通道。

会话访问收窄与授权边界

如需更窄的会话访问,可把tools.sessions.visibility显式设为tree(而不是默认的all)。插件只在每个副会话与其附着的主会话之间安装主机级授权(host-scoped grant),并安装一个工具策略钩子,阻止会话发现与跨会话目标:

  • 仅允许对附着主会话使用sessions_historysession_statussessions_send,并阻止 status 调用改变该会话的模型;
  • 这些工具仍必须出现在 Agent 的有效工具允许列表中;
  • 系统提示只是指导,主机授权与钩子才是真正的授权边界

服务端契约与故障恢复

ClickClack 服务器必须在通道创建与更新时支持并返回托管通道字段(external_managedexternal_refexternal_urlsidebar_section)。OpenClaw 在持久化绑定前会验证该契约:

  • 若创建响应丢失,下一次打开会按服务器强制的external_ref收养(adopt)该通道,而不是再创建一个;在对账完成前,未决预留(pending reservation)会把目标工作区中未绑定的事件临时隔离(quarantine);
  • 粗粒度对账器(coarse reconciler)在逻辑会话活跃时收养通道(包括具体会话 id 改变后);未创建远端通道时清除预留;
  • 该引用包含持久化的每安装命名空间加上会话键、ClickClack 目标与持久化绑定代的哈希——不同网关无法互相收养对方的通道,而具体会话重置仍保持同一通道;账号或工作区往返无法重新收养旧通道;
  • 绑定还固定到配置的 ClickClack 服务器 URL,账号被重新定向时绑定失效;
  • 修改或移除controlUrlBase会在下一次对账时更新或清除托管通道链接;
  • 修改discussions.workspace会先释放旧附着,再到新工作区打开通道,且永不归档旧房间
  • 如果令牌被替换为无法访问旧工作区的工作区级凭据,OpenClaw 会把旧通道记录为已撤销并释放绑定,而不会用替换令牌去尝试。

从 extensions/clickclack/src/discussions/binding-generation.ts 可以看到绑定预留的实现细节:预留记录存放在插件 SQLite 状态键值存储中(命名空间discussion-binding-generations,上限10_000条),且溢出策略为reject-new——因为一条未决记录可能是"响应丢失但远端已提交通道"的唯一证据,拒绝新预留比逐出该证据更安全。这正是文档所述"丢失的创建响应可被收养"的底层支撑。

主会话的只读 discussion 工具

附着的主会话还会收到一个只拉取(pull-only)的discussion工具:它读取最新消息与近期线程回复,每条消息作为一条转义、带归属的记录返回,没有任何写入或生命周期副作用。通道根与线程查询有固定的请求预算,当该安全边界可能遗漏更早的活跃线程时,结果会显式警告。

从 extensions/clickclack/src/discussions/tool.ts 的实现可见:该工具名为discussion,参数仅一个可选limit(默认30,上限200),执行时调用service.readLatestMessages(sessionKey, limit)并返回boundchannelId等元数据;未绑定会话时返回"No discussion is bound to this session."。这印证了"只读、有界、无副作用"的文档描述。

六、回复模式(Reply modes)

  • replyMode: "agent"(默认):入站消息走正常 Agent 管线,包括会话记录与工具策略;
  • replyMode: "model":跳过 Agent 管线,使用插件运行时的llm.complete直接生成机器人回复,可选modelsystemPrompt塑形。所选提供方与模型负责补全预算。

两种模式都遵循通道级或账号级的responsePrefix。账号级取值优先(包括用""关闭继承的前缀);"auto"表示路由 Agent 的身份名,"[{model}]"表示所选模型。显式的message工具与 CLI 文本发送遵循共享前缀行为(含未解析的模型相关前缀省略规则)。

Model 模式对解析出的机器人 Agent id 运行补全,这需要显式信任位plugins.entries.clickclack.llm.allowAgentIdOverride: true

{ plugins: { entries: { clickclack: { llm: { allowAgentIdOverride: true, }, }, }, }, }

若只使用默认的agent回复模式,请保持该信任位关闭——那里并不需要它。

七、命令菜单(Command menu)

网关启动时,每个已配置账号会把 OpenClaw 的原生命令发布到 ClickClack,以机器人句柄(handle)标注出现在输入框自动补全中。发布集合在每次启动时整体替换——包括原生命令目录为空时清除过期菜单。

命令菜单同步默认开启。在账号上设置commandMenu: false即可退出:

{ channels: { clickclack: { enabled: true, token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", commandMenu: false, }, }, }

令牌需要commands:write权限。当前 ClickClack 的bot:writebot:admin权限包都包含该权限,也可单独授予。在命令菜单功能引入前创建的令牌可能需要补充该权限或更换令牌。

同步是尽力而为的,且每次网关启动只运行一次:

  • 缺少权限或网络失败仅记录警告;不支持该端点的旧版 ClickClack 服务器按 debug 级别记录;
  • 这些失败都不会阻塞实时连接启动;
  • 菜单在 Agent 离线时仍可用,机器人离开工作区时菜单被移除。

本次发布只发布原生命令规范。别名以及技能、插件或自定义命令目录不会加入菜单。如果某名字同时注册为 HTTP 斜杠命令,ClickClack 会优先分发该注册;其余菜单命令继续走正常消息投递。

关联追踪证据(correlation evidence)

如需跨服务关联证据,请使用agent模式。要获得规范形态msg_<ulid>的 ClickClack 消息 id,通道会推导出确定性的 OpenClaw 运行 id:clickclack:<message-id>。随后每次模型调用在诊断中可见为clickclack:<message-id>:model:<n>;当该轮使用 ClawRouter 时,同一模型调用 id 会作为X-Request-ID发送。model模式绕过正常的 Agent 运行/会话诊断,因此不适合此证据路径。

当实时事件包含经验证的payload.correlation_id时,通道会在权威消息抓取与产生的 ClickClack 回复请求中把它作为X-Correlation-ID携带。取值使用 ClickClack 的安全 128 字符集(A-Za-z0-9._:-);非法值会被省略。这些关联只包含标识符,绝不包含消息正文、提示、补全、凭据或工具输出。

八、持久化媒体投递(Durable media delivery)

包含媒体的 Agent 回复使用必需持久化投递。OpenClaw 在第一次 ClickClack 写入前为每个消息部分与上传分配稳定的 nonce,因此重试会复用相同的上传与消息,而不会消耗存储配额或产生重复发布。重启后若上传已存在,OpenClaw 不会重新读取原始本地路径或远端媒体 URL。

该恢复契约要求 ClickClack 服务器支持:

  • GET /api/uploads/by-nonce,在命中与未命中结果上都带X-ClickClack-Upload-Nonce: supported
  • GET /api/messages/by-nonce,在命中与未命中结果上都带X-ClickClack-Message-Nonce: supported
  • 对同一所有者作用域 nonce 与上传的幂等消息创建与附件关联。

旧服务器返回的通用 404 不被视为"发送不存在"的证据。OpenClaw 会让投递保持未解决状态,而不是冒重复风险;请在启用产生媒体的 Agent 回复前升级 ClickClack

出站媒体使用 ClickClack 的上传 API,然后把持久化上传附加到创建的通道消息、线程回复或 DM。本地文件与受支持的远端媒体 URL 遵循 OpenClaw 常规媒体访问策略。channels.clickclack.mediaMaxMb限制每个出站附件(MiB);accounts.<id>.mediaMaxMb覆盖根值,agents.defaults.mediaMaxMb作为兜底。64 MiB 上传上限始终适用。图片发送前可能被优化。持久化排队发送为每个上传与消息部分使用独立的所有者作用域 nonce,然后用同一批对象重试附件关联。

九、原生进度与 Agent 活动行(Native progress & agent activity)

原生进度为按账号可选。设置nativeProgress: true可在 Agent 轮次运行时显示瞬态<agent name> is responding状态与进度行。Agent 名来自配置的账号名、ClickClack 机器人句柄或 Agent id。这些使用临时agent.progress事件,轮次结束时清除——只有最终回复是持久的。单独设置agentActivity: true可在轮次进行中发布持久的agent_commentaryagent_tool消息行:

{ channels: { clickclack: { enabled: true, token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", nativeProgress: true, agentActivity: true, }, }, }

要求与行为:

  • 原生进度默认关闭。仅在支持临时实时端点的 ClickClack 部署上设置nativeProgress: true
  • 持久活动默认单独关闭。设置agentActivity: true持久化活动行,但它本身不会启用原生进度;
  • 原生进度尽力而为。进度发布使用临时实时端点与有界请求超时;失败或停滞的进度请求只记日志,不能阻塞最终文本投递
  • 持久活动需要agent_activity:write令牌权限。该权限独立于bot:write,不被其继承;启用agentActivity前请用--scopes bot:write,agent_activity:write创建机器人令牌;
  • 尽力降级。若令牌缺少agent_activity:write或服务器拒绝活动写入,失败只记日志,最终回复仍正常投递,只是不出现活动行;
  • 行按轮次(turn_id)分组、合并(一个逻辑步骤一行),工具行使用与 Discord/Slack/Telegram 相同的进度格式(工具名加命令详情);
  • 归属元数据。Agent 创作的内容(活动行与最终回复)携带author_modelauthor_thinking字段,取自该轮实际使用的模型(含故障回退之后)。未定义这些列的服务器会忽略未知 JSON 字段;支持持久化的服务器可以按消息回答"这一行是哪个模型、什么思考级别说的"。

十、群组提及门控(Group mention gating)

默认情况下,ClickClack 中每条群组消息都会分发给同一工作区中所有已启用的 ClickClack 账号——该行为向后兼容。在账号上添加requireMention: true可要求先被直接提及才运行 Agent 管线。

有效策略按以下顺序解析:

  1. groups中的精确通道条目(按 ClickClack 通道 id 键控);
  2. groups中的通配符"*"条目;
  3. 账号级requireMention/mentionPatterns
  4. 向后兼容默认值({ requireMention: false, mentionPatterns: [] })。

DM 永不受requireMention门控。DM 到达时提及门完全跳过。

提及检测

满足以下任一条件即检测为提及:

  • 消息正文匹配mentionPatterns中的任意模式(每个模式为正则表达式);
  • 消息包含机器人的 ClickClack@handle(网关在启动时从已验证的机器人身份读取句柄)。

纯显示名称(如Blackbird算提及,除非被显式配置为模式。

机器人之间的消息

ClickClack 默认忽略机器人创作的消息。要接入,在账号上设置allowBots: true;设置allowBots: "mentions"则仅在群组通道中提及本机时接纳机器人消息,DM 无需提及仍可接纳。机器人消息仍经过allowFrom,但机器人作者必须按 id 显式列出;默认的通配符allowFrom: ["*"]不授权机器人消息,通配符仍供人类流量使用。自身消息始终被忽略

被接纳的机器人消息还通过 OpenClaw 共享的机器人对循环防护。用账号级botLoopProtectionchannels.defaults.botLoopProtection调整窗口、预算、冷却或启用状态。群组级allowBotsbotLoopProtection遵循与前述相同策略的精确通道→通配符→账号级优先级。顶层通道消息共享一个通道预算,而不同 ClickClack 线程中的回复使用独立的线程根预算。

ClickClack 的agent_commentaryagent_tool活动行永不触发OpenClaw 入站轮次,即使其作者机器人被显式允许。

旧版 ClickClack 响应可能省略author.kind。这类消息故意留在旧的allowFrom路径上:allowFrom: ["*"]可以接纳它们,而机器人专属的allowBots与机器人对循环防护检查不适用,因为服务器没有对作者分类。因此机器人专属限制要求 ClickClack 服务器响应包含作者分类

配置示例

{ channels: { clickclack: { enabled: true, token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" }, workspace: "default", requireMention: true, mentionPatterns: ["\\bBlackbird\\b"], allowBots: "mentions", allowFrom: ["usr_trusted_bot"], botLoopProtection: { maxEventsPerWindow: 12, windowSeconds: 60 }, groups: { "*": { requireMention: true, allowBots: "mentions" }, chn_command_and_control: { requireMention: false }, }, }, }, }

同一工作区中的多个账号独立评估同一条消息:requireMention: true的账号拒绝未提及消息,而requireMention: false的账号可能处理它。

迁移警告

  • ClickClack 通道 id(如chn_...不是Discord 通道 id。配置按通道规则需要使用真实的 ClickClack 通道标识符。除非 ClickClack 服务器显式将其存储为external_ref且适配器有文档化的转换层,否则不要复用 Discord id;
  • 添加requireMention: true而不收紧allowFrom,不会悄悄改变群组消息现有的发送者允许列表行为——提及门只是现有发送者策略之上的额外防护。

十一、目标语法(Targets)

  • channel:<name-or-id>:发送到工作区通道。裸目标默认视为channel:
  • dm:<user_id>:创建或复用与该用户的直接会话;
  • thread:<message_id>:在该消息根线程中回复。

显式出站目标还可携带clickclack:cc:提供方前缀。

从 extensions/clickclack/src/target.ts 的解析器实现可见:parseClickClackTargetchannel:/thread:/dm:前缀分别映射为{ chatType: "group", kind: "channel" }{ chatType: "group", kind: "thread" }{ chatType: "direct", kind: "dm" };无前缀的裸值回退为channel:;无法识别的前缀抛出Unsupported ClickClack target错误。这与文档"裸目标默认 channel:"完全一致。

出站媒体先上传到 ClickClack 再附加到通道消息、线程回复或 DM。示例:

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"

十二、权限:ClickClack 令牌范围

ClickClack 令牌范围由 ClickClack API 强制执行:

  • bot:read:读取工作区/通道/消息/线程/DM/实时/资料数据;
  • bot:writebot:read加通道消息、线程回复、DM、上传与命令菜单发布;
  • bot:adminbot:write加通道创建;
  • commands:write:发布机器人命令菜单。包含在当前bot:writebot:admin权限包中,也可单独授予;
  • agent_activity:write:持久 Agent 活动行(agent_commentary/agent_tool)。不被bot:writebot:admin继承;仅当设置agentActivity: true时需要。

OpenClaw 常规 Agent 聊天与命令菜单同步只需当前bot:write。启用原生进度与活动行时,再加agent_activity:write。启用 Session discussions 时则需bot:admin(含channels:write)。

十三、故障排查

  • ClickClack is not configured for account "<id>":为该账号设置baseUrltoken(例如通过CLICKCLACK_BOT_TOKEN)与workspace
  • ClickClack workspace not found: <value>:把workspace设为 ClickClack 返回的工作区 id、slug 或名称;
  • 无入站回复:确认令牌有实时读取权限。机器人总是忽略自己的消息;其他机器人消息默认被拒,启用allowBots时发送方机器人 id 还必须显式列入allowFrom
  • 通道发送失败:验证机器人是工作区成员且拥有bot:write
  • 无命令菜单:确认commandMenu不是false、ClickClack 服务器支持PUT /api/bots/self/commands、且令牌有commands:write

十四、进一步阅读

  • ClickClack 通道完整文档:设置码、账号键、讨论、提及门控的权威说明;
  • 插件参考页:自动生成的插件表面与契约总览;
  • 扩展源码:src/channel.ts(通道实现)、src/gateway.ts(实时网关)、src/inbound.ts(入站处理)、src/outbound.ts(出站与媒体)、src/accounts.ts(账号解析)、src/config-schema.ts(Zod 配置校验)、src/discussions/(会话讨论服务与工具)以及配套测试;
  • 扩展 README:安装与快速配置摘要;
  • 消息前缀/线程/回复概念:responsePrefix与显式发送行为;
  • Control UI 会话 URL:controlUrlBase生成的规范会话路径。

【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询