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映射到 content_filter 或 refusal 元数据Provider 拒绝了请求。目标协议能表达时应保留 refusal 语义。
stop映射到 end_turn / stop_sequence模型正常停止或命中显式停止条件。
length映射到 max_tokens模型因为 token 预算耗尽而停止。
tool_calls映射到 tool_useassistant 输出了工具调用。
content_filter映射到 refusal / filtered statusProvider 因安全或策略原因停止输出。
即使 provider 文档说某字段必填,wire struct 也经常使用 nullable / accepts-missing 形态。这是有意的:
| 情况 | 为什么 ProxAI 接受 |
|---|---|
| SDK schema 标记 required-nullable 字段 | 有些 SDK 生成类型允许字段缺失,同时也认为 null 有效。 |
| 上游兼容层省略 null 字段 | OpenAI-compatible 或 Anthropic-compatible 代理可能丢弃值为 null 的字段。 |
| 流式累积在终止事件前是不完整的 | 在终止事件之前,stop 信息可能尚不可知。 |
| 错误或中断响应不是正常最终 message | 上游失败应作为错误处理,而不是强行构造假的 stop reason。 |
从逻辑上的非流式成功路径看,最终 Anthropic message 应该包含 stop 信息。解析器仍接受缺失/null,是为了让 ProxAI 产生清晰的转换错误或上游错误,而不是因为过严模型直接崩溃。
code、param 或匹配到的 stop sequence。