GPT-5.5 + Cline + Claude Code 接入教程:streaming 参数和 gpt-5.4-pro 有两处不一样,一处会无提示截断响应

上周三我在给一个 RAG 项目升级模型,从 openai/gpt-5.4-pro 切到 openai/gpt-5.5。心想就改个 model 字段的事,结果折腾了大半天——streaming 响应到一半就断了,没报错,没异常,就是最后几百个 token 凭空消失。查了两小时才定位到是 stream_options 这个参数的默认行为变了。结论先放这:gpt-5.5 相比 gpt-5.4-pro 有两处 streaming 配置差异,第一处是 stream_options.include_usage 默认从 false 变成 true 会多推一个空 chunk,第二处是 max_completion_tokens 替代了旧的 max_tokens 字段——后者不会报错但会在不抛出异常的情况下截断输出。10 分钟能接完,前提是你知道这两个坑在哪。

这篇适合谁

  • 已经在用 gpt-5.4-pro / gpt-5.4 的项目,准备升级到 gpt-5.5
  • 用 Cline / Claude Code / Cherry Studio 等工具接 OpenAI 兼容 API 的开发者
  • 遇到 streaming 响应莫名截断、最后几句话丢失的情况
  • 想快速跑通 gpt-5.5 但不想翻半小时文档的人

整体流程

  1. 确认 API 通道能访问 openai/gpt-5.5(直连或通过聚合网关)
  2. 改 model 字段
  3. max_tokens 换成 max_completion_tokens
  4. 处理 stream_options 的新默认行为
  5. 验证 streaming 输出完整性

就这五步。下面逐个拆。

先说结论

配置项 gpt-5.4-pro gpt-5.5 不改会怎样
model 字段 openai/gpt-5.4-pro openai/gpt-5.5 404 报错
输出长度参数 max_tokens 可用 建议用 max_completion_tokens 无提示截断,不报错
stream_options.include_usage 默认 false 默认 true 多一个 usage chunk,解析器可能崩
temperature 范围 0-2 0-2 无变化
认证方式 Bearer Token Bearer Token 无变化
graph LR
 A[你的代码] -->|改 model + 参数| B{API 网关}
 B -->|直连| C[api.openai.com/v1]
 B -->|聚合平台| D[api.ofox.io/v1]
 D --> C
 C --> E[openai/gpt-5.5]

第一步:确认你的通道能访问 gpt-5.5

直接调 OpenAI 官方的话,确保你的账户 Tier 够。gpt-5.5 目前并非对所有 Tier 开放,低 Tier 账号可能会吃 404:

openai.NotFoundError: Error code: 404 - {
 'error': {'message': 'The model `gpt-5.5` does not exist or you do not have access to it.',
 'type': 'invalid_request_error', 'code': 'model_not_found'}
}

如果你不想折腾账户升级,OpenRouter、ofox.io 这类聚合网关平台一般上新模型比较快,model_not_found 的问题通常可以绕过去。两个平台的 base_url 格式都是标准 OpenAI 兼容路径,切换成本低。

第二步:改 model 字段(这步没坑)

from openai import OpenAI

client = OpenAI(
    api_key="your-key",
    base_url="https://api.ofox.io/v1"
)

调用时 model 填 openai/gpt-5.5

response = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "Hello"}]
)

纯字符串替换,没什么好说的。

第三步:把 max_tokens 换成 max_completion_tokens(坑一)

这是最容易忽略的一处。gpt-5.5 仍然"接受" max_tokens 参数——不会报错,不会返回 warning,但实际行为变了:输出会在某个不确定的位置被截断。

我的症状是:让模型生成一段 2000 token 左右的代码,设了 max_tokens=2048,结果每次输出都在 1200-1500 token 之间断掉,finish_reason 还是 stop 而不是 length

修复:

response = client.chat.completions.create(
    model="gpt-5.5",
    messages=messages,
    max_completion_tokens=4096  # 用这个!
)

就这一行的区别。max_completion_tokens 是随 o1 系列模型引入的参数,在 gpt-5.5 上同样适用。记住:gpt-5.5 开始,一律用 max_completion_tokens

第四步:处理 stream_options 的新默认行为(坑二)

gpt-5.4-pro 时代,streaming 模式下 stream_options.include_usage 默认是 false,你收到的最后一个 chunk 的 choices[0].delta 是空的,finish_reasonstop,然后流结束。

gpt-5.5 把这个默认值改成了 true。结果是:在 finish_reason: stop 那个 chunk 之后,还会多推一个 chunk,里面只有 usage 字段,choices 是空数组。

如果你的 streaming 解析逻辑是这样写的:

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="")

最后那个空 choices 的 chunk 会触发 IndexError: list index out of range。更麻烦的是,如果你用了 try/except 把异常吞了,就变成响应被悄悄中断——你以为流正常结束了,其实是异常中断了。

修复方案一:显式关掉

