1. 13 Feb, 2026 3 commits
  2. 12 Feb, 2026 13 commits
  3. 11 Feb, 2026 4 commits
    • yangjianbo's avatar
      fix(openai): 修复 OAuth 透传流式断开与压缩头问题 · a88bb868
      yangjianbo authored
      - 透传流式在客户端断开后继续 drain 上游并解析 usage,避免计费信息丢失
      
      - 阻断透传 accept-encoding,避免压缩响应影响 SSE/usage 解析
      
      - 阻断 proxy-authorization,避免透传代理鉴权信息
      
      - 补充回归测试:请求头阻断与断流后 usage 采集
      a88bb868
    • sususu98's avatar
      fix: include Gemini thoughtsTokenCount in output token billing · d21d70a5
      sususu98 authored
      Gemini 2.5 Pro/Flash thinking models return thoughtsTokenCount separately
      from candidatesTokenCount in usageMetadata, but this field was not parsed
      or included in billing calculations, causing thinking tokens to be
      unbilled.
      
      - Add ThoughtsTokenCount field to GeminiUsageMetadata struct
      - Include thoughtsTokenCount in OutputTokens across all 3 Gemini usage
        parsing paths (non-streaming, streaming, compat layer)
      - Add tests covering thinking token scenarios
      
      Closes #554
      d21d70a5
    • Edric Li's avatar
      feat(antigravity): 添加 onboardUser 支持并修复 project_id 补齐逻辑 · a4a46a86
      Edric Li authored
      - 新增 OnboardUser API 客户端方法,支持账号 onboarding 获取 project_id
      - loadProjectIDWithRetry 增加 onboard 回退:LoadCodeAssist 未返回 project_id 时自动触发 onboarding
      - GetAccessToken 中 project_id 补齐改用轻量 FillProjectID 替代全量 RefreshAccountToken
      - 补齐逻辑增加 5 分钟冷却机制,防止频繁重试
      - OnboardUser 轮询等待改为 context 感知,支持提前取消
      - 提取 mergeCredentials 辅助方法消除重复代码
      - 新增 extractProjectIDFromOnboardResponse 和 resolveDefaultTierID 单元测试
      a4a46a86
    • SilentFlower's avatar
      [UPDATE] 增强 Claude Thinking 模式支持与 Opus 4.6 动态预算适配 · 19cca11e
      SilentFlower authored
       feat(antigravity): 支持 thinking adaptive 类型并适配 Opus 4.6 动态预算
      🧪 test(gateway): 增加 thinking 模式解析与签名块过滤的边界用例测试
      19cca11e
  4. 10 Feb, 2026 14 commits
    • Tian's avatar
      feat(antigravity): 支持 Refresh Token 批量导入创建 OAuth 账号 · c8f87a9c
      Tian authored
      后端新增 ValidateRefreshToken service 方法和 POST /oauth/refresh-token 端点,
      前端新增 API/Composable/UI 集成,OAuthAuthorizationFlow i18n 动态化,
      支持在 Antigravity 创建账号时批量粘贴 Refresh Token 自动验证并创建账号。
      c8f87a9c
    • yangjianbo's avatar
      feat(openai): 增加 OAuth 透传开关 · f1e884ce
      yangjianbo authored
      
      
      - 仅对 Codex CLI 且账号开启时走原样透传(只替换认证)
      
      - 透传模式禁用工具修正/模型替换,并旁路解析 usage 用于计费
      
      - 管理后台增加开关与文案,ops upstream error 记录 passthrough 标记
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      f1e884ce
    • yangjianbo's avatar
      perf(service): 优化重试场景 thinking 过滤性能 · 86f31247
      yangjianbo authored
      
      
      - 避免全量 Unmarshal 请求体,改为仅解析 messages 子树
      
      - 顶层 thinking 使用 sjson 直接删除,减少整体重写
      
      - content 仅在需要修改时延迟分配 new slice
      
      - 增加 FilterThinkingBlocksForRetry 基准测试
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      86f31247
    • yangjianbo's avatar
    • Edric Li's avatar
      fix: 修复 CI 检查失败 · 378e476e
      Edric Li authored
      - gofmt: 修复 error_passthrough_service.go 格式问题
      - errcheck: 修复 error_passthrough_runtime_test.go 类型断言未检查
      - staticcheck: if-else 改为 switch (gateway_service.go)
      - test: 修复两个测试用例错误使用 MODEL_CAPACITY_EXHAUSTED 导致走错路径
      378e476e
    • Edric Li's avatar
      perf: 错误处理性能优化 · a54b81cf
      Edric Li authored
      - MatchRule 延迟/限制 body ToLower,先用 statusCode 短路,只在需要关键词匹配时转换且限制 8KB
      - 预计算规则的小写关键词/平台和 error code set,消除运行时重复 ToLower 和线性扫描
      - MODEL_CAPACITY_EXHAUSTED 全局去重,避免并发请求重复重试同一模型
      - 503 重试 body 读取限制从 2MB 降至 8KB
      - time.After 替换为 time.NewTimer,防止 context 取消时 timer 泄漏
      a54b81cf
    • Edric Li's avatar
      fix: 修复错误透传规则 skip_monitoring 未生效的问题 · 2d4236f7
      Edric Li authored
      - ops_error_logger: status < 400 分支增加 OpsSkipPassthroughKey 检查
      - ops_upstream_context: 新增 checkSkipMonitoringForUpstreamEvent,中间重试/故障转移事件也能触发跳过标记
      - gateway_handler/openai_gateway_handler/gemini_v1beta_handler: handleFailoverExhausted 匹配规则后设置 OpsSkipPassthroughKey
      - antigravity_gateway_service: writeMappedClaudeError 增加 applyErrorPassthroughRule 调用
      2d4236f7
    • yangjianbo's avatar
      test(backend): 补充改动代码单元测试覆盖率至 85%+ · e4899967
      yangjianbo authored
      
      
      新增 48 个测试用例覆盖修复代码的各分支路径:
      - subscription_maintenance_queue: nil receiver/task、Stop 幂等、零值参数 (+6)
      - billing_service: CalculateCostWithConfig、错误传播、SoraImageCost 等 (+12)
      - timing_wheel_service: Schedule/ScheduleRecurring after Stop (+3)
      - sora_media_cleanup_service: nil guard、Start/Stop 各分支、timezone (+10)
      - sora_gateway_service: normalizeSoraMediaURLs、buildSoraContent 等辅助函数 (+17)
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      e4899967
    • yangjianbo's avatar
      fix(backend): 修复代码审核发现的 8 个确认问题 · 54fe3632
      yangjianbo authored
      
      
      - P0-1: subscription_maintenance_queue 使用 RWMutex 防止 channel close/send 竞态
      - P0-2: billing_service CalculateCostWithLongContext 修复被吞没的 out-range 错误
      - P1-1: timing_wheel_service Schedule/ScheduleRecurring 添加 SetTimer 错误日志
      - P1-2: sora_gateway_service StoreFromURLs 失败时降级使用原始 URL
      - P1-3: concurrency_cache 用 Pipeline 替代 Lua 脚本兼容 Redis Cluster
      - P1-6: sora_media_cleanup_service runCleanup 添加 nil cfg/storage 防护
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      54fe3632
    • song's avatar
      b1613121
    • song's avatar
      1f647b12
    • Edric Li's avatar
      feat: 错误透传规则支持 skip_monitoring 跳过运维监控记录 · d95e04fd
      Edric Li authored
      在每条错误透传规则上新增 skip_monitoring 选项,开启后匹配该规则的错误
      不会被记录到 ops_error_logs,减少监控噪音。默认关闭,不影响现有规则。
      d95e04fd
    • shaw's avatar
    • yangjianbo's avatar
      perf(backend): 使用 gjson/sjson 优化热路径 JSON 处理 · 58912d4a
      yangjianbo authored
      
      
      将 API 网关热路径中的 json.Unmarshal+json.Marshal 替换为 gjson 零拷贝查询和 sjson 精准写入:
      - unwrapV1InternalResponse 性能提升 22x(4009ns→182ns),内存分配减少 28.5x
      - unwrapGeminiResponse、extractGeminiUsage、estimateGeminiCountTokens、ParseGeminiRateLimitResetTime 改为接收 []byte 使用 gjson 提取
      - ParseGatewayRequest 的 model/stream/metadata/thinking/max_tokens 改用 gjson 类型安全提取
      - Handler 层(sora/openai)改用 gjson 提取字段、sjson 注入/修改字段,移除 map[string]any 中间变量
      - Sora Client 响应解析改用 gjson ForEach 遍历,减少内存分配
      - 新增约 100 个单元测试用例,所有改动函数覆盖率 >85%
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      58912d4a
  5. 09 Feb, 2026 6 commits
    • Edric Li's avatar
      feat: MODEL_CAPACITY_EXHAUSTED 使用固定1s间隔重试60次,不切换账号 · 6114f69c
      Edric Li authored
      MODEL_CAPACITY_EXHAUSTED (503) 表示模型容量不足,所有账号共享同一容量池,
      切换账号无意义。改为固定1s间隔重试最多60次,重试耗尽后直接返回上游错误。
      
      - 新增 antigravityModelCapacityRetryMaxAttempts=60 和 antigravityModelCapacityRetryWait=1s
      - shouldTriggerAntigravitySmartRetry 新增 isModelCapacityExhausted 返回值
      - handleSmartRetry 对 MODEL_CAPACITY_EXHAUSTED 使用独立重试策略
      - handleModelRateLimit 对 MODEL_CAPACITY_EXHAUSTED 仅标记 Handled,不设限流
      - 重试耗尽后不设置模型限流、不清除粘性会话、不切换账号
      6114f69c
    • Edric Li's avatar
      feat: same-account retry before failover for transient errors · d6c2921f
      Edric Li authored
      For retryable transient errors (Google 400 "invalid project resource name"
      and empty stream responses), retry on the same account up to 2 times
      (with 500ms delay) before switching to another account.
      
      - Add RetryableOnSameAccount field to UpstreamFailoverError
      - Add same-account retry loop in both Gemini and Claude/OpenAI handler paths
      - Move temp-unschedule from service layer to handler layer (only after
        all same-account retries exhausted)
      - Reduce temp-unschedule cooldown from 30 minutes to 1 minute
      d6c2921f
    • yangjianbo's avatar
    • Edric Li's avatar
      feat: failover and temp-unschedule on empty stream response · 61c73287
      Edric Li authored
      - Empty stream responses now return UpstreamFailoverError instead of
        plain 502, triggering automatic account switching (up to 10 retries)
      - Add tempUnscheduleEmptyResponse: accounts returning empty responses
        are temp-unscheduled for 30 minutes
      - Apply to both Claude and Gemini non-streaming paths
      - Align googleConfigErrorCooldown from 60m to 30m for consistency
      61c73287
    • Edric Li's avatar
      feat: failover and temp-unschedule on Google "Invalid project resource name" 400 · 89905ec4
      Edric Li authored
      Google 后端间歇性返回 400 "Invalid project resource name" 错误,
      此前该错误直接透传给客户端且不触发账号切换,导致请求失败。
      
      - 在 Antigravity 和 Gemini 两个平台的所有转发路径中,
        精确匹配该错误消息后触发 failover 自动换号重试
      - 命中后将账号临时封禁 1 小时,避免反复调度到同一故障账号
      - 提取共享函数 isGoogleProjectConfigError / tempUnscheduleGoogleConfigError
        消除跨 Service 的代码重复
      89905ec4
    • Rose Ding's avatar
      test: 添加单账号 503 退避重试机制的单元测试 · e4bc3515
      Rose Ding authored
      
      
      覆盖 Service 层和 Handler 层的所有新增逻辑:
      - isSingleAccountRetry context 标记检查
      - handleSmartRetry 中 503 + SingleAccountRetry 分支
      - handleSingleAccountRetryInPlace 原地重试逻辑
      - antigravityRetryLoop 预检查跳过限流
      - sleepAntigravitySingleAccountBackoff 固定延迟退避
      - 端到端集成场景验证
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      e4bc3515