快速结论:该报错出现在通过 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与非流式响应顶层字段。
解决步骤
- 先复现基线:按 Issue 中的 curl 请求,对
hosted_vllm模型发起非流式POST /v1/messages,检查响应顶层是否含stop_sequence。若在当前main或 v1.105.1 上响应已带"stop_sequence": null,说明并非 LiteLLM 默认行为导致。 - 若仍缺失该键,逐一排查该代理的 callback、guardrail 与
general_settings,临时禁用后重新请求,观察响应体是否恢复完整。 - 构造命中 stop sequence 的请求(例如
"stop_sequences":[", 7"]),检查返回的stop_reason与stop_sequence。若出现"stop_reason": "end_turn", "stop_sequence": null,即为 PR #47981 所修复的缺陷。 - 升级到包含 PR #47981 修复的版本,或等待修复合入后再验证 stop sequence 场景。
- 客户端侧对
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)
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: /v1/realtime with Gemini Live stalls after the first output_audio_transcript.delta when the turn is triggered by streamed audio (text](https://www.chat-gpts.plus/wp-content/uploads/2026/10/47975-c35b3ecd-768x403.jpg)
![[Bug]: Decisions API should not hardcode an arbitrary 128-question limit](https://www.chat-gpts.plus/wp-content/uploads/2026/10/47536-1f08eb36-768x403.jpg)
