convex-cost 是一个用于预览 Convex 应用花费的 Agent Skill。它的出发点是:成本意外往往来自少数几个读取数据远超预期的函数——这与 convex-advisor 为性能标记的读密集模式相同,只是换成「钱」的视角来看。该能力让花费变得可读:读取部署自身的 bytes/documents-read 证据,归因到驱动它的函数,预测其随流量增长的方式,并指出最便宜的修复方案。它还带有 confirm-cost 纪律(Supabase 针对付费动作的结构化同意机制):在任何计量操作之前,先说明价格并获得明确同意。
工作流程
GUARD:deploy-guard——成本读取对 dev/prod 是只读的(insights 仅限云端 + 用户鉴权,不适用于预览环境)。先声明部署对象。
GATHER:通过官方 MCP 收集花费证据——用 insights 获取 bytes-read / documents-read 事件(直接成本信号,Convex 按函数调用 + 带宽计费),用 tables 获取行数(表的大小决定其扫描成本的上限),用 functionSpec 了解接口面。如果目前还没有用量/流量,就说明这一点,转而从查询 SHAPES 估算(对一个预期会增长的表执行 .collect(),即使今天零流量也是未来成本)。
ATTRIBUTE:按「每次调用读取的 bytes/documents × 观察到的(或被问及的)调用量」对函数排序——乘积才是成本驱动,单看任一因子都不够。一个每次调用便宜但被频繁调用的函数,可能超过一个昂贵但很少调用的函数;两个因子都要展示。
PROJECT:说明头部驱动如何随规模变化——全表 .collect() 随表线性增长(成本随数据积累而复合);带索引的 .take(n) 保持平坦。给用户曲线的形状(例如「这是每次调用 O(表大小)——1k 行时没问题,1M 行时就是账单」),而不是虚假精确的美元数字。
NAME THE CHEAPEST FIX:为每个驱动给出最便宜的修复——用索引 + .withIndex 代替扫描,用 .paginate/.take 代替 .collect,用 aggregate 组件做计数,缓存热读——并作为 cost-class 发现发布到 bus 上(证据:insight 事件 + 预测增长),指向 convex-expert/convex-advisor 去执行实际修改。
CONFIRM-COST:对付费动作,如果流程中包含任何计量项(购买域名、云资源开通、套餐变更),必须明确说明价格与周期性,并在继续之前获得明确同意——绝不让付费动作作为副作用发生(即 cost-confirm 门)。
REPORT:列出当前成本驱动排名,每个都带证据 + 增长形状 + 修复方案,并给出直白结论(例如「你的花费主要由 messages:list 每次调用读取整表造成;加索引后可下降约 100 倍」)。诚实精度:Convex 定价会变化且取决于套餐——给出相对/形状指导,绝对数字请引用定价页面,而不是编造一个美元总额。
规则
成本 = 每次调用的数据读取量 × 调用量——始终展示两个因子;一个便宜但被频繁调用的函数可能比一个昂贵但罕见的函数更贵。
读取部署自身的 insights/bytes-read 证据来评估花费;尚无流量时,对查询 SHAPES 定价(在增长的表上做扫描就是未来成本)。
给出增长曲线而非虚假精确的美元:O(表大小) 的扫描随数据积累而复合;带索引的访问保持平坦。绝对数字请引用定价页面。
每个成本驱动都要点名其最便宜的修复,并发布 cost-class 发现到 bus 上,指向修复方(convex-expert/advisor)。
对任何计量/付费动作执行 confirm-cost:在发生之前说明价格 + 周期性并获得明确同意——绝不能作为副作用发生。
对 dev/prod 只读(deploy-guard);insights 仅限云端 + 用户鉴权。成本能力复用 convex-advisor 的证据,但把它框定为金钱,而非延迟。