diff --git a/backend/internal/handler/openai_chat_completions.go b/backend/internal/handler/openai_chat_completions.go index a59450f1306..36c908b10d2 100644 --- a/backend/internal/handler/openai_chat_completions.go +++ b/backend/internal/handler/openai_chat_completions.go @@ -289,7 +289,7 @@ func (h *OpenAIGatewayHandler) ChatCompletions(c *gin.Context) { userAgent := c.GetHeader("User-Agent") clientIP := ip.GetClientIP(c) inboundEndpoint := GetInboundEndpoint(c) - upstreamEndpoint := resolveRawCCUpstreamEndpoint(c, account) + upstreamEndpoint := resolveOpenAIUpstreamEndpoint(c, account) cyberBlocked := service.GetOpsCyberPolicy(c) != nil h.submitOpenAIUsageRecordTask(c.Request.Context(), result, func(ctx context.Context) { @@ -325,12 +325,12 @@ func (h *OpenAIGatewayHandler) ChatCompletions(c *gin.Context) { } } -// resolveRawCCUpstreamEndpoint returns the actual upstream endpoint for -// OpenAI Chat Completions requests. For APIKey accounts whose upstream -// is forced or probed to not support the Responses API, the request is -// forwarded directly to /v1/chat/completions — not through the default -// CC→Responses conversion path. -func resolveRawCCUpstreamEndpoint(c *gin.Context, account *service.Account) string { +// resolveOpenAIUpstreamEndpoint returns the actual upstream endpoint for an +// OpenAI account, used by every OpenAI usage-recording site. APIKey accounts +// whose upstream is forced or probed to not support the Responses API are +// served directly via /v1/chat/completions (the raw chat path) regardless of +// the inbound endpoint; everything else goes through the Responses API. +func resolveOpenAIUpstreamEndpoint(c *gin.Context, account *service.Account) string { if account != nil && account.Type == service.AccountTypeAPIKey && !openai_compat.ShouldUseResponsesAPI(account.Extra) { return "/v1/chat/completions" diff --git a/backend/internal/handler/openai_gateway_handler.go b/backend/internal/handler/openai_gateway_handler.go index 4c13a2e7aa3..ef7bb31b205 100644 --- a/backend/internal/handler/openai_gateway_handler.go +++ b/backend/internal/handler/openai_gateway_handler.go @@ -496,7 +496,7 @@ func (h *OpenAIGatewayHandler) Responses(c *gin.Context) { clientIP := ip.GetClientIP(c) requestPayloadHash := service.HashUsageRequestPayload(body) inboundEndpoint := GetInboundEndpoint(c) - upstreamEndpoint := GetUpstreamEndpoint(c, account.Platform) + upstreamEndpoint := resolveOpenAIUpstreamEndpoint(c, account) // 使用量记录通过有界 worker 池提交,避免请求热路径创建无界 goroutine。 cyberBlocked := service.GetOpsCyberPolicy(c) != nil @@ -901,7 +901,7 @@ func (h *OpenAIGatewayHandler) Messages(c *gin.Context) { clientIP := ip.GetClientIP(c) requestPayloadHash := service.HashUsageRequestPayload(body) inboundEndpoint := GetInboundEndpoint(c) - upstreamEndpoint := GetUpstreamEndpoint(c, account.Platform) + upstreamEndpoint := resolveOpenAIUpstreamEndpoint(c, account) cyberBlocked := service.GetOpsCyberPolicy(c) != nil h.submitOpenAIUsageRecordTask(c.Request.Context(), result, func(ctx context.Context) { @@ -1496,7 +1496,7 @@ func (h *OpenAIGatewayHandler) ResponsesWebSocket(c *gin.Context) { } h.gatewayService.ReportOpenAIAccountScheduleResult(account.ID, true, result.FirstTokenMs) inboundEndpoint := GetInboundEndpoint(c) - upstreamEndpoint := GetUpstreamEndpoint(c, account.Platform) + upstreamEndpoint := resolveOpenAIUpstreamEndpoint(c, account) cyberBlocked := service.GetOpsCyberPolicy(c) != nil h.submitOpenAIUsageRecordTask(ctx, result, func(taskCtx context.Context) { if err := h.gatewayService.RecordUsage(taskCtx, &service.OpenAIRecordUsageInput{ @@ -2297,7 +2297,7 @@ func (h *OpenAIGatewayHandler) recordCyberPolicyIfMarked(c *gin.Context, apiKey var accountID int64 if account != nil { accountID = account.ID - upstreamEndpoint = GetUpstreamEndpoint(c, account.Platform) + upstreamEndpoint = resolveOpenAIUpstreamEndpoint(c, account) } stream := false if v, ok := c.Get(opsStreamKey); ok {