metrics.usage 中成本字段在 browseruse-bench 中是如何生成的。
成本在何处计算
成本补全发生在共享任务运行器写入result.json 之前:
- 运行器:
browseruse_bench/runners/agent_runner.py - 调用函数:
enrich_result_usage_cost_if_needed(...)
total_cost > 0,则保持原值;否则基于 usage 与价格表重算。
Token 使用量如何获取
Token 统计来自 agent 返回的metrics.usage(通常由模型响应 usage 透传),字段优先级如下:
prompt_tokens:total_prompt_tokens->prompt_tokenscompletion_tokens:total_completion_tokens->completion_tokenstotal_tokens:total_tokens->prompt_tokens + completion_tokenscached_tokens:total_prompt_cached_tokens->cached_tokens- 若仍为
0,回退到prompt_tokens_details.cached_tokens
- 当
prompt_tokens == 0且completion_tokens == 0,但total_tokens > 0时,框架将全部 token 视为 prompt token。 - 当所有 token 计数都为
0时,跳过补全。
价格表如何获取
价格由load_litellm_price_table() 加载,并与可选自定义价格表合并。
LiteLLM 价格来源
- 官方 URL:
https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json
- 内存缓存:
_PRICE_CACHE,按 URL 缓存,TTL 24 小时
- 本地文件缓存:
~/.cache/browseruse_bench/token_cost/pricing_bubench_*.json- 有效缓存优先于网络拉取
自定义价格来源
- 可选文件:
configs/pricing/model_pricing.yaml
- 支持字段(每 token 或每百万 token):
input_cost_per_token、output_cost_per_token、cache_read_input_token_costinput_cost_per_million_tokens、output_cost_per_million_tokens、cache_read_input_cost_per_million_tokens
- 匹配方式:
- 模型名大小写不敏感的精确匹配
- 优先级:
- 相同模型键下,自定义价格优先于 LiteLLM 价格
0.0,总成本为 0.0(并输出 warning 日志)。
成本计算公式
所有费率都会归一化为“美元/每 token”。- 若没有缓存读费率,
cached_rate默认使用input_rate。 cached_tokens会被限制在[0, prompt_tokens]区间。
输出字段
补全后metrics.usage 会包含:
total_prompt_tokenstotal_prompt_costtotal_prompt_cached_tokenstotal_prompt_cached_costtotal_completion_tokenstotal_completion_costtotal_tokenstotal_costentry_countby_model(单模型汇总,含invocations、average_tokens_per_invocation)
usage.total_cost 与 usage.total_tokens。
最小示例
输入 usage:- 非缓存 prompt:
600 * 0.000002 = 0.0012 - 缓存 prompt:
400 * 0.0000005 = 0.0002 - completion:
100 * 0.000008 = 0.0008 - total:
0.0022