mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-09-11 14:41:21 +00:00
fix(task): attribute async task usage log to the initiating node (#5684)
Async task usage logs (LogQuotaData node dimension) were recorded under whichever node happened to poll the task to completion, not the node that submitted it. For token/adaptor-billed video tasks the pre-deduction is often 0, so the entire quota landed on the last polling node. Snapshot common.NodeName into TaskPrivateData at submit time and use it when writing the settlement consume log; fall back to the current node when empty so existing tasks stay compatible.
This commit is contained in:
@@ -583,6 +583,7 @@ func RelayTask(c *gin.Context) {
|
|||||||
task.PrivateData.BillingSource = relayInfo.BillingSource
|
task.PrivateData.BillingSource = relayInfo.BillingSource
|
||||||
task.PrivateData.SubscriptionId = relayInfo.SubscriptionId
|
task.PrivateData.SubscriptionId = relayInfo.SubscriptionId
|
||||||
task.PrivateData.TokenId = relayInfo.TokenId
|
task.PrivateData.TokenId = relayInfo.TokenId
|
||||||
|
task.PrivateData.NodeName = common.NodeName
|
||||||
task.PrivateData.BillingContext = &model.TaskBillingContext{
|
task.PrivateData.BillingContext = &model.TaskBillingContext{
|
||||||
ModelPrice: relayInfo.PriceData.ModelPrice,
|
ModelPrice: relayInfo.PriceData.ModelPrice,
|
||||||
GroupRatio: relayInfo.PriceData.GroupRatioInfo.GroupRatio,
|
GroupRatio: relayInfo.PriceData.GroupRatioInfo.GroupRatio,
|
||||||
|
|||||||
+6
-1
@@ -390,6 +390,7 @@ type RecordTaskBillingLogParams struct {
|
|||||||
TokenId int
|
TokenId int
|
||||||
Group string
|
Group string
|
||||||
Other map[string]interface{}
|
Other map[string]interface{}
|
||||||
|
NodeName string // 任务发起节点;为空时回退当前节点
|
||||||
}
|
}
|
||||||
|
|
||||||
func RecordTaskBillingLog(params RecordTaskBillingLogParams) {
|
func RecordTaskBillingLog(params RecordTaskBillingLogParams) {
|
||||||
@@ -423,6 +424,10 @@ func RecordTaskBillingLog(params RecordTaskBillingLogParams) {
|
|||||||
common.SysLog("failed to record task billing log: " + err.Error())
|
common.SysLog("failed to record task billing log: " + err.Error())
|
||||||
}
|
}
|
||||||
if params.LogType == LogTypeConsume && common.DataExportEnabled {
|
if params.LogType == LogTypeConsume && common.DataExportEnabled {
|
||||||
|
nodeName := params.NodeName
|
||||||
|
if nodeName == "" {
|
||||||
|
nodeName = common.NodeName
|
||||||
|
}
|
||||||
gopool.Go(func() {
|
gopool.Go(func() {
|
||||||
LogQuotaData(QuotaDataLogParams{
|
LogQuotaData(QuotaDataLogParams{
|
||||||
UserID: params.UserId,
|
UserID: params.UserId,
|
||||||
@@ -433,7 +438,7 @@ func RecordTaskBillingLog(params RecordTaskBillingLogParams) {
|
|||||||
UseGroup: params.Group,
|
UseGroup: params.Group,
|
||||||
TokenID: params.TokenId,
|
TokenID: params.TokenId,
|
||||||
ChannelID: params.ChannelId,
|
ChannelID: params.ChannelId,
|
||||||
NodeName: common.NodeName,
|
NodeName: nodeName,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ type TaskPrivateData struct {
|
|||||||
BillingSource string `json:"billing_source,omitempty"` // "wallet" 或 "subscription"
|
BillingSource string `json:"billing_source,omitempty"` // "wallet" 或 "subscription"
|
||||||
SubscriptionId int `json:"subscription_id,omitempty"` // 订阅 ID,用于订阅退款
|
SubscriptionId int `json:"subscription_id,omitempty"` // 订阅 ID,用于订阅退款
|
||||||
TokenId int `json:"token_id,omitempty"` // 令牌 ID,用于令牌额度退款
|
TokenId int `json:"token_id,omitempty"` // 令牌 ID,用于令牌额度退款
|
||||||
|
NodeName string `json:"node_name,omitempty"` // 发起任务的节点名,轮询结算阶段据此归属日志而非最后查询节点
|
||||||
BillingContext *TaskBillingContext `json:"billing_context,omitempty"` // 计费参数快照(用于轮询阶段重新计算)
|
BillingContext *TaskBillingContext `json:"billing_context,omitempty"` // 计费参数快照(用于轮询阶段重新计算)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -241,6 +241,7 @@ func RecalculateTaskQuota(ctx context.Context, task *model.Task, actualQuota int
|
|||||||
TokenId: task.PrivateData.TokenId,
|
TokenId: task.PrivateData.TokenId,
|
||||||
Group: task.Group,
|
Group: task.Group,
|
||||||
Other: other,
|
Other: other,
|
||||||
|
NodeName: task.PrivateData.NodeName,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user