瀏覽代碼

fix: synced 用户剩余额度取 synced_quota + 记录 chat ID

- 前端用户列表:synced 用户显式取 synced_quota 字段作为剩余额度
- 各 OpenAI handler 中记录 relayChatID 用于日志追踪

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
master
fengsilin 2 天之前
父節點
當前提交
8945f8c39e
共有 4 個檔案被更改,包括 11 行新增1 行删除
  1. +2
    -0
      relay/channel/openai/chat_via_responses.go
  2. +3
    -0
      relay/channel/openai/relay-openai.go
  3. +3
    -0
      relay/channel/openai/relay_responses.go
  4. +3
    -1
      web/src/components/table/users/UsersColumnDefs.jsx

+ 2
- 0
relay/channel/openai/chat_via_responses.go 查看文件

@@ -63,6 +63,8 @@ func OaiResponsesToChatHandler(c *gin.Context, info *relaycommon.RelayInfo, resp
return nil, apiErr return nil, apiErr
} }


relaycommon.SetRelayChatID(c, responsesResp.ID)

chatId := helper.GetResponseID(c) chatId := helper.GetResponseID(c)
chatResp, usage, err := service.ResponsesResponseToChatCompletionsResponse(&responsesResp, chatId) chatResp, usage, err := service.ResponsesResponseToChatCompletionsResponse(&responsesResp, chatId)
if err != nil { if err != nil {


+ 3
- 0
relay/channel/openai/relay-openai.go 查看文件

@@ -189,6 +189,7 @@ func OaiStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Re
applyUsagePostProcessing(info, usage, common.StringToByteSlice(lastStreamData)) applyUsagePostProcessing(info, usage, common.StringToByteSlice(lastStreamData))


HandleFinalResponse(c, info, lastStreamData, responseId, createAt, model, systemFingerprint, usage, containStreamUsage) HandleFinalResponse(c, info, lastStreamData, responseId, createAt, model, systemFingerprint, usage, containStreamUsage)
relaycommon.SetRelayChatID(c, responseId)


return usage, nil return usage, nil
} }
@@ -225,6 +226,8 @@ func OpenaiHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http.Respo
return nil, types.NewOpenAIError(err, types.ErrorCodeBadResponseBody, http.StatusInternalServerError) return nil, types.NewOpenAIError(err, types.ErrorCodeBadResponseBody, http.StatusInternalServerError)
} }


relaycommon.SetRelayChatID(c, simpleResponse.Id)

if oaiError := simpleResponse.GetOpenAIError(); oaiError != nil && oaiError.Type != "" { if oaiError := simpleResponse.GetOpenAIError(); oaiError != nil && oaiError.Type != "" {
return nil, types.WithOpenAIError(*oaiError, resp.StatusCode) return nil, types.WithOpenAIError(*oaiError, resp.StatusCode)
} }


+ 3
- 0
relay/channel/openai/relay_responses.go 查看文件

@@ -38,6 +38,8 @@ func OaiResponsesHandler(c *gin.Context, info *relaycommon.RelayInfo, resp *http
return nil, apiErr return nil, apiErr
} }


relaycommon.SetRelayChatID(c, responsesResponse.ID)

if responsesResponse.HasImageGenerationCall() { if responsesResponse.HasImageGenerationCall() {
c.Set("image_generation_call", true) c.Set("image_generation_call", true)
c.Set("image_generation_call_quality", responsesResponse.GetQuality()) c.Set("image_generation_call_quality", responsesResponse.GetQuality())
@@ -106,6 +108,7 @@ func OaiResponsesStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp
usage.PromptTokensDetails.CachedTokens = streamResponse.Response.Usage.InputTokensDetails.CachedTokens usage.PromptTokensDetails.CachedTokens = streamResponse.Response.Usage.InputTokensDetails.CachedTokens
} }
} }
relaycommon.SetRelayChatID(c, streamResponse.Response.ID)
if streamResponse.Response.HasImageGenerationCall() { if streamResponse.Response.HasImageGenerationCall() {
c.Set("image_generation_call", true) c.Set("image_generation_call", true)
c.Set("image_generation_call_quality", streamResponse.Response.GetQuality()) c.Set("image_generation_call_quality", streamResponse.Response.GetQuality())


+ 3
- 1
web/src/components/table/users/UsersColumnDefs.jsx 查看文件

@@ -137,7 +137,9 @@ const renderStatistics = (text, record, showEnableDisableModal, t) => {
const renderQuotaUsage = (text, record, t) => { const renderQuotaUsage = (text, record, t) => {
const { Paragraph } = Typography; const { Paragraph } = Typography;
const used = parseInt(record.used_quota) || 0; const used = parseInt(record.used_quota) || 0;
const remain = parseInt(record.quota) || 0;
const remain = record.source === 'synced'
? (parseInt(record.synced_quota) || 0)
: (parseInt(record.quota) || 0);
const total = used + remain; const total = used + remain;
const percent = total > 0 ? (remain / total) * 100 : 0; const percent = total > 0 ? (remain / total) * 100 : 0;
const popoverContent = ( const popoverContent = (


Loading…
取消
儲存