yangjianbo
f6ca701917
fix(oauth): SessionStore.Stop() 添加 sync.Once 防重入保护 (P1-05)
...
oauth 和 openai 包的 SessionStore.Stop() 直接调用 close(stopCh),
重复调用会导致 panic。使用 sync.Once 包裹确保幂等安全。
新增单元测试覆盖连续调用和 50 goroutine 并发调用场景。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-07 17:39:18 +08:00
yangjianbo
a84604dceb
fix(config): 禁止 server.frontend_url 携带 query/userinfo
2026-02-07 17:37:08 +08:00
shaw
da9546ba24
fix(ui): widen CreateAccountModal to fix platform selector overflow
2026-02-07 17:25:52 +08:00
yangjianbo
e75d3e3584
fix(security): 修复密码重置链接 Host Header 注入漏洞 (P0-07)
...
ForgotPassword 原来从 c.Request.Host 构建重置链接基础 URL,攻击者
可伪造 Host 头将重置链接指向恶意域名窃取 token。
修复方案:
- ServerConfig 新增 frontend_url 配置项
- auth_handler 改为从配置读取前端 URL,未配置时拒绝请求
- Validate() 校验 frontend_url 必须为绝对 HTTP(S) URL
- 新增 TestValidateServerFrontendURL 单元测试
- config.example.yaml 添加配置说明
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-07 17:15:26 +08:00
shaw
1439eb39a9
fix(gateway): harden digest logging and align antigravity ops
...
- avoid panic by using safe UUID prefix truncation in Gemini digest fallback logs\n- remove unconditional Antigravity 429 full-body debug logs and honor log truncation config\n- align Antigravity quick preset mappings to opus 4.6-thinking targets only\n- restore scope rate-limit aggregation/output in ops availability stats
2026-02-07 17:12:15 +08:00
yangjianbo
8226a4ce4d
perf(service): 优化 model 替换函数,用 gjson/sjson 替代全量 JSON 序列化
...
SSE 热路径中 replaceModelInSSELine 和 replaceModelInResponseBody 原来
使用 json.Unmarshal/Marshal 对每个事件做全量反序列化再序列化,现改为
gjson.Get/sjson.Set 精确字段操作,消除 O(n) 中间 map 分配,保持 JSON
字段顺序不变。涉及 OpenAIGatewayService 和 GatewayService 两个服务。
新增 23 个单元测试覆盖:顶层/嵌套 model 替换、不匹配跳过、空行/[DONE]/
非法 JSON 等边界情况。
Fixes: P1-08
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-07 17:09:55 +08:00
erio
e1a68497d6
refactor: simplify sticky session rate limit handling — switch immediately on any rate limit
...
Remove threshold-based waiting in both sticky session and antigravity
pre-check paths. When a model is rate-limited, immediately clear the
sticky session and switch accounts instead of waiting for short durations.
2026-02-07 17:06:49 +08:00
Wesley Liddick
c4615a1224
Merge pull request #509 from touwaeriol/pr/antigravity-full
...
feat(antigravity): comprehensive enhancements - model mapping, rate limiting, scheduling & ops
2026-02-07 16:44:28 +08:00
yangjianbo
65c0d8b51f
fix(middleware): 管理员JWT增加TokenVersion校验
...
管理员改密后旧JWT会被拒绝,并补充单元测试覆盖。
2026-02-07 16:34:57 +08:00
yangjianbo
a9e256ce8c
fix(openai): 修复 usage 为空导致 panic(P0-02)
2026-02-07 16:15:30 +08:00
erio
fa28dcbf32
fix(test): update test calls to match method receivers on handleSmartRetry and antigravityRetryLoop
2026-02-07 16:05:09 +08:00
erio
2656320d04
fix(antigravity): fetch default mapping from API and sync Redis on rate limit
...
1. Frontend: replace hardcoded antigravityDefaultMappings with async
fetch from GET /admin/accounts/antigravity/default-model-mapping,
eliminating the duplicate data source that caused frontend/backend
mapping inconsistency.
2. Backend: convert handleSmartRetry and antigravityRetryLoop from
standalone functions to AntigravityGatewayService methods, enabling
Redis cache sync (updateAccountModelRateLimitInCache) after both
rate-limit write paths — long-delay branch and retry-exhausted branch.
2026-02-07 15:59:27 +08:00
yangjianbo
7e1674e43a
chore(version): 更新版本号至 0.1.70.2
2026-02-07 14:58:52 +08:00
yangjianbo
fc104dfb56
feat:增加端口
2026-02-07 14:57:50 +08:00
shaw
5d4327eb14
fix: 前端codex教程里模型ID升级为gpt-5.3-codex
2026-02-07 14:53:53 +08:00
erio
b4f6c4f9d5
style: fix gofmt formatting in gateway_service.go
...
Remove extra blank line that caused golangci-lint gofmt check to fail.
2026-02-07 14:51:20 +08:00
yangjianbo
0e514ed80b
perf(middleware): 优化订阅模式认证中间件,5次串行调用降至2步同步+1步异步
...
- 为 GetActiveSubscription 添加 ristretto L1 缓存 + singleflight 防击穿
- 合并 ValidateSubscription + CheckUsageLimits 为纯内存 ValidateAndCheckLimits
- 窗口维护操作(激活/重置)异步化,不再阻塞首字节
- 缓存返回浅拷贝,避免并发 data race 和缓存污染
- 所有管理操作(分配/续期/撤销/扩展/窗口重置)同步失效 L1 缓存
- 新增 SubscriptionCacheConfig 可配置 L1 缓存大小/TTL/抖动
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-07 14:43:12 +08:00
erio
14c6c9321a
refactor: remove unused IsAntigravityModelSupported function and its tests
2026-02-07 14:42:28 +08:00
erio
386126b1b2
test(antigravity): add missing unit tests for upstream and custom model_mapping
...
- Add GetAccessToken upstream branch tests (success/failure/empty/nil)
- Add mapAntigravityModel wildcard-target-equals-request edge case tests
- Add upstream account smart retry test case
- Add GeminiMessagesCompatService custom model_mapping and empty model tests
2026-02-07 14:39:25 +08:00
erio
de0927289e
fix(antigravity): support upstream accounts and custom model_mapping in scheduling
...
- GetAccessToken: add upstream branch to read api_key from credentials
- shouldTriggerAntigravitySmartRetry: relax check from IsOAuth to Platform-based
- isModelSupportedByAccount/WithContext: replace IsAntigravityModelSupported
whitelist with mapAntigravityModel for unified scheduling/forwarding logic
- mapAntigravityModel: fix edge case where wildcard target equals request model
- Update tests for new behavior and add custom model_mapping test cases
2026-02-07 14:32:08 +08:00
erio
edb0937024
fix: restore non-failover error passthrough from 7b156489
2026-02-07 14:24:55 +08:00
erio
43a4840daf
fix: restore error passthrough service improvements from 7b156489
2026-02-07 14:16:19 +08:00
erio
5e98445b22
feat(antigravity): comprehensive enhancements - model mapping, rate limiting, scheduling & ops
...
Key changes:
- Upgrade model mapping: Opus 4.5 → Opus 4.6-thinking with precise matching
- Unified rate limiting: scope-level → model-level with Redis snapshot sync
- Load-balanced scheduling by call count with smart retry mechanism
- Force cache billing support
- Model identity injection in prompts with leak prevention
- Thinking mode auto-handling (max_tokens/budget_tokens fix)
- Frontend: whitelist mode toggle, model mapping validation, status indicators
- Gemini session fallback with Redis Trie O(L) matching
- Ops: enhanced concurrency monitoring, account availability, retry logic
- Migration scripts: 049-051 for model mapping unification
2026-02-07 12:31:10 +08:00
Wesley Liddick
e617b45ba3
Merge pull request #508 from touwaeriol/pr/format-time-seconds
...
feat(frontend): show seconds in rate limit time display
2026-02-07 12:20:29 +08:00
Wesley Liddick
20283bb55b
Merge pull request #507 from touwaeriol/pr/fix-429-fallback-default
...
fix(antigravity): reduce 429 fallback cooldown from 5min to 30s
2026-02-07 12:19:14 +08:00
Wesley Liddick
515dbf2c78
Merge pull request #506 from touwaeriol/pr/fix-max-tokens-budget
...
fix(antigravity): auto-fix max_tokens <= budget_tokens causing 400 error
2026-02-07 12:18:11 +08:00
Wesley Liddick
2887e280d6
Merge pull request #505 from touwaeriol/pr/gitattributes-lf
...
chore: add .gitattributes to enforce LF line endings
2026-02-07 12:17:43 +08:00
erio
8826705e71
feat(frontend): show seconds in rate limit time display
...
Change formatTime() to include seconds (HH:MM:SS) instead of only
hours and minutes (HH:MM). This gives users more precise information
about when rate limits will reset.
2026-02-07 11:59:27 +08:00
erio
8917afab2a
fix(antigravity): reduce 429 fallback cooldown from 5min to 30s
...
The default fallback cooldown when rate limit reset time cannot be
parsed was 5 minutes, which is too aggressive and causes accounts
to be unnecessarily locked out. Reduce to 30 seconds for faster
recovery. Config override still works (unit remains minutes).
2026-02-07 11:54:00 +08:00
erio
49233ec26a
fix(antigravity): auto-fix max_tokens <= budget_tokens causing 400 error
...
When extended thinking is enabled, Claude API requires max_tokens >
thinking.budget_tokens. If misconfigured, this auto-adjusts max_tokens
to budget_tokens + 1000 instead of returning a 400 error.
- Add ensureMaxTokensGreaterThanBudget helper function
- Extract Gemini25FlashThinkingBudgetLimit constant (24576)
- Log adjustment for debugging
2026-02-07 11:49:03 +08:00
erio
1e1cbbee80
chore: add .gitattributes to enforce LF line endings
...
Ensures consistent line endings for SQL migration files, Go source,
shell scripts, YAML configs, and Dockerfiles. Fixes checksum mismatches
on Windows where CRLF line endings cause migration hash differences.
2026-02-07 11:47:03 +08:00
shaw
39a5b17d31
fix: 账号测试根据类型使用不同的 beta header
...
- OAuth 账号:使用完整的 DefaultBetaHeader 和 Claude Code 客户端 headers
- API Key 账号:使用 APIKeyBetaHeader(不含 oauth beta)
2026-02-07 11:33:06 +08:00
yangjianbo
782a54a8a1
chore(version): 更新版本号至 0.1.70.1
2026-02-07 11:17:46 +08:00
shaw
35a55e10aa
fix: 前端快捷添加模型id新增gpt5.3系列
2026-02-07 11:13:51 +08:00
shaw
9e80ed0fa8
fix(frontend): 优化代理管理页面工具栏布局
...
- 将筛选器和操作按钮合并到同一行显示
- 筛选器在左侧,操作按钮在右侧
- 添加响应式支持,窄屏时自动换行并简化按钮文字
2026-02-07 11:09:34 +08:00
shaw
5299f3dcf6
fix: ix: antigravity 添加 aude-opus-4-6-thinking 模型支持
2026-02-07 10:38:10 +08:00
shaw
7b1564898b
fix: make error passthrough effective for non-failover upstream errors
2026-02-07 10:25:56 +08:00
yangjianbo
4e01126ff2
test(codex): 清理无用的 opencode 缓存测试
...
移除不再需要的 setupCodexCache 调用与辅助函数(已不再回源/读写缓存)
2026-02-07 09:53:01 +08:00
yangjianbo
55b56328da
feat(codex): 移除 opencode 指令回源与缓存
...
- 不再从 GitHub 拉取 opencode codex_header.txt\n- 删除 ~/.opencode 缓存与异步刷新逻辑\n- 所有 instructions 统一使用内置 codex_cli_instructions.md
2026-02-07 09:28:32 +08:00
yangjianbo
ce764bf2d9
feat(gateway): 支持强制 Codex CLI 模式并伪装 UA
...
- Codex CLI 请求仅使用内置 instructions,不再读取 opencode 缓存/回源\n- 新增 gateway.force_codex_cli(环境变量 GATEWAY_FORCE_CODEX_CLI)\n- ForceCodexCLI=true 时转发上游强制 User-Agent=codex_cli_rs/0.0.0\n- 更新 deploy 示例配置
2026-02-07 09:21:15 +08:00
yangjianbo
d71537d431
perf(service): SSE Scanner buffer 改用 sync.Pool 复用,减少高并发 GC 压力
...
将流式响应中 bufio.Scanner 的 64KB buffer 从每次 make 分配改为
sync.Pool 复用,统一切片表达式为 [:0]、变量命名为 scanBuf,
并补充对应的单元测试。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-06 22:55:12 +08:00
yangjianbo
ae1ba45350
perf(service): jitterTTL 改用 rand/v2 并移除锁
2026-02-06 21:22:38 +08:00
yangjianbo
c4182f8c33
perf(service): 移除 jitter 随机数全局锁
2026-02-06 21:20:25 +08:00
yangjianbo
028f8aaa97
feat: 优化.env参数
2026-02-06 21:01:30 +08:00
yangjianbo
d3f11fdbd3
chore(deploy): aicodex 默认 max_conns_per_host=8192
2026-02-06 20:50:44 +08:00
yangjianbo
8672b2f3ec
chore(gateway): 提升 max_idle_conns 并补齐 env
2026-02-06 20:48:48 +08:00
yangjianbo
de753a149e
chore(deploy): 补齐连接池默认与 8G 参数
2026-02-06 20:44:08 +08:00
yangjianbo
2d4bbbf49d
feat: 优化codex冷启动, 还有连接池数据库配置信息
2026-02-06 20:31:42 +08:00
shaw
76d242e024
refactor(frontend): 复用 TokenUsageTrend 组件优化用户 Dashboard 图表
...
用户 Dashboard 的 Token 使用趋势图表现在显示 Input/Output/Cache 三种类型,
并在 Tooltip 中显示 Actual 和 Standard 价格,与管理员页面保持一致。
2026-02-06 20:18:38 +08:00
shaw
260c152166
fix(frontend): 修复重启后健康检查接口路径错误
...
将 /api/health 改为 /health,与后端实际注册的路由一致
2026-02-06 19:53:39 +08:00