用途
spend-watch 是一个自主运行的云成本分析技能,面向 Neon、Vercel、Railway 和 GitHub Actions 四个平台。它的定位是成本分析师而非账单告警器:每次运行针对每个平台回答三个问题——归因(什么在消耗最多)、根因(为什么这一项昂贵)、建议(按优先级排序的行动清单)。
主要能力
- 归因:按美元(或映射到美元的资源单位)对成本驱动因素排序,细化到具体对象,如服务、分支、路由、RPC 方法、工作流,并给出 Top-N 及每行的占比。
- 根因分析:解释某一行为何昂贵。
- 建议:输出排序后的行动清单,每项包含具体杠杆、投入/风险标签、当前是否可 arm,以及节省金额。
- 跨平台汇总:在 all 模式下,汇总计费暴露的真实支出(Railway 美元、Actions 美元)、任意平台中信号排名最高的驱动因素,以及全舰队范围的顶级行动。不合成总额。
- 状态账本与去重:每个适配器读写 memory/state/spend-<platform>.json,记录驱动因素和已发送建议,避免重复提醒(默认冷却 14 天)。
核心规则:只有真实美元才报美元
仅当平台计费 API 返回真实美元时才给出金额(Railway 的 customer.currentUsage、Actions 的 netAmount/超额费用)。其他情况下 real_usd / saving_usd 为 null,改用真实信号(如 idle-awake 71%、超出包含配额 18%、过期预览 300 个、失败率 51%、RSS 为工作集的 4.6 倍)来排序。技能中不存在任何按费率相乘计算美元的逻辑。建议排序规则:先按真实美元节省(已知时),再按信号量级 × 可操作性(armable > 1-click > code-change > investigate)。
使用方式
变量 ${var} 用于选择范围与可选 arm 标志:
- 空 / all → 扫描所有存在密钥的平台,输出一份合并摘要。
- neon | vercel | railway | actions → 仅运行一个适配器。
- 前缀 arm:(如 arm:neon、arm:actions)→ 授权该适配器本次运行的安全写操作。不带 arm: 时技能为只读,只建议、不修改。
- 任意位置附加 dry-run → 构建摘要但不发送通知(用于测试)。
运行无人值守,${var} 视为最终值,无确认步骤;但删除/变更操作始终会先重新读取目标当前状态。
每次运行的共享设置:读取 memory/MEMORY.md 获取上下文,读取 memory/spend-config.md 获取真实美元预算、信号阈值和忽略列表(缺失时使用内置默认值并记录 NO_CONFIG);读取最近 7 天 memory/logs/ 以识别新增昂贵驱动因素并避免重复提醒;解析 ${var}。
通知严重级别门控:critical 仅限真实美元突破(Railway currentUsage 超过预算或 usageLimit,或 Actions 超出全局包含配额产生真实超额费用);warn 为存在可操作建议,或驱动因素趋势上升/新增超过配置的 alert_share_pct;info 为无需行动,不发送任何内容,仅记录日志。dry-run 完全抑制发送。
各平台适配器
GitHub Actions(构建优先,可行性最高):Aeon 运行在 GitHub Actions 上,此适配器优化代理自身的运行器账单。认证使用 gh(环境变量 GH_GLOBAL 作为 GH_TOKEN)。计费是账户级单一池,包含分钟数为全局配额,超额按账户总量计费而非按仓库。预算检查为全局;按仓库仅用于归因。通过 /users/$ME/settings/billing/usage(增强版,按仓库按天行,汇总得全局分钟与净额)、/settings/billing/actions(经典版,total_minutes_used + included_minutes + 按 OS 细分)、/settings/billing/shared-storage 拉取用量。归因时对计费行中出现的每个仓库拉取 cache/usage、artifacts、runs。根因启发式包括:某仓库/工作流主导池、macOS/Windows 作业无 OS 特定需求、过于频繁的 cron、长保留期大体积产物、工作流平均时长攀升。arm 时可删除过期产物(默认 14 天)或对最大池消耗工作流提 PR 调整 cron(每次运行一个 PR,不强制合并,不降低配置标记 pin: 的计划)。
Neon(可行性高):认证使用 NEON_API_KEY,基址 https://console.neon.tech/api/v2。拉取项目、分支、端点(suspend_timeout_seconds、autoscaling_limit_min_cu/max_cu)和消费历史(compute_time、active_time、storage、data_transfer)。低版本计划不返回可计费美元(consumption_history 为 Scale 计划门控,返回 403),因此该适配器仅基于信号,无美元数字。按信号排序驱动因素:idle-awake %、compute-hours 占比、storage GB-hrs、max_cu 余量。启发式建议包括:降低 suspend_timeout_seconds 至 60s、缩小自动扩缩上限、删除空闲分支、清理死分支存储。注意:不要将 max_cu 缩小报告为美元节省,Neon 按消耗的 CU 计费,未使用的上限成本为 $0,属于合理配置的卫生信号。arm 时 PATCH 端点或 DELETE 分支(需重新读取确认空闲且非默认/主分支),每次运行一类变更。
Railway(可行性中,只读):认证使用 RAILWAY_TOKEN,仅 GraphQL,端点 https://backboard.railway.com/graphql/v2。需发送类浏览器 User-Agent 头以规避 Cloudflare 1010。令牌可能是工作区/团队令牌(无用户上下文,me 查询返回 Not Authorized),因此从根 projects 查询开始,推导 workspaceId,再从 workspace 读取计费。customer.currentUsage 为本周期美元(非美分);usageLimit 未设上限时为 null。estimatedUsage 接受 workspaceId + measurements,返回按 projectId 归因的行。账户总额为真实美元,但按项目/服务的美元未暴露,因此按 estimatedUsage 分组后的 GB-hrs 占比(信号)排序驱动因素。
Alchemy(已推迟):Alchemy CU 适配器曾规划但于 2026-08-05 移除:账户处于免费层($0 CU 支出,无可优化),且 @alchemy/cli usage 命令使用会过期的 OAuth 会话令牌认证,无法干净地用于 CI。若 Alchemy 支出变得重要,可通过 Alchemy MCP 重新添加。
适用场景
适用于需要持续监控多云平台成本、将支出归因到具体对象、并获得可执行优化建议的团队。特别适合运行在 GitHub Actions 上的代理自身账单优化,以及 Neon、Railway 等平台的用量治理。
限制
- 美元数字仅在平台计费 API 返回真实金额时提供,其他情况仅给信号。
- Neon 低版本计划无美元数据(consumption_history 403)。
- Railway 按项目/服务的美元未暴露,仅能按 GB-hrs 信号归因。
- 默认只读,写操作需显式 arm 授权。
- 删除/变更操作会先重新读取目标状态。
- Alchemy 适配器当前不可用。
- 不合成跨平台总额。