跳转到内容

状态与停止原因

不同协议用不同名称表达“模型停止继续输出”。ProxAI 把这些视为相关的协议概念,而不是可以直接互换的原始字段。

协议终止字段或事件含义
OpenAI Responsesstatus、output items、response.completedresponse envelope 和 typed events 共同描述完成。
OpenAI Chat Completionschoices[].finish_reason、[DONE]每个 choice 有 finish reason;stream 用 [DONE] 结束。
Anthropic Messagesstop_reason、stop_sequence、message_stop最终 message 携带 stop 元数据;stream 用 message_stop 结束。
Anthropic Messages stop_reason
end_turn映射到 stop

assistant 自然结束当前轮次。

max_tokens映射到 length

因为 token 预算耗尽而停止生成。

stop_sequence映射到 stop

命中了配置的 stop sequence。stop_sequence 可能标识匹配到的序列。

tool_use映射到 tool_calls

assistant 生成了工具调用请求,期望客户端/工具循环继续。

pause_turn映射到 stop 或协议特定续接状态

Provider 要求客户端稍后继续;转换时不能伪装成普通最终回答。

refusal映射到 refusal 元数据 / 带 refusal 内容的 Responses completed

模型拒绝是一次终态 assistant 输出,不是 provider/request failure。

OpenAI Chat Completions finish_reason
stop映射到 end_turn / stop_sequence

模型正常停止或命中显式停止条件。

length映射到 max_tokens

模型因为 token 预算耗尽而停止。

tool_calls映射到 tool_use

assistant 输出了工具调用。

content_filter映射到 refusal / incomplete Responses

Provider 因安全或策略原因停止输出。按策略停止/截断处理,不当作传输失败。

Wire struct 会精确映射官方字段契约,不会把字段缺失和 null 当成可以互换的状态:

情况表示或处理方式
官方 required-nullable 字段RequiredNullable<T>:拒绝 missing,接受显式 null 和具体值。
官方 optional 字段使用带显式 serde presence 处理的 Option<T>。
已知 provider 省略 required-nullable 字段只有已测量 fixture 记录该偏差时,窄范围 provider normalization 才能在 protocol 反序列化前补成显式 null。
终止事件之前的流式状态内部累积 state 使用自己的 optional 字段;官方 wire event 仍保持严格。

因此,成功的最终 Anthropic message 会遵守官方 stop 字段的 requiredness。失败或中断的上游响应应作为错误处理,而不是放宽 protocol carrier 或伪造 stop reason。

  • ProxAI 会观察流式终止事件;不会把任意字节流关闭当成语义完成。
  • ProxAI 不会伪造 provider 特有的原因细节,例如上游 code、param 或匹配到的 stop sequence。
  • 跨协议映射优先保留行为,其次才是字段名称。
  • 模型 refusal 是语义输出,不是上游/request failure;不要映射成 Responses failed。
  • Responses failed 是响应生命周期/错误状态;没有 refusal 内容时不要伪造成 Anthropic refusal。
  • 工具调用终止状态必须和自然文本完成保持区分。