Publish Docker image (Multi-arch) / Build & push (amd64) (push) Failing after 1m40s
Release (Linux, macOS, Windows) / Linux Release (push) Failing after 42m16s
Publish Docker image (Multi-arch) / Build & push (arm64) (push) Canceled after 0s
Release (Linux, macOS, Windows) / macOS Release (push) Canceled after 0s
Release (Linux, macOS, Windows) / Windows Release (push) Canceled after 0s
Publish Docker image (Multi-arch) / Create multi-arch manifests (push) Canceled after 0s
Sync production source including routing, billing, Astra detection and public uptime. Update custom build instructions and license packaging.
57 lines
2.0 KiB
Go
57 lines
2.0 KiB
Go
package billingexpr
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/QuantumNous/new-api/common"
|
|
)
|
|
|
|
// quotaConversion converts raw expression output to quota based on the
|
|
// expression version. This is the central dispatch point for future versions
|
|
// that may use a different conversion formula.
|
|
func quotaConversion(exprOutput float64, snap *BillingSnapshot) float64 {
|
|
if snap.TaskUsageBilling {
|
|
return exprOutput * snap.QuotaPerUnit
|
|
}
|
|
switch snap.ExprVersion {
|
|
default: // v1: coefficients are $/1M tokens prices
|
|
return exprOutput / 1_000_000 * snap.QuotaPerUnit
|
|
}
|
|
}
|
|
|
|
// ComputeTieredQuota runs the Expr from a frozen BillingSnapshot against
|
|
// actual token counts and returns the settlement result.
|
|
func ComputeTieredQuota(snap *BillingSnapshot, params TokenParams) (TieredResult, error) {
|
|
return ComputeTieredQuotaWithRequest(snap, params, RequestInput{})
|
|
}
|
|
|
|
func ComputeTieredQuotaWithRequest(snap *BillingSnapshot, params TokenParams, request RequestInput) (TieredResult, error) {
|
|
if snap.TaskUsageBilling && UsesFixedPricingByHash(snap.ExprString, snap.ExprHash) {
|
|
return TieredResult{}, fmt.Errorf("fixed pricing is not supported for task usage expressions")
|
|
}
|
|
cost, trace, err := RunExprByHashWithRequest(snap.ExprString, snap.ExprHash, params, request)
|
|
if err != nil {
|
|
return TieredResult{}, err
|
|
}
|
|
|
|
quotaBeforeGroup := quotaConversion(cost, snap)
|
|
afterGroup, clamp := common.QuotaRoundChecked(quotaBeforeGroup * snap.GroupRatio)
|
|
crossed := trace.MatchedTier != snap.EstimatedTier
|
|
|
|
result := TieredResult{
|
|
ImageCount: trace.ImageCount,
|
|
BillingUnit: trace.BillingUnit,
|
|
FixedPrice: trace.FixedPrice,
|
|
ActualQuotaBeforeGroup: quotaBeforeGroup,
|
|
ActualQuotaAfterGroup: afterGroup,
|
|
MatchedTier: trace.MatchedTier,
|
|
RequestRules: trace.RequestRules,
|
|
CrossedTier: crossed,
|
|
Clamp: clamp,
|
|
}
|
|
if trace.BillingUnit == BillingUnitToken && UsedVarsByHash(snap.ExprString, snap.ExprHash)["img_cr"] {
|
|
result.BillingTokens = ¶ms
|
|
}
|
|
return result, nil
|
|
}
|