支出策略控制平面 · 不托管密钥与资金 · 边车(sidecar)由你运行
给 AI 智能体的公司卡和报销制度。
spendctl 是面向 AI 智能体的支出策略控制平面:在每一个钱包和每一种 HTTP 402 协议上统一执行预算、审批、收据和链路追踪——由你自己运行的边车(sidecar)强制执行,绝不托管你的密钥或资金。
5 分钟上手,无需密钥、不上链——自带模拟 facilitator。
$ # The agent may spend $0.03/day on weather. Over that, a human decides. $ spendctl budget researcher enforce · max $0.05/request · approval ≥ $0.50 daily $0.00 of $0.03 $0.03 left monthly $0.00 of $20.00 $20.00 left $ node ../agent.mjs & # an agent with no keys, asking for 4 paid calls [1] 66461 agent ✔ Tokyo: paid $0.01 — sunny, 18°C agent ✔ Kyoto: paid $0.01 — cloudy, 19°C agent ✔ Sapporo: paid $0.01 — light rain, 20°C agent ‖ Osaka: spendctl is holding this request until a human decides $ spendctl pending ID AGENT ENDPOINT AMOUNT EXPIRES WHY apr_mvmp68jvjnsmy6 researcher localhost:4021/weather $0.01 595s $0.01 would exceed the daily budget of $0.03 $ spendctl approve --latest ✔ approved apr_mvmp68jvjnsmy6 agent ✔ Osaka: paid $0.01 (approved by a human) — clear, 21°C [1]+ Done node ../agent.mjs $ spendctl ledger TIME (UTC) ID AGENT ENDPOINT USD STATUS TX / REASON 10-24 17:53:19 pay_mvmp68ju3jze4c researcher GET localhost:4021/weather $0.01 settled 0x0d2aa1e97a887… 10-24 17:53:19 pay_mvmp68jbbn6exg researcher GET localhost:4021/weather $0.01 settled 0x6c0acb888dc4d… 10-24 17:53:19 pay_mvmp68in2q3dka researcher GET localhost:4021/weather $0.01 settled 0x8265dc5b3ae92… 10-24 17:53:19 pay_mvmp68g8nvwcj3 researcher GET localhost:4021/weather $0.01 settled 0xe68f3a8554452… $ spendctl export --format csv --out receipts.csv # for the expense report ✔ wrote 4 row(s) to receipts.csv $
- $ spendctl budget → researcher: daily $0.00 of $0.03 · max $0.05/request · approval ≥ $0.50
- $ node ../agent.mjs & # an agent with no keys, asking for 4 paid calls
- agent ✔ Tokyo: paid $0.01 — sunny, 18°C
- agent ✔ Kyoto: paid $0.01 — cloudy, 19°C
- agent ✔ Sapporo: paid $0.01 — light rain, 20°C
- agent ‖ Osaka: spendctl is holding this request until a human decides
- $ spendctl pending → apr_mvmp68jvjnsmy6 · $0.01 · 595s · $0.01 would exceed the daily budget of $0.03
- $ spendctl approve --latest → ✔ approved apr_mvmp68jvjnsmy6
- agent ✔ Osaka: paid $0.01 (approved by a human) — clear, 21°C
- $ spendctl ledger → 4 rows, all settled, each with a tx hash
- $ spendctl export --format csv --out receipts.csv → ✔ wrote 4 row(s) to receipts.csv
提示词不是支出控制
x402 规范把客户端预算列为范围之外,SDK 的限额运行在智能体自己的进程里,官方客户端会照付服务器要求的金额(x402#3866)。开发者们这样说:
“The trust unit is the policy, not the payment.”信任的单位是策略,而不是付款。
“Asking the assistant to follow instructions more carefully does not provide a dependable spending control.”让助手“更仔细地遵守指令”,并不能成为可靠的支出控制。
“I gave openclaw a bitcoin wallet and $100 to spend. ... With in minutes it had spent all the budget buying fake follows on an X account that was similar to mine.”给了它一个比特币钱包和 100 美元,几分钟内就全花在给一个和我很像的 X 账号买假粉丝上。
工作原理
智能体发起请求
智能体通过 spendctl 调用 API,自己不持有密钥。
卖方返回 402
spendctl 读取 x402(v1/v2)或 MPP 的价格,并对照该智能体的策略。
策略做决定
允许;附模型可读的理由拒绝;或通过 CLI、Slack、审批链接等待人工决定。
只付一次并记账
原子化预留预算,钱包只签一次,收据和交易哈希写入账本。
绝不打破的规则
每条都是端到端场景,每次 CI 运行两遍。
- 会超出预算的付款绝不签名
- 白名单之外的主机绝不付款
- 收款地址被替换或价格暴涨 10 倍需要人工确认
- 并发请求也不会超出预算,哪怕一笔
- 智能体无法自行附加、重放或批准付款
- 结算失败的付款绝不悄悄重试
支持
任何语言都可用的网关 URL、零依赖的 fetch 封装和 MCP 服务器。
- x402 v1 / v2
- Stripe MPP
- MCP
- Claude Agent SDK
- OpenAI Agents SDK
- LangGraph
- Coinbase CDP wallets
- Base
价格
Free 包含边车(sidecar)的全部执行功能,无需信用卡。Pro 和 Team 加上 spendctl 控制平面——Slack 审批、托管账本、定时导出、SSO、共享预算。控制平面仍在开发中,Pro 和 Team 在上线前为创始预购。
Free
无需信用卡,包含全部执行功能。
- 2 个智能体 · 1 条策略 · 1 个席位
- 每月 1,000 笔受管付款
- 本地账本 + CSV / JSON 导出,托管副本保留 7 天,本地沙盒
- CLI / Webhook 审批
- 到达上限即停止,不产生超额费用
Pro
创始预购——控制平面开发中。
- 10 个智能体 · 3 个席位
- 每月 25,000 事件
- 托管账本保留 90 天
- Slack / Discord 审批
- 定时导出 + 会计模板
Team
创始预购——控制平面开发中。
- 不限智能体数量
- 每月 500,000 事件
- 1 年不可篡改账本
- SSO / RBAC,共享预算
- 跨边车链路追踪、策略即代码 CI、区域固定
创始价仅限前 100 名成员,自 GA 起锁定 12 个月。Pro 和 Team 超额按每 10 万事件 $5 计。Team 提供 14 天试用,无需信用卡。永不按支出比例收费。
锁定创始价
选择套餐和许可证将携带的组织 id,然后在 Stripe 付款。密钥会在一分钟内发到邮箱。
抢先体验控制平面
spendctl 控制平面上线时只发一封邮件,不发订阅邮件。
常见问题
私钥放在哪里?
永远不在智能体里。默认用 Coinbase CDP 服务器钱包签名,私钥不离开 CDP,你的机器只发出 EIP-712 签名请求。环境变量里的原始私钥仅在显式选择时使用。
被提示词注入的智能体能让它付款吗?
能让智能体“提出”付款,但改变不了结果。预算、白名单、收款地址锁定和审批阈值都在模型无法编辑的策略文件里,由独立进程判定。
伪造的 402 或被替换的收款地址怎么办?
策略针对你实际请求的主机判定,而不是 402 自称的 URL。可以按主机锁定收款地址、限制首次付款金额,并在价格突变时要求人工确认。
会重复付款吗?
每个决定最多签名一次;失败后绝不重发已签名的付款;按 Idempotency-Key 去重;卖方支持时使用 x402 的 payment-identifier 扩展。无法确定结果的付款标记为 unknown,并在核对前计入预算。
x402 没有退款,怎么自保?
在付款前缩小风险范围:白名单、锁定收款地址、降低单次上限、新收款方和涨价需审批,并保持钱包余额较低。账本保留交易哈希和签名收据,可作为争议证据。
你们托管资金吗?
不托管。签名在你自己运行的边车(sidecar)里完成,针对的是你自己的钱包——Coinbase CDP 服务器钱包或你自己的密钥。spendctl 绝不持有密钥或资金;资金从你的钱包直接链上转给卖方。控制平面(开发中)只保存策略、审批和账本,不保存密钥或资金,也绝不转发签名。非法律意见。
账本能用于记账吗?
每行都有 UTC 时间、智能体、端点、金额、资产、网络、收款方和交易哈希,可导出 CSV/JSON。USD 金额按稳定币 1:1 估算,税务处理请咨询会计师。
为什么不直接用 Stripe、钱包策略或 SDK 的限额?
可以一起用——spendctl 位于它们之前。SDK 限额运行在智能体内部且只限单笔;钱包策略只覆盖自家密钥(而且常常不覆盖 x402 的 typed-data 签名);托管平台只能管理它们托管的那个钱包。限额本身在 Coinbase 和 AWS 的自家工具里已经免费——缺的是跨越所有这些的一套策略、一条审批流程和一本账本。spendctl 管理你已有的钱包,在你自己运行的边车里执行。
x402 和 MPP 一直在变,会不会坏?
协议格式封装在复用官方 SDK 编解码的小适配器里,已同时支持 x402 v1 和 v2;上游规范变化时,每周的 CI 任务会自动开 Issue。