From e13459f3a169f0d7157efd26c07ddd0b9cc2656c Mon Sep 17 00:00:00 2001 From: xiangsx <1984871009@qq.com> Date: Mon, 5 Jan 2026 22:44:11 +0800 Subject: [PATCH 1/4] feat: add regex pattern to mask API keys in sensitive information --- common/str.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/str.go b/common/str.go index a5ac5d447..4f0e81466 100644 --- a/common/str.go +++ b/common/str.go @@ -16,6 +16,8 @@ var ( maskURLPattern = regexp.MustCompile(`(http|https)://[^\s/$.?#].[^\s]*`) maskDomainPattern = regexp.MustCompile(`\b(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}\b`) maskIPPattern = regexp.MustCompile(`\b(?:\d{1,3}\.){3}\d{1,3}\b`) + // maskApiKeyPattern matches patterns like 'api_key:xxx' or "api_key:xxx" to mask the API key value + maskApiKeyPattern = regexp.MustCompile(`(['"]?)api_key:([^\s'"]+)(['"]?)`) ) func GetStringIfEmpty(str string, defaultValue string) string { @@ -235,5 +237,8 @@ func MaskSensitiveInfo(str string) string { // Mask IP addresses str = maskIPPattern.ReplaceAllString(str, "***.***.***.***") + // Mask API keys (e.g., "api_key:AIzaSyAAAaUooTUni8AdaOkSRMda30n_Q4vrV70" -> "api_key:***") + str = maskApiKeyPattern.ReplaceAllString(str, "${1}api_key:***${3}") + return str } From aed1900364e002d7614e5c068b070d6e8f751c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E4=BC=AF=E6=B6=9B?= <351175318@qq.com> Date: Mon, 5 Jan 2026 22:57:26 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix(task):=20=E4=BF=AE=E5=A4=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20auto=20=E5=88=86=E7=BB=84=E6=97=B6=20Task=20Relay?= =?UTF-8?q?=20=E4=B8=8D=E8=AE=B0=E5=BD=95=E6=97=A5=E5=BF=97=E5=92=8C?= =?UTF-8?q?=E4=B8=8D=E6=89=A3=E8=B4=B9=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: - 使用 auto 分组的令牌调用 /v1/videos 等 Task 接口时,虽然任务能成功创建, 但使用日志不显示记录,且不会扣费 根本原因: - Distribute 中间件在选择渠道后,会将实际选中的分组存储在 ContextKeyAutoGroup 中 - 但 RelayTaskSubmit 函数没有从 context 中读取这个值来更新 info.UsingGroup - 导致 info.UsingGroup 始终是 "auto" 而不是实际选中的分组(如 "sora2逆") - 当 auto 分组的倍率配置为 0 时,quota 计算结果为 0 - 日志记录条件 "if quota != 0" 不满足,导致日志不记录、不扣费 修复方案: - 在 RelayTaskSubmit 函数中计算分组倍率之前,添加从 ContextKeyAutoGroup 获取实际分组的逻辑 - 使用安全的类型断言,避免潜在的 panic 风险 影响范围: - 仅影响 Task Relay 流程(/v1/videos, /suno, /kling 等接口) - 不影响使用具体分组令牌的调用 - 不影响其他 Relay 类型(chat/completions 等已有类似处理逻辑) --- relay/relay_task.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/relay/relay_task.go b/relay/relay_task.go index 04a905c7f..61588f93b 100644 --- a/relay/relay_task.go +++ b/relay/relay_task.go @@ -150,6 +150,14 @@ func RelayTaskSubmit(c *gin.Context, info *relaycommon.RelayInfo) (taskErr *dto. } } + // 处理 auto 分组:从 context 获取实际选中的分组 + // 当使用 auto 分组时,Distribute 中间件会将实际选中的分组存储在 ContextKeyAutoGroup 中 + if autoGroup, exists := common.GetContextKey(c, constant.ContextKeyAutoGroup); exists { + if groupStr, ok := autoGroup.(string); ok && groupStr != "" { + info.UsingGroup = groupStr + } + } + // 预扣 groupRatio := ratio_setting.GetGroupRatio(info.UsingGroup) var ratio float64 From 1ab0c35540e708a255ae1601124088f01acb2d44 Mon Sep 17 00:00:00 2001 From: Xyfacai Date: Tue, 6 Jan 2026 21:47:12 +0800 Subject: [PATCH 3/4] Merge pull request #2590 from xyfacai/fix/max-body-limit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: 设置默认max req body 为128MB --- common/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/init.go b/common/init.go index ce121b3be..0789f8cc2 100644 --- a/common/init.go +++ b/common/init.go @@ -118,7 +118,7 @@ func initConstantEnv() { constant.MaxFileDownloadMB = GetEnvOrDefault("MAX_FILE_DOWNLOAD_MB", 64) constant.StreamScannerMaxBufferMB = GetEnvOrDefault("STREAM_SCANNER_MAX_BUFFER_MB", 64) // MaxRequestBodyMB 请求体最大大小(解压后),用于防止超大请求/zip bomb导致内存暴涨 - constant.MaxRequestBodyMB = GetEnvOrDefault("MAX_REQUEST_BODY_MB", 64) + constant.MaxRequestBodyMB = GetEnvOrDefault("MAX_REQUEST_BODY_MB", 128) // ForceStreamOption 覆盖请求参数,强制返回usage信息 constant.ForceStreamOption = GetEnvOrDefaultBool("FORCE_STREAM_OPTION", true) constant.CountToken = GetEnvOrDefaultBool("CountToken", true) From 93012631d1a8203a5f3b518aae41f8522a3a31fb Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 7 Jan 2026 20:52:13 +0800 Subject: [PATCH 4/4] docs: update readme --- README.en.md | 8 +++++--- README.fr.md | 8 +++++--- README.ja.md | 8 +++++--- README.md | 8 +++++--- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/README.en.md b/README.en.md index e222f4451..ff8340dd9 100644 --- a/README.en.md +++ b/README.en.md @@ -213,9 +213,11 @@ docker run --name new-api -d --restart always \ - 🚦 User-level model rate limiting **Format Conversion:** -- 🔄 OpenAI ⇄ Claude Messages -- 🔄 OpenAI ⇄ Gemini Chat -- 🔄 Thinking-to-content functionality +- 🔄 **OpenAI Compatible ⇄ Claude Messages** +- 🔄 **OpenAI Compatible → Google Gemini** +- 🔄 **Google Gemini → OpenAI Compatible** - Text only, function calling not supported yet +- 🚧 **OpenAI Compatible ⇄ OpenAI Responses** - In development +- 🔄 **Thinking-to-content functionality** **Reasoning Effort Support:** diff --git a/README.fr.md b/README.fr.md index 76d8e6ffe..89e60d8c4 100644 --- a/README.fr.md +++ b/README.fr.md @@ -212,9 +212,11 @@ docker run --name new-api -d --restart always \ - 🚦 Limitation du débit du modèle pour les utilisateurs **Conversion de format:** -- 🔄 OpenAI ⇄ Claude Messages -- 🔄 OpenAI ⇄ Gemini Chat -- 🔄 Fonctionnalité de la pensée au contenu +- 🔄 **OpenAI Compatible ⇄ Claude Messages** +- 🔄 **OpenAI Compatible → Google Gemini** +- 🔄 **Google Gemini → OpenAI Compatible** - Texte uniquement, les appels de fonction ne sont pas encore pris en charge +- 🚧 **OpenAI Compatible ⇄ OpenAI Responses** - En développement +- 🔄 **Fonctionnalité de la pensée au contenu** **Prise en charge de l'effort de raisonnement:** diff --git a/README.ja.md b/README.ja.md index c8a27dec0..426af9c1e 100644 --- a/README.ja.md +++ b/README.ja.md @@ -218,9 +218,11 @@ docker run --name new-api -d --restart always \ - 🚦 ユーザーレベルモデルレート制限 **フォーマット変換:** -- 🔄 OpenAI ⇄ Claude Messages -- 🔄 OpenAI ⇄ Gemini Chat -- 🔄 思考からコンテンツへの機能 +- 🔄 **OpenAI Compatible ⇄ Claude Messages** +- 🔄 **OpenAI Compatible → Google Gemini** +- 🔄 **Google Gemini → OpenAI Compatible** - テキストのみ、関数呼び出しはまだサポートされていません +- 🚧 **OpenAI Compatible ⇄ OpenAI Responses** - 開発中 +- 🔄 **思考からコンテンツへの機能** **Reasoning Effort サポート:** diff --git a/README.md b/README.md index 22559fc4a..5d5548fe7 100644 --- a/README.md +++ b/README.md @@ -214,9 +214,11 @@ docker run --name new-api -d --restart always \ - 🚦 用户级别模型限流 **格式转换:** -- 🔄 OpenAI ⇄ Claude Messages -- 🔄 OpenAI ⇄ Gemini Chat -- 🔄 思考转内容功能 +- 🔄 **OpenAI Compatible ⇄ Claude Messages** +- 🔄 **OpenAI Compatible → Google Gemini** +- 🔄 **Google Gemini → OpenAI Compatible** - 仅支持文本,暂不支持函数调用 +- 🚧 **OpenAI Compatible ⇄ OpenAI Responses** - 开发中 +- 🔄 **思考转内容功能** **Reasoning Effort 支持:**