diff --git a/controller/channel.go b/controller/channel.go
index 1cfb7906..acaf2977 100644
--- a/controller/channel.go
+++ b/controller/channel.go
@@ -52,6 +52,14 @@ func GetAllChannels(c *gin.Context) {
channelData := make([]*model.Channel, 0)
idSort, _ := strconv.ParseBool(c.Query("id_sort"))
enableTagMode, _ := strconv.ParseBool(c.Query("tag_mode"))
+ // type filter
+ typeStr := c.Query("type")
+ typeFilter := -1
+ if typeStr != "" {
+ if t, err := strconv.Atoi(typeStr); err == nil {
+ typeFilter = t
+ }
+ }
var total int64
@@ -72,6 +80,14 @@ func GetAllChannels(c *gin.Context) {
}
// 计算 tag 总数用于分页
total, _ = model.CountAllTags()
+ } else if typeFilter >= 0 {
+ channels, err := model.GetChannelsByType((p-1)*pageSize, pageSize, idSort, typeFilter)
+ if err != nil {
+ c.JSON(http.StatusOK, gin.H{"success": false, "message": err.Error()})
+ return
+ }
+ channelData = channels
+ total, _ = model.CountChannelsByType(typeFilter)
} else {
channels, err := model.GetAllChannels((p-1)*pageSize, pageSize, false, idSort)
if err != nil {
@@ -82,14 +98,18 @@ func GetAllChannels(c *gin.Context) {
total, _ = model.CountAllChannels()
}
+ // calculate type counts
+ typeCounts, _ := model.CountChannelsGroupByType()
+
c.JSON(http.StatusOK, gin.H{
- "success": true,
- "message": "",
- "data": gin.H{
- "items": channelData,
- "total": total,
- "page": p,
- "page_size": pageSize,
+ "success": true,
+ "message": "",
+ "data": gin.H{
+ "items": channelData,
+ "total": total,
+ "page": p,
+ "page_size": pageSize,
+ "type_counts": typeCounts,
},
})
return
diff --git a/controller/group.go b/controller/group.go
index 632b6cd5..2565b6ea 100644
--- a/controller/group.go
+++ b/controller/group.go
@@ -4,13 +4,14 @@ import (
"net/http"
"one-api/model"
"one-api/setting"
+ "one-api/setting/ratio_setting"
"github.com/gin-gonic/gin"
)
func GetGroups(c *gin.Context) {
groupNames := make([]string, 0)
- for groupName, _ := range setting.GetGroupRatioCopy() {
+ for groupName := range ratio_setting.GetGroupRatioCopy() {
groupNames = append(groupNames, groupName)
}
c.JSON(http.StatusOK, gin.H{
@@ -25,7 +26,7 @@ func GetUserGroups(c *gin.Context) {
userGroup := ""
userId := c.GetInt("id")
userGroup, _ = model.GetUserGroup(userId, false)
- for groupName, ratio := range setting.GetGroupRatioCopy() {
+ for groupName, ratio := range ratio_setting.GetGroupRatioCopy() {
// UserUsableGroups contains the groups that the user can use
userUsableGroups := setting.GetUserUsableGroups(userGroup)
if desc, ok := userUsableGroups[groupName]; ok {
diff --git a/controller/misc.go b/controller/misc.go
index 1caaf640..4ffe86f4 100644
--- a/controller/misc.go
+++ b/controller/misc.go
@@ -76,6 +76,7 @@ func GetStatus(c *gin.Context) {
"demo_site_enabled": operation_setting.DemoSiteEnabled,
"self_use_mode_enabled": operation_setting.SelfUseModeEnabled,
"default_use_auto_group": setting.DefaultUseAutoGroup,
+ "pay_methods": setting.PayMethods,
// 面板启用开关
"api_info_enabled": cs.ApiInfoEnabled,
diff --git a/controller/option.go b/controller/option.go
index 79ba2ffe..97bb6a5a 100644
--- a/controller/option.go
+++ b/controller/option.go
@@ -7,6 +7,7 @@ import (
"one-api/model"
"one-api/setting"
"one-api/setting/console_setting"
+ "one-api/setting/ratio_setting"
"one-api/setting/system_setting"
"strings"
@@ -103,7 +104,7 @@ func UpdateOption(c *gin.Context) {
return
}
case "GroupRatio":
- err = setting.CheckGroupRatio(option.Value)
+ err = ratio_setting.CheckGroupRatio(option.Value)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
diff --git a/controller/pricing.go b/controller/pricing.go
index e6a3e57f..f27336b7 100644
--- a/controller/pricing.go
+++ b/controller/pricing.go
@@ -3,7 +3,7 @@ package controller
import (
"one-api/model"
"one-api/setting"
- "one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
"github.com/gin-gonic/gin"
)
@@ -13,7 +13,7 @@ func GetPricing(c *gin.Context) {
userId, exists := c.Get("id")
usableGroup := map[string]string{}
groupRatio := map[string]float64{}
- for s, f := range setting.GetGroupRatioCopy() {
+ for s, f := range ratio_setting.GetGroupRatioCopy() {
groupRatio[s] = f
}
var group string
@@ -22,7 +22,7 @@ func GetPricing(c *gin.Context) {
if err == nil {
group = user.Group
for g := range groupRatio {
- ratio, ok := setting.GetGroupGroupRatio(group, g)
+ ratio, ok := ratio_setting.GetGroupGroupRatio(group, g)
if ok {
groupRatio[g] = ratio
}
@@ -32,7 +32,7 @@ func GetPricing(c *gin.Context) {
usableGroup = setting.GetUserUsableGroups(group)
// check groupRatio contains usableGroup
- for group := range setting.GetGroupRatioCopy() {
+ for group := range ratio_setting.GetGroupRatioCopy() {
if _, ok := usableGroup[group]; !ok {
delete(groupRatio, group)
}
@@ -47,7 +47,7 @@ func GetPricing(c *gin.Context) {
}
func ResetModelRatio(c *gin.Context) {
- defaultStr := operation_setting.DefaultModelRatio2JSONString()
+ defaultStr := ratio_setting.DefaultModelRatio2JSONString()
err := model.UpdateOption("ModelRatio", defaultStr)
if err != nil {
c.JSON(200, gin.H{
@@ -56,7 +56,7 @@ func ResetModelRatio(c *gin.Context) {
})
return
}
- err = operation_setting.UpdateModelRatioByJSONString(defaultStr)
+ err = ratio_setting.UpdateModelRatioByJSONString(defaultStr)
if err != nil {
c.JSON(200, gin.H{
"success": false,
diff --git a/dto/openai_request.go b/dto/openai_request.go
index 299171ba..42c290ca 100644
--- a/dto/openai_request.go
+++ b/dto/openai_request.go
@@ -53,6 +53,7 @@ type GeneralOpenAIRequest struct {
Modalities json.RawMessage `json:"modalities,omitempty"`
Audio json.RawMessage `json:"audio,omitempty"`
EnableThinking any `json:"enable_thinking,omitempty"` // ali
+ THINKING json.RawMessage `json:"thinking,omitempty"` // doubao
ExtraBody json.RawMessage `json:"extra_body,omitempty"`
WebSearchOptions *WebSearchOptions `json:"web_search_options,omitempty"`
// OpenRouter Params
diff --git a/main.go b/main.go
index 30ba8092..cf593b57 100644
--- a/main.go
+++ b/main.go
@@ -12,7 +12,7 @@ import (
"one-api/model"
"one-api/router"
"one-api/service"
- "one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
"os"
"strconv"
@@ -74,7 +74,7 @@ func main() {
}
// Initialize model settings
- operation_setting.InitRatioSettings()
+ ratio_setting.InitRatioSettings()
// Initialize constants
constant.InitEnv()
// Initialize options
diff --git a/middleware/distributor.go b/middleware/distributor.go
index 5d1c3641..84eb182e 100644
--- a/middleware/distributor.go
+++ b/middleware/distributor.go
@@ -11,6 +11,7 @@ import (
relayconstant "one-api/relay/constant"
"one-api/service"
"one-api/setting"
+ "one-api/setting/ratio_setting"
"strconv"
"strings"
"time"
@@ -48,7 +49,7 @@ func Distribute() func(c *gin.Context) {
return
}
// check group in common.GroupRatio
- if !setting.ContainsGroupRatio(tokenGroup) {
+ if !ratio_setting.ContainsGroupRatio(tokenGroup) {
if tokenGroup != "auto" {
abortWithOpenAiMessage(c, http.StatusForbidden, fmt.Sprintf("分组 %s 已被弃用", tokenGroup))
return
diff --git a/model/channel.go b/model/channel.go
index b5503eee..6cbd8adc 100644
--- a/model/channel.go
+++ b/model/channel.go
@@ -597,3 +597,39 @@ func CountAllTags() (int64, error) {
err := DB.Model(&Channel{}).Where("tag is not null AND tag != ''").Distinct("tag").Count(&total).Error
return total, err
}
+
+// Get channels of specified type with pagination
+func GetChannelsByType(startIdx int, num int, idSort bool, channelType int) ([]*Channel, error) {
+ var channels []*Channel
+ order := "priority desc"
+ if idSort {
+ order = "id desc"
+ }
+ err := DB.Where("type = ?", channelType).Order(order).Limit(num).Offset(startIdx).Omit("key").Find(&channels).Error
+ return channels, err
+}
+
+// Count channels of specific type
+func CountChannelsByType(channelType int) (int64, error) {
+ var count int64
+ err := DB.Model(&Channel{}).Where("type = ?", channelType).Count(&count).Error
+ return count, err
+}
+
+// Return map[type]count for all channels
+func CountChannelsGroupByType() (map[int64]int64, error) {
+ type result struct {
+ Type int64 `gorm:"column:type"`
+ Count int64 `gorm:"column:count"`
+ }
+ var results []result
+ err := DB.Model(&Channel{}).Select("type, count(*) as count").Group("type").Find(&results).Error
+ if err != nil {
+ return nil, err
+ }
+ counts := make(map[int64]int64)
+ for _, r := range results {
+ counts[r.Type] = r.Count
+ }
+ return counts, nil
+}
diff --git a/model/option.go b/model/option.go
index 1391b203..ec386b29 100644
--- a/model/option.go
+++ b/model/option.go
@@ -5,6 +5,7 @@ import (
"one-api/setting"
"one-api/setting/config"
"one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
"strconv"
"strings"
"time"
@@ -78,6 +79,7 @@ func InitOptionMap() {
common.OptionMap["Chats"] = setting.Chats2JsonString()
common.OptionMap["AutoGroups"] = setting.AutoGroups2JsonString()
common.OptionMap["DefaultUseAutoGroup"] = strconv.FormatBool(setting.DefaultUseAutoGroup)
+ common.OptionMap["PayMethods"] = setting.PayMethods2JsonString()
common.OptionMap["GitHubClientId"] = ""
common.OptionMap["GitHubClientSecret"] = ""
common.OptionMap["TelegramBotToken"] = ""
@@ -96,13 +98,13 @@ func InitOptionMap() {
common.OptionMap["ModelRequestRateLimitDurationMinutes"] = strconv.Itoa(setting.ModelRequestRateLimitDurationMinutes)
common.OptionMap["ModelRequestRateLimitSuccessCount"] = strconv.Itoa(setting.ModelRequestRateLimitSuccessCount)
common.OptionMap["ModelRequestRateLimitGroup"] = setting.ModelRequestRateLimitGroup2JSONString()
- common.OptionMap["ModelRatio"] = operation_setting.ModelRatio2JSONString()
- common.OptionMap["ModelPrice"] = operation_setting.ModelPrice2JSONString()
- common.OptionMap["CacheRatio"] = operation_setting.CacheRatio2JSONString()
- common.OptionMap["GroupRatio"] = setting.GroupRatio2JSONString()
- common.OptionMap["GroupGroupRatio"] = setting.GroupGroupRatio2JSONString()
+ common.OptionMap["ModelRatio"] = ratio_setting.ModelRatio2JSONString()
+ common.OptionMap["ModelPrice"] = ratio_setting.ModelPrice2JSONString()
+ common.OptionMap["CacheRatio"] = ratio_setting.CacheRatio2JSONString()
+ common.OptionMap["GroupRatio"] = ratio_setting.GroupRatio2JSONString()
+ common.OptionMap["GroupGroupRatio"] = ratio_setting.GroupGroupRatio2JSONString()
common.OptionMap["UserUsableGroups"] = setting.UserUsableGroups2JSONString()
- common.OptionMap["CompletionRatio"] = operation_setting.CompletionRatio2JSONString()
+ common.OptionMap["CompletionRatio"] = ratio_setting.CompletionRatio2JSONString()
common.OptionMap["TopUpLink"] = common.TopUpLink
//common.OptionMap["ChatLink"] = common.ChatLink
//common.OptionMap["ChatLink2"] = common.ChatLink2
@@ -358,19 +360,19 @@ func updateOptionMap(key string, value string) (err error) {
case "DataExportDefaultTime":
common.DataExportDefaultTime = value
case "ModelRatio":
- err = operation_setting.UpdateModelRatioByJSONString(value)
+ err = ratio_setting.UpdateModelRatioByJSONString(value)
case "GroupRatio":
- err = setting.UpdateGroupRatioByJSONString(value)
+ err = ratio_setting.UpdateGroupRatioByJSONString(value)
case "GroupGroupRatio":
- err = setting.UpdateGroupGroupRatioByJSONString(value)
+ err = ratio_setting.UpdateGroupGroupRatioByJSONString(value)
case "UserUsableGroups":
err = setting.UpdateUserUsableGroupsByJSONString(value)
case "CompletionRatio":
- err = operation_setting.UpdateCompletionRatioByJSONString(value)
+ err = ratio_setting.UpdateCompletionRatioByJSONString(value)
case "ModelPrice":
- err = operation_setting.UpdateModelPriceByJSONString(value)
+ err = ratio_setting.UpdateModelPriceByJSONString(value)
case "CacheRatio":
- err = operation_setting.UpdateCacheRatioByJSONString(value)
+ err = ratio_setting.UpdateCacheRatioByJSONString(value)
case "TopUpLink":
common.TopUpLink = value
//case "ChatLink":
@@ -387,6 +389,8 @@ func updateOptionMap(key string, value string) (err error) {
operation_setting.AutomaticDisableKeywordsFromString(value)
case "StreamCacheQueueLength":
setting.StreamCacheQueueLength, _ = strconv.Atoi(value)
+ case "PayMethods":
+ err = setting.UpdatePayMethodsByJsonString(value)
}
return err
}
diff --git a/model/pricing.go b/model/pricing.go
index ba1815e2..74a25f2d 100644
--- a/model/pricing.go
+++ b/model/pricing.go
@@ -2,7 +2,7 @@ package model
import (
"one-api/common"
- "one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
"sync"
"time"
)
@@ -65,14 +65,14 @@ func updatePricing() {
ModelName: model,
EnableGroup: groups,
}
- modelPrice, findPrice := operation_setting.GetModelPrice(model, false)
+ modelPrice, findPrice := ratio_setting.GetModelPrice(model, false)
if findPrice {
pricing.ModelPrice = modelPrice
pricing.QuotaType = 1
} else {
- modelRatio, _ := operation_setting.GetModelRatio(model)
+ modelRatio, _ := ratio_setting.GetModelRatio(model)
pricing.ModelRatio = modelRatio
- pricing.CompletionRatio = operation_setting.GetCompletionRatio(model)
+ pricing.CompletionRatio = ratio_setting.GetCompletionRatio(model)
pricing.QuotaType = 0
}
pricingMap = append(pricingMap, pricing)
diff --git a/relay/channel/gemini/dto.go b/relay/channel/gemini/dto.go
index fa9108df..b22e092a 100644
--- a/relay/channel/gemini/dto.go
+++ b/relay/channel/gemini/dto.go
@@ -140,6 +140,7 @@ type GeminiChatGenerationConfig struct {
Seed int64 `json:"seed,omitempty"`
ResponseModalities []string `json:"responseModalities,omitempty"`
ThinkingConfig *GeminiThinkingConfig `json:"thinkingConfig,omitempty"`
+ SpeechConfig json.RawMessage `json:"speechConfig,omitempty"` // RawMessage to allow flexible speech config
}
type GeminiChatCandidate struct {
diff --git a/relay/channel/gemini/relay-gemini.go b/relay/channel/gemini/relay-gemini.go
index 635041d7..d4b7c209 100644
--- a/relay/channel/gemini/relay-gemini.go
+++ b/relay/channel/gemini/relay-gemini.go
@@ -374,7 +374,9 @@ func CovertGemini2OpenAI(textRequest dto.GeneralOpenAIRequest, info *relaycommon
if content.Role == "assistant" {
content.Role = "model"
}
- geminiRequest.Contents = append(geminiRequest.Contents, content)
+ if len(content.Parts) > 0 {
+ geminiRequest.Contents = append(geminiRequest.Contents, content)
+ }
}
if len(system_content) > 0 {
diff --git a/relay/helper/price.go b/relay/helper/price.go
index 326790b4..1ee2767e 100644
--- a/relay/helper/price.go
+++ b/relay/helper/price.go
@@ -5,8 +5,7 @@ import (
"one-api/common"
constant2 "one-api/constant"
relaycommon "one-api/relay/common"
- "one-api/setting"
- "one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
"github.com/gin-gonic/gin"
)
@@ -36,7 +35,7 @@ func (p PriceData) ToSetting() string {
func HandleGroupRatio(ctx *gin.Context, relayInfo *relaycommon.RelayInfo) GroupRatioInfo {
groupRatioInfo := GroupRatioInfo{
GroupRatio: 1.0, // default ratio
- GroupSpecialRatio: 1.0, // default user group ratio
+ GroupSpecialRatio: -1,
}
// check auto group
@@ -49,21 +48,21 @@ func HandleGroupRatio(ctx *gin.Context, relayInfo *relaycommon.RelayInfo) GroupR
}
// check user group special ratio
- userGroupRatio, ok := setting.GetGroupGroupRatio(relayInfo.UserGroup, relayInfo.Group)
+ userGroupRatio, ok := ratio_setting.GetGroupGroupRatio(relayInfo.UserGroup, relayInfo.Group)
if ok {
// user group special ratio
groupRatioInfo.GroupSpecialRatio = userGroupRatio
groupRatioInfo.GroupRatio = userGroupRatio
} else {
// normal group ratio
- groupRatioInfo.GroupRatio = setting.GetGroupRatio(relayInfo.Group)
+ groupRatioInfo.GroupRatio = ratio_setting.GetGroupRatio(relayInfo.Group)
}
return groupRatioInfo
}
func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens int, maxTokens int) (PriceData, error) {
- modelPrice, usePrice := operation_setting.GetModelPrice(info.OriginModelName, false)
+ modelPrice, usePrice := ratio_setting.GetModelPrice(info.OriginModelName, false)
groupRatioInfo := HandleGroupRatio(c, info)
@@ -79,7 +78,7 @@ func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens
preConsumedTokens = promptTokens + maxTokens
}
var success bool
- modelRatio, success = operation_setting.GetModelRatio(info.OriginModelName)
+ modelRatio, success = ratio_setting.GetModelRatio(info.OriginModelName)
if !success {
acceptUnsetRatio := false
if accept, ok := info.UserSetting[constant2.UserAcceptUnsetRatioModel]; ok {
@@ -92,10 +91,10 @@ func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens
return PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请联系管理员设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", info.OriginModelName, info.OriginModelName)
}
}
- completionRatio = operation_setting.GetCompletionRatio(info.OriginModelName)
- cacheRatio, _ = operation_setting.GetCacheRatio(info.OriginModelName)
- cacheCreationRatio, _ = operation_setting.GetCreateCacheRatio(info.OriginModelName)
- imageRatio, _ = operation_setting.GetImageRatio(info.OriginModelName)
+ completionRatio = ratio_setting.GetCompletionRatio(info.OriginModelName)
+ cacheRatio, _ = ratio_setting.GetCacheRatio(info.OriginModelName)
+ cacheCreationRatio, _ = ratio_setting.GetCreateCacheRatio(info.OriginModelName)
+ imageRatio, _ = ratio_setting.GetImageRatio(info.OriginModelName)
ratio := modelRatio * groupRatioInfo.GroupRatio
preConsumedQuota = int(float64(preConsumedTokens) * ratio)
} else {
@@ -122,11 +121,11 @@ func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens
}
func ContainPriceOrRatio(modelName string) bool {
- _, ok := operation_setting.GetModelPrice(modelName, false)
+ _, ok := ratio_setting.GetModelPrice(modelName, false)
if ok {
return true
}
- _, ok = operation_setting.GetModelRatio(modelName)
+ _, ok = ratio_setting.GetModelRatio(modelName)
if ok {
return true
}
diff --git a/relay/relay-gemini.go b/relay/relay-gemini.go
index 21cf5e12..9edbe5c2 100644
--- a/relay/relay-gemini.go
+++ b/relay/relay-gemini.go
@@ -155,6 +155,10 @@ func GeminiHelper(c *gin.Context) (openaiErr *dto.OpenAIErrorWithStatusCode) {
return service.OpenAIErrorWrapperLocal(err, "marshal_text_request_failed", http.StatusInternalServerError)
}
+ if common.DebugEnabled {
+ println("Gemini request body: %s", string(requestBody))
+ }
+
resp, err := adaptor.DoRequest(c, relayInfo, bytes.NewReader(requestBody))
if err != nil {
common.LogError(c, "Do gemini request failed: "+err.Error())
diff --git a/relay/relay-mj.go b/relay/relay-mj.go
index 9d0a2077..ce4346b6 100644
--- a/relay/relay-mj.go
+++ b/relay/relay-mj.go
@@ -15,7 +15,7 @@ import (
relayconstant "one-api/relay/constant"
"one-api/service"
"one-api/setting"
- "one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
"strconv"
"strings"
"time"
@@ -174,17 +174,17 @@ func RelaySwapFace(c *gin.Context) *dto.MidjourneyResponse {
return service.MidjourneyErrorWrapper(constant.MjRequestError, "sour_base64_and_target_base64_is_required")
}
modelName := service.CoverActionToModelName(constant.MjActionSwapFace)
- modelPrice, success := operation_setting.GetModelPrice(modelName, true)
+ modelPrice, success := ratio_setting.GetModelPrice(modelName, true)
// 如果没有配置价格,则使用默认价格
if !success {
- defaultPrice, ok := operation_setting.GetDefaultModelRatioMap()[modelName]
+ defaultPrice, ok := ratio_setting.GetDefaultModelRatioMap()[modelName]
if !ok {
modelPrice = 0.1
} else {
modelPrice = defaultPrice
}
}
- groupRatio := setting.GetGroupRatio(group)
+ groupRatio := ratio_setting.GetGroupRatio(group)
ratio := modelPrice * groupRatio
userQuota, err := model.GetUserQuota(userId, false)
if err != nil {
@@ -480,17 +480,17 @@ func RelayMidjourneySubmit(c *gin.Context, relayMode int) *dto.MidjourneyRespons
fullRequestURL := fmt.Sprintf("%s%s", baseURL, requestURL)
modelName := service.CoverActionToModelName(midjRequest.Action)
- modelPrice, success := operation_setting.GetModelPrice(modelName, true)
+ modelPrice, success := ratio_setting.GetModelPrice(modelName, true)
// 如果没有配置价格,则使用默认价格
if !success {
- defaultPrice, ok := operation_setting.GetDefaultModelRatioMap()[modelName]
+ defaultPrice, ok := ratio_setting.GetDefaultModelRatioMap()[modelName]
if !ok {
modelPrice = 0.1
} else {
modelPrice = defaultPrice
}
}
- groupRatio := setting.GetGroupRatio(group)
+ groupRatio := ratio_setting.GetGroupRatio(group)
ratio := modelPrice * groupRatio
userQuota, err := model.GetUserQuota(userId, false)
if err != nil {
diff --git a/relay/relay_task.go b/relay/relay_task.go
index 26874ba6..3da9a20f 100644
--- a/relay/relay_task.go
+++ b/relay/relay_task.go
@@ -15,8 +15,7 @@ import (
relaycommon "one-api/relay/common"
relayconstant "one-api/relay/constant"
"one-api/service"
- "one-api/setting"
- "one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
)
/*
@@ -38,9 +37,9 @@ func RelayTaskSubmit(c *gin.Context, relayMode int) (taskErr *dto.TaskError) {
}
modelName := service.CoverTaskActionToModelName(platform, relayInfo.Action)
- modelPrice, success := operation_setting.GetModelPrice(modelName, true)
+ modelPrice, success := ratio_setting.GetModelPrice(modelName, true)
if !success {
- defaultPrice, ok := operation_setting.GetDefaultModelRatioMap()[modelName]
+ defaultPrice, ok := ratio_setting.GetDefaultModelRatioMap()[modelName]
if !ok {
modelPrice = 0.1
} else {
@@ -49,7 +48,7 @@ func RelayTaskSubmit(c *gin.Context, relayMode int) (taskErr *dto.TaskError) {
}
// 预扣
- groupRatio := setting.GetGroupRatio(relayInfo.Group)
+ groupRatio := ratio_setting.GetGroupRatio(relayInfo.Group)
ratio := modelPrice * groupRatio
userQuota, err := model.GetUserQuota(relayInfo.UserId, false)
if err != nil {
diff --git a/service/quota.go b/service/quota.go
index 0fb9e67c..973deba7 100644
--- a/service/quota.go
+++ b/service/quota.go
@@ -11,7 +11,7 @@ import (
relaycommon "one-api/relay/common"
"one-api/relay/helper"
"one-api/setting"
- "one-api/setting/operation_setting"
+ "one-api/setting/ratio_setting"
"strings"
"time"
@@ -46,9 +46,9 @@ func calculateAudioQuota(info QuotaInfo) int {
return int(quota.IntPart())
}
- completionRatio := decimal.NewFromFloat(operation_setting.GetCompletionRatio(info.ModelName))
- audioRatio := decimal.NewFromFloat(operation_setting.GetAudioRatio(info.ModelName))
- audioCompletionRatio := decimal.NewFromFloat(operation_setting.GetAudioCompletionRatio(info.ModelName))
+ completionRatio := decimal.NewFromFloat(ratio_setting.GetCompletionRatio(info.ModelName))
+ audioRatio := decimal.NewFromFloat(ratio_setting.GetAudioRatio(info.ModelName))
+ audioCompletionRatio := decimal.NewFromFloat(ratio_setting.GetAudioCompletionRatio(info.ModelName))
groupRatio := decimal.NewFromFloat(info.GroupRatio)
modelRatio := decimal.NewFromFloat(info.ModelRatio)
@@ -94,18 +94,18 @@ func PreWssConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, usag
textOutTokens := usage.OutputTokenDetails.TextTokens
audioInputTokens := usage.InputTokenDetails.AudioTokens
audioOutTokens := usage.OutputTokenDetails.AudioTokens
- groupRatio := setting.GetGroupRatio(relayInfo.Group)
- modelRatio, _ := operation_setting.GetModelRatio(modelName)
+ groupRatio := ratio_setting.GetGroupRatio(relayInfo.Group)
+ modelRatio, _ := ratio_setting.GetModelRatio(modelName)
autoGroup, exists := ctx.Get("auto_group")
if exists {
- groupRatio = setting.GetGroupRatio(autoGroup.(string))
+ groupRatio = ratio_setting.GetGroupRatio(autoGroup.(string))
log.Printf("final group ratio: %f", groupRatio)
relayInfo.Group = autoGroup.(string)
}
actualGroupRatio := groupRatio
- userGroupRatio, ok := setting.GetGroupGroupRatio(relayInfo.UserGroup, relayInfo.Group)
+ userGroupRatio, ok := ratio_setting.GetGroupGroupRatio(relayInfo.UserGroup, relayInfo.Group)
if ok {
actualGroupRatio = userGroupRatio
}
@@ -154,9 +154,9 @@ func PostWssConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, mod
audioOutTokens := usage.OutputTokenDetails.AudioTokens
tokenName := ctx.GetString("token_name")
- completionRatio := decimal.NewFromFloat(operation_setting.GetCompletionRatio(modelName))
- audioRatio := decimal.NewFromFloat(operation_setting.GetAudioRatio(relayInfo.OriginModelName))
- audioCompletionRatio := decimal.NewFromFloat(operation_setting.GetAudioCompletionRatio(modelName))
+ completionRatio := decimal.NewFromFloat(ratio_setting.GetCompletionRatio(modelName))
+ audioRatio := decimal.NewFromFloat(ratio_setting.GetAudioRatio(relayInfo.OriginModelName))
+ audioCompletionRatio := decimal.NewFromFloat(ratio_setting.GetAudioCompletionRatio(modelName))
modelRatio := priceData.ModelRatio
groupRatio := priceData.GroupRatioInfo.GroupRatio
@@ -289,9 +289,9 @@ func PostAudioConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo,
audioOutTokens := usage.CompletionTokenDetails.AudioTokens
tokenName := ctx.GetString("token_name")
- completionRatio := decimal.NewFromFloat(operation_setting.GetCompletionRatio(relayInfo.OriginModelName))
- audioRatio := decimal.NewFromFloat(operation_setting.GetAudioRatio(relayInfo.OriginModelName))
- audioCompletionRatio := decimal.NewFromFloat(operation_setting.GetAudioCompletionRatio(relayInfo.OriginModelName))
+ completionRatio := decimal.NewFromFloat(ratio_setting.GetCompletionRatio(relayInfo.OriginModelName))
+ audioRatio := decimal.NewFromFloat(ratio_setting.GetAudioRatio(relayInfo.OriginModelName))
+ audioCompletionRatio := decimal.NewFromFloat(ratio_setting.GetAudioCompletionRatio(relayInfo.OriginModelName))
modelRatio := priceData.ModelRatio
groupRatio := priceData.GroupRatioInfo.GroupRatio
diff --git a/setting/payment.go b/setting/payment.go
index f50723c3..4ffa4381 100644
--- a/setting/payment.go
+++ b/setting/payment.go
@@ -1,8 +1,45 @@
package setting
+import "encoding/json"
+
var PayAddress = ""
var CustomCallbackAddress = ""
var EpayId = ""
var EpayKey = ""
var Price = 7.3
var MinTopUp = 1
+
+var PayMethods = []map[string]string{
+ {
+ "name": "支付宝",
+ "color": "rgba(var(--semi-blue-5), 1)",
+ "type": "zfb",
+ },
+ {
+ "name": "微信",
+ "color": "rgba(var(--semi-green-5), 1)",
+ "type": "wx",
+ },
+}
+
+func UpdatePayMethodsByJsonString(jsonString string) error {
+ PayMethods = make([]map[string]string, 0)
+ return json.Unmarshal([]byte(jsonString), &PayMethods)
+}
+
+func PayMethods2JsonString() string {
+ jsonBytes, err := json.Marshal(PayMethods)
+ if err != nil {
+ return "[]"
+ }
+ return string(jsonBytes)
+}
+
+func ContainsPayMethod(method string) bool {
+ for _, payMethod := range PayMethods {
+ if payMethod["type"] == method {
+ return true
+ }
+ }
+ return false
+}
diff --git a/setting/operation_setting/cache_ratio.go b/setting/ratio_setting/cache_ratio.go
similarity index 99%
rename from setting/operation_setting/cache_ratio.go
rename to setting/ratio_setting/cache_ratio.go
index ec0c766d..aa934b22 100644
--- a/setting/operation_setting/cache_ratio.go
+++ b/setting/ratio_setting/cache_ratio.go
@@ -1,4 +1,4 @@
-package operation_setting
+package ratio_setting
import (
"encoding/json"
diff --git a/setting/group_ratio.go b/setting/ratio_setting/group_ratio.go
similarity index 99%
rename from setting/group_ratio.go
rename to setting/ratio_setting/group_ratio.go
index 28dbd167..f600a7b5 100644
--- a/setting/group_ratio.go
+++ b/setting/ratio_setting/group_ratio.go
@@ -1,4 +1,4 @@
-package setting
+package ratio_setting
import (
"encoding/json"
diff --git a/setting/operation_setting/model-ratio.go b/setting/ratio_setting/model_ratio.go
similarity index 99%
rename from setting/operation_setting/model-ratio.go
rename to setting/ratio_setting/model_ratio.go
index 5155b2fc..3102dfe9 100644
--- a/setting/operation_setting/model-ratio.go
+++ b/setting/ratio_setting/model_ratio.go
@@ -1,8 +1,9 @@
-package operation_setting
+package ratio_setting
import (
"encoding/json"
"one-api/common"
+ "one-api/setting/operation_setting"
"strings"
"sync"
)
@@ -366,7 +367,7 @@ func GetModelRatio(name string) (float64, bool) {
}
ratio, ok := modelRatioMap[name]
if !ok {
- return 37.5, SelfUseModeEnabled
+ return 37.5, operation_setting.SelfUseModeEnabled
}
return ratio, true
}
diff --git a/web/src/components/settings/OperationSetting.js b/web/src/components/settings/OperationSetting.js
index 7bd9bf62..f6786f95 100644
--- a/web/src/components/settings/OperationSetting.js
+++ b/web/src/components/settings/OperationSetting.js
@@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react';
-import { Card, Spin, Tabs } from '@douyinfe/semi-ui';
+import { Card, Spin } from '@douyinfe/semi-ui';
import SettingsGeneral from '../../pages/Setting/Operation/SettingsGeneral.js';
import SettingsDrawing from '../../pages/Setting/Operation/SettingsDrawing.js';
import SettingsSensitiveWords from '../../pages/Setting/Operation/SettingsSensitiveWords.js';
@@ -7,63 +7,58 @@ import SettingsLog from '../../pages/Setting/Operation/SettingsLog.js';
import SettingsDataDashboard from '../../pages/Setting/Operation/SettingsDataDashboard.js';
import SettingsMonitoring from '../../pages/Setting/Operation/SettingsMonitoring.js';
import SettingsCreditLimit from '../../pages/Setting/Operation/SettingsCreditLimit.js';
-import ModelSettingsVisualEditor from '../../pages/Setting/Operation/ModelSettingsVisualEditor.js';
-import GroupRatioSettings from '../../pages/Setting/Operation/GroupRatioSettings.js';
-import ModelRatioSettings from '../../pages/Setting/Operation/ModelRatioSettings.js';
-
-import { API, showError, showSuccess } from '../../helpers';
import SettingsChats from '../../pages/Setting/Operation/SettingsChats.js';
-import { useTranslation } from 'react-i18next';
-import ModelRatioNotSetEditor from '../../pages/Setting/Operation/ModelRationNotSetEditor.js';
+import { API, showError } from '../../helpers';
const OperationSetting = () => {
- const { t } = useTranslation();
let [inputs, setInputs] = useState({
+ /* 额度相关 */
QuotaForNewUser: 0,
+ PreConsumedQuota: 0,
QuotaForInviter: 0,
QuotaForInvitee: 0,
- QuotaRemindThreshold: 0,
- PreConsumedQuota: 0,
- StreamCacheQueueLength: 0,
- ModelRatio: '',
- CacheRatio: '',
- CompletionRatio: '',
- ModelPrice: '',
- GroupRatio: '',
- GroupGroupRatio: '',
- AutoGroups: '',
- DefaultUseAutoGroup: false,
- UserUsableGroups: '',
+
+ /* 通用设置 */
TopUpLink: '',
'general_setting.docs_link': '',
- // ChatLink2: '', // 添加的新状态变量
QuotaPerUnit: 0,
- AutomaticDisableChannelEnabled: false,
- AutomaticEnableChannelEnabled: false,
- ChannelDisableThreshold: 0,
- LogConsumeEnabled: false,
+ RetryTimes: 0,
DisplayInCurrencyEnabled: false,
DisplayTokenStatEnabled: false,
- CheckSensitiveEnabled: false,
- CheckSensitiveOnPromptEnabled: false,
- CheckSensitiveOnCompletionEnabled: '',
- StopOnSensitiveEnabled: '',
- SensitiveWords: '',
+ DefaultCollapseSidebar: false,
+ DemoSiteEnabled: false,
+ SelfUseModeEnabled: false,
+
+ /* 绘图设置 */
+ DrawingEnabled: false,
MjNotifyEnabled: false,
MjAccountFilterEnabled: false,
- MjModeClearEnabled: false,
MjForwardUrlEnabled: false,
+ MjModeClearEnabled: false,
MjActionCheckSuccessEnabled: false,
- DrawingEnabled: false,
+
+ /* 敏感词设置 */
+ CheckSensitiveEnabled: false,
+ CheckSensitiveOnPromptEnabled: false,
+ SensitiveWords: '',
+
+ /* 日志设置 */
+ LogConsumeEnabled: false,
+
+ /* 数据看板 */
DataExportEnabled: false,
DataExportDefaultTime: 'hour',
DataExportInterval: 5,
- DefaultCollapseSidebar: false, // 默认折叠侧边栏
- RetryTimes: 0,
- Chats: '[]',
- DemoSiteEnabled: false,
- SelfUseModeEnabled: false,
+
+ /* 监控设置 */
+ ChannelDisableThreshold: 0,
+ QuotaRemindThreshold: 0,
+ AutomaticDisableChannelEnabled: false,
+ AutomaticEnableChannelEnabled: false,
AutomaticDisableKeywords: '',
+
+ /* 聊天设置 */
+ Chats: '[]',
});
let [loading, setLoading] = useState(false);
@@ -74,22 +69,9 @@ const OperationSetting = () => {
if (success) {
let newInputs = {};
data.forEach((item) => {
- if (
- item.key === 'ModelRatio' ||
- item.key === 'GroupRatio' ||
- item.key === 'GroupGroupRatio' ||
- item.key === 'AutoGroups' ||
- item.key === 'UserUsableGroups' ||
- item.key === 'CompletionRatio' ||
- item.key === 'ModelPrice' ||
- item.key === 'CacheRatio'
- ) {
- item.value = JSON.stringify(JSON.parse(item.value), null, 2);
- }
if (
item.key.endsWith('Enabled') ||
- ['DefaultCollapseSidebar'].includes(item.key) ||
- ['DefaultUseAutoGroup'].includes(item.key)
+ ['DefaultCollapseSidebar'].includes(item.key)
) {
newInputs[item.key] = item.value === 'true' ? true : false;
} else {
@@ -153,24 +135,6 @@ const OperationSetting = () => {