feat: support new ratio for all ui

This commit is contained in:
WqyJh 2025-01-20 18:58:13 +08:00
parent 56df7c097a
commit f2bff58498
4 changed files with 40 additions and 106 deletions

View File

@ -3,14 +3,14 @@ package openai
import ( import (
"errors" "errors"
"fmt" "fmt"
"math"
"strings"
"github.com/pkoukk/tiktoken-go" "github.com/pkoukk/tiktoken-go"
"github.com/songquanpeng/one-api/common/config" "github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/image" "github.com/songquanpeng/one-api/common/image"
"github.com/songquanpeng/one-api/common/logger" "github.com/songquanpeng/one-api/common/logger"
billingratio "github.com/songquanpeng/one-api/relay/billing/ratio"
"github.com/songquanpeng/one-api/relay/model" "github.com/songquanpeng/one-api/relay/model"
"math"
"strings"
) )
// tokenEncoderMap won't grow after initialization // tokenEncoderMap won't grow after initialization
@ -32,7 +32,7 @@ func InitTokenEncoders() {
if err != nil { if err != nil {
logger.FatalLog(fmt.Sprintf("failed to get gpt-4 token encoder: %s", err.Error())) 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") { if strings.HasPrefix(model, "gpt-3.5") {
tokenEncoderMap[model] = gpt35TokenEncoder tokenEncoderMap[model] = gpt35TokenEncoder
} else if strings.HasPrefix(model, "gpt-4o") { } else if strings.HasPrefix(model, "gpt-4o") {

View File

@ -2,6 +2,13 @@ import React, { useEffect, useState } from 'react';
import { Divider, Form, Grid, Header } from 'semantic-ui-react'; import { Divider, Form, Grid, Header } from 'semantic-ui-react';
import { API, showError, showSuccess, timestamp2string, verifyJSON } from '../helpers'; 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 = () => { const OperationSetting = () => {
let now = new Date(); let now = new Date();
let [inputs, setInputs] = useState({ let [inputs, setInputs] = useState({
@ -10,8 +17,7 @@ const OperationSetting = () => {
QuotaForInvitee: 0, QuotaForInvitee: 0,
QuotaRemindThreshold: 0, QuotaRemindThreshold: 0,
PreConsumedQuota: 0, PreConsumedQuota: 0,
ModelRatio: '', Ratio: '',
CompletionRatio: '',
GroupRatio: '', GroupRatio: '',
TopUpLink: '', TopUpLink: '',
ChatLink: '', ChatLink: '',
@ -35,7 +41,7 @@ const OperationSetting = () => {
if (success) { if (success) {
let newInputs = {}; let newInputs = {};
data.forEach((item) => { 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); item.value = JSON.stringify(JSON.parse(item.value), null, 2);
} }
if (item.value === '{}') { if (item.value === '{}') {
@ -91,12 +97,12 @@ const OperationSetting = () => {
} }
break; break;
case 'ratio': case 'ratio':
if (originInputs['ModelRatio'] !== inputs.ModelRatio) { if (originInputs['Ratio'] !== inputs.Ratio) {
if (!verifyJSON(inputs.ModelRatio)) { if (!verifyJSON(inputs.Ratio)) {
showError('模型倍率不是合法的 JSON 字符串'); showError('自定义倍率不是合法的 JSON 字符串');
return; return;
} }
await updateOption('ModelRatio', inputs.ModelRatio); await updateOption('Ratio', inputs.Ratio);
} }
if (originInputs['GroupRatio'] !== inputs.GroupRatio) { if (originInputs['GroupRatio'] !== inputs.GroupRatio) {
if (!verifyJSON(inputs.GroupRatio)) { if (!verifyJSON(inputs.GroupRatio)) {
@ -105,13 +111,6 @@ const OperationSetting = () => {
} }
await updateOption('GroupRatio', inputs.GroupRatio); await updateOption('GroupRatio', inputs.GroupRatio);
} }
if (originInputs['CompletionRatio'] !== inputs.CompletionRatio) {
if (!verifyJSON(inputs.CompletionRatio)) {
showError('补全倍率不是合法的 JSON 字符串');
return;
}
await updateOption('CompletionRatio', inputs.CompletionRatio);
}
break; break;
case 'quota': case 'quota':
if (originInputs['QuotaForNewUser'] !== inputs.QuotaForNewUser) { if (originInputs['QuotaForNewUser'] !== inputs.QuotaForNewUser) {
@ -346,24 +345,13 @@ const OperationSetting = () => {
</Header> </Header>
<Form.Group widths='equal'> <Form.Group widths='equal'>
<Form.TextArea <Form.TextArea
label='模型倍率' label='自定义倍率'
name='ModelRatio' name='Ratio'
onChange={handleInputChange} onChange={handleInputChange}
style={{ minHeight: 250, fontFamily: 'JetBrains Mono, Consolas' }} style={{ minHeight: 250, fontFamily: 'JetBrains Mono, Consolas' }}
autoComplete='new-password' autoComplete='new-password'
value={inputs.ModelRatio} value={inputs.Ratio}
placeholder='为一个 JSON 文本,键为模型名称,值为倍率' placeholder={`为一个 JSON 文本,键为模型名称,值为倍率结构,例如:\n${JSON.stringify(RATIO_MAPPING_EXAMPLE, null, 2)}`}
/>
</Form.Group>
<Form.Group widths='equal'>
<Form.TextArea
label='补全倍率'
name='CompletionRatio'
onChange={handleInputChange}
style={{ minHeight: 250, fontFamily: 'JetBrains Mono, Consolas' }}
autoComplete='new-password'
value={inputs.CompletionRatio}
placeholder='为一个 JSON 文本,键为模型名称,值为倍率,此处的倍率设置是模型补全倍率相较于提示倍率的比例,使用该设置可强制覆盖 One API 的内部比例'
/> />
</Form.Group> </Form.Group>
<Form.Group widths='equal'> <Form.Group widths='equal'>

View File

@ -18,6 +18,12 @@ import { DateTimePicker } from "@mui/x-date-pickers/DateTimePicker";
import dayjs from "dayjs"; import dayjs from "dayjs";
require("dayjs/locale/zh-cn"); 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 = () => { const OperationSetting = () => {
let now = new Date(); let now = new Date();
let [inputs, setInputs] = useState({ let [inputs, setInputs] = useState({
@ -26,8 +32,7 @@ const OperationSetting = () => {
QuotaForInvitee: 0, QuotaForInvitee: 0,
QuotaRemindThreshold: 0, QuotaRemindThreshold: 0,
PreConsumedQuota: 0, PreConsumedQuota: 0,
ModelRatio: "", Ratio: "",
CompletionRatio: "",
GroupRatio: "", GroupRatio: "",
TopUpLink: "", TopUpLink: "",
ChatLink: "", ChatLink: "",
@ -53,7 +58,7 @@ const OperationSetting = () => {
if (success) { if (success) {
let newInputs = {}; let newInputs = {};
data.forEach((item) => { 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); item.value = JSON.stringify(JSON.parse(item.value), null, 2);
} }
if (item.value === '{}') { if (item.value === '{}') {
@ -123,12 +128,12 @@ const OperationSetting = () => {
} }
break; break;
case "ratio": case "ratio":
if (originInputs["ModelRatio"] !== inputs.ModelRatio) { if (originInputs["Ratio"] !== inputs.Ratio) {
if (!verifyJSON(inputs.ModelRatio)) { if (!verifyJSON(inputs.Ratio)) {
showError("模型倍率不是合法的 JSON 字符串"); showError("自定义倍率不是合法的 JSON 字符串");
return; return;
} }
await updateOption("ModelRatio", inputs.ModelRatio); await updateOption("Ratio", inputs.Ratio);
} }
if (originInputs["GroupRatio"] !== inputs.GroupRatio) { if (originInputs["GroupRatio"] !== inputs.GroupRatio) {
if (!verifyJSON(inputs.GroupRatio)) { if (!verifyJSON(inputs.GroupRatio)) {
@ -137,13 +142,6 @@ const OperationSetting = () => {
} }
await updateOption("GroupRatio", inputs.GroupRatio); await updateOption("GroupRatio", inputs.GroupRatio);
} }
if (originInputs['CompletionRatio'] !== inputs.CompletionRatio) {
if (!verifyJSON(inputs.CompletionRatio)) {
showError('补全倍率不是合法的 JSON 字符串');
return;
}
await updateOption('CompletionRatio', inputs.CompletionRatio);
}
break; break;
case "quota": case "quota":
if (originInputs["QuotaForNewUser"] !== inputs.QuotaForNewUser) { if (originInputs["QuotaForNewUser"] !== inputs.QuotaForNewUser) {
@ -501,28 +499,14 @@ const OperationSetting = () => {
<TextField <TextField
multiline multiline
maxRows={15} maxRows={15}
id="channel-ModelRatio-label" id="channel-Ratio-label"
label="模型倍率" label="自定义倍率"
value={inputs.ModelRatio} value={inputs.Ratio}
name="ModelRatio" name="Ratio"
onChange={handleInputChange} onChange={handleInputChange}
aria-describedby="helper-text-channel-ModelRatio-label" aria-describedby="helper-text-channel-Ratio-label"
minRows={5} minRows={5}
placeholder="为一个 JSON 文本,键为模型名称,值为倍率" placeholder={`为一个 JSON 文本,键为模型名称,值为倍率结构,例如:\n${JSON.stringify(RATIO_MAPPING_EXAMPLE, null, 2)}`}
/>
</FormControl>
<FormControl fullWidth>
<TextField
multiline
maxRows={15}
id="channel-CompletionRatio-label"
label="补全倍率"
value={inputs.CompletionRatio}
name="CompletionRatio"
onChange={handleInputChange}
aria-describedby="helper-text-channel-CompletionRatio-label"
minRows={5}
placeholder="为一个 JSON 文本,键为模型名称,值为倍率,此处的倍率设置是模型补全倍率相较于提示倍率的比例,使用该设置可强制覆盖 One API 的内部比例"
/> />
</FormControl> </FormControl>
<FormControl fullWidth> <FormControl fullWidth>

View File

@ -16,8 +16,6 @@ const OperationSetting = () => {
QuotaForInvitee: 0, QuotaForInvitee: 0,
QuotaRemindThreshold: 0, QuotaRemindThreshold: 0,
PreConsumedQuota: 0, PreConsumedQuota: 0,
ModelRatio: '', // Deprecated
CompletionRatio: '', // Deprecated
GroupRatio: '', GroupRatio: '',
Ratio: '', Ratio: '',
TopUpLink: '', TopUpLink: '',
@ -42,7 +40,7 @@ const OperationSetting = () => {
if (success) { if (success) {
let newInputs = {}; let newInputs = {};
data.forEach((item) => { 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); item.value = JSON.stringify(JSON.parse(item.value), null, 2);
} }
if (item.value === '{}') { if (item.value === '{}') {
@ -98,13 +96,6 @@ const OperationSetting = () => {
} }
break; break;
case 'ratio': 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 (originInputs['GroupRatio'] !== inputs.GroupRatio) {
if (!verifyJSON(inputs.GroupRatio)) { if (!verifyJSON(inputs.GroupRatio)) {
showError('分组倍率不是合法的 JSON 字符串'); showError('分组倍率不是合法的 JSON 字符串');
@ -112,13 +103,6 @@ const OperationSetting = () => {
} }
await updateOption('GroupRatio', inputs.GroupRatio); 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 (originInputs['Ratio'] !== inputs.Ratio) {
if (!verifyJSON(inputs.Ratio)) { if (!verifyJSON(inputs.Ratio)) {
showError('倍率不是合法的 JSON 字符串'); showError('倍率不是合法的 JSON 字符串');
@ -369,28 +353,6 @@ const OperationSetting = () => {
placeholder={`为一个 JSON 文本,键为模型名称,值为倍率结构,例如:\n${JSON.stringify(RATIO_MAPPING_EXAMPLE, null, 2)}`} placeholder={`为一个 JSON 文本,键为模型名称,值为倍率结构,例如:\n${JSON.stringify(RATIO_MAPPING_EXAMPLE, null, 2)}`}
/> />
</Form.Group> </Form.Group>
<Form.Group widths='equal'>
<Form.TextArea
label='模型倍率(已废弃)'
name='ModelRatio'
onChange={handleInputChange}
style={{ minHeight: 250, fontFamily: 'JetBrains Mono, Consolas' }}
autoComplete='new-password'
value={inputs.ModelRatio}
placeholder='为一个 JSON 文本,键为模型名称,值为倍率'
/>
</Form.Group>
<Form.Group widths='equal'>
<Form.TextArea
label='补全倍率(已废弃)'
name='CompletionRatio'
onChange={handleInputChange}
style={{ minHeight: 250, fontFamily: 'JetBrains Mono, Consolas' }}
autoComplete='new-password'
value={inputs.CompletionRatio}
placeholder='为一个 JSON 文本,键为模型名称,值为倍率,此处的倍率设置是模型补全倍率相较于提示倍率的比例,使用该设置可强制覆盖 One API 的内部比例'
/>
</Form.Group>
<Form.Group widths='equal'> <Form.Group widths='equal'>
<Form.TextArea <Form.TextArea
label='分组倍率' label='分组倍率'