Response returns ‘null’ for ‘finish_reason’

当 Ollama 的推理因“超过最大 token 重复限制”被强制终止时,OpenAI 兼容接口返回的 JSON 里 finish_reason 为 null ,而不是正常的 stop ,导致 OpenAI .NET 等客户端抛出 Unknown ChatFinishReason value. 。优

快速结论:当 Ollama 的推理因“超过最大 token 重复限制”被强制终止时,OpenAI 兼容接口返回的 JSON 里 finish_reasonnull,而不是正常的 stop,导致 OpenAI .NET 等客户端抛出 Unknown ChatFinishReason value.。优先排查提示词与 response_format(尤其 JSON 模式)是否匹配。

适用环境:Ollama 0.3.14(用户后续在 0.4.1 上复现同样行为);Windows;CPU Intel、GPU Intel;使用 OpenAI .NET 库通过 Ollama 的 OpenAI 兼容接口调用 llama3.2 模型。

最快修复方案:暂无确认的一步修复方案。Issue 中维护者与提问者的结论是:该场景由服务端生成被中止引起,客户端库需要自行处理 finish_reasonnull 的不完整响应;同时可从修正提示词与 response_format 的匹配入手规避。

注意事项:这不是 TCP 超时,而是生成长度/重复触发的终止逻辑。Ollama 侧“是否应改为返回合法枚举值”在 Issue 中并未被确认修复,也没有给出官方补丁;下面的规避手段属于可优先尝试,不代表已由维护者验证。

问题场景

用户用 OpenAI .NET 库连接 Ollama,走 OpenAI 兼容的 /v1/chat/completions 接口,模型为默认的 llama3.2。正常返回时能正确解析,但在“请求超时/耗时较长的任务”中失败,报出 Unknown ChatFinishReason value.。后续讨论澄清:并非真正的网络超时,而是生成跑飞后被最大 token 重复限制终止。

报错原文

System.ArgumentOutOfRangeException: Unknown ChatFinishReason value.
Parameter name: value
   at OpenAI.Chat.ChatFinishReasonExtensions.ToChatFinishReason(String value)
   at OpenAI.Chat.InternalCreateChatCompletionResponseChoice.DeserializeInternalCreateChatCompletionResponseChoice(JsonElement element, ModelReaderWriterOptions options)
   at OpenAI.Chat.ChatCompletion.DeserializeChatCompletion(JsonElement element, ModelReaderWriterOptions options)
   at OpenAI.Chat.ChatCompletion.FromResponse(PipelineResponse response)
   at OpenAI.Chat.ChatClient.<CompleteChatAsync>d__8.MoveNext()

异常对应服务端返回中的关键片段:

"finish_reason": null

原因分析

根据 Issue 讨论,正常响应返回 "finish_reason": "stop";异常响应返回 "finish_reason": null,且 usage 中 token 计数全为 0。维护者判断这是生成“跑飞”后触发了最大 token 重复限制、生成被中止,因此无法给出正常结束原因。

随后用 curl 直接调用可稳定复现:当提示词与 response_format(例如 {"type":"json_object"})不匹配时,模型持续输出空白/重复内容直至被终止,接口于是返回 finish_reasonnull

可能的责任划分:Ollama 侧在生成被中止时输出了 null;而 OpenAI .NET 库未对不完整响应做兜底处理,直接在 ToChatFinishReason 中解析该值并抛错。Issue 中维护者认为“处理服务端异常情况(含超时/中止)是客户端库的责任”。

环境排查

  • Ollama 版本:用户初始为 0.3.14,升级到 0.4.1 后行为相同,说明升级不一定能解决。
  • 模型:llama3.2 / llama3.2:3bllama3.2:latest
  • 调用方式:OpenAI .NET 库,或直接 curl/v1/chat/completions
  • 请求参数:是否设置了 response_format(如 json_object),以及提示词是否与 JSON 输出要求一致。
  • 是否设置 stream: false,以及返回体中的 finish_reasonusage 数值。
  • Issue 未提供 Python、CUDA、PyTorch 信息,本问题与这些环境无关,无需排查。

解决步骤

  1. 先用 curl 脱离 .NET 库直接验证是否为服务端返回本身的问题,观察 finish_reason 与 token 计数。Issue 中给出的复现请求形如:{"model":"llama3.2:3b","messages":[{"role":"user","content":"why is the sky blue?"}],"stream":false,"response_format":{"type":"json_object"},"seed":0,"temperature":0}
  2. 检查提示词与 response_format 是否匹配。若请求 JSON 输出,提示词中应明确要求返回 JSON,避免模型在 JSON 模式下持续输出空白或重复内容触发中止。
  3. 调整或移除 response_format(如 {"type":"json_object"})后重试同一提示词,确认 finish_reason 是否恢复为 stop
  4. 在客户端侧做防御:对返回中出现 finish_reasonnullusage 全为 0 的不完整响应,不要直接交给 ToChatFinishReason 解析,先判定为失败/重试。
  5. 可优先尝试升级 Ollama 到较新版本以缩小排查面,但 Issue 中已证明用户升到 0.4.1 仍未改变该行为,不要把它当作确定修复。

验证方法

用同一提示词重发请求,检查返回 JSON 中 choices[0].finish_reason 是否为 "stop",同时 usageprompt_tokens/completion_tokens/total_tokens 是否为非 0。若 .NET 客户端不再抛 Unknown ChatFinishReason value. 且能正常解析,即视为该调用路径已规避此问题。注意:这只是规避,Issue 中 Ollama 侧并未确认提供修复。

参考来源

ollama/ollama #7547

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22925

发表回复

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