[Bug]: The model info returned on /model/info is inconsistent, especially with regards to the access_groups

用户在使用 LiteLLM Proxy 构建的 AI Gateway 生产环境(多用户并发访问)中:

[Bug]: The model info returned on /model/info is inconsistent, especially with regards to the access_groups

[Bug]: The model info returned on /model/info is inconsistent, especially with regards to the access_groups

快速结论:该问题通常发生在 LiteLLM Proxy 生产环境中,当多个用户同时编辑模型的 access_groups 或其它属性时,/model/info 接口返回的数据(UI 也同理)会出现不一致,包括 access_groups 随机缺失或重复、已删除的模型重新出现等问题。优先排查是否由 Python 循环变量未正确赋值回列表的编码错误引发,并检查 LRU 缓存是否在模型增删改操作后被正确清理。

问题场景

用户在使用 LiteLLM Proxy 构建的 AI Gateway 生产环境(多用户并发访问)中:

  • 通过 API 或 LiteLLM UI 编辑模型的 access_groups(增删改)。
  • 调用 /model/info 接口或刷新 UI 模型列表,发现 access_groups 不固定地缺失、闪现。部分团队因 access_groups 缺失而收到 401/403 错误。
  • 用户已尝试清除 30 秒缓存,问题依旧,包括已删除的模型随机重现、模型属性加载不正确。
  • 问题在 LiteLLM v1.81.9、v1.81.12、v1.81.14 等版本中持续出现。

报错原文

Teams getting unauthorized model access error after adding access group to model.
access groups appear as missing and then they appear as coming back.
Models that have been deleted randomly reappear and their properties are not loading correctly.

注:该 Issue 未提供标准 shell 报错输出,错误表现为 HTTP 401/403 状态码及 UI 展示异常。

原因分析

通过代码分析和社区排查,该问题由多个因素叠加导致:

  1. Python 循环变量未更新列表的 Bug(核心原因之一):在 litellm/proxy/proxy_server.py 中,/model/info 端点的代码使用了 for in_place_model in all_models:,然后赋值 in_place_model = _get_proxy_model_info(model=in_place_model)。此赋值仅修改了局部变量,未写回原列表 all_models,导致模型信息(包括 access_groups)未被正确更新。
  2. LRU 缓存未清除litellm/router.py 中的缓存(如 add_deploymentupsert_deploymentdelete_deployment)在模型变更后未被清理,导致返回过期数据。
  3. 共享对象引用导致状态污染:返回的模型对象是直接引用而非深拷贝,多线程/多协程环境下可能导致数据错乱。
  4. 数据库查询顺序不确定:没有明确排序,每次查询可能返回不同的模型顺序。
  5. 缺乏并发控制:后台每 30 秒的作业与 API 请求存在竞态条件。

注意:用户尝试了包括修复循环变量、清除缓存、深拷贝、加锁等一系列解决方案后,仍报告模型列表不一致。Issue 中提及 #34041 可能解决此问题,但未在关闭时提供最终确认。

环境排查

  • LiteLLM 版本:v1.81.9 / v1.81.12 / v1.81.14(问题持续存在)
  • 运行模式:Proxy(多用户生产环境)
  • 触发操作:通过 API 或 UI 编辑模型的 access_groups / 其他属性
  • Python 版本:未明确指定,需用户自查
  • 数据库:未明确指定(LiteLLM 默认使用 SQLite 或可配 PostgreSQL),需确认是否支持一致排序

解决步骤

  1. 检查代码 Bug(可优先尝试):定位 litellm/proxy/proxy_server.py/model/info 端点相关代码(原 Issue 指向行号 9424-9425,不同版本可能变化),将循环修改为:
    for i, in_place_model in enumerate(all_models):
        all_models[i] = _get_proxy_model_info(model=in_place_model)
  2. 清理 LRU 缓存:确认 litellm/router.py 中的 add_deployment()upsert_deployment()delete_deployment() 方法在修改后调用 clear_cache() 或等效操作。
  3. 使用深拷贝避免引用污染:在返回模型列表或单个模型时,使用 copy.deepcopy(model) 替代直接返回引用。
  4. 统一数据库查询排序:为模型数据查询添加固定排序字段,如 order={"model_id": "asc"}
  5. 添加并发控制(尝试性方案):考虑在 /model/info 端点和 add_deployment 等方法上添加 asyncio.Lock 以防止竞态条件。
  6. 升级到更高版本:Issue 提及 #34041 可能已修复,建议尝试升级 LiteLLM 到包含该 PR 的版本。

验证方法

在应用上述修复后,执行以下操作验证:

  • 反复通过 API 或 UI 添加/移除模型的 access_groups,每次修改后立即调用 /model/info 检查返回数据是否与最新修改一致。
  • 模拟多用户并发访问场景,检查 access_groups 是否持续稳定出现,无 401/403 错误。
  • 确认已删除的模型不再出现在列表返回中。
  • 测试持续编辑 10 次以上,间隔随机秒数,确认数据不再出现“闪现”或“消失”现象。

参考来源

BerriAI/litellm #20999
BerriAI/litellm #34041(可能修复)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 14539

发表回复

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