TypeError: LiteLLM_VerificationTokenActions.find_many() got an unexpected keyword argument ‘select’

该报错通常出现在 LiteLLM 代理升级到 v1.89.2 及之后的版本、并启用数据库存储(store_model_in_db: true)后,普通内部用户(非管理员)访问 /tag/list 或 /tag/daily/activity 等管理端点时触发。优先排查 tag_management_e

快速结论:该报错通常出现在 LiteLLM 代理升级到 v1.89.2 及之后的版本、并启用数据库存储(store_model_in_db: true)后,普通内部用户(非管理员)访问 /tag/list/tag/daily/activity 等管理端点时触发。优先排查 tag_management_endpoints.pytool_management_endpoints.py 中是否仍在使用 select={...} 参数调用 Prisma 读取方法。

适用环境:Issue 已确认 LiteLLM v1.89.2(问题报告版本)、v1.94.0(生产环境 traceback 版本)、v1.95.0-rc.3、v1.96.0-dev.2 均受影响;依赖 prisma>=0.11.0,<1.0(解析为 0.15.0);需要 DB 后端(store_model_in_db: true)。报告未提供 Python、CUDA、显卡信息。

最快修复方案:暂无确认的一步修复方案。Issue 中三个 select={...} 调用点在 litellm_internal_staging 分支上已通过提交 b5cfc2ca00c943d9a9 修复,但截至报告时这些修复尚未进入任何 release tag,也尚未合并到 main。可优先尝试手动移除 select={...} 参数,改为返回完整行(结果仅通过 getattr 读取单个字段,功能等价),或关注 #35293 / #35288 进入正式发布。

注意事项:移除 select={...} 会返回整行数据,功能行为等价但可能带来轻微性能开销。该问题仅在非管理员内部用户(virtual key 属于 internal_useruser_id 非空)访问时触发;管理员或具有 admin view 的调用者会提前返回 HTTP 200,无法复现。截至报告时修复仅在 staging 分支,未进入任何 release。

问题场景

用户在 LiteLLM 代理启用数据库后端(store_model_in_db: true)并运行 v1.89.2 及之后的版本时,普通内部用户(非管理员)登录 Dashboard 加载标签列表或标签日活动数据,调用 GET /tag/listGET /tag/daily/activity 时返回 HTTP 500。管理层端点中 _get_internal_user_api_keys()_resolve_team_id_to_object_permission_id() 向 Prisma 读取方法传入了 select= 参数。

报错原文

{"detail": "LiteLLM_VerificationTokenActions.find_many() got an unexpected keyword argument 'select'"}

TypeError: LiteLLM_VerificationTokenActions.find_many() got an unexpected keyword argument 'select'

原因分析

LiteLLM v1.89.2 中多个管理端点开始向 Prisma 读取方法传入 select= 参数,但 prisma-client-py(prisma>=0.11.0,<1.0,解析为 0.15.0)不支持 find_many / find_unique 的运行时 select= 关键字参数——prisma-client-py 的字段选择仅通过构建时 partial types 提供。由于生成的 Prisma 方法签名未声明该参数,运行时抛出 Python TypeError,最终表现为 HTTP 500。Issue 中确认的三处调用点:

  • litellm/proxy/management_endpoints/tag_management_endpoints.py_get_internal_user_api_keys() 中的 find_many(where={"user_id": user_id}, select={"token": True})。该函数有两个调用者:_get_tag_list_scope(服务于 list_tags)和 _get_tag_daily_activity_api_key_filter(服务于 get_tag_daily_activity),因此移除该参数可同时修复两个端点。
  • litellm/proxy/management_endpoints/tool_management_endpoints.py_resolve_team_id_to_object_permission_id() 中约 388 行和 409 行的两次 find_unique(select={"object_permission_id": True}) 调用。

这三处的结果均通过 getattr(record, <field>, None) 消费,因此 select= 仅是优化,移除后返回完整行在功能上等价。

之所以难以复现,是因为失败路径受限于非管理员内部用户:_get_internal_user_api_keysuser_role.is_internal_user_role 为假时会在 tag_management_endpoints.py:147 提前返回,两个调用者在 user_api_key_has_admin_view(user_api_key_dict) 为真时也会提前返回。任何具有 admin view 的调用者都会从 /tag/list 得到 HTTP 200,不会触及 find_many。复现需要一个属于 internal_useruser_id 非空的 virtual key。

Issue 报告了一项 8 天生产窗口的统计:GET /tag/list 返回 HTTP 500 共 1363 次,GET /tag/daily/activity 3 次,全部来自加载 Dashboard 的普通用户;管理员流量 0 次失败。这说明在拥有普通非管理员用户的部署中,该问题并非边缘情况。

环境排查

  • 确认 LiteLLM 版本:v1.89.2、v1.94.0、v1.95.0-rc.3、v1.96.0-dev.2 均受影响;检查是否仍在 release tag 中,或已使用包含 b5cfc2ca00 / c943d9a9 修复的分支。
  • 确认 Prisma 版本:prisma>=0.11.0,<1.0(解析为 0.15.0),这是不支持运行时 select= 的版本。
  • 确认代理配置启用了数据库后端:store_model_in_db: true,并有可用 DB 连接。
  • 确认触发身份:使用属于 internal_user 角色、user_id 非空的 virtual key,而非具有 admin view 的 bearer token。
  • 确认代码中是否仍有 select={...} 残留:检查 litellm/proxy/management_endpoints/tag_management_endpoints.py:160tool_management_endpoints.py:483 / :502main 分支位置)。

解决步骤

  1. 确认复现:以非管理员内部用户的 virtual key 调用 GET /tag/list?start_date=...&end_date=...,观察是否返回 HTTP 500 及 unexpected keyword argument 'select'。同时测试 GET /tag/daily/activity
  2. 定位残留调用点:在代码库中搜索 select=,重点检查 tag_management_endpoints.py_get_internal_user_api_keystool_management_endpoints.py_resolve_team_id_to_object_permission_id
  3. 移除不支持的参数:删除三处 Prisma 读取调用中的 select={...},改为返回完整行(例如将 find_many(where={...}, select={"token": True}) 改为 find_many(where={...})),因为结果仅通过 getattr(record, <field>, None) 消费,功能等价。
  4. 如果你使用官方发布版本而非自行打补丁:关注修复是否进入正式 release。Issue 报告时 litellm_internal_staging 分支已修复(b5cfc2ca00 覆盖 tag 端点,c943d9a9 覆盖 tool 端点),但 main 和所有 release tag 仍包含全部三处。
  5. 验证改动未引入回归:确保所有调用者仍能正常读取所需字段(tokenobject_permission_id)。

验证方法

使用非管理员内部用户的 virtual key 重新调用 GET /tag/list?start_date=...&end_date=...GET /tag/daily/activity,确认返回 HTTP 200 且数据内容正确(标签列表、API key 过滤结果符合预期)。同时用管理员或 admin view token 调用相同端点,确认其行为未改变,仍返回 HTTP 200。检查容器日志中不再出现 LiteLLM_VerificationTokenActions.find_many() got an unexpected keyword argument 'select'

参考来源

BerriAI/litellm #30972

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23799

发表回复

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