1. 26 Feb, 2026 3 commits
    • alfadb's avatar
      fix(gateway): return 404 instead of fake 200 for unsupported count_tokens endpoint · 94895314
      alfadb authored
      PR #635 returned HTTP 200 with {"input_tokens": 0} when upstream doesn't
      support count_tokens (404). This caused Claude Code CLI to trust the zero
      value, believing context uses 0 tokens, so auto-compression never triggers.
      
      Fix: return 404 with proper error body so CLI falls back to its local
      tokenizer for accurate estimation. Return nil (not error) to avoid
      polluting ops error metrics with expected 404s.
      
      Affected paths:
      - Passthrough APIKey accounts: upstream 404 now passed through as 404
      - Antigravity accounts: same fix (was also returning fake 200)
      94895314
    • shaw's avatar
      4ac57b4e
    • alfadb's avatar
      fix: count_tokens 端点不支持时降级返回空值 (404 only) · 03bcd94a
      alfadb authored
      第三方 Anthropic 中转站通常不支持 /v1/messages/count_tokens 端点,
      上游返回 404 时降级返回 {input_tokens: 0},客户端 fallback 到本地估算。
      
      - 仅匹配 404 状态码,语义明确:端点不存在
      - 其他错误 (400/429/500) 保留原始处理链和 ops 遥测
      - 无需解析错误消息内容,不依赖字符串匹配
      - 新增 table-driven 测试覆盖 fallback 和 non-fallback 路径
      03bcd94a
  2. 24 Feb, 2026 1 commit
  3. 22 Feb, 2026 2 commits
  4. 21 Feb, 2026 2 commits
  5. 19 Feb, 2026 2 commits
  6. 18 Feb, 2026 1 commit
  7. 17 Feb, 2026 1 commit
  8. 16 Feb, 2026 1 commit
  9. 14 Feb, 2026 2 commits
    • shaw's avatar
      feat: 区分 Anthropic 5m/1h 缓存创建 token 的差异化计费 · a817cafe
      shaw authored
      Anthropic API 的 cache_creation 对象区分了 ephemeral_5m 和 ephemeral_1h
      两种缓存创建 token,1h 单价远高于 5m(如 claude-3-5-haiku: 5m=$1/MTok,
      1h=$6/MTok)。此前系统统一按 5m 单价计费,导致计费偏低。
      
      后端:
      - pricing_service: 加载 LiteLLM 的 cache_creation_input_token_cost_above_1hr
      - billing_service: GetModelPricing 启用分类计费(安全守卫 1h>5m),
        CalculateCost 按 5m/1h 分别计费,无明细时回退到 5m 单价
      - gateway_service: parseSSEUsage/handleNonStreamingResponse 用 gjson
        提取嵌套 cache_creation 对象的 ephemeral_5m/1h_input_tokens
      - antigravity_gateway_service: extractSSEUsage/extractClaudeUsage 同步提取
      - usage_log: 修复 GORM column tag 确保写入正确的数据库列
      - 新增迁移 054: 删除 GORM 自动生成的重复列
      
      前端:
      - 使用记录 tooltip 展示 5m/1h 缓存创建明细(带彩色 badge 区分)
      - 表格单元格缓存写入数值旁显示 1h 标识
      a817cafe
    • yangjianbo's avatar
  10. 12 Feb, 2026 1 commit
    • yangjianbo's avatar
      chore(logging): 完成后端日志审计与结构化迁移 · 584cfc3d
      yangjianbo authored
      - 将高密度服务与处理器日志迁移到新日志系统(LegacyPrintf/结构化日志)
      - 增加 stdlog bridge 与兼容测试,保留旧日志捕获能力
      - 将 OpenAI 断流告警改为结构化 Warn 并改造对应测试为 sink 捕获
      - 补齐后端相关文件 logger 引用并通过全量 go test
      584cfc3d
  11. 11 Feb, 2026 1 commit
  12. 10 Feb, 2026 2 commits
  13. 09 Feb, 2026 4 commits
    • 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
    • Rose Ding's avatar
      fix: 单账号分组首次 503 不设模型限流标记,避免后续请求雪崩 · 021abfca
      Rose Ding authored
      单账号 antigravity 分组收到 503 (MODEL_CAPACITY_EXHAUSTED) 时,
      原逻辑会设置 ~29s 模型限流标记。由于只有一个账号无法切换,
      后续所有新请求在预检查时命中限流 → 几毫秒内直接返回 503,
      导致约 30 秒的雪崩窗口。
      
      修复:在 Handler 入口处检查分组是否只有单个 antigravity 账号,
      如果是则提前设置 SingleAccountRetry context 标记,让 Service 层
      首次 503 就走原地重试逻辑(不设限流标记),避免污染后续请求。
      021abfca
    • erio's avatar
      refactor: replace scope-level rate limiting with model-level rate limiting · fc095bf0
      erio authored
      Merge functional changes from develop branch:
      - Remove AntigravityQuotaScope system (claude/gemini_text/gemini_image)
      - Replace with per-model rate limiting using resolveAntigravityModelKey
      - Remove model load statistics (IncrModelCallCount/GetModelLoadBatch)
      - Simplify account selection to unified priority→load→LRU algorithm
      - Remove SetAntigravityQuotaScopeLimit from AccountRepository
      - Clean up scope-related UI indicators and API fields
      fc095bf0
  14. 08 Feb, 2026 4 commits
  15. 07 Feb, 2026 10 commits
  16. 06 Feb, 2026 3 commits
    • yangjianbo's avatar
      perf(service): SSE Scanner buffer 改用 sync.Pool 复用,减少高并发 GC 压力 · d71537d4
      yangjianbo authored
      
      
      将流式响应中 bufio.Scanner 的 64KB buffer 从每次 make 分配改为
      sync.Pool 复用,统一切片表达式为 [:0]、变量命名为 scanBuf,
      并补充对应的单元测试。
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      d71537d4
    • shaw's avatar
      fix(gateway): 移除 PR #316 引入的工具名转换逻辑 · d182ef03
      shaw authored
      移除响应阶段的工具名/schema/description 转换逻辑,修复第三方工具调用时
      工具名被错误转换的问题(如 Task → task)。
      
      移除内容:
      - 工具名相关正则变量(toolPrefixRe, toolNameBoundaryRe 等)
      - openCodeToolOverrides 和 claudeToolNameOverrides 映射表
      - 工具名转换函数(normalizeToolNameForClaude, normalizeToolNameForOpenCode 等)
      - 响应体工具名替换函数(replaceToolNamesInText, replaceToolNamesInResponseBody 等)
      - 参数名转换函数(normalizeParamNameForOpenCode, rewriteParamKeysInValue)
      - 工具描述清理函数(sanitizeToolDescription)
      - 输入 schema 转换函数(normalizeToolInputSchema)
      - 模型 ID 正则替换函数(replaceModelIDInText)
      
      保留内容:
      - 系统提示词清理(sanitizeSystemText)
      - Claude Code 指纹 headers 处理
      - 模型 ID 映射(通过 JSON 对象操作)
      d182ef03
    • yangjianbo's avatar
      fix(兼容): 将 Kimi cached_tokens 映射到 Claude 标准 cache_read_input_tokens · f33a9501
      yangjianbo authored
      
      
      Kimi 等 Claude 兼容 API 返回缓存信息使用 OpenAI 风格的 cached_tokens 字段,
      而非 Claude 标准的 cache_read_input_tokens,导致客户端收不到缓存命中信息且
      内部计费缓存折扣为 0。
      
      新增 reconcileCachedTokens 辅助函数,在 cache_read_input_tokens == 0 且
      cached_tokens > 0 时自动填充,覆盖流式(message_start/message_delta)和
      非流式两种响应路径。对 Claude 原生上游无影响。
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      f33a9501