shaw
752882a022
fix: Token 统计支持 M 单位并修复 lint 错误
...
- 用户仪表盘 Token 统计卡片支持 K/M 单位自动切换
- 更新 formatTokensK 工具函数支持百万级显示
- 修复 setup.go 中未检查返回值的 errcheck 错误
2026-01-06 10:13:12 +08:00
shaw
7dbbfc22b6
fix: 移除 release 模式 JWT Secret 必填限制并支持 Docker 数据目录
...
- 移除 Install() 和 AutoSetupFromEnv() 中 release 模式下 JWT Secret 必填检查
- 移除 config.Validate() 中 release 模式下的 JWT 验证
- 新增 GetDataDir() 函数,自动检测数据目录:DATA_DIR 环境变量 > /app/data > 当前目录
- config.yaml 和 .installed 文件现在写入正确的数据目录
- config.Load() 添加 /app/data 到配置搜索路径
这修复了两个问题:
1. Web Setup Wizard 在 release 模式下无法完成安装
2. Docker 部署时 config.yaml 未被持久化导致每次重启重新初始化
2026-01-06 09:43:56 +08:00
shaw
aaaa68ea7f
fix: 修复 CSP 策略阻止 Cloudflare Turnstile 加载的问题
...
在 script-src 和 frame-src 中添加 challenges.cloudflare.com 域名,
允许 Turnstile 脚本加载和 iframe 渲染。
2026-01-06 09:15:03 +08:00
shaw
3956819c78
fix: 数据迁移时长增加到10分钟
2026-01-05 22:24:24 +08:00
shaw
706af2920f
Merge branch 'fix/account-filters-menu-missing-features'
...
## Summary
- 修复账号管理页面组件拆分时遗漏的功能
- 统一所有内联 SVG 为 Icon 组件
- 修复 ProxySelector 选择"无代理"时发送错误值的问题
## Changes
- AccountTableFilters: 添加 Antigravity 平台选项、类型筛选器、inactive 状态
- AccountActionMenu: 恢复重置状态和清除限速按钮
- AccountsView: 修正 handleClearRateLimit 调用正确的 API
- ProxySelector: 修复选择"无代理"时发送 null 而不是 0
## Conflict Resolution
- ProxySelector.vue: 采用 PR 分支的正确逻辑(发送 null 而不是 0)
这是正确的修复,因为后端使用 *int64 类型,nil 会触发 ClearProxyID()
2026-01-05 21:16:05 +08:00
shaw
4d078a8854
fix(admin): 修复零值字段无法保存的问题
...
- 用户允许分组:前端发送空数组而非 null 表示"允许全部"
- 账户代理:前端发送 0 而非 null 表示"无代理"
- 后端 UpdateAccount/BulkUpdate 正确处理 ProxyID=0 为清除代理
2026-01-05 20:53:38 +08:00
IanShaw027
34aa77e4e1
fix(backend): 删除未使用的 sleepAntigravityBackoff 函数
...
修复 golangci-lint unused 检查失败
2026-01-05 20:15:36 +08:00
longgexx
c27d511736
test(billing): 更新测试用例以验证透支策略
2026-01-05 19:03:54 +08:00
longgexx
d6f8ac0226
fix(billing): 修复计费漏洞
...
- 允许余额透支策略
## 问题
- 扣费失败时只记录日志,不阻止请求完成
- 用户可以用极少余额无限次免费使用服务
- 数据库层使用 BalanceGTE 条件防止余额变负,导致余额不足时扣费失败
## 修复
- 移除 DeductBalance 方法中的 BalanceGTE 条件,允许余额变为负数
- 修改错误返回:用户不存在时返回 ErrUserNotFound
- 实现透支策略:余额不足时允许本次请求完成,余额变负后阻止后续请求
## 测试
- 更新 TestDeductBalance_InsufficientFunds 测试,验证透支功能
- 更新 TestDeductBalance_NotFound 测试,验证正确的错误类型
- 新增 TestDeductBalance_AllowsOverdraft 测试,专门测试透支场景
- 所有测试通过 ✅
2026-01-05 18:48:49 +08:00
yangjianbo
d936eb6518
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-05 17:26:18 +08:00
yangjianbo
3b7d0c42f1
fix(格式): 修复 config.go 代码格式问题
...
修复 golangci-lint gofmt 检查失败,移除 AllowInsecureHTTP 字段后多余的空格。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-05 17:24:37 +08:00
程序猿MT
e800af54f9
Merge branch 'Wei-Shaw:main' into main
2026-01-05 17:12:09 +08:00
yangjianbo
4c1293a74c
fix(安全): CSP 策略添加 Google Fonts 支持
...
在 style-src 中添加 fonts.googleapis.com,在 font-src 中添加
fonts.gstatic.com,解决浏览器控制台因 CSP 策略阻止加载
Google Fonts 样式表的错误。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-05 15:32:36 +08:00
yangjianbo
fb313356f7
Merge branch 'main' into test-dev
2026-01-05 14:43:08 +08:00
shaw
d20697beb3
Merge branch 'feat/account-notes'
2026-01-05 14:42:31 +08:00
yangjianbo
048ed061c2
fix(安全): 关闭白名单时保留最小校验与默认白名单
...
实现 allow_insecure_http 并在关闭校验时执行最小格式验证
- 关闭 allowlist 时要求 URL 可解析且 scheme 合规
- 响应头过滤关闭时使用默认白名单策略
- 更新相关文档、示例与测试覆盖
2026-01-05 14:41:08 +08:00
shaw
91f9d4c7a9
Merge branch 'mike/deployment'
2026-01-05 14:37:31 +08:00
shaw
a60dbb5533
Merge branch 'fix/turnstile-secret-key-preserve'
2026-01-05 14:31:50 +08:00
ianshaw
471b1c3eeb
fix(frontend): 修复重构时遗漏的 SVG 图标,创建统一图标管理组件
...
- 创建 Icon.vue 统一管理 SVG 图标(20+ 常用图标)
- 修复 AccountActionMenu 中被错误替换为 emoji 的图标
- 修复 ProfileView 和 GroupsView 中的 emoji 图标
- 图标支持 size/strokeWidth 属性,便于复用
2026-01-04 22:26:33 -08:00
LLLLLLiulei
94750fb61f
feat: add account notes field
2026-01-05 14:07:33 +08:00
yangjianbo
794a9f969b
feat(安全): 添加安全开关并完善测试流程
...
实现安全开关默认关闭与响应头透传逻辑
- URL 校验与响应头过滤支持开关并覆盖流式路径
- 非流式 Content-Type 透传/默认值按配置生效
- 接入 go test、golangci-lint 与前端 lint/typecheck
- 补充相关测试与配置/文档说明
2026-01-05 13:54:43 +08:00
Jiahao Luo
204190f807
feat(crs-sync): improve error messages and add private IP allowlist support
...
## Changes
### 1. Enhanced Error Messages
- Modified CRS sync error handling to show detailed error messages
- Changed from generic "internal error" to "CRS sync failed: <details>"
- Helps diagnose connection issues with private CRS deployments
### 2. Security Configuration
- Added SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS environment variable
- Allows administrators to enable/disable private IP access for CRS sync
- Production default: false (secure)
- Test environment default: true (convenient for internal testing)
### 3. Flexible Configuration Support
- Added config.yaml mount support in both production and test environments
- Supports dual configuration methods:
* config.yaml for detailed/complex configurations
* Environment variables for quick overrides
- Priority: ENV vars > config.yaml > defaults
## Use Case
Enables CRS sync from internal deployments where CRS resolves to private IPs
(e.g., 10.x.x.x, 192.168.x.x) while maintaining security by default.
## Files Modified
- backend/internal/handler/admin/account_handler.go
- deploy/docker-compose.yml
- deploy/docker-compose-test.yml
2026-01-05 12:57:03 +08:00
Yuhao Jiang
411ebe4d17
fix(后端): 修复 Turnstile Secret Key 留空保留当前值不生效的问题
...
前端显示"密钥已配置,留空以保留当前值",但后端验证逻辑直接
要求该字段非空,导致修改其他设置时报错。
修复方案:
- 当 TurnstileSecretKey 为空时,检查 previousSettings 是否有已保存的值
- 如果有,使用已保存的值而非返回错误
- 同时移除重复获取 currentSettings 的代码,直接复用 previousSettings
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2026-01-04 22:52:00 -06:00
ianshaw
ae3d6fd776
fix(antigravity): 扩展 isSignatureRelatedError 检测 thinking 结构错误
...
- 添加对 "Expected thinking/redacted_thinking" 错误的检测
- 修复 antigravity 服务中 thinking 模式启用时的结构约束错误
- 确保此类错误能触发重试逻辑
2026-01-04 18:34:19 -08:00
ianshaw
118ca5cf6d
fix: 修复空content处理及更新Gemini使用指南链接
...
- 修复FilterThinkingBlocksForRetry对空content数组的处理
- docker-compose添加SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS配置
- 更新Gemini使用指南链接:检查归属地、修改归属地、激活Gemini Web
2026-01-04 18:26:39 -08:00
yangjianbo
c8e5455df0
chore(配置): 更新上游白名单默认值
...
新增 Kimi/BigModel/Minimax 官方域名到 allowlist
保持示例配置与默认值一致
2026-01-05 09:18:17 +08:00
IanShaw027
06216aad53
fix(backend): 修复 CI 失败问题
...
修复内容:
1. 修复 6 个 golangci-lint 错误
- 3 个 errcheck 错误:在 gateway_request_test.go 中添加类型断言检查
- 3 个 gofmt 格式化问题:修复代码格式
2. 修复 API 契约测试失败
- 在测试中添加缺失的字段:enable_identity_patch 和 identity_patch_prompt
所有测试和 linter 检查现已通过。
2026-01-05 00:56:48 +08:00
IanShaw027
aa6f253374
merge: 合并 upstream/main 并解决冲突
...
解决了以下文件的冲突:
- backend/internal/handler/admin/setting_handler.go
- 采用 upstream 的字段对齐风格和 *Configured 字段名
- 添加 EnableIdentityPatch 和 IdentityPatchPrompt 字段
- backend/internal/handler/gateway_handler.go
- 采用 upstream 的 billingErrorDetails 错误处理方式
- frontend/src/api/admin/settings.ts
- 采用 upstream 的 *_configured 字段名
- 添加 enable_identity_patch 和 identity_patch_prompt 字段
- frontend/src/views/admin/SettingsView.vue
- 合并 turnstile_secret_key_configured 字段
- 保留 enable_identity_patch 和 identity_patch_prompt 字段
2026-01-04 23:17:15 +08:00
IanShaw027
f60f943d0c
fix: 修复代码审查报告中的4个关键问题
...
1. 资源管理冗余(ForwardGemini双重Close)
- 错误分支读取body后立即关闭原始body,用内存副本重新包装
- defer添加nil guard,避免重复关闭
- fallback成功时显式关闭旧body,确保连接释放
2. Schema校验丢失(cleanJSONSchema移除字段无感知)
- 新增schemaCleaningWarningsEnabled()支持环境变量控制
- 实现warnSchemaKeyRemovedOnce()在非release模式下告警
- 移除关键验证字段时输出warning,包含key和path
3. UI响应式风险(UsersView操作菜单硬编码定位)
- 菜单改为先粗定位、渲染后测量、再clamp到视口内
- 添加max-height + overflow-auto,超出时可滚动
- 增强交互:点击其它位置/滚动/resize自动关闭或重新定位
4. 身份补丁干扰(TransformClaudeToGemini默认注入)
- 新增TransformOptions + TransformClaudeToGeminiWithOptions
- 系统设置新增enable_identity_patch、identity_patch_prompt
- 完整打通handler/dto/service/frontend配置链路
- 默认保持启用,向后兼容现有行为
测试:
- 后端单测全量通过:go test ./...
- 前端类型检查通过:npm run typecheck
2026-01-04 22:49:40 +08:00
IanShaw027
bfcc562c35
feat(backend): 为 JSON Schema 清理添加警告日志
...
改进 cleanJSONSchema 函数:
- 新增 schemaValidationKeys 映射表,标记关键验证字段
- 新增 warnSchemaKeyRemovedOnce 函数,在移除关键验证字段时输出警告(每个 key 仅警告一次)
- 支持通过环境变量 SUB2API_SCHEMA_CLEAN_WARN 控制警告开关
- 默认在非 release 模式下启用警告,便于开发调试
此改进响应代码审查建议,帮助开发者识别可能影响模型输出质量的 Schema 字段移除。
2026-01-04 22:33:01 +08:00
IanShaw027
87426e5dda
fix(backend): 改进 thinking/tool block 签名处理和重试策略
...
主要改动:
- request_transformer: thinking block 缺少签名时降级为文本而非丢弃,保留内容并在上层禁用 thinking mode
- antigravity_gateway_service: 新增两阶段降级策略,先处理 thinking blocks,如仍失败且涉及 tool 签名错误则进一步降级 tool blocks
- gateway_request: 新增 FilterSignatureSensitiveBlocksForRetry 函数,支持将 tool_use/tool_result 降级为文本
- gateway_request: 改进 FilterThinkingBlocksForRetry,禁用顶层 thinking 配置以避免结构约束冲突
- gateway_service: 实现保守的两阶段重试逻辑,优先保留内容,仅在必要时降级工具调用
- 新增 antigravity_gateway_service_test.go 测试签名块剥离逻辑
- 更新相关测试用例以验证降级行为
此修复解决了跨平台/账户切换时历史消息签名失效导致的请求失败问题。
2026-01-04 22:32:36 +08:00
yangjianbo
5dd8b8802b
fix(后端): 修复 lint 失败并清理无用代码
...
修正测试中的 APIKey 名称引用
移除不可达返回与未使用函数
统一 gofmt 格式并处理 Close 错误
2026-01-04 22:10:32 +08:00
IanShaw027
7122b3b3b6
fix(backend): 修复 P0/P1 严重安全和稳定性问题
...
P0 严重问题修复:
- 优化重试机制:降至 5 次 + 指数退避 + 10s 上限,防止请求堆积
- 修复 SSE 错误格式:符合 Anthropic API 规范,添加错误类型标准化
P1 重要问题修复:
- 防止 DOS 攻击:使用 io.LimitReader 限制请求体 10MB,流式解析
- 修复计费数据丢失:改为同步计费,使用独立 context 防止中断
技术细节:
- 新增 retryBackoffDelay() 和 sleepWithContext() 支持 context 取消
- 新增 normalizeAnthropicErrorType() 和 sanitizePublicErrorMessage()
- 新增 parseGatewayRequestStream() 实现流式解析
- 新增 recordUsageSync() 确保计费数据持久化
影响:
- 极端场景重试时间从 30s 降至 ≤10s
- 防止高并发 OOM 攻击
- 消除计费数据丢失风险
- 提升客户端兼容性
2026-01-04 21:29:09 +08:00
IanShaw027
d36392b74f
fix(frontend): comprehensive i18n cleanup and Select component hardening
2026-01-04 21:09:14 +08:00
yangjianbo
7dddd06583
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2026-01-04 21:06:12 +08:00
shaw
e78c864650
Merge PR #142 : feat: 多平台网关优化与用户系统增强
...
主要功能:
- Gemini OAuth 配额系统优化:Google One tier 自动推断
- Antigravity 网关增强:Thinking Block 重试、Claude 模型 signature 透传
- 账号调度改进:临时不可调度功能、负载感知调度优化
- 前端用户体验:账号管理界面优化、使用教程改进
冲突解决:保留 handleUpstreamError 的 prefix 参数和日志记录能力,
同时合并 PR 的 thinking block 重试和 model fallback 功能。
2026-01-04 20:30:19 +08:00
yangjianbo
25a0d49af9
chore(合并): 同步主分支变更并解决冲突
...
- 合并 wire/httpclient/http_upstream/proxy_probe 冲突并保留校验逻辑
- 引入 proxyutil 及测试,完善代理配置
- 更新 goreleaser/workflow 与前端细节调整
测试: go test ./...
2026-01-04 20:29:39 +08:00
yangjianbo
7489da49cb
fix(流式): 以上游读取判定超时并调大事件缓冲
...
- 以读取时间戳判定流式间隔超时,避免下游阻塞误判
- antigravity 流式读取使用 MaxLineSize 配置
- 事件通道缓冲提升到 16
测试: go test ./...
2026-01-04 20:19:07 +08:00
shaw
4df712624e
Merge branch 'slovx2/main'
2026-01-04 19:51:17 +08:00
yangjianbo
73ffb58518
fix(流式): 提升SSE稳定性并统一超时配置
...
- 扩展SSE行长与间隔超时处理,补充keepalive
- 写入失败与超长行时发送错误事件,修复并发释放
- 同步默认配置与示例配置,更新Caddy超时/压缩规则
- 新增OpenAI流式超时与超长行测试
测试: go test ./...
2026-01-04 19:49:59 +08:00
IanShaw027
a4953785d9
fix(lint): 修复所有 Go 命名规范问题
...
- 全局替换 ApiKey → APIKey(类型、字段、方法、变量)
- 修复所有 initialism 命名(API, SMTP, HTML, URL 等)
- 添加所有缺失的包注释
- 修复导出符号的注释格式
主要修改:
- ApiKey → APIKey(所有出现的地方)
- ApiKeyID → APIKeyID
- ApiKeyIDs → APIKeyIDs
- TestSmtpConnection → TestSMTPConnection
- HtmlURL → HTMLURL
- 添加 20+ 个包注释
- 修复 10+ 个导出符号注释格式
验证结果:
- ✓ golangci-lint: 0 issues
- ✓ 单元测试: 通过
- ✓ 集成测试: 通过
2026-01-04 19:28:20 +08:00
IanShaw027
d92e71a1f0
fix(ci): 修复 CI 检查失败问题
...
- 重新生成 Wire 依赖注入代码(修复服务构造函数签名不匹配)
- 修复集成测试中的 err 变量重复声明
- 临时禁用 golangci-lint 的命名规范检查(ST1000/ST1003/ST1020/ST1021/ST1022)
- 这些只是代码风格问题,不影响功能
- 后续将创建专门的 PR 系统地修复命名规范
测试结果:
- ✓ golangci-lint: 通过(0 issues)
- ✓ 单元测试: 通过
- ✓ 集成测试: 通过
2026-01-04 18:55:34 +08:00
IanShaw027
a8c3dfb0c1
merge: 合并 upstream/main 解决冲突
...
- 接受上游 wire_gen.go 的简化构造函数参数
- 接受上游 account_test_service.go 的优化实现
2026-01-04 17:41:06 +08:00
IanShaw027
2c06255f0e
fix(test): 修复集成测试中 err 变量重复声明问题
2026-01-04 17:36:49 +08:00
shaw
a527559526
fix(test): 修复claude、openai oauth账号test刷新token的bug
2026-01-04 17:29:34 +08:00
IanShaw027
7e6a197ddb
fix(test): 修复集成测试中 Create 方法的返回值处理
2026-01-04 17:27:32 +08:00
IanShaw027
603b361fb9
fix(test): 修复 api_contract_test 的接口签名和参数问题
2026-01-04 17:21:13 +08:00
IanShaw027
2632a7102d
refactor(settings): 规范化缩写词命名并优化前端帮助界面
...
- 后端:将 Smtp/Api/Doc 字段改为 SMTP/API/Doc(遵循 Go 命名规范)
- 前端:添加 Gemini 帮助按钮,简化配额说明展示
2026-01-04 17:02:38 +08:00
song
63453fbfa0
style: gofmt
2026-01-04 16:58:51 +08:00
song
50f9272850
feat(antigravity): gemini-2.5-flash-image 转发到 gemini-3-pro-image
2026-01-04 16:53:35 +08:00