Skip to content

网关不认结构化输出:会话标题、记忆召回失败怎么关 ​

走公司网关、第三方代理或者 Mantle 这类托管端点的人,可能碰到过一种「主对话好好的,周边功能却一直坏」的情况:会话标题生成不出来、自动记忆召回没反应、prompt 类型的 hook 报错。主线能聊,所以很容易被忽略。

CLI 2.1.288 把根因说清楚了,并给了开关:这些功能在后台会用到 structured outputs(结构化输出),而有的网关直接拒绝这类请求。修复之外,新增环境变量 CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS,可以整体关掉结构化输出。

症状长什么样 ​

  • 会话列表里的标题一直是默认名或空白,不会根据内容自动起名。
  • 自动记忆 的召回不生效,之前记住的偏好像是「失忆」。
  • 配了 prompt 类型的 hook(让模型判断的那种),每次都失败或被跳过。
  • 主对话、读写文件、跑命令都正常。

共同点是:它们都是 Claude Code 自己在后台发起的小请求,要求模型按固定格式返回结果。网关如果不认这种请求格式,就会把它们拒掉,而主对话不受影响。

2.1.288 改了什么 ​

  1. 修复:在 Mantle 或拒绝结构化输出的网关后面,会话标题、记忆召回、prompt hooks 不再因此失败。
  2. 新增开关: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 的用户一般不需要碰它。

排查顺序 ​

  1. claude --version 确认 ≥ 2.1.288,很多情况升级就好了。
  2. 确认自己确实在网关或代理后面:检查 ANTHROPIC_BASE_URL 等配置。
  3. 看症状是不是集中在标题、记忆、prompt hook 这几类「后台小请求」上。
  4. 仍失败时,设置 CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS=1 重启会话再试。
  5. 还不行,就回到网关本身:看它返回的错误码,参考 ANTHROPIC_BASE_URL 400 排错 和 网关可观测请求头。

小结 ​

  • 网关拒绝结构化输出时,受伤的是会话标题、记忆召回、prompt hooks 这类后台功能,主对话看起来正常。
  • 2.1.288 修了这个问题,并新增 CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS 作为兜底开关。
  • 先升级,再判断要不要开关;网关能支持的话,长期还是从网关侧解决。

「主线正常、周边全坏」时,先想到是不是网关不认某种请求格式,往往能少走很多弯路。

Claude-cn.org,专注于 Claude Code 中文教程