Agent 付费调用:Bedrock AgentCore Payments 与 x402 的工程拆解
Agent 需要调用收费 API 时,传统做法是把长期密钥放进服务端配置,再由业务代码统一扣费。这种方式能工作,却很难回答三个问题:哪一次调用产生了费用、Agent 是否只被允许支付预期金额、支付失败后能否安全重试。
本文把 AWS 对 Amazon Bedrock AgentCore 的产品能力与 x402 的 HTTP 支付协议放在同一张工程图里讨论。具体 API 名称、支持的网络和费率会随官方版本变化,接入前应以 AWS 与 x402 官方文档为准。
1. x402 解决的是 HTTP 层握手
x402 借用了 HTTP 402 Payment Required:客户端请求资源,服务端返回支付要求;客户端完成链下或链上支付后,携带支付证明重试同一请求。核心不在“自动扣款”四个字,而在于把支付要求变成机器可读的协议步骤。
一个简化的交互如下:
Agent -> GET /summarize
<- 402 + payment requirements
Agent -> payment provider/wallet
<- signed payment proof
Agent -> GET /summarize + payment proof
<- 200 result
生产实现必须校验支付证明的受益方、资产、网络、金额、过期时间和 nonce,不能只看到“支付成功”字符串就放行。
2. AgentCore 的边界应该放在哪里
AgentCore 适合作为 Agent 运行时与安全边界:身份、工具调用、会话和 trace 由受控服务承接。支付编排可以放在工具适配层,而不是让模型直接构造交易:
- 工具适配器读取服务端返回的支付要求;
- 策略引擎检查服务、预算、金额和允许网络;
- 只有通过策略的请求才调用支付提供方;
- 以 request id、payment id 和 trace id 关联支付与业务结果;
- 失败时把“未支付、已支付但业务失败、状态未知”分开处理。
伪代码只表达边界,不代表 AWS 或 x402 的可直接运行 SDK:
def call_paid_tool(req, policy, payer):
challenge = req.get_payment_requirements()
policy.check(
service=req.service,
amount=challenge.amount,
network=challenge.network,
budget=req.run_budget,
)
proof = payer.authorize(challenge)
return req.retry(payment_proof=proof)
3. 幂等、预算和人工刹车
支付调用不能沿用普通 API 的“失败就重试”。客户端应使用幂等键,并记录支付证明的唯一标识;在状态未知时先查询支付状态,禁止盲目再次付款。预算至少分为单次上限、单 Agent run 上限和租户日上限。
一个可审计的事件应包含:trace_id、request_id、服务标识、报价摘要哈希、策略版本、支付证明哈希、业务响应状态和时间戳。不要把私钥、完整钱包凭据或可重放的支付材料写入日志。
4. 失败矩阵
| 场景 | 安全动作 | 是否重试 |
|---|---|---|
| 402 要求过期 | 重新获取报价 | 可以,重新评估预算 |
| 支付明确失败 | 返回可解释错误 | 仅在新报价下 |
| 支付成功、业务超时 | 查询业务幂等状态 | 不直接再次付款 |
| 支付状态未知 | 进入人工或后台对账 | 禁止盲付 |
| 金额/网络不符合策略 | 拒绝 | 不重试 |
结语
x402 提供的是支付握手,AgentCore 提供的是运行时治理边界;两者组合仍需要预算、幂等、密钥隔离和对账系统。本文没有执行真实支付,也没有给出费率或网络支持的承诺。
参考来源:
- Amazon Bedrock AgentCore:https://aws.amazon.com/bedrock/agentcore/
- x402 文档:https://docs.x402.org/
- HTTP 402 状态码:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402
