关于 focxle — what your AI agents cost
focxle 是用于 Python Agent 的进程内开销追踪库,按 Agent 汇总多个供应商的调用成本,并支持检查限额会阻止哪些调用。它还附带 MCP 服务,可查询本机保存的每日开销记录。
主要功能
- 01按 Agent 汇总多供应商成本
- 02依据供应商用量数据计价
- 03展示限额的事后模拟结果
- 04支持 OpenAI、Anthropic 与 LangChain
- 05本地保存逐次调用记录
适用场景
- 01定位高开销的 Agent 或供应商
- 02检查成本上限可能阻止的调用
- 03查看本周的 Agent 支出
- 04将每次调用写入 JSONL 文件
MCP 相关
附带的 MCP 服务读取 ~/.focxle/history.json 中的每日汇总,回答开销相关查询;它只读取该文件,不发起网络连接或追踪编辑器自身的模型调用。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
focxle
查看每个 AI Agent 在所有供应商处的成本。一行即可,无需账户,不到一秒。
你现有的工具都无法告诉你某个 Agent 花了多少钱。OpenAI 控制面板看不到 Anthropic。它们也都看不到 Serper、Firecrawl,或你的 Agent 凌晨 3 点循环调用的其他十二个 API。它们都按密钥和月份报告费用,而这两种计量单位都不合适:你运行的不是密钥,而是 Agent;等到月底,钱早就花出去了。
focxle 在你的进程内运行,因此它能看到所有调用,将费用归到发起调用的 Agent,并根据供应商自己的令牌用量计价,而不是靠估算。连接账户后,Agent 在链上结算的付款也会计入同一总额。
为什么费用很快就会变高。 算一算一个卡住的 Agent 会花多少钱。每秒调用两次前沿模型,输入 10k 个令牌、输出 1k 个令牌,输入价格为每百万个 5 美元、输出价格为每百万个 25 美元,每次调用就要 7.5 美分,也就是每小时 540 美元。一夜 12 小时就是6,480 美元。一个两天的周末就是25,900 美元。没人会为这种情况做预算,因为没人会预先想到:停止条件不当、多套了一层重试包装,或某个工具把自己的输出重新送回提示词中。等到发票来了,大家才第一次听说这件事。
这就是这个项目存在的全部理由。你可以永远免费地观察这种情况,并准确看到设置限额本可在你付费前拦下什么。
这个库会在失败时放行。 它在你的 Agent 内运行,因此最糟糕的情况就是破坏一个本来只该被计量的请求。若其中任何部分发生故障,你的调用仍会继续,故障会被记录并在最后打印出来。如果确实对你而言,未计量的调用比失败的调用更糟,可以使用 focxle.init(fail_open=False) 反转这一行为。
默认不会拦截任何内容。 开箱即用时,它只会进行计量。拒绝调用需要付费套餐账户;即便如此,指令也来自签名文档,而非本地设置,因此无论你还是我们,都无法通过代码悄悄启用拦截。对于我们无法计价的供应商,调用始终会放行。
pip install focxle
import focxle
focxle.init()
全部设置就是这些。无需账户、API 密钥、配置文件或网络调用。价格随软件包一同提供,因此首次运行时即使在飞机上也能正常工作。除非你主动开启,否则遥测功能处于关闭状态,而且我们只会询问一次。
你将获得什么
focxle spend $47.21
--------------------------------------------------------
support-triage $31.04 (1,284 calls)
anthropic $28.10
google.serper.dev $2.94
research $16.17 (203 calls)
openai $14.02
api.firecrawl.dev $2.15
3 calls would have been stopped under $1.50/call and $50/day
$12.30 prevented, worst single call $4.10
3x single call $4.10 over the $1.50 per-call limit
$5,904 a month at the rate this run was going
$412.60 prevented across 17 runs in 9 days
observe mode: nothing was actually blocked
prices dated 2026-08-05
turn these into real caps: https://focxle.com/upgrade
第二部分才是重点。它展示的是限额本可产生的效果,评估方式与实际执行拦截的代码相同,并将结果打印出来,让你在付费前决定是否需要限额。
其中每个数字都是测量结果,而非营销数据。 总额、最贵的调用和累计总额,都是对实际发生的调用求和,并根据供应商自己的用量数据计价。月度数据是唯一的预测值,它按本次运行的实测速率推算到整个月,说明也会直接标在该行上;只有当本次运行的时长和调用量都足以得出有意义的结果时,才会显示这一数据。
如果某个限额会拦下大量调用,它会明确指出这一点,而不是给出一个数字。一个会阻止 Agent 四分之一工作的限额,并没有在省钱,而是在阻止 Agent;把两者之差称为节省,会让这个数字在最需要参考时变得毫无价值。此类运行也不会向你推销任何东西。
为什么它与众不同
AI 成本工具有三种形式,而这三种工具都会先要求你提供一些东西,才会告诉你任何信息。
供应商仪表板按密钥和月份统计,每家供应商各有一个,而且彼此无法查看数据。四家供应商就意味着四个标签页,却没有总计。
代理和网关能看到所有信息,因为现在每次调用都要经过别人的服务。这会让你的实时调用路径新增一个依赖,新增一家持有你提示词的公司,还会多一个可能在凌晨 3 点宕机的环节。
可观测性平台要求你先接入追踪管道、注册账号,并购买席位或支付追踪费用,之后才会显示第一个数字。其中有几款确实很出色。但它们都需要一番投入,而且没有哪款适合你在午餐时收到意外账单后,于下午 4 点顺手试用。
focxle 只需运行 pip install focxle 和一行代码。它零依赖,因此不会有任何内容进入你的环境,也不会与固定版本发生冲突。免费使用时,它零网络调用,测试套件通过删除 socket.socket 后仍运行完整测试套件来证明这一点。它无需账号、密钥或配置文件,价格表也随软件包一同提供,因此第一次运行无需联网。它在设计上默认放行:这里的错误最多只会导致某次调用未被统计,但调用本身仍会正常执行。
它还能回答其他工具都无法回答的问题:我的 Agent 在使用所有接触过的服务时,总共花了多少钱。
将支出归因到 Agent
每个 Agent 的支出是其他工具都无法展示的数字,而只有给调用打上标签,这个数字才会存在。
with focxle.agent("support-triage"):
result = my_agent.run(ticket)
适用于不同线程和异步任务。或者在环境中设置 FOCXLE_AGENT,通常这是正确的做法,因为同一个镜像通常会部署为多个不同的 Agent。
精确的 token 数量
HTTP 层已经能看到你对模型的调用。包装客户端后,就能从“发生了一次请求”升级为获取供应商自己的 token 数量。
from openai import OpenAI
client = focxle.watch(OpenAI())
支持流式传输。重复包装同一个客户端不会重复计数,而是什么也不做。
对于由框架为你创建客户端的 LangChain:
chain.invoke(x, config={"callbacks": [focxle.langchain_handler()]})
在编辑器中询问
focxle 提供 MCP 服务,因此你可以在 Claude Code、Cursor、Windsurf、Zed 或任何支持 MCP 的工具中询问自己的支出:
我的 Agent 本周花了多少钱
哪个 Agent 最贵
如果每次调用的上限是 2 美元,会拦下哪些调用
将以下内容添加到客户端的 MCP 配置中:
{
"mcpServers": {
"focxle": { "command": "python", "args": ["-m", "focxle", "mcp"] }
}
}
它会根据保存在 ~/.focxle/history.json 中的每日汇总数据作答;这些数据会在经过检测的进程退出时写入。它只读取该文件,不读取任何其他内容:不联网、不需要账号,也不会自行开始测量,因此不会把编辑器自身的模型调用计入你的支出。设置 FOCXLE_NO_HISTORY=1 可关闭汇总功能,这样就没有可供询问的数据了。
自行读取数据
focxle.spend() # total USD observed
focxle.spend("support-triage") # for one agent
focxle.counterfactual() # what a cap would have stopped
focxle.report() # print now instead of at exit
focxle.init(file="~/spend.jsonl") # one JSON object per call
它不会做什么
它本身不会拦截任何内容。 没有账户时,仍会运行策略评估并仅记录判定结果,因此在决定是否需要设置上限之前,你可以先了解上限会产生什么影响。在你自己的代码中写入 Policy(mode="enforce") 会被拒绝并降级为 observe,stderr 中会显示说明:强制执行是账户获授的权限,不是进程可以自行设置的标志。
获授该权限后,上限依据你实际花费的金额进行判定,而不是对某次调用即将产生的费用进行猜测。回复生成前无法得知输出长度,因此猜测会拒绝正常工作,却漏掉失控调用。唯一的例外是单次调用上限,它必须预先判定:系统会根据你指定的 max_tokens 估算费用,因此应将上限设为高于你所声明的最大回复费用,而不是高于调用的典型费用。
它不会为所有内容定价。 价格表中没有的供应商会按零费用记录,报告中会列出主机和确切的模型 ID,因此,表示“免费”的零不会与表示“无法识别”的零混淆。调用会照常放行。因为不知道费用就阻止调用,意味着这个库在一个信任它保持被动的进程中,基于缺失的信息自行做出决定。编造一个数值更糟,因为它看起来像是确切信息。
路由器会按其指明的提供方定价,因此,通过 OpenRouter 调用 anthropic/claude-haiku-4.5 的费用与该模型相同。版本号中的点和连字符会被视为同一种拼写,因为具体出现哪种形式取决于生成字符串的 SDK。
它按进程运行。 跨五十个工作进程运行的 Agent 会产生五十份不完整的记录。要汇总这些记录,需要有一个接收它们的地方,这正是账户的用途。唯一的例外是上限本可阻止的累计金额,该数据保存在 ~/.focxle/lifetime.json 中,因此再次运行时不会从零开始。文件只保存两个数字和一个日期,永远不会离开你的设备;设置 FOCXLE_NO_LIFETIME=1 则会完全停止写入该文件。
~/.focxle 下的所有内容仅供你的用户访问:目录权限为 0700,文件权限为 0600,与 ~/.ssh 和 ~/.aws/credentials 的权限相同。你的账户 ID 属于凭据:任何读取它的人都能查看该账户的支出,并以该账户发起结账;而 Agent 工作负载会持续运行在共享 CI Runner 上。早期版本留下的任何全局可读文件,都会在下次写入时收紧权限。
它没有依赖项。 不会向你的环境添加任何内容,也不会与你的版本冲突。它会在运行时检测所监控的 SDK 和框架,安装时绝不会导入它们。
哪些内容会被发送
除非你主动开启,否则不会发送任何内容。在观测路径上完全不会进行网络调用;测试套件会移除 socket.socket,并在此状态下运行,以确保这一点。
我们只会请求一项操作,在你首次完成统计后显示一次,之后不再显示。除非你输入命令,否则此功能处于关闭状态:
python -m focxle share preview # the exact JSON, before you decide
python -m focxle share on
python -m focxle share off
如果你开启此功能,它会发送匿名的供应商汇总数据:你使用了哪些供应商、调用次数、费用,以及我们无法估价的主机。最后这一项正是我们请求这些数据的全部原因,因为它能帮助我们决定接下来要为哪些内容定价。
它绝不会发送你的 Agent 名称、模型名称、提示词、响应、URL,也不会发送任何从你的机器信息推导出的内容。安装 ID 是在本地生成的随机 UUID,并非你的主机名哈希,因为任何推导出的内容都可能被持有相同输入的人反向还原。私有主机(.internal、.corp、裸名称、IP 地址)会从所有字段中移除,并计入 withheld,因此汇总数据会明确显示为不完整,而不是悄悄隐藏这一点。
它绝不会弹出提示。此操作会在进程退出时运行,此时通常没有终端连接;如果这时阻塞等待标准输入,就会让生产环境中的 Agent 挂起。
如果你启用了本地文件接收器,它会记录主机和路径的前两段,但绝不会记录查询字符串,因此你的搜索词和文档 ID 不会被记录。该文件绝不会离开你的机器。
兼容性
支持 Python 3.9 及更高版本。会在 openai、anthropic、httpx、requests 和 LangChain 存在时为其添加监测;如果它们不存在,则不会执行任何操作。
源代码、问题与贡献
源代码发布在 github.com/focxle/focxle-python,你可以先阅读,再在 Agent 中运行。该项目由一个私有构建仓库生成,且仅包含源代码:测试套件保存在该私有仓库中,未同步到此处,因为这些文件从未经过决定哪些内容可以安全发布的检查。
由于仓库是生成的,拉取请求无法合并回去,因此不予接受。这是构建方式的限制,并非对你提交的补丁有任何评价。我们确实需要并会处理以下内容:
- 错误和功能请求——请提交 issue,或发送邮件至 [email protected]。
- 定价有误或尚未定价的供应商或模型。 报告中会列出它们;这份清单是你能提供给我们的最有价值的信息。
- 安全问题——请使用该仓库的 GitHub 私密漏洞报告功能,或发送邮件至上述地址。请在公开发布前留出合理的处理时间。
许可证
MIT。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。