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 文本,键为模型名称,值为倍率'
/>
+
+
+