ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

如何用 Vercel cron 和 Composio 会话搭建按日程生成日报的 Slack 机器人

2026/9/12 6:09:17 拓冰建站 浏览量
如何用 Vercel cron 和 Composio 会话搭建按日程生成日报的 Slack 机器人 如何用 Vercel cron 和 Composio 会话搭建按日程生成日报的 Slack 机器人【免费下载链接】composioComposio powers 1000 toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio目标是一个每天在固定时间运行的 Slack 机器人Vercel cron 按 30 分钟一个槽位触发到点的成员会收到一条带Draft按钮的提醒点一下 Draft机器人就为这个成员创建一个 Composio 会话tool-router session让子代理从该成员已连接的工具GitHub、Linear、Notion 等里调研并写出一份日报草稿成员确认后再以他本人身份发布到当天的站会线程里。整个服务部署在 Vercel 上只有两个 serverless function——一个 cron、一个 interactivity handler没有常驻服务器。前提条件示例文档明确列出一个 Composio API key、一个可以安装应用的 Slack workspace、装了 Node 和本地 tsx 的运行环境。项目需要的包composio/core、composio/vercel、ai、dayjs。整体流程是确定性的除起草环节外不让 agent 做决定cron 触发后先查找或创建当天的站会线程再给每个到点的成员私聊发提醒菜单按钮点击走/api/interactivity只有Draft这一个动作会拉起子代理写稿。准备注册自己的 Slack 应用并创建 auth config这个示例走的是 white-labeling 路径机器人以自己的 Slack 应用身份自己的名字、头像发帖而不是用 Composio 托管的应用。官方文档明确提示这不是最省事的路径——如果不需要自己的品牌Composio 托管应用可以零配置完成只有确实想用自己的 app 时才走下面这些步骤。Slack 的建应用界面会变化以实际界面为准。步骤如下详见 standup-slackbot 示例从零创建应用在 Slack 开发者网站api.slack.com/apps点Create an App选From scratch给应用命名例如Daily Standup Bot选择你的 workspace。添加 Bot Token Scopes在OAuth Permissions下添加chat:write、im:write、channels:history、channels:read、users:read、users:read.email、team:read然后打开Interactivity把 Request URL 指向你部署后的/api/interactivity。复制凭证在Basic Information页复制Client ID和Client Secret。Composio 会拿这两个值以你的应用身份驱动 OAuth。Composio 里有两个容易混淆的 Slack toolkit示例文档 的说明slackbot认证 Slack应用以机器人身份bot token行动。发提醒、发草稿用的是它white-label 也是它。slack认证个人用户以该成员身份user token行动。每个成员连上它后机器人才能以成员本人名字发布日报、读取成员活动。创建 auth config 的操作路径在 Composio dashboard 点Create Auth Config搜索slackbot选Slackbot不是Slack认证方式选OAuth 2.0→Your Own Credentials粘贴上一步的 Client ID 和 Secret并把team:read加进 user token scopes。创建成功后把它的ac_...id 复制下来后面存进环境变量COMPOSIO_SLACKBOT_AUTH_CONFIG_ID。一次性连接机器人运行 setup 脚本机器人自己也要先连上 Composio这一步只做一次。示例项目提供scripts/setup.ts见 手动认证文档 的session.authorize()waitForConnection()流程npx tsx scripts/setup.ts运行前需要四个环境变量示例项目用.env.localapi/_utils/env.ts在 import 时校验缺失变量并直接报错部署配置错误会快速失败。四个必选项来自示例源码api/_utils/env.ts# .env.local值为你自己的凭证按需替换 COMPOSIO_API_KEY你的Composio项目API key COMPOSIO_SLACKBOT_AUTH_CONFIG_ID上一步的ac_...id SLACK_SIGNING_SECRETSlack应用的signing secret CRON_SECRETVercel cron调用时携带的共享密钥首次运行脚本会打印一个授权链接并阻塞等待文档示例输出✅ Auth config has the required user scopes. · Bot is not connected yet. Generating an authorization link… Open this URL in your browser to authorize the bot: https://backend.composio.dev/s/AbC123xy Waiting for you to complete the OAuth flow (CtrlC to abort)… ✅ Bot connected to Slack.在浏览器里打开链接批准机器人脚本打印 Setup complete 即完成接下来把机器人拉进站会频道、确认 Slack 应用的 Interactivity Request URL 指向https://你的部署域名/api/interactivity。脚本是幂等的漏了 scope 或连接出问题加--reconnect重跑——副作用是它会先删除已有的slackbot连接再重新走一遍 OAuth。配置日程standup.config.ts 与 Vercel cron示例项目把团队、日程和工具目录放在standup.config.ts密钥不放在这里只放.env.local。按源码需要编辑的关键项// 团队成员slackEmail 用于查找 Slack 用户和 Composio 连接 // standupTime / standupTimezone 可逐人覆盖格式 HH:MM 24h IANA 时区 export const team: Member[] [ { slackEmail: youexample.com, githubUsername: your-handle }, { slackEmail: albertoexample.com, githubUsername: alberto-handle, standupTimezone: Europe/Rome }, ]; export const standupChannel #standup; // 日报草稿只统计这个 org 的 GitHub 活动 export const GITHUB_ORG your-github-org; // 默认站会时间/时区以及 cron 槽位粒度 export const DEFAULT_STANDUP_TIMEZONE America/Los_Angeles; export const DEFAULT_STANDUP_TIME 10:00; export const CRON_SLOT_MINUTES 30; // true 时每个成员在每次 cron 运行都“到点”生产环境必须为 false export const DEMO_MODE false; // 写稿模型经 Vercel AI Gateway 调用 export const MODEL anthropic/claude-sonnet-4-5 as const;TOOLKITS数组是成员可以连接的工具目录github、linear、notion、googlecalendar、googlemeet、zoom、granola_mcp、slack每项的draftInstruction会被注入起草提示词不想要的直接删掉即可。cron 侧的工作机制来自示例源码api/cron/standup.ts和api/_utils/schedule.ts的注释与逻辑按源码注释cron 在工作日每 30 分钟运行一次成员在「其自己时区下 standupTime 所在的那个 30 分钟槽位」被判定为到点isMemberDue。cron 入口校验请求头Authorization: Bearer ${CRON_SECRET}不匹配直接返回 401。每个日历天共用一个线程按团队默认时区定「今天」先扫最近 200 条消息找当日父消息找不到就新建一条。源码注释说明高流量频道可能把这 200 条窗口挤穿生产 bot 应分页或持久化 thread ts。没有成员到点时返回 200 和no members due this slot频道找不到机器人不是频道成员返回 500 和Channel ... not found. Is the bot a member?——这两个响应也是判断 cron 是否正常工作的依据。起草环节Composio 会话 手动工具执行按钮交互的处理逻辑api/interactivity.tsSlack 点击按钮后 POST 到/api/interactivity先用SLACK_SIGNING_SECRET校验签名v0 HMAC-SHA2565 分钟重放窗口在 Slack 的 3 秒窗口内先 ack慢活AI 起草、OAuth 链接、发帖交给waitUntil在响应发出后继续执行。发消息走手动工具执行确定性流程中的消息收发用 Composio 的SLACKBOT_SEND_MESSAGE和SLACKBOT_UPDATES_A_MESSAGE手动执行工具文档。SLACKBOT_SEND_MESSAGE接受 Block Kit 的blocks所以带交互按钮的提醒也是经工具发出的没有对应工具的 Slack 端点比如打开 modal 的views.open则落到proxyExecute以已连接账号身份调用任意 Slack Web API 端点代码里不出现 token。写稿才是会话出场的地方。成员点 Draft 时api/_utils/composio.ts和api/_utils/agent.ts做两件事创建一个作用域限定到该成员已连接 toolkit 的 tool-router sessionexport async function createToolRouterSession( memberEmail: string, toolkitSlugs: string[] ) { return composio.create(memberEmail, { toolkits: toolkitSlugs, manageConnections: false, }); }manageConnections: false会移除会话里的连接管理 meta-tools默认会话包含COMPOSIO_MANAGE_CONNECTIONS见 手动认证文档。这样 agent 只能基于成员已经连上的工具写稿碰到没连的工具直接跳过而不是中途弹 OAuth 提示会话本身也只暴露成员实际连接过的账号的工具。用 Vercel AI SDK 让模型驱动会话的 meta-tools 调研并成文Vercel AI SDK provider 文档const session await createToolRouterSession(member.slackEmail, connectedSlugs); const tools await session.tools(); const { text } await generateText({ model: MODEL, // anthropic/claude-sonnet-4-5经 Vercel AI Gateway system: buildDraftPrompt(member, lookbackWindow(member.standupTimezone), connectedSlugs), prompt: Research and write ${member.githubUsername}s standup update., tools, stopWhen: stepCountIs(40), });回看窗口由lookbackWindow决定周一往前数到上周五其余日子往前一天按成员自己的时区计算lookbackWindow在api/_utils/schedule.ts。提示词里还要求 GitHub 检索必须限定在GITHUB_ORG组织内、输出 2 到 5 条单行更新、无活动时固定回复 No tracked activity ...。草稿发回成员私聊后带Confirm Post和Edit按钮Confirm 用成员个人的slack连接SLACK_SEND_MESSAGEuserId 为成员邮箱以他本人身份把日报发进当天线程成员没连个人 Slack 时退化为给一段可复制的文本加线程链接。部署与验证部署只有一条命令示例文档 Run it 一节编辑好standup.config.ts、配好四个环境变量、跑过一次npx tsx scripts/setup.ts之后执行vercel deploy。文档给出的验证判据按顺序是setup 脚本打印 Bot connected to Slack 和 Setup complete见上面的示例输出cron 被触发时有成员到点则返回 200 且 JSON 里含threadTs、threadUrl和每个成员的results状态reminded或带原因的错误无成员到点返回no members due this slot到点的成员在 Slack 私聊收到带Draft按钮的提醒即开头第一张图点 Draft 后私聊消息被替换为草稿第二张图点Confirm Post后成员名下出现在当天站会线程中。边界与限制这是一个「deliberately advanced」的参考实现背景代理 确定性手动执行 预连好的手动认证。它不是in-chat / 动态授权运行中让用户连接工具的示例想要零配置或聊天中授权的 Slack bot官方指向的是 general Slack bot 示例。white-labeling 比托管应用多注册、多配置自己的工作slackbot机器人身份和slack个人身份两个 toolkit 都用到混用会破坏「以谁的身份发帖」的行为。草稿只基于成员已连接的工具没连的直接跳过不会引导授权想加数据源就改TOOLKITS目录和对应draftInstruction。找当日线程用的是 200 条消息窗口高流量频道下需要自行分页或持久化 thread ts源码注释明确这是生产 bot 要做的事。相关文档standup-slackbot 示例、配置会话、手动认证、Vercel AI SDK provider。【免费下载链接】composioComposio powers 1000 toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考