网关不认结构化输出:会话标题、记忆召回失败怎么关
走公司网关、第三方代理或者 Mantle 这类托管端点的人,可能碰到过一种「主对话好好的,周边功能却一直坏」的情况:会话标题生成不出来、自动记忆召回没反应、prompt 类型的 hook 报错。主线能聊,所以很容易被忽略。
CLI 2.1.288 把根因说清楚了,并给了开关:这些功能在后台会用到 structured outputs(结构化输出),而有的网关直接拒绝这类请求。修复之外,新增环境变量 CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS,可以整体关掉结构化输出。
症状长什么样
- 会话列表里的标题一直是默认名或空白,不会根据内容自动起名。
- 自动记忆 的召回不生效,之前记住的偏好像是「失忆」。
- 配了 prompt 类型的 hook(让模型判断的那种),每次都失败或被跳过。
- 主对话、读写文件、跑命令都正常。
共同点是:它们都是 Claude Code 自己在后台发起的小请求,要求模型按固定格式返回结果。网关如果不认这种请求格式,就会把它们拒掉,而主对话不受影响。
2.1.288 改了什么
- 修复:在 Mantle 或拒绝结构化输出的网关后面,会话标题、记忆召回、prompt hooks 不再因此失败。
- 新增开关:
CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS,用来明确告诉 Claude Code「别再发结构化输出请求」。
如果升级后症状已经消失,不用动任何配置。如果你的网关比较特殊,升级后仍然失败,再用这个开关兜底。
开关怎么用
在启动 Claude Code 的环境里设置(按惯例设为 1 表示开启):
bash
export CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS=1
claude团队统一管理时,也可以写进 settings 的 env 字段,让所有人走同一套配置。
几点提醒:
- 这个开关只是关掉结构化输出,不会替你修网关。能让网关支持的话,长期还是让网关支持更好。
- 在
-p无头模式里显式用--json-schema要结构化结果,是另一种用法,见 print 与 bare 模式在 CI 里的用法。开关打开后这类调用会不会受影响,以你所用版本实测为准。 - 直连 Anthropic 官方 API 的用户一般不需要碰它。
排查顺序
claude --version确认 ≥ 2.1.288,很多情况升级就好了。- 确认自己确实在网关或代理后面:检查
ANTHROPIC_BASE_URL等配置。 - 看症状是不是集中在标题、记忆、prompt hook 这几类「后台小请求」上。
- 仍失败时,设置
CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS=1重启会话再试。 - 还不行,就回到网关本身:看它返回的错误码,参考 ANTHROPIC_BASE_URL 400 排错 和 网关可观测请求头。
小结
- 网关拒绝结构化输出时,受伤的是会话标题、记忆召回、prompt hooks 这类后台功能,主对话看起来正常。
- 2.1.288 修了这个问题,并新增
CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS作为兜底开关。 - 先升级,再判断要不要开关;网关能支持的话,长期还是从网关侧解决。
「主线正常、周边全坏」时,先想到是不是网关不认某种请求格式,往往能少走很多弯路。