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'}