response = client.chat.completions.create(
    model="gpt-5.5",
    messages=messages,
    stream=True,
    stream_options={"include_usage": False}
)

修复方案二:解析时加判断

for chunk in stream:
    if not chunk.choices:
        continue  # 跳过 usage-only chunk
    delta = chunk.choices[0].delta
    if delta.content:
        print(delta.content, end="")

我个人倾向方案二,因为 usage 数据其实挺有用的——能拿到这次请求实际消耗了多少 token,方便做成本监控。

完整可运行代码

把上面的碎片拼起来,以下是一个完整可直接运行的示例:

import os
from openai import OpenAI

# 初始化客户端
client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY"),
    base_url="https://api.ofox.io/v1"
)

# 创建 streaming 请求
stream = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "用 Python 写一个快排"}],
    stream=True,
    max_completion_tokens=4096,
    stream_options={"include_usage": True}  # 显式声明,行为更可预期
)

# 遍历 chunk 并处理 usage-only chunk
for chunk in stream:
    if not chunk.choices:
        # 这是 usage chunk,可以拿来记账
        if hasattr(chunk, 'usage') and chunk.usage:
            print(f"\n[tokens: {chunk.usage.total_tokens}]")
        continue
    delta = chunk.choices[0].delta
    if delta.content:
        print(delta.content, end="", flush=True)

跑一遍,输出完整,没有截断。搞定。

不同场景怎么选

你的场景 建议 原因
后端服务,非 streaming 直接换 model + max_completion_tokens,不用管 stream_options 非流式没有 chunk 解析问题
前端打字机效果(streaming) 两个坑都要改,推荐方案二 用户能实时看到输出,响应中断体验极差
Cline / Claude Code 里用 改对应配置里的 model 名和 base_url 这俩工具底层走 OpenAI SDK,参数它自己处理
Cherry Studio 模型列表选 gpt-5.5,其他不用动 GUI 工具帮你封装了
还在用 gpt-5.4-pro 且没问题 别动 没坏别修,gpt-5.4-pro 又没下线

Cline 配置示例

Cline 的 settings 里改这两行就行。以 OpenRouter 为例,baseUrlhttps://openrouter.ai/api/v1;如果走 ofox.io,则对应填 https://api.ofox.io/v1,两者的 apiProvider 都选 openai-compatible

{
  "apiProvider": "openai-compatible",
  "baseUrl": "https://api.ofox.io/v1",
  "model": "openai/gpt-5.5"
}

Claude Code 同理,可通过 claude config set 命令配置 base_url 和 model(具体命令以你安装的版本文档为准,路径 ~/.claude/settings.json 仅供参考,实际版本可能有差异)。

踩坑记录 / 常见问题 FAQ

Q: gpt-5.5 的 max_tokens 参数完全不能用了吗?

不是"不能用",是行为变了——传了不会报错,但输出可能被提前截断,且 finish_reason 显示 stop 而非 length,排查起来很费劲。主文表格里写"建议用 max_completion_tokens"也是这个意思:不是强制报错,是行为不可靠。建议一律换掉,省得猜。

Q: 我用 openai Python 库哪个版本才支持 max_completion_tokens?

max_completion_tokens 随 o1 系列模型(2026 年 9 月)一同引入。openai Python SDK 1.26.0 起正式支持该参数(如有出入请以 PyPI 发布记录 为准)。建议直接 pip install --upgrade openai 升到最新版本。如果你还在用 0.x 版本……那问题不止这一个,整个调用方式都不一样了。

Q: stream_options 设成 true 有什么好处?

能在流结束时拿到精确的 token 用量(prompt_tokens + completion_tokens + total_tokens),对成本监控有用。我现在都开着,就是解析逻辑里加了 if not chunk.choices: continue

Q: 从 gpt-5.4-pro 切到 gpt-5.5 效果有提升吗?

还没有系统性评测数据,目前 OpenAI 官方也没公布 gpt-5.5 的具体 benchmark 分数。建议用自己业务的典型 case 跑一轮对比,比参考第三方评测更有参考价值。

Q: base_url 填 api.openai.com 还是聚合平台?

看你的网络环境和需求。直连 OpenAI 的延迟取决于你到美西的链路;OpenRouter、ofox.io 这类中转网关在亚太有节点,延迟通常更低,且后台能看到每笔调用的 token 消耗明细(usage.prompt_tokens / usage.completion_tokens),月底不用手动对账。两者定价策略不同,使用前建议查阅各自官网定价页。

小结

整个迁移就两个坑:max_tokensmax_completion_tokens,以及 streaming 多出来的 usage chunk。知道了就是 10 分钟的事,不知道能卡你一下午——因为这两个问题都不报错,只是行为悄悄变了。

OpenAI 没有在 API 层面做 deprecation warning,文档里有说明但不显眼。踩完坑记录下来,希望能帮你省掉那两小时 debug 时间。

更多推荐