From 19df2ac234d69d00ecdefa3e11c0a85d64361b4b Mon Sep 17 00:00:00 2001
From: Raymond <240029725@qq.com>
Date: Sat, 26 Jul 2025 17:09:38 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E8=AF=B7=E6=B1=82?=
=?UTF-8?q?=E9=80=9F=E7=8E=87=E9=99=90=E5=88=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=AF=B9=E8=AF=B7=E6=B1=82=E6=AC=A1=E6=95=B0=E6=9C=80=E5=A4=A7?=
=?UTF-8?q?=E5=80=BC=E7=9A=84=E9=99=90=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
setting/rate_limit.go | 3 +++
web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js | 3 +++
2 files changed, 6 insertions(+)
diff --git a/setting/rate_limit.go b/setting/rate_limit.go
index 53b53f88..535fd831 100644
--- a/setting/rate_limit.go
+++ b/setting/rate_limit.go
@@ -58,6 +58,9 @@ func CheckModelRequestRateLimitGroup(jsonStr string) error {
if limits[0] < 0 || limits[1] < 1 {
return fmt.Errorf("group %s has negative rate limit values: [%d, %d]", group, limits[0], limits[1])
}
+ if limits[0] > 2147483647 || limits[1] > 2147483647 {
+ return fmt.Errorf("group %s [%d, %d] has max rate limits value 2147483647", group, limits[0], limits[1])
+ }
}
return nil
diff --git a/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js b/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
index 85473ec9..d5b1c637 100644
--- a/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
+++ b/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
@@ -128,6 +128,7 @@ export default function RequestRateLimit(props) {
label={t('用户每周期最多请求次数')}
step={1}
min={0}
+ max={2147483647}
suffix={t('次')}
extraText={t('包括失败请求的次数,0代表不限制')}
field={'ModelRequestRateLimitCount'}
@@ -144,6 +145,7 @@ export default function RequestRateLimit(props) {
label={t('用户每周期最多请求完成次数')}
step={1}
min={1}
+ max={2147483647}
suffix={t('次')}
extraText={t('只包括请求成功的次数')}
field={'ModelRequestRateLimitSuccessCount'}
@@ -180,6 +182,7 @@ export default function RequestRateLimit(props) {
{t('使用 JSON 对象格式,格式为:{"组名": [最多请求次数, 最多请求完成次数]}')}
{t('示例:{"default": [200, 100], "vip": [0, 1000]}。')}
{t('[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。')}
+ {t('[最多请求次数]和[最多请求完成次数]的最大值为2147483647。')}
{t('分组速率配置优先级高于全局速率限制。')}
{t('限制周期统一使用上方配置的“限制周期”值。')}
From bcf7e7866595ac1224065cf1b493e057e0a05310 Mon Sep 17 00:00:00 2001
From: Raymond <240029725@qq.com>
Date: Sun, 27 Jul 2025 16:01:59 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E8=AF=B7=E6=B1=82?=
=?UTF-8?q?=E9=80=9F=E7=8E=87=E9=99=90=E5=88=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=AF=B9=E8=AF=B7=E6=B1=82=E6=AC=A1=E6=95=B0=E6=9C=80=E5=A4=A7?=
=?UTF-8?q?=E5=80=BC=E7=9A=84=E9=99=90=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
setting/rate_limit.go | 3 ++-
web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/setting/rate_limit.go b/setting/rate_limit.go
index 535fd831..d550b2c3 100644
--- a/setting/rate_limit.go
+++ b/setting/rate_limit.go
@@ -3,6 +3,7 @@ package setting
import (
"encoding/json"
"fmt"
+ "math"
"one-api/common"
"sync"
)
@@ -58,7 +59,7 @@ func CheckModelRequestRateLimitGroup(jsonStr string) error {
if limits[0] < 0 || limits[1] < 1 {
return fmt.Errorf("group %s has negative rate limit values: [%d, %d]", group, limits[0], limits[1])
}
- if limits[0] > 2147483647 || limits[1] > 2147483647 {
+ if limits[0] > math.MaxInt32 || limits[1] > math.MaxInt32 {
return fmt.Errorf("group %s [%d, %d] has max rate limits value 2147483647", group, limits[0], limits[1])
}
}
diff --git a/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js b/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
index d5b1c637..60d58ba6 100644
--- a/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
+++ b/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
@@ -128,7 +128,7 @@ export default function RequestRateLimit(props) {
label={t('用户每周期最多请求次数')}
step={1}
min={0}
- max={2147483647}
+ max={100000}
suffix={t('次')}
extraText={t('包括失败请求的次数,0代表不限制')}
field={'ModelRequestRateLimitCount'}
@@ -145,7 +145,7 @@ export default function RequestRateLimit(props) {
label={t('用户每周期最多请求完成次数')}
step={1}
min={1}
- max={2147483647}
+ max={100000}
suffix={t('次')}
extraText={t('只包括请求成功的次数')}
field={'ModelRequestRateLimitSuccessCount'}
From e322ed4f054a836859134dc417d5402b01952447 Mon Sep 17 00:00:00 2001
From: CaIon
Date: Sun, 27 Jul 2025 16:32:14 +0800
Subject: [PATCH 3/4] fix: ensure minimum quota display and handle zero values
in render function
---
relay/relay-text.go | 3 +++
web/src/helpers/render.js | 12 +++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/relay/relay-text.go b/relay/relay-text.go
index 84d4e38b..1856a2a1 100644
--- a/relay/relay-text.go
+++ b/relay/relay-text.go
@@ -517,6 +517,9 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo,
common.LogError(ctx, fmt.Sprintf("total tokens is 0, cannot consume quota, userId %d, channelId %d, "+
"tokenId %d, model %s, pre-consumed quota %d", relayInfo.UserId, relayInfo.ChannelId, relayInfo.TokenId, modelName, preConsumedQuota))
} else {
+ if !ratio.IsZero() && quota == 0 {
+ quota = 1
+ }
model.UpdateUserUsedQuotaAndRequestCount(relayInfo.UserId, quota)
model.UpdateChannelUsedQuota(relayInfo.ChannelId, quota)
}
diff --git a/web/src/helpers/render.js b/web/src/helpers/render.js
index bd0a8131..1178d5f9 100644
--- a/web/src/helpers/render.js
+++ b/web/src/helpers/render.js
@@ -883,12 +883,22 @@ export function renderQuotaWithAmount(amount) {
}
export function renderQuota(quota, digits = 2) {
+
let quotaPerUnit = localStorage.getItem('quota_per_unit');
let displayInCurrency = localStorage.getItem('display_in_currency');
quotaPerUnit = parseFloat(quotaPerUnit);
displayInCurrency = displayInCurrency === 'true';
if (displayInCurrency) {
- return '$' + (quota / quotaPerUnit).toFixed(digits);
+ const result = quota / quotaPerUnit;
+ const fixedResult = result.toFixed(digits);
+
+ // 如果 toFixed 后结果为 0 但原始值不为 0,显示最小值
+ if (parseFloat(fixedResult) === 0 && quota > 0 && result > 0) {
+ const minValue = Math.pow(10, -digits);
+ return '$' + minValue.toFixed(digits);
+ }
+
+ return '$' + fixedResult;
}
return renderNumber(quota);
}
From 821ea34a3c7825dfdb2b727b8f6636a1c9d31556 Mon Sep 17 00:00:00 2001
From: CaIon
Date: Sun, 27 Jul 2025 16:46:34 +0800
Subject: [PATCH 4/4] fix: increase maximum request count limits for user rate
settings
---
web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js b/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
index dad8bd9c..bbdd623e 100644
--- a/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
+++ b/web/src/pages/Setting/RateLimit/SettingsRequestRateLimit.js
@@ -147,7 +147,7 @@ export default function RequestRateLimit(props) {
label={t('用户每周期最多请求次数')}
step={1}
min={0}
- max={100000}
+ max={100000000}
suffix={t('次')}
extraText={t('包括失败请求的次数,0代表不限制')}
field={'ModelRequestRateLimitCount'}
@@ -164,7 +164,7 @@ export default function RequestRateLimit(props) {
label={t('用户每周期最多请求完成次数')}
step={1}
min={1}
- max={100000}
+ max={100000000}
suffix={t('次')}
extraText={t('只包括请求成功的次数')}
field={'ModelRequestRateLimitSuccessCount'}