52 lines
2.0 KiB
Go
52 lines
2.0 KiB
Go
package helper
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/QuantumNous/new-api/pkg/billingexpr"
|
|
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
|
"github.com/QuantumNous/new-api/relaykit/types"
|
|
"github.com/QuantumNous/new-api/setting/config"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGroupModelPricingPreservesOtherGroupsAndSnapshot(t *testing.T) {
|
|
saved := map[string]string{}
|
|
require.NoError(t, config.GlobalConfig.SaveToDB(func(k, v string) error { saved[k] = v; return nil }))
|
|
t.Cleanup(func() { require.NoError(t, config.GlobalConfig.LoadFromDB(saved)) })
|
|
require.NoError(t, config.GlobalConfig.LoadFromDB(map[string]string{
|
|
"billing_setting.billing_mode": `{"gpt-5.6-sol":"tiered_expr"}`,
|
|
"billing_setting.billing_expr": `{"gpt-5.6-sol":"tier(\"standard\", p * 4 + c * 20 + cr * 0.4)"}`,
|
|
"billing_setting.group_billing_expr": `{"gpt-v-pro":{"gpt-5.6-sol":"tier(\"standard\", p * 5 + c * 30 + cr * 0.5)"}}`,
|
|
"group_ratio_setting.group_ratio": `{"gpt-v-pro":0.2052,"gpt-v-mix":0.18}`,
|
|
}))
|
|
for _, tc := range []struct {
|
|
group string
|
|
expected int
|
|
cost float64
|
|
}{
|
|
{"gpt-v-pro", 513, 8500},
|
|
{"gpt-v-mix", 360, 6400},
|
|
} {
|
|
t.Run(tc.group, func(t *testing.T) {
|
|
ctx, _ := gin.CreateTestContext(httptest.NewRecorder())
|
|
ctx.Request = httptest.NewRequest("POST", "/v1/responses", nil)
|
|
ctx.Set("auto_group", tc.group)
|
|
info := &relaycommon.RelayInfo{
|
|
OriginModelName: "gpt-5.6-sol", UserGroup: "default", UsingGroup: "auto",
|
|
BillingRequestInput: &billingexpr.RequestInput{Body: []byte(`{}`)},
|
|
}
|
|
data, err := ModelPriceHelper(ctx, info, 1000, &types.TokenCountMeta{MaxTokens: 100})
|
|
require.NoError(t, err)
|
|
require.Equal(t, tc.expected, data.QuotaToPreConsume)
|
|
require.Equal(t, tc.group, info.UsingGroup)
|
|
raw, _, err := billingexpr.RunExprWithRequest(info.TieredBillingSnapshot.ExprString,
|
|
billingexpr.TokenParams{P: 1000, C: 100, CR: 1000, Len: 2000}, billingexpr.RequestInput{})
|
|
require.NoError(t, err)
|
|
require.Equal(t, tc.cost, raw)
|
|
})
|
|
}
|
|
}
|