ValueError: Invalid content item type: file. Expected str or dict with ‘type’ field (text, image_url, tool_use, tool_result, thinking).

该报错发生在 LiteLLM 的 trim_messages 或 token 计数流程中,当消息内容包含 file 类型块(如 PDF 附件)时,token_counter 无法识别该类型并抛出 ValueError 。优先确认 LiteLLM 版本是否已升级到包含修复(#38997)的版本,并暂时

快速结论:该报错发生在 LiteLLM 的 trim_messages 或 token 计数流程中,当消息内容包含 file 类型块(如 PDF 附件)时,token_counter 无法识别该类型并抛出 ValueError。优先确认 LiteLLM 版本是否已升级到包含修复(#38997)的版本,并暂时为文件类内容手动估算 token。

适用环境:已确认 LiteLLM v1.83.14 和 v1.95.0 可复现;Python 3.13 环境;涉及 OpenAI 兼容接口的 PDF 文档理解场景。操作系统、CUDA、显卡信息未在 Issue 中提及。

最快修复方案:升级 LiteLLM 到包含 PR #38997 的版本(该修复已进入 litellm_internal_staging),该版本使 token_counter 支持 OpenAI 的 file 块,从而不再在 trim_messages 时抛出异常。

注意事项:如果当前无法升级,可以暂时跳过对含 file 内容的消息做 trim,或自定义 token 计数逻辑处理 file 类型;另外需留意该问题在代理侧引发的两个次生影响(预检被跳过、输入成本统计为 0),它们可能需要额外的修复或配置调整。

问题场景

用户在 LiteLLM 中构造包含 file 类型内容(如 PDF 输入,参考文档理解功能 https://docs.litellm.ai/docs/completion/document_understanding)的消息,然后调用消息裁剪功能 trim_messages(https://docs.litellm.ai/docs/completion/message_trimming)时触发异常。该问题在 v1.83.14 和 v1.95.0 上均可复现。

报错原文

ValueError: Invalid content item type: file. Expected str or dict with 'type' field (text, image_url, tool_use, tool_result, thinking).

ValueError: Error getting number of tokens from content list: Invalid content item type: file. Expected str or dict with 'type' field (text, image_url, tool_use, tool_result, thinking)., default_token_count=None

原因分析

直接原因:LiteLLM 的 token_counter_count_content_list 中只识别 textimage_urltool_usetool_resultthinking 等类型,遇到新增的 file 类型块时未做处理,直接抛出 ValueError

次生影响(已证实):该问题不仅影响 trim_messages,还会导致代理侧两个隐患:

  • 预检被静默跳过:Router._pre_call_checks 中 token 计数失败被捕获后直接提前返回,导致后续的 RPM 限制、区域检查、参数支持检查全部被跳过。
  • 输入成本统计丢失:ChunkProcessor.calculate_usage() 中捕获异常后将 prompt_tokens 置为 0,导致流式请求(如带 PDF 附件)记录零输入 token 和零输入成本。

环境排查

  • 确认 LiteLLM 版本(v1.83.14、v1.95.0 均已复现,需确认当前版本是否已包含 #38997 修复)。
  • 确认 Python 版本(Issue 中日志显示为 Python 3.13)。
  • 确认是否使用 OpenAI 兼容的流式接口且未开启 stream_options: {"include_usage": true}(这会导致输入成本统计异常的路径被触发)。
  • 检查代理配置中是否设置了 enable_pre_call_checks(默认可能未启用,若启用则需关注预检被跳过的问题)。

解决步骤

  1. 首选:升级 LiteLLM 到包含 PR #38997 的版本。该 PR 已合入 litellm_internal_staging,使 token_counter 支持 OpenAI file 块,trim_messages 不再因 PDF 输入抛错。
  2. 临时规避:若无法立即升级,在调用 trim_messages 前过滤或手动处理 file 类型内容,例如将 file 块替换为纯文本占位或估算 token 数后再传入。
  3. 处理次生影响(输入成本统计为 0):在代理配置的 general_settings 中设置 always_include_stream_usage: true,强制上游提供真实 usage,绕开本地估算路径。这是一个可优先尝试的运营侧 workaround。
  4. 关注次生影响(预检跳过):PR #33659 旨在修复该问题,但当时仍在审查中;升级最新版本后请验证预检相关行为是否正常。

验证方法

在升级到包含修复的版本后,重新构造包含 file 类型块(如 PDF)的消息并调用 trim_messages,确认不再抛出 ValueError: Invalid content item type: file;同时检查代理日志和 SpendLogs,确认带文件附件的请求能正确记录输入 token 和成本,且预检流程(RPM 限制、区域检查等)正常执行。

参考来源

BerriAI/litellm #28409

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21208

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注