Responses Lite 不是把标准请求发往另一个 URL,而是把顶层指令和工具重新编码进 Input 前缀,并关闭若干能力。Codex 在请求编译处完成这种方言适配,上游 Prompt 不需要理解线协议差异。
具体问题与启用条件
本节比较两种请求方言及其能力协商;字段逐项序列化见 5.6,传输选择见 5.7—5.8。
| 条件来源 | 决定字段或状态 | 对本机制的影响 |
|---|---|---|
| 模型能力 | use_responses_lite | 选择 Lite 编码 |
| Provider | Responses wire API | 两种方言仍使用 Responses 事件模型 |
| 模型能力 | reasoning summary、verbosity、parallel tools | 决定字段发送或降级 |
协议、类型与状态所有权
| 状态或协议 | 所有者 | 生命周期 | 关键不变量 |
|---|---|---|---|
| 内部 Prompt | Core Turn | 一次采样 | 方言无关 |
| ResponsesApiRequest | ModelClient | 一次请求尝试 | 反映已协商能力 |
| AdditionalTools + developer prefix | Lite 编译分支 | 请求 Input 前缀 | 替代顶层 tools/instructions |
机制调用链如下:
Prompt + ModelInfo
→ 判断 use_responses_lite
→ 标准:instructions/tools 顶层编码
→ Lite:AdditionalTools + Developer Message 前置
→ 过滤不支持的 image detail/parallel tools
→ 两种方言进入同一流事件映射
机制怎样工作
标准 Responses 保留 instructions、tools 和 parallel_tool_calls 的顶层含义。Lite 则把工具序列化为 AdditionalTools Developer 输入项,把 Base Instructions 变成 Developer Message,二者插到原始 Input 前面;顶层 instructions 变为空串、tools 为空,并强制关闭并行工具调用。Lite 还移除图片 detail,并把 reasoning context 设为所有 Turn。
能力协商不是一次集中握手,而是编译期门控:模型不支持推理摘要就不发送 summary;不支持 verbosity 就省略;是否使用 sequential cutoff summaries 又取决于 Feature 与 OpenAI Provider。这样的“省略”比发送一个看似合理但服务端不认识的值更安全。
Python 风格伪代码
这段伪代码保留生产实现中会改变结果的状态、分支和异步边界;认证 SDK、遥测字段和 Rust 所有权样板被折叠为明确的领域对象。
def compile_dialect(prompt: Prompt, model: ModelInfo) -> ResponsesRequest:
input_items = clone_items(prompt.input)
if model.use_responses_lite:
strip_image_detail(input_items)
prefix = [
AdditionalTools.from_specs(prompt.tools),
developer_message(prompt.base_instructions.text),
]
return request(
instructions="", input=prefix + input_items, tools=None,
parallel_tool_calls=False,
reasoning_context="all_turns",
)
return request(
instructions=prompt.base_instructions.text,
input=input_items,
tools=serialize_tools(prompt.tools),
parallel_tool_calls=prompt.parallel_tool_calls,
)
失败、取消与恢复
| 故障或边界 | 已发生的状态 | 对上层的结果 | 能否直接重试 | 恢复动作 |
|---|---|---|---|---|
| 把 Lite 当成标准请求 | 字段已放在错误层 | 服务端忽略或拒绝能力 | 否 | 重新编译方言 |
| Lite 仍发送并行工具 | 请求语义冲突 | 可能 4xx | 否 | 强制关闭 |
| 发送不支持的 verbosity/summary | 请求已编码 | Provider 4xx | 否 | 按 ModelInfo 省略 |
| Lite 图片保留 detail | Input 已构造 | 不兼容字段 | 否 | 请求投影时清除 |
设计取舍与验证
在 ModelClient 内适配方言,让 Prompt、History 和 ToolRouter 继续使用统一类型;代价是请求构造器承担了更多兼容逻辑。另一方案是让上游直接构造 Lite Prompt,但会把同一会话的语义历史分裂成两套表示,更难做重试和测试。
| 可验证契约 | 证据方式 | 预期结果 |
|---|---|---|
| Lite 指令和工具进入 Input 前缀 | 请求 body 捕获 | 顶层字段清空且顺序稳定 |
| Lite 关闭 parallel tool calls | 集成请求断言 | 字段恒为 false |
| 标准模式保持顶层字段 | 同一 Prompt 的对照测试 | instructions/tools 不被前置消息替代 |
Mini Codex 对照
Mini Codex 可定义 WireDialect 策略,让两种编译器共享 Prompt 类型。若不实现 Lite,应在能力解析时明确拒绝该模型,不能静默用标准方言发送。
本节边界
这里完成请求方言选择。下一节进入与模型语义无关、但影响路由和审计的请求身份。
评论
登录后即可评论