Skip to content

Commit fb0a97a

Browse files
committed
fix(billing): apply 2x service-tier multiplier for fast/priority fallback
Models without an explicit priority price table (e.g. gpt-5.4-mini, gpt-5.4-nano) were billed at base rate when requested with service_tier=fast/priority, while OpenAI's published priority pricing for those SKUs is exactly 2x base. Align with sub2api: serviceTierCostMultiplier now returns 2.0 for priority/fast, and models that *do* declare InputPricePerMTokenPriority continue to use their explicit priority price table unchanged. Fixes #158.
1 parent 016046f commit fb0a97a

2 files changed

Lines changed: 15 additions & 18 deletions

File tree

database/billing.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,8 @@ func usePriorityPricing(serviceTier string, pricing *ModelPricing) bool {
337337

338338
func serviceTierCostMultiplier(serviceTier string) float64 {
339339
switch normalizeServiceTier(serviceTier) {
340+
case "priority", "fast":
341+
return 2.0
340342
case "flex":
341343
return 0.5
342344
default:

database/billing_test.go

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -109,24 +109,6 @@ func TestCalculateCostHandlesCachedTokensAndServiceTier(t *testing.T) {
109109
cachedTokens: 200,
110110
want: 0.0191,
111111
},
112-
{
113-
name: "does not invent priority multiplier when priority price is unknown",
114-
model: "gpt-4o",
115-
serviceTier: "priority",
116-
inputTokens: 1000,
117-
outputTokens: 500,
118-
cachedTokens: 200,
119-
want: 0.0075,
120-
},
121-
{
122-
name: "fast tier falls back to standard pricing when priority price is unknown",
123-
model: "gpt-4o",
124-
serviceTier: "fast",
125-
inputTokens: 1000,
126-
outputTokens: 500,
127-
cachedTokens: 200,
128-
want: 0.0075,
129-
},
130112
{
131113
name: "applies flex multiplier",
132114
model: "gpt-5.4",
@@ -161,6 +143,19 @@ func TestCalculateCostBreakdownExposesDisplayFields(t *testing.T) {
161143
assertFloatEqual(t, got.ServiceTierCostMultiplier, 0.5)
162144
}
163145

146+
func TestFastTierFallbackDoublesCostForModelsWithoutPriorityPricing(t *testing.T) {
147+
for _, model := range []string{"gpt-5.4-mini", "gpt-5.4-nano"} {
148+
base := calculateCostBreakdown(1000, 500, 200, model, "")
149+
fast := calculateCostBreakdown(1000, 500, 200, model, "fast")
150+
priority := calculateCostBreakdown(1000, 500, 200, model, "priority")
151+
152+
assertFloatEqual(t, fast.TotalCost, base.TotalCost*2)
153+
assertFloatEqual(t, priority.TotalCost, base.TotalCost*2)
154+
assertFloatEqual(t, fast.ServiceTierCostMultiplier, 2.0)
155+
assertFloatEqual(t, priority.ServiceTierCostMultiplier, 2.0)
156+
}
157+
}
158+
164159
func TestGPT55PricingDoesNotMatchGPT54(t *testing.T) {
165160
gpt54 := GetModelPricing("gpt-5.4")
166161
gpt55 := GetModelPricing("gpt-5.5")

0 commit comments

Comments
 (0)