IanShaw027
a2f3d10bee
fix(lint): 使用 any 替代 interface{} 以符合 gofmt 规则
2026-01-01 04:37:33 +08:00
IanShaw027
c5781c69bb
fix(merge): 解决与 main 分支的配置冲突
...
- 合并 main 分支的上游错误日志配置
- 保留调度配置
- 合并 beta header 和 failover 配置
2026-01-01 04:33:12 +08:00
IanShaw027
e1a9c1ecd9
fix(lint): 修复 openai_gateway_handler 的 staticcheck 问题
2026-01-01 04:30:42 +08:00
IanShaw027
9c88980483
fix(lint): 修复 golangci-lint 报错
...
- 修复 gofmt 格式问题
- 修复 staticcheck SA4031 nil check 问题(只在成功时设置 release 函数)
- 删除未使用的 sortAccountsByPriority 函数
2026-01-01 04:26:01 +08:00
IanShaw
34c102045a
fix: 修复 /v1/messages 间歇性 400 错误 ( #18 )
...
* fix(upstream): 修复上游格式兼容性问题
- 跳过Claude模型无signature的thinking block
- 支持custom类型工具(MCP)格式转换
- 添加ClaudeCustomToolSpec结构体支持MCP工具
- 添加Custom字段验证,跳过无效custom工具
- 在convertClaudeToolsToGeminiTools中添加schema清理
- 完整的单元测试覆盖,包含边界情况
修复: Issue 0.1 signature缺失, Issue 0.2 custom工具格式
改进: Codex审查发现的2个重要问题
测试:
- TestBuildParts_ThinkingBlockWithoutSignature: 验证thinking block处理
- TestBuildTools_CustomTypeTools: 验证custom工具转换和边界情况
- TestConvertClaudeToolsToGeminiTools_CustomType: 验证service层转换
* feat(gemini): 添加Gemini限额与TierID支持
实现PR1:Gemini限额与TierID功能
后端修改:
- GeminiTokenInfo结构体添加TierID字段
- fetchProjectID函数返回(projectID, tierID, error)
- 从LoadCodeAssist响应中提取tierID(优先IsDefault,回退到第一个非空tier)
- ExchangeCode、RefreshAccountToken、GetAccessToken函数更新以处理tierID
- BuildAccountCredentials函数保存tier_id到credentials
前端修改:
- AccountStatusIndicator组件添加tier显示
- 支持LEGACY/PRO/ULTRA等tier类型的友好显示
- 使用蓝色badge展示tier信息
技术细节:
- tierID提取逻辑:优先选择IsDefault的tier,否则选择第一个非空tier
- 所有fetchProjectID调用点已更新以处理新的返回签名
- 前端gracefully处理missing/unknown tier_id
* refactor(gemini): 优化TierID实现并添加安全验证
根据并发代码审查(code-reviewer, security-auditor, gemini, codex)的反馈进行改进:
安全改进:
- 添加validateTierID函数验证tier_id格式和长度(最大64字符)
- 限制tier_id字符集为字母数字、下划线、连字符和斜杠
- 在BuildAccountCredentials中验证tier_id后再存储
- 静默跳过无效tier_id,不阻塞账户创建
代码质量改进:
- 提取extractTierIDFromAllowedTiers辅助函数消除重复代码
- 重构fetchProjectID函数,tierID提取逻辑只执行一次
- 改进代码可读性和可维护性
审查工具:
- code-reviewer agent (a09848e)
- security-auditor agent (a9a149c)
- gemini CLI (bcc7c81)
- codex (b5d8919)
修复问题:
- HIGH: 未验证的tier_id输入
- MEDIUM: 代码重复(tierID提取逻辑重复2次)
* fix(format): 修复 gofmt 格式问题
- 修复 claude_types.go 中的字段对齐问题
- 修复 gemini_messages_compat_service.go 中的缩进问题
* fix(upstream): 修复上游格式兼容性问题 (#14 )
* fix(upstream): 修复上游格式兼容性问题
- 跳过Claude模型无signature的thinking block
- 支持custom类型工具(MCP)格式转换
- 添加ClaudeCustomToolSpec结构体支持MCP工具
- 添加Custom字段验证,跳过无效custom工具
- 在convertClaudeToolsToGeminiTools中添加schema清理
- 完整的单元测试覆盖,包含边界情况
修复: Issue 0.1 signature缺失, Issue 0.2 custom工具格式
改进: Codex审查发现的2个重要问题
测试:
- TestBuildParts_ThinkingBlockWithoutSignature: 验证thinking block处理
- TestBuildTools_CustomTypeTools: 验证custom工具转换和边界情况
- TestConvertClaudeToolsToGeminiTools_CustomType: 验证service层转换
* fix(format): 修复 gofmt 格式问题
- 修复 claude_types.go 中的字段对齐问题
- 修复 gemini_messages_compat_service.go 中的缩进问题
* fix(format): 修复 claude_types.go 的 gofmt 格式问题
* feat(antigravity): 优化 thinking block 和 schema 处理
- 为 dummy thinking block 添加 ThoughtSignature
- 重构 thinking block 处理逻辑,在每个条件分支内创建 part
- 优化 excludedSchemaKeys,移除 Gemini 实际支持的字段
(minItems, maxItems, minimum, maximum, additionalProperties, format)
- 添加详细注释说明 Gemini API 支持的 schema 字段
* fix(antigravity): 增强 schema 清理的安全性
基于 Codex review 建议:
- 添加 format 字段白名单过滤,只保留 Gemini 支持的 date-time/date/time
- 补充更多不支持的 schema 关键字到黑名单:
* 组合 schema: oneOf, anyOf, allOf, not, if/then/else
* 对象验证: minProperties, maxProperties, patternProperties 等
* 定义引用: $defs, definitions
- 避免不支持的 schema 字段导致 Gemini API 校验失败
* fix(lint): 修复 gemini_messages_compat_service 空分支警告
- 在 cleanToolSchema 的 if 语句中添加 continue
- 移除重复的注释
* fix(antigravity): 移除 minItems/maxItems 以兼容 Claude API
- 将 minItems 和 maxItems 添加到 schema 黑名单
- Claude API (Vertex AI) 不支持这些数组验证字段
- 添加调试日志记录工具 schema 转换过程
- 修复 tools.14.custom.input_schema 验证错误
* fix(antigravity): 修复 additionalProperties schema 对象问题
- 将 additionalProperties 的 schema 对象转换为布尔值 true
- Claude API 只支持 additionalProperties: false,不支持 schema 对象
- 修复 tools.14.custom.input_schema 验证错误
- 参考 Claude 官方文档的 JSON Schema 限制
* fix(antigravity): 修复 Claude 模型 thinking 块兼容性问题
- 完全跳过 Claude 模型的 thinking 块以避免 signature 验证失败
- 只在 Gemini 模型中使用 dummy thought signature
- 修改 additionalProperties 默认值为 false(更安全)
- 添加调试日志以便排查问题
* fix(upstream): 修复跨模型切换时的 dummy signature 问题
基于 Codex review 和用户场景分析的修复:
1. 问题场景
- Gemini (thinking) → Claude (thinking) 切换时
- Gemini 返回的 thinking 块使用 dummy signature
- Claude API 会拒绝 dummy signature,导致 400 错误
2. 修复内容
- request_transformer.go:262: 跳过 dummy signature
- 只保留真实的 Claude signature
- 支持频繁的跨模型切换
3. 其他修复(基于 Codex review)
- gateway_service.go:691: 修复 io.ReadAll 错误处理
- gateway_service.go:687: 条件日志(尊重 LogUpstreamErrorBody 配置)
- gateway_service.go:915: 收紧 400 failover 启发式
- request_transformer.go:188: 移除签名成功日志
4. 新增功能(默认关闭)
- 阶段 1: 上游错误日志(GATEWAY_LOG_UPSTREAM_ERROR_BODY)
- 阶段 2: Antigravity thinking 修复
- 阶段 3: API-key beta 注入(GATEWAY_INJECT_BETA_FOR_APIKEY)
- 阶段 3: 智能 400 failover(GATEWAY_FAILOVER_ON_400)
测试:所有测试通过
* fix(lint): 修复 golangci-lint 问题
- 应用 De Morgan 定律简化条件判断
- 修复 gofmt 格式问题
- 移除未使用的 min 函数
2026-01-01 04:21:18 +08:00
IanShaw027
fe31495a89
test(gateway): 补充账号调度优化的单元测试
...
- 添加 GetAccountsLoadBatch 批量负载查询测试
- 添加 CleanupExpiredAccountSlots 过期槽位清理测试
- 添加 SelectAccountWithLoadAwareness 负载感知选择测试
- 测试覆盖降级行为、账号排除、错误处理等场景
2026-01-01 04:15:31 +08:00
IanShaw027
592d2d0978
feat(gateway): 实现负载感知的账号调度优化
...
- 新增调度配置:粘性会话排队、兜底排队、负载计算、槽位清理
- 实现账号级等待队列和批量负载查询(Redis Lua 脚本)
- 三层选择策略:粘性会话优先 → 负载感知选择 → 兜底排队
- 后台定期清理过期槽位,防止资源泄漏
- 集成到所有网关处理器(Claude/Gemini/OpenAI)
2026-01-01 04:01:51 +08:00
shaw
312cc00d21
Merge branch 'IanShaw027/main'
2025-12-31 23:50:26 +08:00
shaw
8e55ee0e2c
style: fix gofmt formatting in claude_types.go
2025-12-31 23:50:15 +08:00
NepetaLemon
2270a54ff6
refactor: 移除 infrastructure 目录 ( #108 )
...
* refactor: 迁移初始化 db 和 redis 到 repository
* refactor: 迁移 errors 到 pkg
2025-12-31 23:42:01 +08:00
shaw
bb7ade265d
chore(token-refresh): 添加 Antigravity Token 刷新调试日志
...
- NeedsRefresh 判断为 true 时输出 expires_at、time_until_expiry、window
- 修正注释中的刷新窗口描述(10分钟 → 15分钟)
2025-12-31 23:37:51 +08:00
shaw
c5b792add5
fix(billing): 修复限额为0时消费记录失败的问题
...
- 添加 normalizeLimit 函数,将 0 或负数限额规范化为 nil(无限制)
- 简化 IncrementUsage,移除冗余的配额检查逻辑
- 配额检查已在请求前由中间件和网关完成
- 消费记录应无条件执行,确保数据完整性
- 删除测试限额超出行为的无效集成测试
2025-12-31 22:48:35 +08:00
IanShaw027
2ccdc2b8ef
Merge remote-tracking branch 'upstream/main'
2025-12-31 21:56:17 +08:00
IanShaw027
c1e25b7ecf
fix(upstream): 完善边界检查和 thinking block 处理
...
基于 Gemini + Codex 审查结果的修复:
1. thinking block dummy signature 填充
- Gemini 模型现在会填充 dummyThoughtSignature
- 与 tool_use 处理逻辑保持一致
2. 边界检查增强
- buildTools: 跳过空工具名称
- buildTools: 为 nil schema 提供默认值
- convertClaudeToolsToGeminiTools: 为 nil params 提供默认值
3. 防止下游 API 验证错误
- 确保所有工具都有有效的 parameters
- 默认 schema: {type: 'object', properties: {}}
审查报告:Gemini 评分 95%, Codex 评分 8.2/10
2025-12-31 21:44:56 +08:00
IanShaw027
35b768b719
fix(upstream): 跳过 Claude 模型无 signature 的 thinking block
...
- buildParts 函数检测 thinking block 的 signature
- Claude 模型 (allowDummyThought=false) 时跳过无 signature 的 block
- 记录警告日志以便调试
- Gemini 模型继续使用 dummy signature 兼容方案
修复 Issue 0.1: Claude thinking block signature 缺失错误
2025-12-31 21:35:41 +08:00
shaw
0b6371174e
fix(settings): 保存 Turnstile 设置时验证参数有效性
2025-12-31 21:11:10 +08:00
IanShaw027
15e676e9cd
fix(upstream): 支持 Claude custom 类型工具 (MCP) 格式
...
- ClaudeTool 结构体增加 Type 和 Custom 字段
- buildTools 函数支持从 custom 字段读取 input_schema
- convertClaudeToolsToGeminiTools 函数支持 MCP 工具格式
- 修复 Antigravity upstream error 400: JSON schema invalid
修复 Issue 0.2: tools.X.custom.input_schema 验证错误
2025-12-31 20:56:38 +08:00
程序猿MT
2d22623b7d
Merge branch 'Wei-Shaw:main' into main
2025-12-31 16:39:42 +08:00
shaw
81213f2324
refactor(service): 统一时间戳解析,支持多种格式
...
新增 Account.GetCredentialAsTime 方法,统一处理凭证中的时间戳字段,
兼容 RFC3339 字符串、Unix 时间戳字符串和数字类型。
- 重构 Claude/Gemini/Antigravity TokenRefresher.NeedsRefresh
- 移除重复的 parseExpiresAt/parseAntigravityExpiresAt 函数
- 简化 GetOpenAITokenExpiresAt 实现
- 新增 RFC3339 格式单元测试用例
2025-12-31 16:25:45 +08:00
yangjianbo
1ef4f09df5
fix(网关): 添加 model 参数必填验证
...
在以下端点添加 model 参数的必填验证,缺失时直接返回 400 错误:
- /v1/messages
- /v1/messages/count_tokens
- /openai/v1/responses
修复前:空 model 会进入账号选择流程,最终由上游 API 返回错误
修复后:入口处直接拒绝,避免浪费资源和不明确的错误信息
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 16:17:45 +08:00
shaw
aac7dd6b08
style: fix gofmt formatting in test file
...
Remove redundant alignment whitespace before comments.
2025-12-31 15:52:02 +08:00
yangjianbo
0ffb3201b7
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2025-12-31 15:33:08 +08:00
yangjianbo
6f6dc3032c
fix(设置): 修复站点设置保存失败的问题
...
问题:
1. Setting.value 字段设置了 NotEmpty() 约束,导致保存空字符串值时验证失败
2. 数据库 settings 表缺少 key 字段的唯一约束,导致 ON CONFLICT 语句执行失败
修复:
- 移除 ent/schema/setting.go 中 value 字段的 NotEmpty() 约束
- 新增迁移 015_fix_settings_unique_constraint.sql 添加缺失的唯一约束
- 添加3个回归测试确保空值保存功能正常
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 15:31:26 +08:00
yangjianbo
d77d0544d0
fix(仓储): 修复并发缓存前缀与软删除更新
...
补齐 Redis ZSET 前缀处理,确保并发释放计数正确
删除时改用 Client().Mutate 走更新逻辑,保留软删除记录
测试: make test-integration
2025-12-31 15:20:58 +08:00
yangjianbo
682f546c0e
fix(lint): 修复 golangci-lint 报告的代码问题
...
- errcheck: 修复类型断言未检查返回值的问题
- pool.go: 添加 sync.Map 类型断言安全检查
- req_client_pool.go: 添加 sync.Map 类型断言安全检查
- concurrency_cache_benchmark_test.go: 显式忽略断言返回值
- gateway_service.go: 显式忽略 WriteString 返回值
- gofmt: 修复代码格式问题
- redis.go: 注释对齐
- api_key_repo.go: 结构体字段对齐
- concurrency_cache.go: 字段对齐
- http_upstream.go: 注释对齐
- unused: 删除未使用的代码
- user_repo.go: 删除未使用的 sql 字段
- usage_service.go: 删除未使用的 calculateStats 函数
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 14:51:58 +08:00
程序猿MT
4368966e09
Merge branch 'Wei-Shaw:main' into main
2025-12-31 14:40:52 +08:00
yangjianbo
679b21a86c
Merge branch 'main' into test
...
冲突解决:
- wire_gen.go: 合并 antigravityGatewayService 和 ProvideConcurrencyCache
- user_repo_integration_test.go: 保留 NotFound 测试
- antigravity_gateway_service.go: 适配 httpUpstream.Do 新签名
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 14:17:18 +08:00
yangjianbo
5906f9ab98
fix(数据层): 修复数据完整性与仓储一致性问题
...
## 数据完整性修复 (fix-critical-data-integrity)
- 添加 error_translate.go 统一错误转换层
- 修复 nil 输入和 NotFound 错误处理
- 增强仓储层错误一致性
## 仓储一致性修复 (fix-high-repository-consistency)
- Group schema 添加 default_validity_days 字段
- Account schema 添加 proxy edge 关联
- 新增 UsageLog ent schema 定义
- 修复 UpdateBalance/UpdateConcurrency 受影响行数校验
## 数据卫生修复 (fix-medium-data-hygiene)
- UserSubscription 添加软删除支持 (SoftDeleteMixin)
- RedeemCode/Setting 添加硬删除策略文档
- account_groups/user_allowed_groups 的 created_at 声明 timestamptz
- 停止写入 legacy users.allowed_groups 列
- 新增迁移: 011-014 (索引优化、软删除、孤立数据审计、列清理)
## 测试补充
- 添加 UserSubscription 软删除测试
- 添加迁移回归测试
- 添加 NotFound 错误测试
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 14:11:57 +08:00
yangjianbo
820bb16ca7
fix(网关): 防止连接池缓存失控
...
超限且无可淘汰条目时拒绝新建
规范化代理地址并更新失败时的访问时间
补充连接池上限与代理规范化测试
2025-12-31 12:01:31 +08:00
Wei Shaw
a1540e27c2
feat: 修复 OpenAI 402 报错自动切换问题
2025-12-31 11:46:53 +08:00
yangjianbo
d1c9889609
perf(网关): 实现上游账号连接池隔离
...
新增隔离策略与连接池缓存回收
连接池大小跟随账号并发并处理代理切换
同步配置默认值与示例并补充测试
2025-12-31 11:43:58 +08:00
shaw
b7c6d040dd
fix: 修复Antigravity token刷新间隔问题
2025-12-31 10:33:00 +08:00
yangjianbo
3d7f8e4b3a
fix(服务): 修复system判定、统计时区与缓存日志
...
- system 字段存在即视为显式提供,避免 null 触发默认注入
- 日统计分组显式使用应用时区,缺失时从 TZ 回退到 UTC
- 缓存写入队列丢弃日志节流汇总,关键任务同步回退
测试: go test ./internal/service -run TestBillingCacheServiceQueueHighLoad
2025-12-31 10:17:38 +08:00
yangjianbo
7efa8b54c4
perf(后端): 完成性能优化与连接池配置
...
新增 DB/Redis 连接池配置与校验,并补充单测
网关请求体大小限制与 413 处理
HTTP/req 客户端池化并调整上游连接池默认值
并发槽位改为 ZSET+Lua 与指数退避
用量统计改 SQL 聚合并新增索引迁移
计费缓存写入改工作池并补测试/基准
测试: 在 backend/ 下运行 go test ./...
2025-12-31 08:50:12 +08:00
song
aa4631640a
Merge branch 'main' into fix/antigravity_auth_3
2025-12-31 00:36:43 +08:00
song
f284ea72fc
refactor(Antigravity): 保存完整 API 响应到 extra 字段
...
- LoadCodeAssist/FetchAvailableModels 返回原始 JSON
- extra 新增 load_code_assist 和 available_models 保存原始响应
- 前端 tier 从 load_code_assist.paidTier.id 提取
- 删除冗余的 updateAccountTier 函数
2025-12-31 00:15:25 +08:00
song
0a4e0edc85
fix(Antigravity): 配额刷新时自动补充缺失的 project_id
...
旧账户可能没有 project_id,在刷新配额时自动生成并保存。
2025-12-30 23:58:03 +08:00
song
fa48cf27eb
feat(Antigravity): 为无 project_id 的账户生成随机 project_id
...
部分账户类型(如 g1-pro-tier)API 不返回 cloudaicompanionProject,
但实际接受任意格式的 project_id,故添加随机生成逻辑作为兜底。
2025-12-30 23:54:33 +08:00
song
1c42403e6d
fix(Antigravity): 支持无 project_id 的账户类型
...
- 移除 project_id 强制检查,部分账户类型 API 不返回此字段
- 重构:提取 antigravity.NewAPIRequest() 统一创建 API 请求
- quota_refresher: 无 project_id 时仍可更新 tier 信息
2025-12-30 23:42:50 +08:00
shaw
4319cf7f31
fix(仓储): 修复 BatchUpdateLastUsed 时间戳类型不匹配
...
在原生 SQL 的 CASE WHEN 语句中,PostgreSQL 无法自动推断占位符参数类型,
导致 time.Time 被当作 text 类型处理,与 last_used_at 列的 timestamptz 类型不匹配。
添加显式类型转换 ::timestamptz 解决此问题。
2025-12-30 23:11:49 +08:00
shaw
1ecef269f7
fix: 去除openai-apkey账户请求路径多余的v1
2025-12-30 23:07:25 +08:00
song
5844ea7e6e
fix(Antigravity): 修复账号测试连接认证错误
...
- 新增 AntigravityGatewayService.TestConnection 方法,支持 Claude/Gemini 双协议测试
- AccountTestService 改用 AntigravityGatewayService 进行测试连接
- GetAvailableModels 为 Antigravity 账号返回 Claude + Gemini 模型列表
2025-12-30 22:42:00 +08:00
程序猿MT
5cad90fb4d
Merge branch 'Wei-Shaw:main' into main
2025-12-30 17:14:39 +08:00
yangjianbo
8cb2d3b352
fix(仓储): 规范 rows.Close 错误回传
...
统一 usage_log_repo 查询的 Close 错误处理,避免\n成功路径吞掉关闭失败
scanSingleRow 使用 errors.Join 合并 Close 错误,\n保留 ErrNoRows 可判定
测试: make -C backend test-unit
2025-12-30 17:13:32 +08:00
shaw
3d296d8898
style: 修复 gofmt 格式化问题
...
格式化以下测试文件以符合 Go 代码风格规范:
- fixtures_integration_test.go
- user_repo_integration_test.go
- api_key_service_delete_test.go
2025-12-30 17:08:36 +08:00
yangjianbo
aacbc98aec
fix(仓储): 修复查询关闭错误并迁移集成测试
...
修复 rows.Close 失败时的错误返回逻辑
迁移网关路由集成测试到 ent 事务基建
补齐仓储接口变更对应的测试桩方法
新增 backend/Makefile 统一测试命令
测试: GOTOOLCHAIN=go1.24.11 go test ./...
测试: golangci-lint run ./... --timeout=5m
测试: make test-integration
2025-12-30 16:41:45 +08:00
yangjianbo
b9a753cd04
fix(仓库): 使用 ent 实现账号调度查询
...
替换 gorm 查询并复用分组过滤逻辑,避免编译错误
2025-12-30 14:35:29 +08:00
yangjianbo
809ea23587
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
2025-12-30 14:15:52 +08:00
shaw
2004230b66
Merge branch 'fix/token-invalidation-on-password-change'
2025-12-30 11:19:58 +08:00
刀刀
0026e871f0
CC Stream 响应流中出现 error 时, 增加返回重试 ( #86 )
...
* 响应流中出现 error, 返回重试
* 响应流中出现 error, 返回重试
2025-12-30 10:48:55 +08:00