fix(openai): preserve tiers in messages chat fallback

This commit is contained in:
Ritel-T
2026-08-30 13:06:45 +09:00
parent 8b4b3f4a94
commit 2b8cb628b6
2 changed files with 37 additions and 32 deletions
@@ -152,15 +152,16 @@ func (s *OpenAIGatewayService) bufferChatCompletionsAsAnthropic(
c.JSON(http.StatusOK, anthropicResp)
return &OpenAIForwardResult{
RequestID: requestID,
Usage: usage,
Model: originalModel,
BillingModel: billingModel,
UpstreamModel: upstreamModel,
ReasoningEffort: reasoningEffort,
ServiceTier: resolvedOpenAIUpstreamServiceTier(c, serviceTier),
Stream: false,
Duration: time.Since(startTime),
RequestID: requestID,
Usage: usage,
Model: originalModel,
BillingModel: billingModel,
UpstreamModel: upstreamModel,
ReasoningEffort: reasoningEffort,
UpstreamResponseServiceTier: observedUpstreamResponseServiceTier(c),
ServiceTier: resolvedOpenAIUpstreamServiceTier(c, serviceTier),
Stream: false,
Duration: time.Since(startTime),
}, nil
}
@@ -212,17 +213,18 @@ func (s *OpenAIGatewayService) streamChatCompletionsAsAnthropic(
// masks the truncation, and surface the error to flag usage incomplete
// (mirrors forwardResponsesViaRawChatCompletions).
return &OpenAIForwardResult{
RequestID: requestID,
Usage: usage,
Model: originalModel,
BillingModel: billingModel,
UpstreamModel: upstreamModel,
ReasoningEffort: reasoningEffort,
ServiceTier: resolvedOpenAIUpstreamServiceTier(c, serviceTier),
Stream: true,
Duration: time.Since(startTime),
FirstTokenMs: scan.FirstTokenMs,
ClientDisconnect: clientDisconnected,
RequestID: requestID,
Usage: usage,
Model: originalModel,
BillingModel: billingModel,
UpstreamModel: upstreamModel,
ReasoningEffort: reasoningEffort,
UpstreamResponseServiceTier: observedUpstreamResponseServiceTier(c),
ServiceTier: resolvedOpenAIUpstreamServiceTier(c, serviceTier),
Stream: true,
Duration: time.Since(startTime),
FirstTokenMs: scan.FirstTokenMs,
ClientDisconnect: clientDisconnected,
}, fmt.Errorf("stream usage incomplete: %w", scan.Err)
}
@@ -247,16 +249,17 @@ func (s *OpenAIGatewayService) streamChatCompletionsAsAnthropic(
}
return &OpenAIForwardResult{
RequestID: requestID,
Usage: usage,
Model: originalModel,
BillingModel: billingModel,
UpstreamModel: upstreamModel,
ReasoningEffort: reasoningEffort,
ServiceTier: resolvedOpenAIUpstreamServiceTier(c, serviceTier),
Stream: true,
Duration: time.Since(startTime),
FirstTokenMs: scan.FirstTokenMs,
ClientDisconnect: clientDisconnected,
RequestID: requestID,
Usage: usage,
Model: originalModel,
BillingModel: billingModel,
UpstreamModel: upstreamModel,
ReasoningEffort: reasoningEffort,
UpstreamResponseServiceTier: observedUpstreamResponseServiceTier(c),
ServiceTier: resolvedOpenAIUpstreamServiceTier(c, serviceTier),
Stream: true,
Duration: time.Since(startTime),
FirstTokenMs: scan.FirstTokenMs,
ClientDisconnect: clientDisconnected,
}, nil
}
@@ -140,7 +140,7 @@ func TestForwardAsAnthropic_ForceChatCompletionsNonStreaming(t *testing.T) {
StatusCode: http.StatusOK,
Header: http.Header{"Content-Type": []string{"application/json"}, "x-request-id": []string{"rid_msg_chat_json"}},
Body: io.NopCloser(strings.NewReader(
`{"id":"chatcmpl_json","object":"chat.completion","model":"gpt-5.4","choices":[{"index":0,"message":{"role":"assistant","content":"ok"},"finish_reason":"stop"}],"usage":{"prompt_tokens":3,"completion_tokens":2,"total_tokens":5,"prompt_tokens_details":{"cached_tokens":1}}}`,
`{"id":"chatcmpl_json","object":"chat.completion","model":"gpt-5.4","service_tier":"priority","choices":[{"index":0,"message":{"role":"assistant","content":"ok"},"finish_reason":"stop"}],"usage":{"prompt_tokens":3,"completion_tokens":2,"total_tokens":5,"prompt_tokens_details":{"cached_tokens":1}}}`,
)),
}}
svc := &OpenAIGatewayService{
@@ -162,6 +162,8 @@ func TestForwardAsAnthropic_ForceChatCompletionsNonStreaming(t *testing.T) {
require.Equal(t, 3, result.Usage.InputTokens)
require.Equal(t, 2, result.Usage.OutputTokens)
require.Equal(t, 1, result.Usage.CacheReadInputTokens)
require.Nil(t, result.ServiceTier)
require.Equal(t, "priority", result.UpstreamResponseServiceTier)
require.False(t, result.Stream)
}