mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-09-03 04:43:01 +00:00
merge: adopt text protocol conversion feature onto refactor/ui design
Merge origin/main (c36418c86, text protocol conversion and advanced
custom routing). Backend and most frontend changes merged cleanly;
conflicts resolved with refactor/ui as the design source of truth:
- advanced-custom-editor-dialog: keep main new routing/conversion
feature body, but use our design-system Button/Input imports and
plain button styling; add the Badge import the new body needs
- details-dialog: adopt main isUsageBillingPathLocal helper for the
billing path row, keep our muted icon styling
- i18n: union-merge of the new protocol-conversion keys across all
locales
This commit is contained in:
@@ -131,7 +131,17 @@ func withSelfUseModeDisabled(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func decodeListModelsResponse(t *testing.T, recorder *httptest.ResponseRecorder) map[string]struct{} {
|
||||
func withSelfUseModeEnabled(t *testing.T) {
|
||||
t.Helper()
|
||||
|
||||
original := operation_setting.SelfUseModeEnabled
|
||||
operation_setting.SelfUseModeEnabled = true
|
||||
t.Cleanup(func() {
|
||||
operation_setting.SelfUseModeEnabled = original
|
||||
})
|
||||
}
|
||||
|
||||
func decodeListModelsPayload(t *testing.T, recorder *httptest.ResponseRecorder) listModelsResponse {
|
||||
t.Helper()
|
||||
|
||||
require.Equal(t, http.StatusOK, recorder.Code)
|
||||
@@ -139,7 +149,13 @@ func decodeListModelsResponse(t *testing.T, recorder *httptest.ResponseRecorder)
|
||||
require.NoError(t, common.Unmarshal(recorder.Body.Bytes(), &payload))
|
||||
require.True(t, payload.Success)
|
||||
require.Equal(t, "list", payload.Object)
|
||||
return payload
|
||||
}
|
||||
|
||||
func decodeListModelsResponse(t *testing.T, recorder *httptest.ResponseRecorder) map[string]struct{} {
|
||||
t.Helper()
|
||||
|
||||
payload := decodeListModelsPayload(t, recorder)
|
||||
ids := make(map[string]struct{}, len(payload.Data))
|
||||
for _, item := range payload.Data {
|
||||
ids[item.Id] = struct{}{}
|
||||
@@ -255,6 +271,77 @@ func TestListModelsIncludesTieredBillingModel(t *testing.T) {
|
||||
require.Empty(t, missingExprPricing.BillingExpr)
|
||||
}
|
||||
|
||||
func TestListModelsUsesAdvancedCustomEndpointTypesFromPricingCache(t *testing.T) {
|
||||
withSelfUseModeEnabled(t)
|
||||
db := setupModelListControllerTestDB(t)
|
||||
|
||||
originalMemoryCacheEnabled := common.MemoryCacheEnabled
|
||||
common.MemoryCacheEnabled = true
|
||||
t.Cleanup(func() {
|
||||
common.MemoryCacheEnabled = originalMemoryCacheEnabled
|
||||
model.InvalidatePricingCache()
|
||||
})
|
||||
|
||||
require.NoError(t, db.Create(&model.User{
|
||||
Id: 1003,
|
||||
Username: "advanced-custom-model-list-user",
|
||||
Password: "password",
|
||||
Group: "default",
|
||||
Status: common.UserStatusEnabled,
|
||||
}).Error)
|
||||
|
||||
channel := &model.Channel{
|
||||
Id: 701,
|
||||
Type: constant.ChannelTypeAdvancedCustom,
|
||||
Key: "advanced-custom-key",
|
||||
Status: common.ChannelStatusEnabled,
|
||||
Name: "advanced-custom-channel",
|
||||
Group: "default",
|
||||
Models: "gemini-3.5-flash",
|
||||
}
|
||||
channel.SetOtherSettings(dto.ChannelOtherSettings{
|
||||
AdvancedCustom: &dto.AdvancedCustomConfig{
|
||||
Routes: []dto.AdvancedCustomRoute{
|
||||
{
|
||||
IncomingPath: "/v1/chat/completions",
|
||||
UpstreamPath: "/v1/chat/completions",
|
||||
},
|
||||
{
|
||||
IncomingPath: "/v1/responses",
|
||||
UpstreamPath: "/v1beta/models/{model}:generateContent",
|
||||
Converter: "openai_responses_to_gemini_generate_content",
|
||||
Models: []string{"re:^gemini-"},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
require.NoError(t, db.Create(channel).Error)
|
||||
require.NoError(t, db.Create(&model.Ability{
|
||||
Group: "default",
|
||||
Model: "gemini-3.5-flash",
|
||||
ChannelId: 701,
|
||||
Enabled: true,
|
||||
}).Error)
|
||||
|
||||
model.InitChannelCache()
|
||||
model.GetPricing()
|
||||
|
||||
recorder := httptest.NewRecorder()
|
||||
ctx, _ := gin.CreateTestContext(recorder)
|
||||
ctx.Request = httptest.NewRequest(http.MethodGet, "/v1/models", nil)
|
||||
ctx.Set("id", 1003)
|
||||
|
||||
ListModels(ctx, constant.ChannelTypeOpenAI)
|
||||
|
||||
payload := decodeListModelsPayload(t, recorder)
|
||||
require.Len(t, payload.Data, 1)
|
||||
require.Equal(t, "gemini-3.5-flash", payload.Data[0].Id)
|
||||
require.Equal(t, []constant.EndpointType{
|
||||
constant.EndpointTypeOpenAI,
|
||||
constant.EndpointTypeOpenAIResponse,
|
||||
}, payload.Data[0].SupportedEndpointTypes)
|
||||
}
|
||||
|
||||
func TestListModelsTokenLimitIncludesTieredBillingModel(t *testing.T) {
|
||||
withSelfUseModeDisabled(t)
|
||||
withTieredBillingConfig(t, map[string]string{
|
||||
|
||||
Reference in New Issue
Block a user