fix(apicompat): Responses→Chat 转换补齐 completion_tokens_details 透传
OpenAI Responses API 在 gpt-5.x 等 reasoning 模型上会返回
output_tokens_details.reasoning_tokens, 但 ResponsesToChatCompletions
只映射了 input_tokens_details.cached_tokens, 导致客户端拿到的
chat.completion.usage 中 completion_tokens 出现无法解释的波动
(短 prompt 也可能 30+ token), 且缺失 reasoning_tokens 细分字段,
难以与 OpenAI 原生 Chat Completions 响应对账。
按 OpenAI 官方 CompletionUsage schema (openai/openai-go SDK
completion.go) 补齐所有 token-details 字段, 全部 omitempty:
prompt_tokens_details:
- cached_tokens (原已支持)
- audio_tokens (新增)
completion_tokens_details:
- reasoning_tokens (新增)
- audio_tokens (新增)
- accepted_prediction_tokens (新增)
- rejected_prediction_tokens (新增)
实现细节:
- 抽出 promptDetailsFromResponses / completionDetailsFromResponses
两个 helper, 全零字段返回 nil
- 非流路径 ResponsesToChatCompletions 复用已存在的
chatUsageFromResponsesUsage helper, 消除两条路径间的重复
- 非 reasoning / 非 audio 上游 (Anthropic, Gemini, gpt-4o) 不填这些
字段, helper 返回 nil → CompletionTokensDetails 不输出, 对现有响应
字节级兼容
新增单测:
- TestResponsesToChatCompletions_ReasoningTokens
- TestResponsesToChatCompletions_AllTokenDetailsPassThrough
- TestResponsesToChatCompletions_NoReasoningTokensWhenZero
- TestResponsesEventToChatChunks_CompletedWithReasoningTokens