[Bug]: Non-streamed /v1/messages response has no `stop_sequence` key unless a stop sequence fired (hosted_vllm)

该报错出现在通过 LiteLLM Proxy 调用 POST /v1/messages 、后端路由到 hosted_vllm 的非流式场景中,表现为响应缺少 stop_sequence 或该字段取值异常。优先确认 LiteLLM 版本与代理侧的 callback、guardrail、 general

快速结论:该报错出现在通过 LiteLLM Proxy 调用 POST /v1/messages、后端路由到 hosted_vllm 的非流式场景中,表现为响应缺少 stop_sequence 或该字段取值异常。优先确认 LiteLLM 版本与代理侧的 callback、guardrail、general_settings 是否改写了响应体。

适用环境:Issue 中确认的环境为 LiteLLM v1.105.1(由 x-litellm-version 响应头确认)、vLLM 0.31.0 dev build,模型 hosted_vllm/zai-org/GLM-5.3;原报告使用 2026-10-22 的运行记录。

最快修复方案:暂无确认的一步修复方案。Issue 描述中的“缺少 stop_sequence 键”在当前 main(f2118fc)与 v1.105.1 上均未复现,报告者也可优先排查自己的代理配置;而“stop sequence 已触发但 stop_reason 仍为 end_turn”属于真实缺陷,已在 PR #47981 中修复。

注意事项:缺失 stop_sequence 键这一现象未能在官方侧复现,也可能是本地 callback、guardrail 或 general_settings 改写了响应,未经确认;PR #47981 只针对“stop sequence fired”场景,修复前请勿假设缺失键问题一定随之消失。

问题场景

用户在 LiteLLM Proxy 上以 Anthropic Messages 格式请求 POST /v1/messages,模型配置为 model_name: glm-5.3、model: hosted_vllm/zai-org/GLM-5.3、api_base: http://<vllm-host>:8000/v1。非流式响应在未触发自定义 stop sequence 时缺少 stop_sequence 键;同时,在命中了 stop sequence 的对照请求中,返回的 stop_reason 与 stop_sequence 也与预期不一致。

报错原文

[Bug]: Non-streamed /v1/messages response has no `stop_sequence` key unless a stop sequence fired (hosted_vllm)

Top-level keys: `content, id, model, role, stop_reason, type, usage`; no `stop_sequence`.

Expected: `"stop_sequence": null` on every non-streamed message where no stop sequence fired.

code that reads `message["stop_sequence"]` raises `KeyError`

原因分析

报告者提出的可能原因(其自述为线索而非确认诊断):hosted_vllm 的 /v1/messages 由 Anthropic-to-Chat 适配器处理(响应 id 为后端的 chatcmpl-…)。在 v1.105.1 中,LiteLLMAnthropicMessagesAdapter.translate_openai_response_to_anthropic(litellm/llms/anthropic/pass_through/adapters/transformation.py)构造消息时使用 stop_sequence=None 与 stop_details=None,后续序列化步骤可能丢弃取值为 None 的键,但报告者未定位到具体步骤。

维护者复现后给出的结论有所不同:缺失 stop_sequence 键在 main 与 v1.105.1 上均未复现,两者在未触发 stop sequence 时都返回 "stop_sequence": null,因此该现象可能来自代理上的 callback、guardrail 或 general_settings 对响应体的改写。另有一处真实缺陷:vLLM 在 choice 的 stop_reason 中报告了命中的字符串,但代理返回 "stop_reason": "end_turn", "stop_sequence": null,与上游不一致。

环境排查

  • 确认 LiteLLM 版本:查看响应头 x-litellm-version,报告中为 v1.105.1;对比当前 main(f2118fc)行为。
  • 确认 vLLM 版本:报告中为 0.31.0 dev build,并确认其 choice 中 stop_reason 是否为命中的 stop 字符串。
  • 确认 model_list 配置:hosted_vllm/... 前缀、api_base 是否指向 vLLM 的 /v1。
  • 排查代理侧是否启用 callback、guardrail 或 general_settings,它们可能是响应体被改写的来源。
  • 分别测试流式与非流式请求,对比 message_start 中的 stop_sequence 与非流式响应顶层字段。

解决步骤

  1. 先复现基线:按 Issue 中的 curl 请求,对 hosted_vllm 模型发起非流式 POST /v1/messages,检查响应顶层是否含 stop_sequence。若在当前 main 或 v1.105.1 上响应已带 "stop_sequence": null,说明并非 LiteLLM 默认行为导致。
  2. 若仍缺失该键,逐一排查该代理的 callback、guardrail 与 general_settings,临时禁用后重新请求,观察响应体是否恢复完整。
  3. 构造命中 stop sequence 的请求(例如 "stop_sequences":[", 7"]),检查返回的 stop_reason 与 stop_sequence。若出现 "stop_reason": "end_turn", "stop_sequence": null,即为 PR #47981 所修复的缺陷。
  4. 升级到包含 PR #47981 修复的版本,或等待修复合入后再验证 stop sequence 场景。
  5. 客户端侧对 stop_sequence 缺失做防御性读取(如 message.get("stop_sequence")),避免 KeyError,但这只是规避而非修复。

验证方法

对未触发 stop sequence 的非流式请求,响应应包含 "stop_sequence": null,且与流式 message_start 中的 "stop_sequence": null 一致;对命中 stop sequence 的请求,应返回 "stop_reason": "stop_sequence" 与命中的字符串(如 ", 7")。另需确认回调或 guardrail 启用后响应体不再丢失该字段。

参考来源

BerriAI/litellm #47946(Issue 中另提及 PR #47981 修复 stop sequence 场景,以及相关 PR #42439、#37118)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29761

发表回复

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