
TypeError: ‘>’ not supported between instances of ‘str’ and ‘float’
快速结论:该报错通常发生在 LiteLLM Proxy 使用 store_model_in_db: true 或 Helm Chart 部署时,model_info 中的成本字段(如 output_cost_per_token)被序列化为字符串(如 "1e-05"),导致在 router.py 中进行大小比较时出现类型错误。优先排查成本字段是否被 YAML 解析器(如 PyYAML)误解析为字符串。
问题场景
用户在使用 LiteLLM Proxy(v1.89.1)并通过 Prometheus 回调或 API 响应获取模型成本信息时触发。具体场景包括:
- 代理配置中启用了
store_model_in_db: true,导致模型配置经过数据库往返(round-trip)。 - 使用 Helm 部署时,Go 的
yaml.v3库将浮点数0.00001标准化为1e-05(整数尾数),而 PyYAML 6.0.3 将 YAML 1.2 规范的1e-05(无小数点的整数尾数表示)解析为字符串。
报错原文
TypeError: '>' not supported between instances of 'str' and 'float'
完整回溯信息:
Traceback (most recent call last):
File ".../litellm/integrations/prometheus.py", line 2463, in _async_set_router_remaining_metrics
remaining_usage = await llm_router.get_remaining_model_group_usage(
File ".../litellm/router.py", line 9484, in get_remaining_model_group_usage
model_group_info = self._cached_get_model_group_info(model_group)
File ".../litellm/router.py", line 9481, in _cached_get_model_group_info
return self.get_model_group_info(model_group)
File ".../litellm/router.py", line 9395, in get_model_group_info
return self._set_model_group_info(
File ".../litellm/router.py", line 9293, in _set_model_group_info
or (model_info["output_cost_per_token"] or 0.0)
> (model_group_info.output_cost_per_token or 0.0)
TypeError: '>' not supported between instances of 'str' and 'float'
原因分析
根本原因是 LiteLLM 的 _set_model_group_info() 方法(位于 litellm/router.py 第 9293 行附近)在比较成本字段时,未对 model_info 中的值进行类型转换。当场景满足以下条件时触发:
- 配置渲染阶段:Helm 的 Go
yaml.v3库将0.00001标准化为1e-05(整数尾数,无小数点)。 - 配置解析阶段:PyYAML 6.0.3 将
1e-05解析为字符串("1e-05"),而不是浮点数。相比之下,1.0e-05(有小数点)会被正确解析为浮点数。 - 运行时阶段:
model_info["output_cost_per_token"]为字符串类型,在与浮点数model_group_info.output_cost_per_token比较时抛出TypeError。
注意:store_model_in_db: true 并非必要条件——纯粹通过 YAML 配置加载模型时也会触发,只要成本值被序列化为 1e-05 这类字符串。
环境排查
- LiteLLM 版本:v1.89.1(受影响版本,需检查是否有修复补丁)
- Python 版本:3.13(用户环境)
- PyYAML 版本:6.0.3(该版本对
1e-05的解析行为见上述分析) - 部署方式:Kubernetes + Helm(Go
yaml.v3渲染配置) - 配置项:
- 检查
model_info下的output_cost_per_token、input_cost_per_token、cache_read_input_token_cost等字段是否使用了类似0.00001的极小浮点数。 - 确认是否启用了
store_model_in_db: true(虽然本 Issue 证实非必须,但仍需排查数据库中存储的字符串化成本值)。
- 检查
解决步骤
- 确认问题根源:在启动 LiteLLM Proxy 的容器中运行以下命令,检查成本字段是否为字符串类型:
python3 -c "import yaml; print(type(yaml.safe_load('output_cost_per_token: 1e-05')['output_cost_per_token']))"若输出
<class 'str'>,则确认问题。 - 临时规避:修改 Helm 配置:在
values.yaml中将成本值改为十进制表示法(如0.00001)或使用带小数点的科学计数法(如1.0e-05),避免被 Helm 标准化为1e-05。 - 代码修复(可优先尝试):在 LiteLLM 的
_set_model_group_info()方法中,对所有成本字段增加float()类型转换。修复位置为litellm/router.py第 9293 行附近,参考以下补丁:# 修改前 if model_info.get("output_cost_per_token", None) is not None and ( model_group_info.output_cost_per_token is None or (model_info["output_cost_per_token"] or 0.0) > (model_group_info.output_cost_per_token or 0.0) ): model_group_info.output_cost_per_token = model_info["output_cost_per_token"] # 修改后 cost_val = model_info.get("output_cost_per_token") if cost_val is not None and ( model_group_info.output_cost_per_token is None or float(cost_val or 0.0) > float(model_group_info.output_cost_per_token or 0.0) ): model_group_info.output_cost_per_token = float(cost_val)同理,对
input_cost_per_token、cache_read_input_token_cost等字段也做相同的float()包裹处理。 - 升级 LiteLLM 版本:检查 LiteLLM 后续版本(≥ v1.89.2)是否已包含该修复。若未包含,可等待官方 release 或自行安装补丁。
验证方法
完成修复后,重新启动 LiteLLM Proxy,执行以下验证:
- 发送一个补全请求(completion request)到模型中,检查 HTTP 响应头
x-litellm-response-cost是否存在且包含正确的成本值。 - 如果启用了 Prometheus 回调,检查 Prometheus 指标采集是否恢复正常,不再抛出
TypeError异常。 - 在 Python 解释器中模拟比较操作,确认
float("1e-05") > 0.0为True且不报错。



