diff --git a/common/model-ratio.go b/common/model-ratio.go index 6b2bc6a9..a6819494 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -46,7 +46,7 @@ var ModelRatio = map[string]float64{ "gpt-4-32k-0613": 30, "gpt-4-1106-preview": 5, // $0.01 / 1K tokens "gpt-4-0125-preview": 5, // $0.01 / 1K tokens - "gpt-4-turbo-preview": 5, // $0.01 / 1K tokens + "gpt-4-turbo-preview": 5, // $0.01 / 1K tokens "gpt-4-vision-preview": 5, // $0.01 / 1K tokens "gpt-3.5-turbo": 0.75, // $0.0015 / 1K tokens "gpt-3.5-turbo-0301": 0.75, @@ -55,7 +55,7 @@ var ModelRatio = map[string]float64{ "gpt-3.5-turbo-16k-0613": 1.5, "gpt-3.5-turbo-instruct": 0.75, // $0.0015 / 1K tokens "gpt-3.5-turbo-1106": 0.5, // $0.001 / 1K tokens - "gpt-3.5-turbo-0125": 0.25, // $0.0005 / 1K tokens + "gpt-3.5-turbo-0125": 0.25, // $0.0005 / 1K tokens "davinci-002": 1, // $0.002 / 1K tokens "babbage-002": 0.2, // $0.0004 / 1K tokens "text-ada-001": 0.2, @@ -135,7 +135,25 @@ func GetModelRatio(name string) float64 { return ratio } +var CompletionRatio = map[string]float64{} + +func CompletionRatio2JSONString() string { + jsonBytes, err := json.Marshal(CompletionRatio) + if err != nil { + logger.SysError("error marshalling completion ratio: " + err.Error()) + } + return string(jsonBytes) +} + +func UpdateCompletionRatioByJSONString(jsonStr string) error { + CompletionRatio = make(map[string]float64) + return json.Unmarshal([]byte(jsonStr), &CompletionRatio) +} + func GetCompletionRatio(name string) float64 { + if ratio, ok := CompletionRatio[name]; ok { + return ratio + } if strings.HasPrefix(name, "gpt-3.5") { if strings.HasSuffix(name, "0125") { // https://openai.com/blog/new-embedding-models-and-api-updates diff --git a/model/option.go b/model/option.go index e211264c..4b316278 100644 --- a/model/option.go +++ b/model/option.go @@ -66,6 +66,7 @@ func InitOptionMap() { config.OptionMap["PreConsumedQuota"] = strconv.Itoa(config.PreConsumedQuota) config.OptionMap["ModelRatio"] = common.ModelRatio2JSONString() config.OptionMap["GroupRatio"] = common.GroupRatio2JSONString() + config.OptionMap["CompletionRatio"] = common.CompletionRatio2JSONString() config.OptionMap["TopUpLink"] = config.TopUpLink config.OptionMap["ChatLink"] = config.ChatLink config.OptionMap["QuotaPerUnit"] = strconv.FormatFloat(config.QuotaPerUnit, 'f', -1, 64) @@ -198,6 +199,8 @@ func updateOptionMap(key string, value string) (err error) { err = common.UpdateModelRatioByJSONString(value) case "GroupRatio": err = common.UpdateGroupRatioByJSONString(value) + case "CompletionRatio": + err = common.UpdateCompletionRatioByJSONString(value) case "TopUpLink": config.TopUpLink = value case "ChatLink": diff --git a/web/berry/src/views/Setting/component/OperationSetting.js b/web/berry/src/views/Setting/component/OperationSetting.js index 0d331d76..d91298b2 100644 --- a/web/berry/src/views/Setting/component/OperationSetting.js +++ b/web/berry/src/views/Setting/component/OperationSetting.js @@ -27,6 +27,7 @@ const OperationSetting = () => { QuotaRemindThreshold: 0, PreConsumedQuota: 0, ModelRatio: "", + CompletionRatio: "", GroupRatio: "", TopUpLink: "", ChatLink: "", @@ -52,9 +53,12 @@ const OperationSetting = () => { if (success) { let newInputs = {}; data.forEach((item) => { - if (item.key === "ModelRatio" || item.key === "GroupRatio") { + if (item.key === "ModelRatio" || item.key === "GroupRatio" || item.key === "CompletionRatio") { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } + if (item.value === '{}') { + item.value = ''; + } newInputs[item.key] = item.value; }); setInputs(newInputs); @@ -133,6 +137,13 @@ const OperationSetting = () => { } await updateOption("GroupRatio", inputs.GroupRatio); } + if (originInputs['CompletionRatio'] !== inputs.CompletionRatio) { + if (!verifyJSON(inputs.CompletionRatio)) { + showError('补全倍率不是合法的 JSON 字符串'); + return; + } + await updateOption('CompletionRatio', inputs.CompletionRatio); + } break; case "quota": if (originInputs["QuotaForNewUser"] !== inputs.QuotaForNewUser) { @@ -500,7 +511,20 @@ const OperationSetting = () => { placeholder="为一个 JSON 文本,键为模型名称,值为倍率" /> - + + + { QuotaRemindThreshold: 0, PreConsumedQuota: 0, ModelRatio: '', + CompletionRatio: '', GroupRatio: '', TopUpLink: '', ChatLink: '', @@ -34,9 +35,12 @@ const OperationSetting = () => { if (success) { let newInputs = {}; data.forEach((item) => { - if (item.key === 'ModelRatio' || item.key === 'GroupRatio') { + if (item.key === 'ModelRatio' || item.key === 'GroupRatio' || item.key === 'CompletionRatio') { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } + if (item.value === '{}') { + item.value = ''; + } newInputs[item.key] = item.value; }); setInputs(newInputs); @@ -101,6 +105,13 @@ const OperationSetting = () => { } await updateOption('GroupRatio', inputs.GroupRatio); } + if (originInputs['CompletionRatio'] !== inputs.CompletionRatio) { + if (!verifyJSON(inputs.CompletionRatio)) { + showError('补全倍率不是合法的 JSON 字符串'); + return; + } + await updateOption('CompletionRatio', inputs.CompletionRatio); + } break; case 'quota': if (originInputs['QuotaForNewUser'] !== inputs.QuotaForNewUser) { @@ -271,10 +282,10 @@ const OperationSetting = () => { onChange={handleInputChange} /> { @@ -344,6 +355,17 @@ const OperationSetting = () => { placeholder='为一个 JSON 文本,键为模型名称,值为倍率' /> + + +