bayma888
be7bc658fc
fix(test): add IncrementQuotaUsed to all APIKeyRepository test stubs
...
- Add missing IncrementQuotaUsed method to stubApiKeyRepo in api_contract_test.go
- Fix gofmt formatting issues in api_key_service.go, dto/types.go, api_key_handler.go
2026-02-03 20:49:58 +08:00
bayma888
e59e3a9f00
fix(test): add IncrementQuotaUsed to all APIKeyRepository test stubs
...
Add the missing IncrementQuotaUsed method to:
- fakeAPIKeyRepo (api_key_auth_google_test.go)
- stubApiKeyRepo (api_key_auth_test.go)
- apiKeyRepoStub (api_key_service_delete_test.go)
- authRepoStub (api_key_service_cache_test.go)
2026-02-03 20:00:43 +08:00
bayma888
6146be1474
feat(api-key): add independent quota and expiration support
...
This feature allows API Keys to have their own quota limits and expiration
times, independent of the user's balance.
Backend:
- Add quota, quota_used, expires_at fields to api_key schema
- Implement IsExpired() and IsQuotaExhausted() checks in middleware
- Add ResetQuota and ClearExpiration API endpoints
- Integrate quota billing in gateway handlers (OpenAI, Anthropic, Gemini)
- Include quota/expiration fields in auth cache for performance
- Expiration check returns 403, quota exhausted returns 429
Frontend:
- Add quota and expiration inputs to key create/edit dialog
- Add quick-select buttons for expiration (+7, +30, +90 days)
- Add reset quota confirmation dialog
- Add expires_at column to keys list
- Add i18n translations for new features (en/zh)
Migration:
- Add 045_add_api_key_quota.sql for new columns
2026-02-03 19:49:31 +08:00
Wesley Liddick
bb3df5785a
Merge pull request #322 from xlx0852/main
...
fix: 混合渠道警告确认框和过滤 prompt_cache_retention 参数
2026-02-03 15:13:10 +08:00
Wesley Liddick
6e54eda41f
Merge pull request #464 from touwaeriol/pr/antigravity-scope-ratelimit
...
feat(antigravity): 支持按配额域(scope)级别限流
2026-02-03 15:02:15 +08:00
Wesley Liddick
df4c0adf0b
Merge pull request #463 from DuckyProject/feat/usage-records-codex-reasoning-effort
...
feat(usage): add reasoning effort column
2026-02-03 14:57:45 +08:00
Wesley Liddick
7cbe4afdb8
Merge pull request #462 from touwaeriol/pr/antigravity-gemini-mapping
...
feat(antigravity): map all gemini-2.5 to gemini-3 series
2026-02-03 14:55:45 +08:00
Wesley Liddick
16f150caae
Merge pull request #459 from IanShaw027/fix/gemini-error
...
fix(gemini): 为 Gemini 工具调用添加 thoughtSignature 避免 INVALID_ARGUMENT 错误
2026-02-03 14:48:50 +08:00
Wesley Liddick
7229b41fc7
Merge pull request #420 from shuike/feat-invitation-code
...
feat: 增加邀请码注册功能
2026-02-03 14:44:15 +08:00
ducky
53ee6383db
feat(usage): add reasoning effort column
2026-02-03 14:36:29 +08:00
Wesley Liddick
a09478f374
Merge pull request #316 from cyhhao/fix/claude-oauth-compat
...
fix(网关): 完善 Claude OAuth/Claude Code 兼容
2026-02-03 14:26:19 +08:00
liuxiongfeng
6e8eff9bb9
feat(ops): 运维界面展示 Antigravity 账号 scope 级别限流统计
...
在运维监控的并发/排队卡片中,为 Antigravity 平台账号显示各 scope
(claude/gemini_text/gemini_image) 的限流数量统计,便于管理员了解
哪些 scope 正在被限流。
Cherry-picked from slovx2/sub2api: 08d6dc52
2026-02-03 14:25:30 +08:00
liuxiongfeng
56949a58bc
feat(antigravity): 默认开启按配额域限流,避免整个账号被锁定
...
将 GATEWAY_ANTIGRAVITY_429_SCOPE_LIMIT 的默认值从关闭改为开启。
当 Gemini 模型触发 429 限流时,只会限制对应的配额域(gemini_text),
而 Claude 和 gemini_image 仍可继续使用,提高账号利用率。
2026-02-03 14:25:30 +08:00
liuxiongfeng
7d256879c5
feat(antigravity): map all gemini-2.5 to gemini-3 series
...
Antigravity 上游不再支持 gemini-2.5 系列,统一映射到 gemini-3:
- gemini-2.5-flash → gemini-3-flash
- gemini-2.5-flash-lite → gemini-3-flash
- gemini-2.5-flash-thinking → gemini-3-flash
- gemini-2.5-flash-image → gemini-3-pro-image
- gemini-2.5-pro → gemini-3-pro-high
- gemini-2.5-pro-preview → gemini-3-pro-high
- gemini-2.5-pro-exp → gemini-3-pro-high
2026-02-03 14:23:47 +08:00
liuxiongfeng
f9512fda58
test: update gemini-2.5-pro mapping test case
...
Update test expectation to reflect new mapping:
gemini-2.5-pro -> gemini-3-pro-high
2026-02-03 14:23:47 +08:00
liuxiongfeng
beb63cb152
feat(antigravity): map gemini-2.5-pro to gemini-3-pro-high
...
Add prefix mapping rules for gemini-2.5-pro variants:
- gemini-2.5-pro -> gemini-3-pro-high
- gemini-2.5-pro-preview -> gemini-3-pro-high
- gemini-2.5-pro-exp -> gemini-3-pro-high
2026-02-03 14:23:47 +08:00
shuike
6c86501d11
feat: 增加邀请码注册功能
2026-02-03 13:38:44 +08:00
Wesley Liddick
2f92b06869
Merge pull request #457 from touwaeriol/pr/group-copy-accounts
...
feat(groups): 添加从其他分组复制账号功能
2026-02-03 08:45:13 +08:00
ianshaw
03e94f9f53
fix(gemini): 为 Gemini 工具调用添加 thoughtSignature 避免 INVALID_ARGUMENT 错误
2026-02-03 06:01:29 +08:00
liuxiongfeng
ce1d2904c7
test: 为测试 stub 添加缺失的 GroupRepository 接口方法
...
新增 BindAccountsToGroup 和 GetAccountIDsByGroupIDs 方法的 stub 实现,
确保测试文件中的 mock 类型满足 GroupRepository 接口要求。
2026-02-02 22:06:37 +08:00
liuxiongfeng
e1a4a7b8c0
feat(groups): 添加从其他分组复制账号功能
...
- 创建分组时可选择从已有分组复制账号
- 编辑分组时支持同步账号(全量替换操作)
- 仅允许选择相同平台的源分组
- 添加完整的数据校验:去重、自引用检查、平台一致性检查
- 前端支持多选源分组,带提示说明操作行为
2026-02-02 21:47:47 +08:00
liuxiongfeng
b381e8ee73
refactor(billing): 简化 CalculateCostWithLongContext 逻辑
...
将 token 直接拆分为范围内和范围外两部分,分别调用 CalculateCost:
- 范围内:正常计费 (rateMultiplier)
- 范围外:双倍计费 (rateMultiplier × extraMultiplier)
代码更直观,便于理解和维护
2026-02-02 21:47:02 +08:00
liuxiongfeng
45e1429ae8
feat(billing): 添加 Gemini 200K 长上下文双倍计费功能
...
- 新增 CalculateCostWithLongContext 方法支持阈值双倍计费
- 新增 RecordUsageWithLongContext 方法专用于 Gemini 计费
- Gemini 超过 200K token 的部分按 2 倍费率计算
- 其他平台(Claude/OpenAI)完全不受影响
2026-02-02 21:47:02 +08:00
Wesley Liddick
325ed747d8
Merge pull request #455 from ZeroClover/feat/ops-ignore-invalid-api-key-errors
...
feat(ops): 支持过滤无效 API Key 错误,不写入错误日志
2026-02-02 20:28:00 +08:00
Zero Clover
ad1cdba338
feat(ops): 支持过滤无效 API Key 错误,不写入错误日志
...
新增 IgnoreInvalidApiKeyErrors 开关,启用后 INVALID_API_KEY 和
API_KEY_REQUIRED 错误将被完全跳过,不写入 Ops 错误日志。
这些错误由用户错误配置导致,与服务质量无关。
2026-02-02 20:16:17 +08:00
shaw
79fa18132b
fix(gateway): 修复 OAuth token 刷新后调度器缓存不一致问题
...
Token 刷新成功后,调度器缓存中的 Account 对象仍包含旧的 credentials,
导致在 Outbox 异步更新之前(最多 1 秒窗口)请求使用过期 token,
返回 403 错误(OAuth token has been revoked)。
修复方案:在 token 刷新成功后同步更新调度器缓存,确保调度获取的
Account 对象立即包含最新的 access_token 和 _token_version。
此修复覆盖所有 OAuth 平台:OpenAI、Claude、Gemini、Antigravity。
2026-02-02 20:05:37 +08:00
Wesley Liddick
cc7e67b01a
Merge pull request #445 from touwaeriol/fix/gemini-cache-token-billing
...
fix(billing): 修复 Gemini 接口缓存 token 统计
2026-02-02 15:22:46 +08:00
liuxiongfeng
4bfeeecb05
fix(billing): 修复 Gemini 接口缓存 token 统计
...
extractGeminiUsage 函数未提取 cachedContentTokenCount,
导致计费时缓存读取 token 始终为 0。
修复:
- 提取 usageMetadata.cachedContentTokenCount
- 设置 CacheReadInputTokens 字段
- InputTokens 减去缓存 token(与 response_transformer 逻辑一致)
2026-02-02 14:01:17 +08:00
liuxiongfeng
bbc7b4aeed
feat(gateway): Gemini API Key 账户跳过模型映射检查,直接透传
...
Gemini API Key 账户通常代理上游服务,模型支持由上游判断,
本地不需要预先配置模型映射。
2026-02-02 13:40:29 +08:00
cyhhao
adb77af1d9
fix: satisfy golangci-lint (nil checks, remove unused helpers)
2026-01-31 02:07:57 +08:00
cyhhao
3a34746668
refactor: stop rewriting tool descriptions; keep only system sentence rewrite
2026-01-31 02:01:51 +08:00
cyhhao
fe17058700
refactor: limit OpenCode keyword replacement to tool descriptions
2026-01-31 01:40:38 +08:00
ducky
9bee0a2071
chore: gofmt for golangci-lint
2026-01-30 17:28:53 +08:00
ducky
b7f69844e1
feat(announcements): add admin/user announcement system
...
Implements announcements end-to-end (admin CRUD + read status, user list + mark read) with OR-of-AND targeting. Also breaks the ent<->service import cycle by moving schema-facing constants/targeting into a new domain package.
2026-01-30 16:45:04 +08:00
cyhhao
fa454b1b99
fix: align Claude Code system banner with opencode latest
2026-01-29 15:37:07 +08:00
cyhhao
8375094c69
fix(oauth): match Claude CLI accept header and beta set
2026-01-29 15:31:29 +08:00
cyhhao
91079d3f15
chore(debug): emit Claude mimic fingerprint on credential-scope error
2026-01-29 15:17:46 +08:00
cyhhao
63412a9fcc
chore(debug): log Claude mimic fingerprint
2026-01-29 03:13:14 +08:00
cyhhao
d98648f03b
fix: rewrite OpenCode identity sentence to Claude Code
2026-01-29 03:03:40 +08:00
cyhhao
c37fe91672
fix(oauth): update Claude CLI fingerprint headers
2026-01-29 02:52:26 +08:00
cyhhao
4d40fb6b60
fix(oauth): merge anthropic-beta and force Claude Code headers in mimic mode
2026-01-29 02:36:28 +08:00
cyhhao
be3b788b8f
fix: also prefix next system block with Claude Code banner
2026-01-29 02:03:54 +08:00
cyhhao
723e54013a
fix(oauth): mimic Claude Code metadata and beta headers
2026-01-29 01:49:51 +08:00
cyhhao
4d566f68b6
chore: gofmt
2026-01-29 01:34:58 +08:00
cyhhao
31f817d189
fix: add newline separation for Claude Code system prompt
2026-01-29 01:28:43 +08:00
cyhhao
59231668c5
Merge branch 'main' of github.com:Wei-Shaw/sub2api
2026-01-29 01:16:36 +08:00
shaw
cadca752c4
修复SSE流式响应中usage数据被覆盖的问题
2026-01-28 18:36:21 +08:00
Wesley Liddick
edf215e6fd
Merge pull request #409 from DuckyProject/feat/purchase-subscription-iframe
...
feat(purchase): 增加购买订阅 iframe 页面与配置
2026-01-28 17:28:47 +08:00
ducky
04a509d45e
feat(purchase): 增加购买订阅 iframe 页面与配置
...
- 新增 /purchase 页面(iframe + 新窗口兜底)
- 管理员系统设置可配置开关与URL
- 非 simple mode 才在侧边栏展示入口
2026-01-28 13:54:32 +08:00
Wesley Liddick
269a659200
Merge pull request #406 from geminiwen/main
...
fix(openai-oauth): 改进错误处理和代理支持
2026-01-28 13:53:44 +08:00