|
|
|
@@ -0,0 +1,133 @@ |
|
|
|
package types |
|
|
|
|
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
|
|
|
|
"github.com/QuantumNous/new-api/common" |
|
|
|
) |
|
|
|
|
|
|
|
const ( |
|
|
|
PricingSchemaVersion = 1 |
|
|
|
|
|
|
|
PricingScopeModel = "model" |
|
|
|
|
|
|
|
BillingUnitPerCall = "per_call" |
|
|
|
BillingUnitPer1MTokens = "per_1m_tokens" |
|
|
|
|
|
|
|
PreconsumeStrategyExact = "exact" |
|
|
|
PreconsumeStrategyMinimum = "minimum" |
|
|
|
|
|
|
|
PricingFallbackReject = "reject" |
|
|
|
PricingFallbackMax = "max" |
|
|
|
PricingFallbackDefault = "default" |
|
|
|
|
|
|
|
PricingRowSourceManual = "manual" |
|
|
|
PricingRowSourceGenerated = "generated" |
|
|
|
|
|
|
|
BillingModeMatrix = "matrix" |
|
|
|
) |
|
|
|
|
|
|
|
type PricingConfig struct { |
|
|
|
SchemaVersion int `json:"schema_version"` |
|
|
|
Scope string `json:"scope"` |
|
|
|
BillingUnit string `json:"billing_unit,omitempty"` |
|
|
|
PreconsumeStrategy string `json:"preconsume_strategy,omitempty"` |
|
|
|
Dimensions []PricingDimension `json:"dimensions"` |
|
|
|
Table []PricingRow `json:"table"` |
|
|
|
Fallback PricingFallback `json:"fallback"` |
|
|
|
GeneratorSnapshot map[string]any `json:"generator_snapshot,omitempty"` |
|
|
|
} |
|
|
|
|
|
|
|
type PricingDimension struct { |
|
|
|
Key string `json:"key"` |
|
|
|
Source string `json:"source"` |
|
|
|
Type string `json:"type"` |
|
|
|
Optional bool `json:"optional,omitempty"` |
|
|
|
Default any `json:"default"` |
|
|
|
} |
|
|
|
|
|
|
|
type PricingRow map[string]any |
|
|
|
|
|
|
|
type PricingFallback struct { |
|
|
|
Strategy string `json:"strategy"` |
|
|
|
DefaultPrice float64 `json:"default_price,omitempty"` |
|
|
|
} |
|
|
|
|
|
|
|
type OriginPricingSnapshot struct { |
|
|
|
BillingMode string |
|
|
|
BillingUnit string |
|
|
|
PriceUSD float64 |
|
|
|
TokenUnitPriceUSD float64 |
|
|
|
Snapshot map[string]any |
|
|
|
OtherRatios map[string]float64 |
|
|
|
PerCallBilling bool |
|
|
|
} |
|
|
|
|
|
|
|
func ClonePricingConfig(src *PricingConfig) *PricingConfig { |
|
|
|
if src == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
return &PricingConfig{ |
|
|
|
SchemaVersion: src.SchemaVersion, |
|
|
|
Scope: src.Scope, |
|
|
|
BillingUnit: src.BillingUnit, |
|
|
|
PreconsumeStrategy: src.PreconsumeStrategy, |
|
|
|
Dimensions: append([]PricingDimension(nil), src.Dimensions...), |
|
|
|
Table: ClonePricingRows(src.Table), |
|
|
|
Fallback: src.Fallback, |
|
|
|
GeneratorSnapshot: CloneMapAny(src.GeneratorSnapshot), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func ClonePricingRows(src []PricingRow) []PricingRow { |
|
|
|
if src == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
dst := make([]PricingRow, len(src)) |
|
|
|
for i := range src { |
|
|
|
dst[i] = PricingRow(CloneMapAny(map[string]any(src[i]))) |
|
|
|
} |
|
|
|
return dst |
|
|
|
} |
|
|
|
|
|
|
|
func CloneMapAny(src map[string]any) map[string]any { |
|
|
|
if src == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
bytes, err := common.Marshal(src) |
|
|
|
if err != nil { |
|
|
|
dst := make(map[string]any, len(src)) |
|
|
|
for k, v := range src { |
|
|
|
dst[k] = v |
|
|
|
} |
|
|
|
return dst |
|
|
|
} |
|
|
|
var dst map[string]any |
|
|
|
if err := common.Unmarshal(bytes, &dst); err != nil { |
|
|
|
panic(fmt.Sprintf("clone map failed after successful marshal: %v", err)) |
|
|
|
} |
|
|
|
return dst |
|
|
|
} |
|
|
|
|
|
|
|
func CloneRatios(src map[string]float64) map[string]float64 { |
|
|
|
if src == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
dst := make(map[string]float64, len(src)) |
|
|
|
for k, v := range src { |
|
|
|
dst[k] = v |
|
|
|
} |
|
|
|
return dst |
|
|
|
} |
|
|
|
|
|
|
|
func NormalizePricingConfigDefaults(cfg *PricingConfig) { |
|
|
|
if cfg == nil { |
|
|
|
return |
|
|
|
} |
|
|
|
if cfg.BillingUnit == "" { |
|
|
|
cfg.BillingUnit = BillingUnitPerCall |
|
|
|
} |
|
|
|
if cfg.PreconsumeStrategy == "" { |
|
|
|
cfg.PreconsumeStrategy = PreconsumeStrategyExact |
|
|
|
} |
|
|
|
} |