Wesley Liddick
d3a9f5bb88
Merge pull request #1027 from touwaeriol/feat/ignore-insufficient-balance-errors
...
feat(ops): add ignore insufficient balance errors toggle and extract error constants
v0.1.100
2026-03-15 19:10:18 +08:00
Wesley Liddick
7eb0415a8a
Merge pull request #1028 from IanShaw027/fix/open-issues-cleanup
...
fix: 修复多个issues - Gemini schema 兼容性、批量编辑白名单、Docker 工具支持和限额字段处理Fix/open issues cleanup
2026-03-15 19:09:49 +08:00
erio
bdbc8fa08f
fix(ops): align constant declarations for gofmt compliance
2026-03-15 18:55:14 +08:00
erio
63f3af0f94
fix(ops): match "insufficient account balance" in error filter
...
The upstream Gemini API returns "Insufficient account balance" which
doesn't contain the substring "insufficient balance". Add explicit
match for the full phrase to ensure the filter works correctly.
2026-03-15 18:45:48 +08:00
IanShaw027
686f890fbf
style: 修复 gofmt 格式问题
2026-03-15 18:42:32 +08:00
shaw
220fbe6544
fix: 恢复 UsageProgressBar 中被意外移除的窗口统计数据展示
...
commit 0debe0a8 在修复 OpenAI WS 用量窗口刷新问题时,意外删除了
UsageProgressBar 中的 window stats 渲染逻辑和格式化函数。
恢复进度条上方的统计行(requests, tokens, account cost, user cost)
及对应的 4 个格式化 computed 属性。
2026-03-15 18:29:23 +08:00
shaw
ae44a94325
fix: 重置密码功能新增UI配置发送邮件域名
2026-03-15 17:52:29 +08:00
IanShaw
3718d6dcd4
Merge branch 'Wei-Shaw:main' into fix/open-issues-cleanup
2026-03-15 17:49:20 +08:00
IanShaw027
90b3838173
fix: 移除 Gemini 不支持的 patternProperties 字段 #795
2026-03-15 17:46:58 +08:00
IanShaw027
19d3ecc76f
fix: 修复批量编辑账号时模型白名单显示与实际不一致的问题 #982
...
修复批量编辑账号时,UI 显示的是 plain 模型名(如 GPT-5),但实际落库的是 dated 模型名的问题。
核心改动:
1. 批量编辑白名单不再使用 BulkEditAccountModal.vue 中手写的过期模型列表
- 移除了 allModels 和 presetMappings 的硬编码列表(共 200+ 行)
- 直接复用 ModelWhitelistSelector.vue 组件
2. ModelWhitelistSelector 组件支持多平台联合过滤
- 新增 platforms 属性支持传入多个平台
- 添加 normalizedPlatforms 计算属性统一处理单平台和多平台场景
- availableOptions 根据选中的多个平台动态联合过滤模型列表
- fillRelated 功能支持一次性填充多个平台的相关模型
3. 模型映射预设改为动态生成
- filteredPresets 改用 getPresetMappingsByPlatform 从统一模型源按平台动态生成
- 不再依赖弹窗中的手写预设列表
现在的行为:
- UI 显示什么模型,勾选什么模型,传给后端的就是什么模型
- 彻底解决了批量编辑链路上"显示与实际不一致"的问题
- 模型列表和映射预设始终与系统定义保持同步
2026-03-15 17:46:58 +08:00
IanShaw027
6fba4ebb13
fix: 在 Dockerfile.goreleaser 中添加 pg_dump 和 psql 工具 #1002
...
为了支持容器内的数据库备份和恢复功能,在运行时镜像中添加 PostgreSQL 客户端工具。
变更内容:
- 使用多阶段构建从 postgres:18-alpine 镜像复制 pg_dump 和 psql 二进制文件
- 添加必要的依赖库(libpq, zstd-libs, lz4-libs, krb5-libs, libldap, libedit)
- 升级基础镜像到 alpine:3.21
- 复制 libpq.so.5 共享库以确保工具正常运行
这样可以在运行时容器中直接执行数据库备份和恢复操作,无需访问 Docker socket。
2026-03-15 17:46:58 +08:00
IanShaw027
c31974c913
fix: 兼容部分限额字段为空的情况 #1021
...
修复在填写限额时,如果不填写完整的三个限额额度(日限额、周限额、月限额)就会报错的问题。
变更内容:
- 后端:添加 optionalLimitField 类型处理空值和空字符串,兼容部分限额字段为空的情况
- 前端:添加 normalizeOptionalLimit 函数规范化限额输入,将空值、空字符串和无效数字统一处理为 null
2026-03-15 17:46:58 +08:00
erio
6177fa5dd8
fix(i18n): correct insufficient balance error hint text
...
Remove misleading "upstream" wording - the error is about client API key
user balance, not upstream account balance.
2026-03-15 17:41:51 +08:00
erio
cfe72159d0
feat(ops): add ignore insufficient balance errors toggle and extract error constants
...
- Add 5th error filter switch IgnoreInsufficientBalanceErrors to suppress
upstream insufficient balance / insufficient_quota errors from ops log
- Extract hardcoded error strings into package-level constants for
shouldSkipOpsErrorLog, normalizeOpsErrorType, classifyOpsPhase, and
classifyOpsIsBusinessLimited
- Define ErrNoAvailableAccounts sentinel error and replace all
errors.New("no available accounts") call sites
- Update tests to use require.ErrorIs with the sentinel error
2026-03-15 17:26:18 +08:00
Wesley Liddick
8321e4a647
Merge pull request #1023 from YanzheL/fix/claude-output-effort-logging
...
fix: extract and log Claude output_config.effort in usage records
2026-03-15 16:45:37 +08:00
Wesley Liddick
3084330d0c
Merge pull request #1019 from Ethan0x0000/feat/usage-endpoint-distribution
...
feat: add endpoint metadata and usage endpoint distribution insights
2026-03-15 16:42:03 +08:00
Wesley Liddick
b566649e79
Merge pull request #1025 from touwaeriol/fix/rate-limit-nil-window-reset
...
fix(billing): treat nil rate limit window as expired to prevent usage accumulation
2026-03-15 16:33:14 +08:00
Wesley Liddick
10a6180e4a
Merge pull request #1026 from touwaeriol/fix/group-quota-clear
...
fix(billing): allow clearing group quota limits and treat 0 as zero-limit
2026-03-15 16:33:00 +08:00
Wesley Liddick
cbe9e78977
Merge pull request #1007 from StarryKira/fix/streaming-failover-corruption
...
fix(gateway): 防止流式 failover 拼接腐化导致客户端收到双 message_start fix issue #991
2026-03-15 16:29:31 +08:00
Wesley Liddick
74145b1f39
Merge pull request #1017 from SsageParuders/fix/bedrock-account-quota
...
fix: Bedrock 账户配额限制不生效
2026-03-15 16:28:42 +08:00
Elysia
359e56751b
增加测试
2026-03-15 16:21:49 +08:00
erio
5899784aa4
fix(billing): allow clearing group quota limits and treat 0 as zero-limit
...
Previously, v-model.number produced "" when input was cleared, causing
JSON decode errors on the backend. Also, normalizeLimit treated 0 as
"unlimited" which prevented setting a zero quota. Now "" is converted
to null (unlimited) in frontend, and 0 is preserved as a valid limit.
Closes Wei-Shaw/sub2api#1021
2026-03-15 16:15:15 +08:00
erio
9e8959c56d
fix(billing): treat nil rate limit window as expired to prevent usage accumulation
...
When Redis cache is populated from DB with a NULL window_1d_start, the
Lua increment script only updates usage counters without setting window
timestamps. IsWindowExpired(nil) previously returned false, so the
accumulated usage was never reset across time windows, effectively
turning usage_1d into a lifetime counter. Once this exceeded
rate_limit_1d the key was incorrectly blocked with "日限额已用完".
Fixes Wei-Shaw/sub2api#1022
2026-03-15 14:04:13 +08:00
YanzheL
1bff2292a6
fix: extract and log Claude output_config.effort in usage records
...
Claude's output_config.effort parameter (low/medium/high/max) was not
being extracted from requests or logged in the reasoning_effort column
of usage logs. Only the OpenAI path populated this field.
Changes:
- Extract output_config.effort in ParseGatewayRequest
- Add ReasoningEffort field to ForwardResult
- Populate reasoning_effort in both RecordUsage and RecordUsageWithLongContext
- Guard against overwriting service-set effort values in handler
- Update stale comments that described reasoning_effort as OpenAI-only
- Add unit tests for extraction, normalization, and persistence
2026-03-15 12:55:37 +08:00
Ethan0x0000
cf9247754e
test: fix usage repo stubs for unit builds
2026-03-15 12:51:34 +08:00
Ethan0x0000
eefab15958
feat: 完善使用记录端点可观测性与分布统计
...
将入站、上游与路径三类端点分布统一到使用记录页的一致化卡片交互中,并补齐端点元数据与统计链路,提升排障与流量分析效率。
2026-03-15 11:26:42 +08:00
Elysia
0e23732631
fix(gateway): 防止流式 failover 拼接腐化导致客户端收到双 message_start
...
当上游在 SSE 流中途返回 event:error 时,handleStreamingResponse 已将
部分 SSE 事件写入客户端,但原先的 failover 逻辑仍会切换到下一个账号
并写入完整流,导致客户端收到两个 message_start 进而产生 400 错误。
修复方案:在每次 Forward 调用前记录 c.Writer.Size(),若 Forward 返回
UpstreamFailoverError 后 writer 字节数增加,说明 SSE 内容已不可撤销地
发送给客户端,此时直接调用 handleFailoverExhausted 发送 SSE error 事件
终止流,而非继续 failover。
Ping-only 场景不受影响:slot 等待期的 ping 字节在 Forward 前后相等,
正常 failover 流程照常进行。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-14 22:49:23 +08:00
SsageParuders
37c044fb4b
fix: Bedrock 账户配额限制不生效,配额计数器始终为 $0.00
...
applyUsageBillingEffects() 中配额更新条件仅检查了 AccountTypeAPIKey,
遗漏了 AccountTypeBedrock,导致 Bedrock 账户的配额计数器永远不递增。
扩展条件以同时支持 APIKey 和 Bedrock 类型。
同时在前端账户筛选下拉框中添加 AWS Bedrock 选项。
2026-03-14 22:47:44 +08:00
shaw
6da5fa01b9
fix(frontend): 修复运维设置对话框保存按钮始终禁用的问题
...
后端默认 alert.enabled=true 但 recipients 为空,前端验证将其视为
错误并阻断保存按钮。移除该阻断性验证,改为保存时自动禁用无收件人
的邮件通知配置。
v0.1.99
2026-03-14 20:39:29 +08:00
shaw
616930f9d3
refactor(frontend): 将备份和数据管理页面合并为设置页的标签页
...
将独立的 /admin/backup 和 /admin/data-management 页面整合到设置页,
作为「备份」和「Sora 存储」标签页,减少侧边栏条目,集中管理配置。
- 移除 BackupView 和 DataManagementView 的 AppLayout 包装
- 在 SettingsView 中以子组件形式嵌入,使用 v-show 切换标签
- 删除独立路由和侧边栏菜单入口
- 备份/数据标签页下隐藏主保存按钮(各自有独立保存)
- 优化标签栏样式适配7个标签,PC端支持细滚动条
- 清理未使用的图标组件和 i18n 键
2026-03-14 20:22:39 +08:00
Wesley Liddick
b9c31fa7c4
Merge pull request #999 from InCerryGit/fix/enc_coot
...
fix: handle invalid encrypted content error and retry logic.
2026-03-14 19:29:07 +08:00
Wesley Liddick
17b339972c
Merge pull request #1000 from touwaeriol/fix/ops-agg-tuning
...
fix(ops): tune aggregation constants to prevent PG overload
2026-03-14 19:03:03 +08:00
shaw
39f8bd91b9
fix: remove unused saveRecords method to pass lint
2026-03-14 19:01:27 +08:00
Wesley Liddick
aa4e37d085
Merge pull request #966 from GuangYiDing/feat/db-backup-restore
...
feat: 数据库定时备份与恢复(S3 兼容存储,支持 Cloudflare R2)
2026-03-14 18:58:56 +08:00
erio
f59b66b7d4
fix(ops): tune aggregation constants to prevent PG overload
...
Increase MAX(bucket_start) query timeout from 3s to 5s to reduce
timeout-induced fallbacks. Shrink backfill window from 30 days to
1 hour so that fallback recomputation stays lightweight instead of
scanning the entire retention range.
2026-03-14 18:47:37 +08:00
InCerry
8f0ea7a02d
Merge branch 'main' into fix/enc_coot
2026-03-14 18:46:33 +08:00
Wesley Liddick
a1dc00890e
Merge pull request #944 from miraserver/feat/backend-mode
...
feat: add Backend Mode toggle to disable user self-service
2026-03-14 17:53:54 +08:00
Wesley Liddick
dfbcc363d1
Merge pull request #969 from wucm667/feat/quota-fixed-reset-mode
...
feat: 账号配额支持固定时间重置模式
2026-03-14 17:52:56 +08:00
Rose Ding
1047f973d5
fix: 按 review 意见重构数据库备份服务(安全性 + 架构 + 健壮性)
...
1. S3 凭证加密存储:使用 SecretEncryptor (AES-256-GCM) 加密 SecretAccessKey,
防止备份文件中泄露 S3 凭证,兼容旧的未加密数据
2. 修复 saveRecord 竞态条件:添加 recordsMu 互斥锁保护 records 的 load/save
3. 恢复操作增加服务端验证:handler 层要求重新输入管理员密码,通过 bcrypt
校验,前端弹出密码输入框
4. pg_dump/psql/S3 操作抽象为接口:定义 DBDumper 和 BackupObjectStore 接口,
实现放入 repository 层,遵循项目依赖注入架构规范
5. 改为流式处理避免大数据库 OOM:备份时 pg_dump stdout -> gzip -> io.Pipe ->
S3 upload;恢复时 S3 download -> gzip reader -> psql stdin,不再全量加载
6. loadRecords 区分"无数据"和"数据损坏"场景:JSON 解析失败返回明确错误
7. 添加 18 个核心逻辑单元测试:覆盖加密、并发、流式备份/恢复、错误处理等
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-14 17:48:21 +08:00
Wesley Liddick
e32977dd73
Merge pull request #997 from SsageParuders/refactor/bedrock-channel-merge
...
refactor: merge bedrock-apikey into unified bedrock channel with auth_mode
2026-03-14 17:48:01 +08:00
wucm667
b5f78ec1e8
feat: 实现固定时间重置模式的 SQL 表达式,并添加相关单元测试
2026-03-14 17:37:34 +08:00
SsageParuders
e0f290fdc8
style: fix gofmt formatting for account type constants
2026-03-14 17:32:53 +08:00
Wesley Liddick
fc00a4e3b2
Merge pull request #959 from touwaeriol/feat/antigravity-403-detection
...
feat(antigravity): add 403 forbidden status detection and display
2026-03-14 17:23:22 +08:00
Wesley Liddick
db1f6ded88
Merge pull request #961 from 0xObjc/codex/ops-openai-token-visibility
...
feat(ops): make OpenAI token stats optional
2026-03-14 17:23:01 +08:00
SsageParuders
4644af2ccc
refactor: merge bedrock-apikey into bedrock with auth_mode credential
...
Consolidate two separate channel types (bedrock + bedrock-apikey) into
a single "AWS Bedrock" channel. Authentication mode is now distinguished
by credentials.auth_mode ("sigv4" | "apikey") instead of separate types.
Backend:
- Remove AccountTypeBedrockAPIKey constant
- IsBedrock() simplified; IsBedrockAPIKey() checks auth_mode
- Add IsAPIKeyOrBedrock() helper to eliminate repeated type checks
- Extend pool mode, quota scheduling, and billing to bedrock
- Add RetryableOnSameAccount to handleBedrockUpstreamErrors
- Add "bedrock" scope to Beta Policy for independent control
Frontend:
- Merge two buttons into one "AWS Bedrock" with auth mode radio
- Badge displays "Anthropic | AWS"
- Pool mode and quota limit UI available for bedrock
- Quota display in account list (usage bars, capacity badges, reset)
- Remove all bedrock-apikey type references
2026-03-14 17:13:30 +08:00
Wesley Liddick
2e3e8687e1
Merge pull request #993 from xvhuan/fix/codex-responses-id-prefix-hotfix-20260314
...
fix: 止血 Codex/Responses 原生 input id 被误改成 fc_*
v0.1.98
2026-03-14 13:54:26 +08:00
ius
ca42a45802
fix: stop rewriting native responses input ids
2026-03-14 13:47:01 +08:00
Wesley Liddick
9350ecb62b
Merge pull request #987 from Ethan0x0000/feat-chatcompletions2repsonses-fix
...
fix: chat compatibility model fallback and reasoning_content output
2026-03-14 13:41:47 +08:00
Wesley Liddick
a4a026e8da
Merge pull request #990 from LvyuanW/admin-openai-available-models-fix
...
fix: respect OpenAI OAuth model mapping in admin available models
2026-03-14 13:33:18 +08:00
Wesley Liddick
342fd03e72
Merge pull request #986 from LvyuanW/openai-model-mapping-fix
...
fix: honor account model mapping before group fallback
2026-03-14 13:32:26 +08:00