feat: implement tiered billing expression evaluation and related functionality
- Added support for tiered billing expressions in the billing system. - Introduced new types and functions for handling billing expressions, including caching and execution. - Updated existing billing logic to accommodate tiered billing scenarios. - Enhanced request handling to support incoming billing expression requests. - Added tests for tiered billing functionality to ensure correctness.
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"github.com/QuantumNous/new-api/common"
|
||||
"github.com/QuantumNous/new-api/constant"
|
||||
"github.com/QuantumNous/new-api/dto"
|
||||
"github.com/QuantumNous/new-api/pkg/billingexpr"
|
||||
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
||||
"github.com/QuantumNous/new-api/types"
|
||||
|
||||
@@ -214,3 +215,42 @@ func GenerateMjOtherInfo(relayInfo *relaycommon.RelayInfo, priceData types.Price
|
||||
appendRequestPath(nil, relayInfo, other)
|
||||
return other
|
||||
}
|
||||
|
||||
func GenerateTieredOtherInfo(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, result *billingexpr.TieredResult) map[string]interface{} {
|
||||
other := make(map[string]interface{})
|
||||
other["billing_mode"] = "tiered_expr"
|
||||
|
||||
snap := relayInfo.TieredBillingSnapshot
|
||||
if snap != nil {
|
||||
other["group_ratio"] = snap.GroupRatio
|
||||
other["expr_hash"] = snap.ExprHash
|
||||
other["estimated_prompt_tokens"] = snap.EstimatedPromptTokens
|
||||
other["estimated_completion_tokens"] = snap.EstimatedCompletionTokens
|
||||
other["estimated_quota_before_group"] = snap.EstimatedQuotaBeforeGroup
|
||||
other["estimated_quota_after_group"] = snap.EstimatedQuotaAfterGroup
|
||||
other["estimated_tier"] = snap.EstimatedTier
|
||||
}
|
||||
|
||||
if result != nil {
|
||||
other["actual_quota_before_group"] = result.ActualQuotaBeforeGroup
|
||||
other["actual_quota_after_group"] = result.ActualQuotaAfterGroup
|
||||
other["matched_tier"] = result.MatchedTier
|
||||
other["crossed_tier"] = result.CrossedTier
|
||||
}
|
||||
|
||||
other["frt"] = float64(relayInfo.FirstResponseTime.UnixMilli() - relayInfo.StartTime.UnixMilli())
|
||||
if relayInfo.IsModelMapped {
|
||||
other["is_model_mapped"] = true
|
||||
other["upstream_model_name"] = relayInfo.UpstreamModelName
|
||||
}
|
||||
|
||||
adminInfo := make(map[string]interface{})
|
||||
adminInfo["use_channel"] = ctx.GetStringSlice("use_channel")
|
||||
AppendChannelAffinityAdminInfo(ctx, adminInfo)
|
||||
other["admin_info"] = adminInfo
|
||||
|
||||
appendRequestPath(ctx, relayInfo, other)
|
||||
appendRequestConversionChain(relayInfo, other)
|
||||
appendBillingInfo(relayInfo, other)
|
||||
return other
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user