- AI 应用
- 后端
【免费下载链接】botpress
The open-source hub to build & deploy GPT/LLM Agents ⚡️
本文基于 Botpress 开源仓库中的 ClickUp 官方集成(集成说明文档)编写,围绕该集成的配置流程、可用动作(Actions)、Webhook 事件、评论通道与 API 限制展开。读者阅读后将掌握如何在 Botpress 工作区中完成 ClickUp 集成的鉴权配置,理解
createTask、updateTask、deleteTask、getListMembers四个内置动作的完整参数与底层 API 调用关系,并了解机器人如何通过 Webhook 实时感知任务创建、更新、删除与评论事件。
集成能做什么:连接聊天机器人到 ClickUp
ClickUp 集成让 Botpress 聊天机器人能够直接操作你的 ClickUp 工作区。官方集成定义(integration.definition.ts)将它的能力概括为 "Create and update tasks, and add comments from your chatbot",即:
- 创建任务:在指定 List 中新建任务,可携带描述、状态、负责人、截止日期与标签;
- 更新任务:修改任务的名称、描述、状态、归档状态、负责人与截止日期;
- 删除任务:按任务 ID 删除任务;
- 查询列表成员:获取某个 List 下所有成员及其邮箱信息;
- 回复任务评论:通过
comment通道,机器人可以直接在任务的评论区发表文本消息; - 接收实时事件:集成启用时自动注册 ClickUp Webhook,将
taskCreated、taskUpdated、taskDeleted、taskCommentPosted等事件实时转发给 Botpress。
换言之,团队可以在聊天工具中通过机器人完成"帮我建一个任务""把某任务状态改为进行中""提醒大家查看某个任务的评论"等操作,而不必频繁切换界面,从而简化项目管理流程、提升团队协作效率。
配置前置准备:获取 API Key 与 Team ID
使用该集成前,需要从 ClickUp 账户中准备两项核心凭证:API Key与Team ID。官方文档(hub.md)给出的步骤如下:
1. 生成 API Key
- 登录你的 ClickUp 账户;
- 进入个人 Profile 设置,选择Apps区块;
- 生成或获取你的 API Key。
API Key 是集成调用 ClickUp API 的唯一凭证,在 Botpress 侧会被保存为集成配置项apiKey,并被封装进 HTTP 请求头中(详见下文"底层实现")。
2. 查找 Team ID
- 打开 ClickUp 工作区,查看左侧菜单栏;
- 复制工作区的 URL,例如
https://app.clickup.com/9011669285/v/s/90112461548; - URL 中最后一段 ID 即为 Team ID,上例中对应
90112461548。
注意:示例 URL 中倒数第二段9011669285是 Workspace ID,而末尾的90112461548才是集成所需的 Team ID,两者不要混淆。
在 Botpress 中配置并启用集成
完成上述凭证准备后,按以下步骤在 Botpress 中启用 ClickUp 集成:
- 进入 Botpress 工作区的Integrations区块;
- 选择ClickUp Integration,打开配置面板;
- 依次填入以下两项配置:
- API Key:上一步生成的 ClickUp API Key;
- Team ID:从工作区 URL 末尾提取的 Team ID;
- 保存配置并启用集成;
- 启用成功后,机器人即可与你的 ClickUp 工作区交互。
从集成定义看(integration.definition.ts),apiKey与teamId均为必填字符串,Botpress 会基于 zod schema 对配置做类型校验。集成启用时(对应 src/index.ts 中的register钩子),会先调用getUser()校验 API Key 是否有效,确认有访问权限后再向 ClickUp 注册 Webhook——也就是说,如果 API Key 无效,集成会直接注册失败,避免留下一个"看起来启用、实际不可用"的集成实例。
内置动作(Actions)详解
集成对外暴露四个动作,均可直接在 Botpress 的画布节点或 LLM 工具调用中使用。动作声明位于 integration.definition.ts,实现位于 src/actions。
createTask:在列表中创建任务
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
listId | string | 是 | 任务要创建到的 List 的 ID |
name | string | 是 | 任务名称 |
description | string | 否 | 任务描述 |
status | string | 否 | 任务状态(如待办/进行中/完成) |
assignees | number[] | 否 | 任务负责人(ClickUp 成员 ID 数组) |
dueDate | string(ISO datetime) | 否 | 截止日期 |
tags | string[] | 否 | 任务标签 |
输出:{ taskId: string }
实现要点(createTask.ts):动作会把 ISO 格式的dueDate字符串通过new Date(dueDate).getTime()转换为毫秒级时间戳,再交给ClickUpClient.createTask调用 ClickUp 的POST /list/{listId}/task接口,最终返回新任务的taskId(由 ClickUp 返回的数值型 ID 转为字符串)。
updateTask:更新任务详情
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskId | string | 是 | 要更新的任务 ID |
name | string | 否 | 任务新名称 |
description | string | 否 | 任务新描述 |
status | string | 否 | 任务新状态 |
archived | boolean | 否 | 是否归档 |
assigneesToAdd | number[] | 否 | 需要新增到任务的成员 |
assigneesToRemove | number[] | 否 | 需要从任务移除的成员 |
dueDate | string(ISO datetime) | 否 | 新截止日期 |
输出:{ taskId: string }
实现要点(updateTask.ts):assigneesToAdd与assigneesToRemove会被合并为{ add: [...], rem: [...] }结构,dueDate同样转换为毫秒时间戳,最终通过PUT /task/{taskId}提交。所有字段均可选,未传入的字段不会在请求体中携带。
deleteTask:删除任务
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskId | string | 是 | 要删除的任务 ID |
输出:{}(无返回数据)
实现调用 ClickUp 的DELETE /task/{taskId}接口(deleteTask.ts)。删除是不可逆操作,建议在画布逻辑中增加确认环节。
getListMembers:获取列表成员
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
listId | string | 是 | 要查询成员列表的 List ID |
输出:members: { id: number; username: string; email: string }[]
实现调用 ClickUp 的GET /list/{listId}/member接口(getListMembers.ts)。该动作常与createTask配合使用:先查询列表成员拿到合法成员 ID,再把这些 ID 作为assignees传入建任务动作,避免传入无效的负责人。
动作的公共封装
四个动作都通过 action-wrapper.ts 统一封装:每个动作执行前会记录Running action "xxx"的调试日志(含 botId 与输入),执行时通过toolFactories注入基于当前集成配置创建的ClickUpClient实例;一旦底层调用抛错,会使用createAsyncFnWrapperWithErrorRedaction将异常收敛为sdk.RuntimeError,以Failed to create a new task、Failed to update the task等自定义消息返回给调用方,避免向用户暴露底层 API 细节。
事件与 Webhook:实时感知任务变化
ClickUp 集成的"实时性"来自 Webhook。集成启用时(src/index.ts 的setWebhook函数)会:
- 调用
GET /team/{teamId}/webhook查询已有 Webhook; - 若存在 endpoint 与当前 Botpress
webhookUrl相同的记录,则更新其为 active 状态并同步事件列表; - 否则新建 Webhook,endpoint 指向 Botpress 分配的回调地址。
注册的事件包括taskCommentPosted、taskCreated、taskUpdated、taskDeleted四种。
所有 Webhook 回调统一进入 handler.ts 分发:
- 请求体先做 JSON 解析,非法 JSON 返回 400;
taskCreated/taskUpdated/taskDeleted:通过client.createEvent向 Botpress 抛出对应事件,payload 为{ id: task_id }。集成定义中声明的三个事件(integration.definition.ts)即与之对应,可在 Botpress 画布中通过"事件"节点监听并驱动后续流程(例如任务创建后自动通知相关人员);taskCommentPosted:转入executeCommentReceived处理(见下节)。
评论通道:让机器人参与任务讨论
集成定义了一个名为comment的通道(integration.definition.ts),支持text文本消息。通道实现位于 channels.ts:机器人发送文本时,会调用 ClickUp 的POST /task/{taskId}/comment接口,以当前 API Key 对应的账户身份在任务下发表评论(notify_all为 false),并从返回结果中取出评论 ID 作为消息标签id回执。
与"机器人发评论"相对的是"接收用户评论"。Webhook 中的taskCommentPosted事件由 executeCommentReceived.ts 处理,其逻辑是:
- 先获取当前机器人账户信息,跳过机器人自己发出的评论(避免回声循环);
- 对每条评论历史记录,按
user.id创建/复用 Botpress 用户,按task_id创建/复用comment通道下的会话(会话标签taskId即任务 ID); - 将评论内容写入 Botpress 消息,使机器人的对话引擎可以把"任务评论"当作普通消息来处理。
由此形成闭环:团队成员在 ClickUp 任务下留言 → 事件进入 Botpress → 机器人可以感知并基于知识库或 LLM 自动回复 → 回复内容通过comment通道写回 ClickUp 评论区。
底层实现:ClickUpClient 与 API 调用关系
所有 ClickUp API 调用集中在 client.ts 的ClickUpClient类中,它基于axios构建,baseURL为https://api.clickup.com/api/v2,每个请求携带Authorization: <apiKey>请求头。主要端点映射如下:
| 方法 | HTTP 端点 | 用途 |
|---|---|---|
getUser | GET /user | 校验凭证、获取当前用户 |
listWebhooks | GET /team/{teamId}/webhook | 查询已注册 Webhook |
createWebhook | POST /team/{teamId}/webhook | 注册 Webhook |
updateWebhook | PUT /webhook/{webhookId} | 更新 Webhook |
createComment | POST /task/{taskId}/comment | 发布任务评论 |
createTask | POST /list/{listId}/task | 创建任务 |
getTask | GET /task/{taskId} | 查询任务 |
updateTask | PUT /task/{taskId} | 更新任务 |
deleteTask | DELETE /task/{taskId} | 删除任务 |
getListMembers | GET /list/{listId}/member | 查询列表成员 |
集成包依赖axios ^1.7.7以及@botpress/sdk、@botpress/common、@botpress/client(见 package.json),并提供了check:type(tsc 类型检查)、check:bplint、build、test(vitest)等标准脚本。如果你想在本地查看或扩展该集成,可阅读其 集成定义 与 入口文件。
平台限制与最佳实践
官方文档(hub.md)明确说明,ClickUp 集成受平台 API 限制约束,主要包括:
- 速率限制(Rate Limits):每个工作区限制为每分钟 100 次请求、每秒钟 10 次请求;
- 请求体大小限制(Payload Size):API 调用存在大小限制,发送的数据需符合 ClickUp 的规格要求。
这些限制意味着:
- 批量操作要控速:当机器人需要一次性创建/更新大量任务时,应避免在短时间内密集调用,可在流程中引入节流或分批策略,防止触发限流导致任务失败;
- 长文本要精简:写入任务描述或评论的文本不宜过长,超出载荷上限的请求会被拒绝;
- 失败要可观测、可重试:得益于动作封装层的错误收敛(action-wrapper.ts),限流等异常会以明确的错误消息返回给流程,便于在画布中设计"重试"或"告警"分支;更稳妥的做法是配合指数退避在外部编排层实现自动重试。
关于速率限制的完整规则与最佳实践,ClickUp 官方开发者文档中有更详细的说明,集成使用者可在遇到 429 等限流响应时查阅官方文档并据此调整调用节奏。
小结
Botpress 的 ClickUp 集成把"项目管理后台"与"对话机器人"打通:通过apiKey+teamId两步配置即可启用;createTask、updateTask、deleteTask、getListMembers四个动作覆盖了任务生命周期管理;Webhook 与comment通道则让机器人既能实时感知任务变化,也能直接参与任务评论讨论。结合官方给出的速率限制(每工作区每分钟 100 次、每秒 10 次),在实际流程设计中为批量操作预留节流与重试空间,即可稳定地把 ClickUp 协作能力嵌入团队日常对话中。
- AI 应用
- 后端
【免费下载链接】botpress
The open-source hub to build & deploy GPT/LLM Agents ⚡️
相关推荐
Botpress Asana 集成接入指南:用聊天机器人管理项目与任务
Botpress Asana 集成接入指南:用聊天机器人管理项目与任务 本篇技术指南讲解 Botpress 官方 Asana 集成( integrations/
AI 应用后端Botpress Trello 集成实战指南:让聊天机器人直接创建、更新卡片并订阅看板事件
Botpress Trello 集成实战指南:让聊天机器人直接创建、更新卡片并订阅看板事件 Botpress 的 Trello 集成(当前仓库版本为 2.1.3
AI 应用后端10 分钟搭好 Syncthing 中继服务器:strelaysrv 部署、公共池与私有中继两条路线
10 分钟搭好 Syncthing 中继服务器:strelaysrv 部署、公共池与私有中继两条路线 两台 Syncthing 设备都躲在 NAT 后面,直连死
网络通信存储
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考