From f2bff58498906aec3c7b8660d6cd8577d31f1884 Mon Sep 17 00:00:00 2001 From: WqyJh <781345688@qq.com> Date: Mon, 20 Jan 2025 18:58:13 +0800 Subject: [PATCH] feat: support new ratio for all ui --- relay/adaptor/openai/token.go | 8 +-- web/air/src/components/OperationSetting.js | 46 ++++++---------- .../Setting/component/OperationSetting.js | 52 +++++++------------ .../src/components/OperationSetting.js | 40 +------------- 4 files changed, 40 insertions(+), 106 deletions(-) diff --git a/relay/adaptor/openai/token.go b/relay/adaptor/openai/token.go index 7c8468b9..bda08577 100644 --- a/relay/adaptor/openai/token.go +++ b/relay/adaptor/openai/token.go @@ -3,14 +3,14 @@ package openai import ( "errors" "fmt" + "math" + "strings" + "github.com/pkoukk/tiktoken-go" "github.com/songquanpeng/one-api/common/config" "github.com/songquanpeng/one-api/common/image" "github.com/songquanpeng/one-api/common/logger" - billingratio "github.com/songquanpeng/one-api/relay/billing/ratio" "github.com/songquanpeng/one-api/relay/model" - "math" - "strings" ) // tokenEncoderMap won't grow after initialization @@ -32,7 +32,7 @@ func InitTokenEncoders() { if err != nil { logger.FatalLog(fmt.Sprintf("failed to get gpt-4 token encoder: %s", err.Error())) } - for model := range billingratio.ModelRatio { + for model := range RatioMap { if strings.HasPrefix(model, "gpt-3.5") { tokenEncoderMap[model] = gpt35TokenEncoder } else if strings.HasPrefix(model, "gpt-4o") { diff --git a/web/air/src/components/OperationSetting.js b/web/air/src/components/OperationSetting.js index 6356ac66..d13c882c 100644 --- a/web/air/src/components/OperationSetting.js +++ b/web/air/src/components/OperationSetting.js @@ -2,6 +2,13 @@ import React, { useEffect, useState } from 'react'; import { Divider, Form, Grid, Header } from 'semantic-ui-react'; import { API, showError, showSuccess, timestamp2string, verifyJSON } from '../helpers'; +const RATIO_MAPPING_EXAMPLE = { + 'gpt-4o-mini': {'input': 0.075, 'output': 0.3}, + 'llama3-8b-8192(33)': {'input': 0.15, 'output': 0.3}, + 'llama3-70b-8192(33)': {'input': 1.325, 'output': 1.749}, +}; + + const OperationSetting = () => { let now = new Date(); let [inputs, setInputs] = useState({ @@ -10,8 +17,7 @@ const OperationSetting = () => { QuotaForInvitee: 0, QuotaRemindThreshold: 0, PreConsumedQuota: 0, - ModelRatio: '', - CompletionRatio: '', + Ratio: '', GroupRatio: '', TopUpLink: '', ChatLink: '', @@ -35,7 +41,7 @@ const OperationSetting = () => { if (success) { let newInputs = {}; data.forEach((item) => { - if (item.key === 'ModelRatio' || item.key === 'GroupRatio' || item.key === 'CompletionRatio') { + if (item.key === 'GroupRatio' || item.key === 'Ratio') { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } if (item.value === '{}') { @@ -91,12 +97,12 @@ const OperationSetting = () => { } break; case 'ratio': - if (originInputs['ModelRatio'] !== inputs.ModelRatio) { - if (!verifyJSON(inputs.ModelRatio)) { - showError('模型倍率不是合法的 JSON 字符串'); + if (originInputs['Ratio'] !== inputs.Ratio) { + if (!verifyJSON(inputs.Ratio)) { + showError('自定义倍率不是合法的 JSON 字符串'); return; } - await updateOption('ModelRatio', inputs.ModelRatio); + await updateOption('Ratio', inputs.Ratio); } if (originInputs['GroupRatio'] !== inputs.GroupRatio) { if (!verifyJSON(inputs.GroupRatio)) { @@ -105,13 +111,6 @@ 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) { @@ -346,24 +345,13 @@ const OperationSetting = () => { - - - diff --git a/web/berry/src/views/Setting/component/OperationSetting.js b/web/berry/src/views/Setting/component/OperationSetting.js index 2bed715b..ee609d77 100644 --- a/web/berry/src/views/Setting/component/OperationSetting.js +++ b/web/berry/src/views/Setting/component/OperationSetting.js @@ -18,6 +18,12 @@ import { DateTimePicker } from "@mui/x-date-pickers/DateTimePicker"; import dayjs from "dayjs"; require("dayjs/locale/zh-cn"); +const RATIO_MAPPING_EXAMPLE = { + 'gpt-4o-mini': {'input': 0.075, 'output': 0.3}, + 'llama3-8b-8192(33)': {'input': 0.15, 'output': 0.3}, + 'llama3-70b-8192(33)': {'input': 1.325, 'output': 1.749}, +}; + const OperationSetting = () => { let now = new Date(); let [inputs, setInputs] = useState({ @@ -26,8 +32,7 @@ const OperationSetting = () => { QuotaForInvitee: 0, QuotaRemindThreshold: 0, PreConsumedQuota: 0, - ModelRatio: "", - CompletionRatio: "", + Ratio: "", GroupRatio: "", TopUpLink: "", ChatLink: "", @@ -53,7 +58,7 @@ const OperationSetting = () => { if (success) { let newInputs = {}; data.forEach((item) => { - if (item.key === "ModelRatio" || item.key === "GroupRatio" || item.key === "CompletionRatio") { + if (item.key === "GroupRatio" || item.key === "Ratio") { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } if (item.value === '{}') { @@ -123,12 +128,12 @@ const OperationSetting = () => { } break; case "ratio": - if (originInputs["ModelRatio"] !== inputs.ModelRatio) { - if (!verifyJSON(inputs.ModelRatio)) { - showError("模型倍率不是合法的 JSON 字符串"); + if (originInputs["Ratio"] !== inputs.Ratio) { + if (!verifyJSON(inputs.Ratio)) { + showError("自定义倍率不是合法的 JSON 字符串"); return; } - await updateOption("ModelRatio", inputs.ModelRatio); + await updateOption("Ratio", inputs.Ratio); } if (originInputs["GroupRatio"] !== inputs.GroupRatio) { if (!verifyJSON(inputs.GroupRatio)) { @@ -137,13 +142,6 @@ 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) { @@ -501,28 +499,14 @@ const OperationSetting = () => { - - - diff --git a/web/default/src/components/OperationSetting.js b/web/default/src/components/OperationSetting.js index 88cbf2d0..eaf7a234 100644 --- a/web/default/src/components/OperationSetting.js +++ b/web/default/src/components/OperationSetting.js @@ -16,8 +16,6 @@ const OperationSetting = () => { QuotaForInvitee: 0, QuotaRemindThreshold: 0, PreConsumedQuota: 0, - ModelRatio: '', // Deprecated - CompletionRatio: '', // Deprecated GroupRatio: '', Ratio: '', TopUpLink: '', @@ -42,7 +40,7 @@ const OperationSetting = () => { if (success) { let newInputs = {}; data.forEach((item) => { - if (item.key === 'ModelRatio' || item.key === 'GroupRatio' || item.key === 'CompletionRatio' || item.key === 'Ratio') { + if (item.key === 'GroupRatio' || item.key === 'Ratio') { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } if (item.value === '{}') { @@ -98,13 +96,6 @@ const OperationSetting = () => { } break; case 'ratio': - if (originInputs['ModelRatio'] !== inputs.ModelRatio) { - if (!verifyJSON(inputs.ModelRatio)) { - showError('模型倍率不是合法的 JSON 字符串'); - return; - } - await updateOption('ModelRatio', inputs.ModelRatio); - } if (originInputs['GroupRatio'] !== inputs.GroupRatio) { if (!verifyJSON(inputs.GroupRatio)) { showError('分组倍率不是合法的 JSON 字符串'); @@ -112,13 +103,6 @@ const OperationSetting = () => { } await updateOption('GroupRatio', inputs.GroupRatio); } - if (originInputs['CompletionRatio'] !== inputs.CompletionRatio) { - if (!verifyJSON(inputs.CompletionRatio)) { - showError('补全倍率不是合法的 JSON 字符串'); - return; - } - await updateOption('CompletionRatio', inputs.CompletionRatio); - } if (originInputs['Ratio'] !== inputs.Ratio) { if (!verifyJSON(inputs.Ratio)) { showError('倍率不是合法的 JSON 字符串'); @@ -369,28 +353,6 @@ const OperationSetting = () => { placeholder={`为一个 JSON 文本,键为模型名称,值为倍率结构,例如:\n${JSON.stringify(RATIO_MAPPING_EXAMPLE, null, 2)}`} /> - - - - - -