end_turn映射到 stopassistant 自然结束当前轮次。
不同协议用不同名称表达“模型停止继续输出”。ProxAI 把这些视为相关的协议概念,而不是可以直接互换的原始字段。
| 协议 | 终止字段或事件 | 含义 |
|---|---|---|
| OpenAI Responses | status、output items、response.completed | response envelope 和 typed events 共同描述完成。 |
| OpenAI Chat Completions | choices[].finish_reason、[DONE] | 每个 choice 有 finish reason;stream 用 [DONE] 结束。 |
| Anthropic Messages | stop_reason、stop_sequence、message_stop | 最终 message 携带 stop 元数据;stream 用 message_stop 结束。 |
end_turn映射到 stopassistant 自然结束当前轮次。
max_tokens映射到 length因为 token 预算耗尽而停止生成。
stop_sequence映射到 stop命中了配置的 stop sequence。stop_sequence 可能标识匹配到的序列。
tool_use映射到 tool_callsassistant 生成了工具调用请求,期望客户端/工具循环继续。
pause_turn映射到 stop 或协议特定续接状态Provider 要求客户端稍后继续;转换时不能伪装成普通最终回答。
refusal映射到 refusal 元数据 / 带 refusal 内容的 Responses completed模型拒绝是一次终态 assistant 输出,不是 provider/request failure。
stop映射到 end_turn / stop_sequence模型正常停止或命中显式停止条件。
length映射到 max_tokens模型因为 token 预算耗尽而停止。
tool_calls映射到 tool_useassistant 输出了工具调用。
content_filter映射到 refusal / incomplete ResponsesProvider 因安全或策略原因停止输出。按策略停止/截断处理,不当作传输失败。
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。
code、param 或匹配到的 stop sequence。failed。failed 是响应生命周期/错误状态;没有 refusal 内容时不要伪造成 Anthropic refusal。