如何用 RiskKernel 为 AI Agent 搭建硬预算护栏?防止 Agent 深夜暴走烧钱
带 AI Agent 的生产级应用跑起来之后,最让人心惊胆战的一个画面就是:凌晨三点收到告警——Agent 陷入了死循环,几小时内烧掉了数百美元的 API 费用。LangGraph、CrewAI 等框架擅长编排 Agent 的推理逻辑,但它们没有提供原生的预算控制、循环检测和崩溃恢复能力。
RiskKernel 是一个开源的 Agent 可靠性运行时(Go, Apache-2.0, github.com/prashar32/riskkernel),它在你的 Agent 和 LLM API 之间插入一层确定性运行控制——硬预算限额、循环上限、崩溃可恢复检查点,全部由编译后的 Go 代码执行,不依赖 LLM 的「自觉」。
为什么需要一层「硬控制」?
Agent 框架解决的问题是「如何让 Agent 思考」,但生产环境 Agent 的问题往往是:
- 死循环:Agent 反复调用同一个工具,每次调用都在花钱,框架没有任何循环检测
- 意外超支:一个回答的 token 消耗远超预期,$0.01 的任务跑到 $10
- 崩溃丢失状态:进程
kill -9后,已经花掉的钱不可回收,重新跑又要再花一遍 - 无审核门禁:Agent 可以自行决定执行删除文件、发送邮件等副作用操作
RiskKernel 不是另一个 API 网关(那是 LiteLLM 做的事),也不是另一个可观测性面板(那是 Langfuse 的领域)。它填补的是框架和网关之间的空白:Agent 运行时的确定性控制层。
三种集成方式
RiskKernel 提供了三种递进的集成方式:
方式一:零代码代理模式
最简单的用法——设置一个环境变量,将 OpenAI 基地址指向 RiskKernel 的代理端口:
export OPENAI_BASE_URL=http://localhost:7070/v1
每个请求自动被截获、计量、经预算校验后,转发到真正的 API 提供商。不需要改一行代码。
方式二:Python SDK 深度集成
用装饰器控制函数级别的预算和行为:
from riskkernel import governed_run, ApprovalGate
@governed_run(budget_dollars=0.50, max_loops=100, max_seconds=3600)
def my_agent_loop():
# 你的 Agent 逻辑不动
pass
approve = ApprovalGate()
result = approve.request("删除 /data/temp 目录中的所有文件")
if result.approved:
# 执行删除
pass
方式三:OpenTelemetry 通用集成
RiskKernel 本身就是一个 OTLP 端点和发射器——可以管理已用 OpenLLMetry 等 SDK 做探针的 Agent,同时将追踪数据导出到你的 Grafana 或 SigNoz。
核心功能拆解
💸 硬成本上限(Hard Cost Ceiling)
每个运行可以设定固定的美元限额。Agent 的请求一旦累计费用超过上限,立即返回 HTTP 402 中断运行,但状态被持久化保存:
docker run --rm -p 7070:7070 \
-e ANTHROPIC_API_KEY=xxx \
-e RISKKERNEL_DEFAULT_DOLLARS=0.50 \
ghcr.io/prashar32/riskkernel:latest
curl -s -D- http://localhost:7070/v1/chat/completions \
-H 'content-type: application/json' \
-H 'X-RiskKernel-Run-Id: demo' \
-d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"hi"}]}'
🔁 循环上限与墙钟时间(Loop & Wall-Clock Budget)
即使单次调用未超限,RiskKernel 也会追踪调用次数和总执行时间。默认安全值:$5 / 100 次循环 / 1 小时。这意味着你忘记停止的 Agent 最坏情况也不超过这个范围。
💾 崩溃可恢复检查点
最亮眼的功能:如果 kill -9 杀掉了守护进程,重新启动后 RiskKernel 会自动从上一个检查点恢复,已经花掉的费用不会被重复计算:
riskkernel serve & kill -9 $RISKKERNEL_PID riskkernel serve riskkernel runs list # 看到之前的运行继续
✋ 人工审批门禁
RiskKernel 支持框架无关的审批门禁。当 Agent 需要执行有副作用的工具调用(如删除文件、发送邮件、数据库写入)时,运行会暂停等待人工确认——通过 CLI、本地 Web 面板或 Webhook 三种方式。
🧠 自有记忆系统
运行状态、审计日志和配置以 Git-native Markdown/YAML 存储在你的磁盘上,会话状态存在本地 SQLite 中。不依赖任何外部数据库。
快速上手
启动 RiskKernel 的方法非常直接:
docker run --rm -p 7070:7070 -v "$PWD/data:/data" \ -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \ -e RISKKERNEL_DEFAULT_DOLLARS=0.50 \ ghcr.io/prashar32/riskkernel:latest go install github.com/prashar32/riskkernel/cmd/riskkernel@latest riskkernel init # 在当前目录生成 .env + 示例 riskkernel serve # 启动守护进程
启动后,查看受控运行的审计日志:
riskkernel runs list # 列出所有受控运行 riskkernel audit export# 导出费用账目(JSON) riskkernel audit tools # 导出受控工具调用记录
对比:有 RiskKernel vs 无保护
| 场景 | 无保护 | 有 RiskKernel |
|---|---|---|
| Agent 陷入死循环 | 持续扣费直到手动停止或余额耗尽 | 到达循环上限(默认 100 次)自动停机 |
| 意外使用高成本模型 | Token 超支无感知 | 硬成本上限触发 HTTP 402 |
| 服务器重启 | 丢失运行上下文,重跑重新扣费 | 自动恢复检查点,不重复计费 |
| 删除操作 | Agent 可自行决定执行 | 暂停等待人工审批 |
| 问题排查 | 无运行日志 | 完整审计导出 + OTLP 追踪 |
注意事项
- RiskKernel 目前是单人维护的开源项目(18⭐),代码质量可靠但功能迭代节奏取决于社区反馈
- 代理模式目前仅支持 OpenAI 兼容接口——Anthropic 直接调用需通过 SDK 方式
- 安装 Go 原生版本需要本地有 Go 工具链;纯 Docker 模式对 Python/Node 用户更友好
- 审批门禁目前支持 CLI 和 Webhook,本地 Web UI 正在开发中
总结
RiskKernel 解决的是一个被大多数 Agent 框架忽视的问题:运行时层缺乏确定性控制。它不是替代 LangGraph 或 LangChain,而是在它们下面加一层「硬底」。如果你的 Agent 已经到了生产环境、处理真实数据、有明确的开销预算约束,花 60 秒跑一个 Docker 容器加上这层护栏,是投资回报率极高的「保险」。