[Bug]: Complexity auto-router moves encrypted content follow-ups across model groups

该报错发生在 LiteLLM 代理使用复杂度自动路由器(complexity auto-router)时,第二轮携带加密推理内容( reasoning.encrypted_content )的请求被错误地重新分类切换到其他模型组,导致加密边界不匹配而返回 503。优先排查请求是否触发了跨模型组的部署

快速结论:该报错发生在 LiteLLM 代理使用复杂度自动路由器(complexity auto-router)时,第二轮携带加密推理内容(reasoning.encrypted_content)的请求被错误地重新分类切换到其他模型组,导致加密边界不匹配而返回 503。优先排查请求是否触发了跨模型组的部署路由,应确保加密内容亲和性检查能在路由分类前接管请求。

适用环境:工具为 LiteLLM(版本 v1.99.0),通过 /v1/responses 接口发起带 reasoning.encrypted_content 的无状态会话续聊。配置了 complexity_router 类型的快速路由器,并启用了 encrypted_content_affinity 预调用检查。

最快修复方案:暂无确认的一步修复方案。该问题在跨模型组场景下涉及路由优先级设计缺陷,需要代码级补丁(如 PR #40245 及其后续修订)才能正确处理,且需要明确区分“钉住原部署”“替换到同边界对等体”“无可用对等体直接失败”三种情况。

注意事项:Issue 中开发者明确指出“预调用检查(pre-call check)”因运行时机在模型组解析之后,无法单独修复此问题;修复必须在路由分类之前拦截。同时,单纯基于 (api_base, api_key) 的边界判断不足以作为安全替换依据,还需校验底层解析模型一致。目前所有的修复方案与建议均为代码库内部逻辑调整,未提供可在配置文件层面完成规避的官方方案。

问题场景

用户在 LiteLLM 代理的 /v1/responses 接口上使用复杂度自动路由器(auto_router/complexity_router)。第一轮请求配置了 include: ["reasoning.encrypted_content"] 并获得了包含加密内容的输出。当第二轮请求携带该加密内容作为输入,且新消息被路由器分类到不同的复杂度梯度(如从 gpt-5.3-codex 切换到 gpt-5.2-codex)时,代理将请求路由到新的模型组,但该模型组内没有任何部署与原加密内容的 (api_base, api_key) 边界匹配,最终返回错误。原部署在它自身的模型组中保持健康且可用。

报错原文

Error: The deployment that produced encrypted_content is not available in the resolved model group. No deployment on the same encryption boundary (api_base, api_key) is configured for the selected complexity tier. (HTTP 503)

原因分析

该问题的根源在于代理内的路由优先级错误。当复杂度分类器(complexity classifier)在预调用加密内容亲和性检查(encrypted_content_affinity)之前运行,它会先将模型组切换到新梯度对应的目标组,导致后续的亲和性检查只能在该新组的候选部署列表中查找,无法感知或保留原加密内容所属的部署(可能属于通配符模型组,如 gpt*),从而触发边界不匹配的快速失败(503)。

可能原因还包括:

  • 预调用检查的固有局限: EncryptedContentAffinityCheck.async_filter_deploymentsasync_callback_filter_deployments 内部运行,此时模型组已解析完成,候选列表已锁定,无法表达“路由到其他模型组的部署”这一操作。
  • 通配符模型名导致亲和规则失效: 在修复 PR(#40245)中,新钩子仅当原部署的 model_name 命中复杂度配置的 allowed_models 时才生效,而通配符组的模式(如 gpt*)不会被该名单包含,导致保护逻辑跳过。
  • 错误的替换前提: 仅检查 (api_base, api_key) 是否相同不够安全,因为不同复杂度梯度可能对应完全不同的底层模型。加密推理内容属于特定模型的思维链,不可跨模型延续。

环境排查

  • 确认 LiteLLM 代理版本:Issue 中报告为 v1.99.0,需要在 main 分支或更高版本中验证是否已包含修复 PR #40245 的完整代码。
  • 检查 config.yamlauto-router 及相关模型组的配置结构,确认是否存在通配符模型名称(如 model_name: "gpt*")。
  • 确认并记录各部署的 api_baseapi_key 环境变量指向,以便后续对照加密边界匹配情况。
  • 核查当前代码中 encrypted_content_affinity_check.py 的运行时机与模型组解析顺序。
  • 检查复杂度路由器的梯度定义中,各层级对应的 model_name 和实际部署名称是否一致。

解决步骤

  1. 确认问题影响范围:复现请求流程,确认仅当第二轮请求的消息被分类到与第一轮不同的梯度时才触发 503,以锁定为跨组路由问题。
  2. 检查代码补丁状态:若使用版本高于或等于包含 PR #40245 的构建,请审查该补丁中 _resolve_encrypted_content_affinity_hook 函数的逻辑,判断其对通配符模型组(如 gpt*)的匹配是否完善。若未包含此补丁,需升级版本或自行应用补丁。
  3. 调整模型命名策略(可优先尝试,属临时规避):将通配符模型组(gpt*)拆分成与复杂度梯度匹配的显式模型条目(如将生产第一轮内容的部署直接命名为 gpt-5.3-codex),使得原部署的 model_name 能命中复杂度配置中的层级列表,从而在补丁生效前让亲和性检查得以触发并钉住原路由。
  4. 若后续社区补丁跟进(按 Issue 评论建议):确保修复逻辑在路由分类前执行,并基于“已解析的部署”而非字面量模型名进行匹配,同时区分三种处理分支:原部署健康则钉住;原部署不可用但存在“同边界同模型”的对等体则替换;否则保持清晰的错误信息。

验证方法

完成修复或应用规避后,重复 Issue 中的用户流程:在第二轮请求中携带第一轮获得的 reasoning.encrypted_content,并确保新消息可被分类到不同梯度。若请求成功返回 HTTP 200,且响应内容延续了原部署的上下文,则问题已解决。同时,可执行额外回归测试:将原部署从路由中移除(应返回 400 Bad Request 而非 503)、模拟原部署冷却(应返回携带 Retry-After 的 RateLimitError)。

参考来源

BerriAI/litellm #40237

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22531

发表回复

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