Structured output with OpenAI SDK and gpt-oss:20b not working

这个报错通常出现在通过 OpenAI SDK(含 client.beta.chat.completions.parse 或 LangChain/ChatOllama)对 gpt-oss:20b 请求结构化输出时,Ollama 返回的内容不是合法 JSON,导致 Pydantic 解析失败;优先排查

快速结论:这个报错通常出现在通过 OpenAI SDK(含 client.beta.chat.completions.parse 或 LangChain/ChatOllama)对 gpt-oss:20b 请求结构化输出时,Ollama 返回的内容不是合法 JSON,导致 Pydantic 解析失败;优先排查 gpt-oss 的 Harmony 响应格式是否与结构化输出不兼容,以及返回体里是否混入了思考文本或空内容。

适用环境:Ollama 0.11.0;macOS(Apple 芯片,Apple GPU/CPU);使用 OpenAI Python SDK 与 Pydantic 进行结构化输出;同时有用户在 LangChain 的 OllamaChatModel/ChatOllama 中遇到同类问题。

最快修复方案:暂无确认的一步修复方案。Issue 中讨论的替代做法(把 JSON schema 写进提示词、用其他小模型把 gpt-oss 的输出再转成结构化格式、手动截取 ```json 之后的内容)都属于绕过手段,未被官方确认为稳定修复。

注意事项:把 schema 写进提示词并不能保证输出符合编译后的语法约束,返回结果仍可能被 Markdown 包裹,或在字符串中夹带前缀文本,需要额外清洗;有用户实测同一查询会随机成功或返回空内容,因此不建议在生产中依赖该绕过方式处理 gpt-oss 的结构化输出。

问题场景

用户在本地启动 Ollama 服务后,通过 OpenAI SDK 的 base_url="http://localhost:11434/v1" 调用 gpt-oss:20b,并使用 client.beta.chat.completions.parse 配合 Pydantic 模型 Response 请求结构化输出。Ollama 官方博客称支持 OpenAI SDK 结构化输出,但实际返回内容无法被 Pydantic 解析。同类问题也出现在 LangChain 的 OllamaChatModel/ChatOllama,以及直接调用 Ollama 并设置 "format": "json" 或指定具体 format 的场景中。

报错原文

Structured output with OpenAI SDK and gpt-oss:20b not working

pydantic_core._pydantic_core.ValidationError: 1 validation error for Response
  Invalid JSON: expected value at line 1 column 1 [type=json_invalid, input_value='The user says "\n\n    \t}\n       \t\t \t\t    ', input_type=str]
    For further information visit https://errors.pydantic.dev/2.11/v/json_invalid

原因分析

Issue 中有评论指出,结构化输出在 gpt-oss 上失效是因为该模型使用了新的 Harmony 响应格式,Ollama 侧可能尚未在集成层正确适配这一格式,导致结构化输出无法按预期编译/约束语法。

从复现日志看,返回的 response 字段有时为空,有时以思考文本开头,有时只是类似 {\"\n\n } 的碎片;设置 "format": "json" 时更容易出现错误碎片,而完全移除 "format" 后反而能返回较完整的 JSON(但思考文本仍在 thinking 字段中)。另外,直接指定具体 format 时,用户反馈始终得到空响应文本。这些都指向 gpt-oss 的思考/输出分段与 Ollama 当前结构化输出解析逻辑之间的兼容问题。

环境排查

  • 确认 Ollama 版本(Issue 中为 0.11.0)。
  • 确认操作系统与硬件(Issue 中为 macOS,Apple GPU/CPU)。
  • 确认模型是否为 gpt-oss:20b
  • 确认调用方式:OpenAI SDK beta.chat.completions.parse、LangChain OllamaChatModel/ChatOllama,还是直接使用 Ollama 的 /api/generate 并设置 "format"
  • 确认返回体中 responsethinking 字段的实际内容,判断是否混入思考文本或空字符串。
  • 确认 Pydantic 版本(报错链接指向 2.11 文档,可作为参考)。

解决步骤

  1. 先按 Issue 中的复现方式确认问题:使用 OpenAI SDK 的 client.beta.chat.completions.parse 请求 gpt-oss:20b,观察是否抛出相同的 Pydantic ValidationError
  2. 对比移除 "format": "json" 后的返回结果。Issue 中用户发现不设置 format 时能返回完整的 JSON 内容(但思考文本位于 thinking 字段),可据此判断问题是否由 format 约束触发。注意:这只是定位手段,不是稳定解决方案。
  3. 可优先尝试的绕过方式之一:在提示词中显式加入期望的 JSON schema,例如把 ThisIsMySchema.model_json_schema() 放进 prompt,并提示模型按该 schema 回复。Issue 中用户反馈该方式“有时能用”,但返回的 JSON 可能被 Markdown 代码块包裹,且同一查询会随机成功或返回空内容,需要额外从 ```json 位置截取内容。
  4. 可优先尝试的绕过方式之二:不要求 gpt-oss 直接输出结构化格式,而是用另一个较小的模型把 gpt-oss 的自然语言响应转换成目标结构化格式。该用户反馈这种方式“冗余但稳定可用”。
  5. 如果上述绕过方式都不能接受,Issue 讨论中多位用户表示会暂时避免使用 gpt-oss 处理结构化输出,等待 Ollama 侧对 Harmony 格式的集成适配,或使用其他支持结构化输出的模型。

验证方法

用同一段复现脚本再次请求:若返回内容能被 Pydantic 成功解析为 Response 模型且无 ValidationError,说明问题已解决;若仍出现空内容、思考文本前缀或 JSON 碎片,则问题依旧。对绕过方式,需要多次运行同一查询确认结果是否稳定,因为 Issue 中报告存在随机成功/失败的情况。

参考来源

ollama/ollama #11691

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23760

发表回复

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