230 lines
6.3 KiB
Go
230 lines
6.3 KiB
Go
package controller
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestConvertModelsDevToRatioData_OnlyOfficialProviders(t *testing.T) {
|
|
payload := `{
|
|
"openai": {
|
|
"id": "openai",
|
|
"name": "OpenAI",
|
|
"models": {
|
|
"gpt-4o": {
|
|
"cost": {"input": 5, "output": 15}
|
|
}
|
|
}
|
|
},
|
|
"moonshotai": {
|
|
"id": "moonshotai",
|
|
"api": "https://api.moonshot.ai/v1",
|
|
"name": "Moonshot AI",
|
|
"models": {
|
|
"kimi-latest": {
|
|
"cost": {"input": 12, "output": 36}
|
|
}
|
|
}
|
|
},
|
|
"moonshotai-cn": {
|
|
"id": "moonshotai-cn",
|
|
"api": "https://api.moonshot.cn/v1",
|
|
"name": "Moonshot AI CN",
|
|
"models": {
|
|
"kimi-k2-0711-preview": {
|
|
"cost": {"input": 10, "output": 20}
|
|
}
|
|
}
|
|
},
|
|
"openai-proxy": {
|
|
"id": "openai-proxy",
|
|
"api": "https://proxy.example.com/v1",
|
|
"name": "OpenAI Proxy",
|
|
"models": {
|
|
"gpt-4.1-mini": {
|
|
"cost": {"input": 1, "output": 2}
|
|
}
|
|
}
|
|
}
|
|
}`
|
|
|
|
converted, err := convertModelsDevToRatioData(strings.NewReader(payload))
|
|
require.NoError(t, err)
|
|
|
|
modelRatios := converted["model_ratio"].(map[string]any)
|
|
completionRatios := converted["completion_ratio"].(map[string]any)
|
|
|
|
require.Contains(t, modelRatios, "gpt-4o")
|
|
require.Contains(t, modelRatios, "kimi-latest")
|
|
require.NotContains(t, modelRatios, "kimi-k2-0711-preview")
|
|
require.NotContains(t, modelRatios, "gpt-4.1-mini")
|
|
|
|
require.Equal(t, 2.5, modelRatios["gpt-4o"])
|
|
require.Equal(t, 6.0, modelRatios["kimi-latest"])
|
|
require.Equal(t, 3.0, completionRatios["gpt-4o"])
|
|
require.Equal(t, 3.0, completionRatios["kimi-latest"])
|
|
}
|
|
|
|
func TestOldEffectiveForUpstream_ChannelDoesNotFallbackToGlobal(t *testing.T) {
|
|
localData := map[string]any{
|
|
"model_ratio": map[string]float64{
|
|
"unconfigured-model": 9.9,
|
|
},
|
|
}
|
|
|
|
require.Nil(t, oldEffectiveForUpstream(12345, "model_ratio", "unconfigured-model", localData))
|
|
require.Equal(t, 9.9, oldEffectiveForUpstream(0, "model_ratio", "unconfigured-model", localData))
|
|
}
|
|
|
|
func TestOldChannelValueOrNil_ZeroDisplaysUnset(t *testing.T) {
|
|
require.Nil(t, oldChannelValueOrNil(0))
|
|
require.Nil(t, oldChannelValueOrNil(1e-10))
|
|
require.Equal(t, 1.25, oldChannelValueOrNil(1.25))
|
|
}
|
|
|
|
func TestConvertChannelPricingItemsToRatioData_UsesMatchedChannelList(t *testing.T) {
|
|
pricingItems := []pricingItem{
|
|
{
|
|
ModelName: "gpt-test",
|
|
QuotaType: 0,
|
|
ModelRatio: 0,
|
|
CompletionRatio: 0,
|
|
CacheRatio: 0,
|
|
CreateCacheRatio: 0,
|
|
ModelPrice: 0,
|
|
ChannelList: []pricingChannelItem{
|
|
{
|
|
ChannelID: 49,
|
|
QuotaType: 0,
|
|
ModelRatio: 9,
|
|
CompletionRatio: 9,
|
|
CacheRatio: 9,
|
|
CreateCacheRatio: 9,
|
|
ModelPrice: 9,
|
|
},
|
|
{
|
|
ChannelID: 50,
|
|
QuotaType: 0,
|
|
ModelRatio: 2.125,
|
|
CompletionRatio: 5,
|
|
CacheRatio: 0.1,
|
|
CreateCacheRatio: 1.25,
|
|
ModelPrice: 0,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
converted := convertChannelPricingItemsToRatioData(pricingItems, 50)
|
|
|
|
require.Equal(t, 2.125, converted["model_ratio"].(map[string]any)["gpt-test"])
|
|
require.Equal(t, 5.0, converted["completion_ratio"].(map[string]any)["gpt-test"])
|
|
require.Equal(t, 0.1, converted["cache_ratio"].(map[string]any)["gpt-test"])
|
|
require.Equal(t, 1.25, converted["create_cache_ratio"].(map[string]any)["gpt-test"])
|
|
require.Equal(t, 0.0, converted["model_price"].(map[string]any)["gpt-test"])
|
|
}
|
|
|
|
func TestConvertChannelPricingItemsToRatioData_ExtractsAllFieldsWithoutQuotaTypeFiltering(t *testing.T) {
|
|
pricingItems := []pricingItem{
|
|
{
|
|
ModelName: "image-test",
|
|
QuotaType: 0,
|
|
ModelPrice: 0,
|
|
ChannelList: []pricingChannelItem{
|
|
{
|
|
ChannelID: 50,
|
|
QuotaType: 0,
|
|
ModelRatio: 3,
|
|
ModelPrice: 0.25,
|
|
CompletionRatio: 4,
|
|
CacheRatio: 0.2,
|
|
CreateCacheRatio: 1.5,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
converted := convertChannelPricingItemsToRatioData(pricingItems, 50)
|
|
|
|
require.Equal(t, 0.25, converted["model_price"].(map[string]any)["image-test"])
|
|
require.Equal(t, 3.0, converted["model_ratio"].(map[string]any)["image-test"])
|
|
require.Equal(t, 4.0, converted["completion_ratio"].(map[string]any)["image-test"])
|
|
require.Equal(t, 0.2, converted["cache_ratio"].(map[string]any)["image-test"])
|
|
require.Equal(t, 1.5, converted["create_cache_ratio"].(map[string]any)["image-test"])
|
|
}
|
|
|
|
func TestConvertChannelPricingItemsToRatioData_DuplicateModelKeepsNonZeroValues(t *testing.T) {
|
|
pricingItems := []pricingItem{
|
|
{
|
|
ModelName: "gpt-dup",
|
|
ChannelList: []pricingChannelItem{
|
|
{
|
|
ChannelID: 50,
|
|
ModelRatio: 2.125,
|
|
CompletionRatio: 5,
|
|
CacheRatio: 0.1,
|
|
CreateCacheRatio: 1.25,
|
|
ModelPrice: 0.3,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
ModelName: "gpt-dup",
|
|
ChannelList: []pricingChannelItem{
|
|
{
|
|
ChannelID: 50,
|
|
ModelRatio: 0,
|
|
CompletionRatio: 0,
|
|
CacheRatio: 0,
|
|
CreateCacheRatio: 0,
|
|
ModelPrice: 0,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
converted := convertChannelPricingItemsToRatioData(pricingItems, 50)
|
|
|
|
require.Equal(t, 2.125, converted["model_ratio"].(map[string]any)["gpt-dup"])
|
|
require.Equal(t, 5.0, converted["completion_ratio"].(map[string]any)["gpt-dup"])
|
|
require.Equal(t, 0.1, converted["cache_ratio"].(map[string]any)["gpt-dup"])
|
|
require.Equal(t, 1.25, converted["create_cache_ratio"].(map[string]any)["gpt-dup"])
|
|
require.Equal(t, 0.3, converted["model_price"].(map[string]any)["gpt-dup"])
|
|
}
|
|
|
|
func TestConvertChannelPricingItemsToRatioData_DuplicateModelCanFillMissingNonZeroFields(t *testing.T) {
|
|
pricingItems := []pricingItem{
|
|
{
|
|
ModelName: "gpt-dup",
|
|
ChannelList: []pricingChannelItem{
|
|
{
|
|
ChannelID: 50,
|
|
ModelRatio: 2.125,
|
|
CompletionRatio: 0,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
ModelName: "gpt-dup",
|
|
ChannelList: []pricingChannelItem{
|
|
{
|
|
ChannelID: 50,
|
|
ModelRatio: 0,
|
|
CompletionRatio: 5,
|
|
CacheRatio: 0.1,
|
|
CreateCacheRatio: 1.25,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
converted := convertChannelPricingItemsToRatioData(pricingItems, 50)
|
|
|
|
require.Equal(t, 2.125, converted["model_ratio"].(map[string]any)["gpt-dup"])
|
|
require.Equal(t, 5.0, converted["completion_ratio"].(map[string]any)["gpt-dup"])
|
|
require.Equal(t, 0.1, converted["cache_ratio"].(map[string]any)["gpt-dup"])
|
|
require.Equal(t, 1.25, converted["create_cache_ratio"].(map[string]any)["gpt-dup"])
|
|
}
|