"backend/internal/service/vscode:/vscode.git/clone" did not exist on "655382800899185ba0905cda4186aa81c3781fb0"
  1. 31 Dec, 2025 23 commits
    • IanShaw027's avatar
      fix(gemini): 修复 P0/P1 级别问题(429误判/Tier丢失/expires_at/前端一致性) · e4928177
      IanShaw027 authored
      P0 修复(Critical - 影响生产稳定性):
      - 修复 429 判断逻辑:使用 project_id 判断而非 account.Type
        防止 AI Studio OAuth 被误判为 Code Assist 5分钟窗口
      - 修复 Tier ID 丢失:刷新时始终保留旧值,默认 LEGACY
        防止 fetchProjectID 失败导致 tier_id 被清空
      - 修复 expires_at 下界:添加 minTTL=30s 保护
        防止 expires_in <= 300 时生成过去时间引发刷新风暴
      
      P1 修复(Important - 行为一致性):
      - 前端 isCodeAssist 判断与后端一致(支持 legacy)
      - 前端日期解析添加 NaN 保护
      - 迁移脚本覆盖 legacy 账号
      
      前端功能(新增):
      - AccountQuotaInfo 组件:Tier Badge + 二元进度条 + 倒计时
      - 定时器动态管理:watch 监听限流状态
      - 类型定义:GeminiCredentials 接口
      
      测试:
      -  TypeScript 类型检查通过
      -  前端构建成功(3.33s)
      -  Gemini + Codex 双 AI 审查通过
      
      Refs: #gemini-quota
      e4928177
    • IanShaw's avatar
      fix: 修复 /v1/messages 间歇性 400 错误 (#18) · 34c10204
      IanShaw authored
      * 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 函数
      34c10204
    • shaw's avatar
      style: fix gofmt formatting in claude_types.go · 8e55ee0e
      shaw authored
      8e55ee0e
    • NepetaLemon's avatar
      refactor: 移除 infrastructure 目录 (#108) · 2270a54f
      NepetaLemon authored
      * refactor: 迁移初始化 db 和 redis 到 repository
      
      * refactor: 迁移 errors 到 pkg
      2270a54f
    • shaw's avatar
      chore(token-refresh): 添加 Antigravity Token 刷新调试日志 · bb7ade26
      shaw authored
      - NeedsRefresh 判断为 true 时输出 expires_at、time_until_expiry、window
      - 修正注释中的刷新窗口描述(10分钟 → 15分钟)
      bb7ade26
    • shaw's avatar
      fix(billing): 修复限额为0时消费记录失败的问题 · c5b792ad
      shaw authored
      - 添加 normalizeLimit 函数,将 0 或负数限额规范化为 nil(无限制)
      - 简化 IncrementUsage,移除冗余的配额检查逻辑
        - 配额检查已在请求前由中间件和网关完成
        - 消费记录应无条件执行,确保数据完整性
      - 删除测试限额超出行为的无效集成测试
      c5b792ad
    • IanShaw027's avatar
      fix(upstream): 完善边界检查和 thinking block 处理 · c1e25b7e
      IanShaw027 authored
      基于 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
      c1e25b7e
    • IanShaw027's avatar
      fix(upstream): 跳过 Claude 模型无 signature 的 thinking block · 35b768b7
      IanShaw027 authored
      - buildParts 函数检测 thinking block 的 signature
      - Claude 模型 (allowDummyThought=false) 时跳过无 signature 的 block
      - 记录警告日志以便调试
      - Gemini 模型继续使用 dummy signature 兼容方案
      
      修复 Issue 0.1: Claude thinking block signature 缺失错误
      35b768b7
    • shaw's avatar
      0b637117
    • IanShaw027's avatar
      fix(upstream): 支持 Claude custom 类型工具 (MCP) 格式 · 15e676e9
      IanShaw027 authored
      - ClaudeTool 结构体增加 Type 和 Custom 字段
      - buildTools 函数支持从 custom 字段读取 input_schema
      - convertClaudeToolsToGeminiTools 函数支持 MCP 工具格式
      - 修复 Antigravity upstream error 400: JSON schema invalid
      
      修复 Issue 0.2: tools.X.custom.input_schema 验证错误
      15e676e9
    • shaw's avatar
      refactor(service): 统一时间戳解析,支持多种格式 · 81213f23
      shaw authored
      新增 Account.GetCredentialAsTime 方法,统一处理凭证中的时间戳字段,
      兼容 RFC3339 字符串、Unix 时间戳字符串和数字类型。
      
      - 重构 Claude/Gemini/Antigravity TokenRefresher.NeedsRefresh
      - 移除重复的 parseExpiresAt/parseAntigravityExpiresAt 函数
      - 简化 GetOpenAITokenExpiresAt 实现
      - 新增 RFC3339 格式单元测试用例
      81213f23
    • yangjianbo's avatar
      fix(网关): 添加 model 参数必填验证 · 1ef4f09d
      yangjianbo authored
      在以下端点添加 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: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      1ef4f09d
    • shaw's avatar
      style: fix gofmt formatting in test file · aac7dd6b
      shaw authored
      Remove redundant alignment whitespace before comments.
      aac7dd6b
    • yangjianbo's avatar
      fix(设置): 修复站点设置保存失败的问题 · 6f6dc303
      yangjianbo authored
      问题:
      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: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      6f6dc303
    • yangjianbo's avatar
      fix(仓储): 修复并发缓存前缀与软删除更新 · d77d0544
      yangjianbo authored
      补齐 Redis ZSET 前缀处理,确保并发释放计数正确
      
      删除时改用 Client().Mutate 走更新逻辑,保留软删除记录
      
      测试: make test-integration
      d77d0544
    • yangjianbo's avatar
      fix(lint): 修复 golangci-lint 报告的代码问题 · 682f546c
      yangjianbo authored
      - 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: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      682f546c
    • yangjianbo's avatar
      fix(数据层): 修复数据完整性与仓储一致性问题 · 5906f9ab
      yangjianbo authored
      ## 数据完整性修复 (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: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      5906f9ab
    • yangjianbo's avatar
      fix(网关): 防止连接池缓存失控 · 820bb16c
      yangjianbo authored
      超限且无可淘汰条目时拒绝新建
      
      规范化代理地址并更新失败时的访问时间
      
      补充连接池上限与代理规范化测试
      820bb16c
    • Wei Shaw's avatar
      a1540e27
    • yangjianbo's avatar
      perf(网关): 实现上游账号连接池隔离 · d1c98896
      yangjianbo authored
      新增隔离策略与连接池缓存回收
      
      连接池大小跟随账号并发并处理代理切换
      
      同步配置默认值与示例并补充测试
      d1c98896
    • shaw's avatar
      fix: 修复Antigravity token刷新间隔问题 · b7c6d040
      shaw authored
      b7c6d040
    • yangjianbo's avatar
      fix(服务): 修复system判定、统计时区与缓存日志 · 3d7f8e4b
      yangjianbo authored
      - system 字段存在即视为显式提供,避免 null 触发默认注入
      - 日统计分组显式使用应用时区,缺失时从 TZ 回退到 UTC
      - 缓存写入队列丢弃日志节流汇总,关键任务同步回退
      
      测试: go test ./internal/service -run TestBillingCacheServiceQueueHighLoad
      3d7f8e4b
    • yangjianbo's avatar
      perf(后端): 完成性能优化与连接池配置 · 7efa8b54
      yangjianbo authored
      新增 DB/Redis 连接池配置与校验,并补充单测
      
      网关请求体大小限制与 413 处理
      
      HTTP/req 客户端池化并调整上游连接池默认值
      
      并发槽位改为 ZSET+Lua 与指数退避
      
      用量统计改 SQL 聚合并新增索引迁移
      
      计费缓存写入改工作池并补测试/基准
      
      测试: 在 backend/ 下运行 go test ./...
      7efa8b54
  2. 30 Dec, 2025 13 commits
  3. 29 Dec, 2025 4 commits