跳转到内容

状态与停止原因

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

协议终止字段或事件含义
OpenAI Responsesstatus、output items、response.completedresponse envelope 和 typed events 共同描述完成。
OpenAI Chat Completionschoices[].finish_reason[DONE]每个 choice 有 finish reason;stream 用 [DONE] 结束。
Anthropic Messagesstop_reasonstop_sequencemessage_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映射到 content_filter 或 refusal 元数据

Provider 拒绝了请求。目标协议能表达时应保留 refusal 语义。

OpenAI Chat Completions finish_reason
stop映射到 end_turn / stop_sequence

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

length映射到 max_tokens

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

tool_calls映射到 tool_use

assistant 输出了工具调用。

content_filter映射到 refusal / filtered status

Provider 因安全或策略原因停止输出。

即使 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 产生清晰的转换错误或上游错误,而不是因为过严模型直接崩溃。

  • ProxAI 会观察流式终止事件;不会把任意字节流关闭当成语义完成。
  • ProxAI 不会伪造 provider 特有的原因细节,例如上游 codeparam 或匹配到的 stop sequence。
  • 跨协议映射优先保留行为,其次才是字段名称。
  • 工具调用终止状态必须和自然文本完成保持区分。