
构建高效的智能体自动化:Anthropic 的参考实现

Anthropic 在这篇文章里介绍如何用 Claude Managed Agents(beta)构建可靠的定时智能体自动化。团队内部经常用这类自动化在后台收集上下文,按计划运行,再主动把需要知道的事推到 Slack。文章基于一个具体的每日简报参考实现:定时读取 Slack 频道和 GitHub PR,追踪上次运行后的变化,把简报发回 Slack。仓库提供了 agent.md、deployment.md、environment.yaml、memory_store_preferences.yaml、memory_store_state.yaml、vault.yaml、claude-lock.json 等配置文件,ant apply 会把它们变成 Claude API workspace 里的资源,运行发生在 Anthropic 基础架构上,本地无需常驻进程。Claude Code 里运行 /claude-api managed-agents-onboard 加文章链接,也能交互式生成这套配置。
六个组件依次是 Sources、Destination、Agent、Schedule、Memory、Guardrails。默认 Source 是 Slack 频道和 GitHub PR,频道和仓库写在 preferences 文件里。凭据放进 vault,代理只能引用真实值,值本身留在沙箱外的 vault 中:GitHub 通过 MCP server 调用,MCP 代理在沙箱外运行,按 URL 匹配 vault 凭据;Slack 用 bash 工具 curl 调 API,沙箱里只有占位符 $SLACK_BOT_TOKEN,请求离开沙箱时平台才替换成真实 token。读取状态用书签而不是固定时间窗:每个源一个时间戳,存在 state memory store 的 bookmarks.json 里,下一次运行从书签继续,因此迟跑不会漏、早跑不会重。若某个源读取失败(MCP server 宕机或 token 过期),agent 仍会运行其他源,但不推进失败源的书签,并在简报末尾写明哪个源不可用,而不是把失败当成“今天没有新内容”。
Destination 是单个 Slack 频道,每次运行发一条带日期的帖子。bash 工具默认不请求批准,slack.com 也在沙箱 allowlist 里,所以帖子无需人工确认即可发出。为避免重复或丢失,agent.md 给了三条规则:先看频道近期消息里有没有今天的标题,有就不发;只有 Slack 返回 ok:true 和 message ts 才算发送成功;确认成功后才更新 ledger 和书签。结果不清楚时把本次运行标为 maybe posted,不改其他记录。
Agent 是一个版本化配置,包含模型、system prompt 和工具。参考实现使用 claude-sonnet-5-5,GitHub MCP server 地址为 https://api.githubcopilot.com/mcp/,web_search 和 web_fetch 被禁用。由于 MCP 工具默认会请求批准而定时任务无人批准,GitHub toolset 设为 always_allow,且 GitHub token 只读。agent.md 还强调简报要短:只有读者今天会行动或会影响近期决策的事项才给一行,拿不准就删;“12 个待审 PR”这类计数不算事项,要列出真正被阻塞的链接;ledger 里已有且仍开着的事项标为 still waiting 继续追踪,不重复报告。发布前还要对每个事项做二次核验,状态变了就修正或删除,绝不模糊表述。
Schedule 放在 deployment.md:cron 为 32 7 1-5,时区 America/New_York,且 body 里明确要求所有日期按读者时区计算,避免服务器时区导致把今早说成昨天。配置完成后可用 ant beta:deployments run –deployment-id 手动触发测试。Memory 分为 preferences(agent 只读,存放频道、仓库、长度上限、停止条件)和 state(agent 读写,存放书签、ledger、运行记录、对 preferences 的修改建议)。每次运行都从 preferences 文件重读,读不到就停下说明,而不是按默认值继续。ledger 记录每条已报告事项的时间、来源、稳定 ID 和最后状态,从而避免重复。Guardrails 方面,能读的地方尽量只读:GitHub token 和 preferences 只读,环境只可达 allowlist 主机,agent 不能写 GitHub、不能改规则;Slack 是唯一例外,因为同一个 token 既读也发。预算上限从正常运行成本的 3 到 5 倍起步,再按真实数据收紧;触及上限会以 budget_reached 暂停而不是失败,所以上限设太低的表现就是简报突然变安静。示例的 budget 字段为 max_list_cost,金额用美分字符串表示。
文章最后把整套做法压缩成六条规则:从书签而非固定时间窗读取;失败读取要明确报告为不可读;发布前重新核验每个事项;只有收到 Slack 确认才更新书签和 ledger;每次运行都重读用户偏好;只读场景给只读权限并给每次运行设预算上限。参考实现应被视为起点,可按自己的源、目标渠道和记忆偏好修改。


