快速结论:这个报错通常出现在通过 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、LangChainOllamaChatModel/ChatOllama,还是直接使用 Ollama 的/api/generate并设置"format"。 - 确认返回体中
response、thinking字段的实际内容,判断是否混入思考文本或空字符串。 - 确认 Pydantic 版本(报错链接指向 2.11 文档,可作为参考)。
解决步骤
- 先按 Issue 中的复现方式确认问题:使用 OpenAI SDK 的
client.beta.chat.completions.parse请求gpt-oss:20b,观察是否抛出相同的 PydanticValidationError。 - 对比移除
"format": "json"后的返回结果。Issue 中用户发现不设置 format 时能返回完整的 JSON 内容(但思考文本位于thinking字段),可据此判断问题是否由 format 约束触发。注意:这只是定位手段,不是稳定解决方案。 - 可优先尝试的绕过方式之一:在提示词中显式加入期望的 JSON schema,例如把
ThisIsMySchema.model_json_schema()放进 prompt,并提示模型按该 schema 回复。Issue 中用户反馈该方式“有时能用”,但返回的 JSON 可能被 Markdown 代码块包裹,且同一查询会随机成功或返回空内容,需要额外从```json位置截取内容。 - 可优先尝试的绕过方式之二:不要求
gpt-oss直接输出结构化格式,而是用另一个较小的模型把gpt-oss的自然语言响应转换成目标结构化格式。该用户反馈这种方式“冗余但稳定可用”。 - 如果上述绕过方式都不能接受,Issue 讨论中多位用户表示会暂时避免使用
gpt-oss处理结构化输出,等待 Ollama 侧对 Harmony 格式的集成适配,或使用其他支持结构化输出的模型。
验证方法
用同一段复现脚本再次请求:若返回内容能被 Pydantic 成功解析为 Response 模型且无 ValidationError,说明问题已解决;若仍出现空内容、思考文本前缀或 JSON 碎片,则问题依旧。对绕过方式,需要多次运行同一查询确认结果是否稳定,因为 Issue 中报告存在随机成功/失败的情况。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


