开源 · MIT · 零依赖

挡在失控花费前面的网关。

llm-guard 坐在你的 OpenAI、Anthropic 或 Gemini 调用前面。它记录每个请求实际花了多少,把成本归因到背后的 API key、project 和终端用户,在失控花费还在发生时发现它,并执行硬预算。

运行期依赖
0
只用标准库
额外延迟
4.6ms
最坏情况
测试
214
不需要网络
子命令
15
全部可用

它解决什么问题

一个在请求之间检查的预算,拦不住正在越线的那一个请求。对于一次简短的对话调用,这几乎无所谓。对于一条 200 步的 agent 循环,这就是全部问题:OWASP 记录了一条 200 步循环的成本是单次调用的 100 倍以上,而且 62% 的 agent 账单来自上下文被反复重发。

llm-guard 盯着三种失控花费的形态:

  • 上下文循环 —— 持续病态的输入输出 token 比。正常流量在 5:1 到 15:1 之间。已记录的生产事故达到 74:1 和 175:1。
  • 速率突发 —— 花费速率远高于你自己账号的基线,而不是高于某个对所有人都不适用的绝对数字。
  • 重试风暴 —— 失败调用的爆发。它们仍然消耗延迟,而且常常也消耗 token。

检测永远只是报告。执行是一个单独的、明确的决定:一个带 action=block 的按 key 预算会返回 HTTP 429,而可选的单条流封顶会在流中途掐断一个正在进行的响应。

它有什么不同

零运行期依赖 只用标准库。一个下午能审完 —— 这很重要,因为请求路径上的网关是高价值目标。
成本来自计费事实 价格来自服务商返回的 usage 块,永远不用本地 token 估算。
按模型的缓存经济学 缓存读按模型不同,是输入价的 2.5% 到 50%。把它当常数就是 4–5 倍的静默误差。
无法定价就说不 如果某个模型没有价格,成本记为 NULL,报为「未定价」。一个看着合理但是错的数字,比一个明显的缺口更糟。
归因到请求背后的人 每一行都带 key、project 和终端用户。没有归因,成本就无法在事故中被诊断。
能进隔离网络 看板是自包含 HTML,图表是内联 SVG。没有 CDN、没有 JS 依赖、没有外部请求。

它故意不做什么

一个诚实的限制清单,通常比功能清单更有用。

不终止入站 TLS

负载均衡器做得更好。出站到服务商的 TLS 在进程内完成,并且对着真实 API 验证过。

不读你的 prompt

只有 token 数、模型标识、时间戳和状态。它告诉不了你应用在做什么,因为它看不到。

不悄悄阻塞流量

检测是建议性的。唯一的例外是你自己显式设置的 action=block 预算。

不是可观测性平台

它计量成本并执行预算。它不做提示词实验、评估或向量检索。

超过几百万行就该换

SQLite 在这个量级以上是错的选择,文档里就这么写了。schema 是纯 SQL,可迁移到 Postgres 或 ClickHouse。

不是 LLM 安全工具

PyPI 上的 llm-guard 是另一个项目,做 prompt 注入防护。和这个无关。

三十秒试一下

不需要 API key、不需要网络、不需要注册。

bash
$ git clone https://github.com/leyao-daily/llm-guard.git
$ cd llm-guard
$ python3 -m llmguard seed --reset --compare-days 30
$ python3 -m llmguard anomalies
$ python3 -m llmguard dashboard --out dash.html

需要有人帮你看?

如果你的账单难以预测,我们做固定价格的诊断,交付一份书面报告。不需要部署,只读访问用量数据,prompt 和回复永远不离开你的账号。