1. 24 Mar, 2026 6 commits
  2. 23 Mar, 2026 6 commits
    • qingyuzhang's avatar
      ce8520c9
    • Ethan0x0000's avatar
      feat(routes): add platform-based routing split for /v1/responses and /v1/chat/completions · d927c0e4
      Ethan0x0000 authored
      Mirror the existing /v1/messages platform split pattern:
      - OpenAI groups → OpenAIGateway handlers (existing, unchanged)
      - Non-OpenAI groups → Gateway handlers (new Anthropic-upstream path)
      
      Updated both /v1 prefixed routes and non-prefixed alias routes
      (/responses, /chat/completions). WebSocket route (/v1/responses GET)
      remains OpenAI-only as Anthropic has no WebSocket equivalent.
      d927c0e4
    • Ethan0x0000's avatar
      feat(handler): add Responses/ChatCompletions handlers on GatewayHandler · 31660c4c
      Ethan0x0000 authored
      New HTTP handlers for Anthropic platform groups accepting OpenAI-format
      endpoints:
      
      - GatewayHandler.Responses: /v1/responses for non-OpenAI groups
      - GatewayHandler.ChatCompletions: /v1/chat/completions for non-OpenAI groups
      
      Both handlers include:
      - Claude Code only restriction (403 reject when claude_code_only enabled,
        since these endpoints are never Claude Code clients)
      - Full auth → billing → user/account concurrency → failover loop
      - Ops error/endpoint context propagation
      - Async usage recording via worker pool
      
      Error responses use each endpoint's native format (Responses API format
      for /v1/responses, CC format for /v1/chat/completions).
      31660c4c
    • Ethan0x0000's avatar
      feat(service): add ForwardAsResponses/ForwardAsChatCompletions on GatewayService · 4321adab
      Ethan0x0000 authored
      New forwarding methods on GatewayService for Anthropic platform groups:
      
      - ForwardAsResponses: accept Responses body → convert to Anthropic →
        forward to upstream → convert response back to Responses format.
        Supports both streaming (SSE event-by-event conversion) and buffered
        (accumulate then convert) response modes.
      - ForwardAsChatCompletions: chain CC→Responses→Anthropic for request,
        Anthropic→Responses→CC for response. Streaming uses dual state machine
        chain with [DONE] marker.
      
      Both methods reuse existing GatewayService infrastructure:
      buildUpstreamRequest, Claude Code mimicry, cache control enforcement,
      model mapping, and return UpstreamFailoverError for handler-level retry.
      4321adab
    • Ethan0x0000's avatar
      feat(apicompat): add ResponsesAnthropic bidirectional format conversion · 68f151f5
      Ethan0x0000 authored
      Add reverse-direction converters for Anthropic platform groups to accept
      OpenAI-format requests:
      
      - ResponsesToAnthropicRequest: Responses API input → Anthropic Messages
        request with system extraction, tool/toolChoice mapping, reasoning
        effort conversion, image data URIbase64, and consecutive role merging
      - AnthropicToResponsesResponse: Anthropic response → Responses response
        with content block→output item mapping, usage, stop_reason→status
      - AnthropicEventToResponsesEvents: stateful SSE stream converter
        (Anthropic streaming protocol → Responses streaming protocol)
      - FinalizeAnthropicResponsesStream: synthetic termination for
        incomplete streams
      68f151f5
    • weak-fox's avatar
      feat(admin): add account privacy mode filter · 4838ab74
      weak-fox authored
      4838ab74
  3. 22 Mar, 2026 3 commits
  4. 21 Mar, 2026 8 commits
  5. 20 Mar, 2026 14 commits
  6. 19 Mar, 2026 3 commits
    • erio's avatar
      fix(antigravity): correctly mark credits exhausted on "Resource has been exhausted" 429 · 21b6f2d5
      erio authored
      shouldMarkCreditsExhausted was blocked by isURLLevelRateLimit check when
      credit overages retry returned "Resource has been exhausted (e.g. check quota).",
      causing credits to never be marked as exhausted. This led to an infinite loop
      where each request injected credits, bypassed model rate limits, and failed again.
      
      - Remove isURLLevelRateLimit guard from shouldMarkCreditsExhausted (only called
        for credit retry responses — if credits retry fails, mark exhausted)
      - Add "resource has been exhausted" to creditsExhaustedKeywords
      - Update tests to match corrected behavior
      21b6f2d5
    • erio's avatar
      fix(antigravity): fast-fail on proxy unavailable, temp-unschedule account · 528ff5d2
      erio authored
      ## Problem
      
      When a proxy is unreachable, token refresh retries up to 4 times with
      30s timeout each, causing requests to hang for ~2 minutes before
      failing with a generic 502 error. The failed account is not marked,
      so subsequent requests keep hitting it.
      
      ## Changes
      
      ### Proxy connection fast-fail
      - Set TCP dial timeout to 5s and TLS handshake timeout to 5s on
        antigravity client, so proxy connectivity issues fail within 5s
        instead of 30s
      - Reduce overall HTTP client timeout from 30s to 10s
      - Export `IsConnectionError` for service-layer use
      - Detect proxy connection errors in `RefreshToken` and return
        immediately with "proxy unavailable" error (no retries)
      
      ### Token refresh temp-unschedulable
      - Add 8s context timeout for token refresh on request path
      - Mark account as temp-unschedulable for 10min when refresh fails
        (both background `TokenRefreshService` and request-path
        `GetAccessToken`)
      - Sync temp-unschedulable state to Redis cache for immediate
        scheduler effect
      - Inject `TempUnschedCache` into `AntigravityTokenProvider`
      
      ### Account failover
      - Return `UpstreamFailoverError` on `GetAccessToken` failure in
        `Forward`/`ForwardGemini` to trigger handler-level account switch
        instead of returning 502 directly
      
      ### Proxy probe alignment
      - Apply same 5s dial/TLS timeout to shared `httpclient` pool
      - Reduce proxy probe timeout from 30s to 10s
      528ff5d2
    • QTom's avatar
      feat(admin): 用户管理新增分组列、分组筛选与专属分组一键替换 · ba7d2aec
      QTom authored
      - 新增分组列:展示用户的专属/公开分组,支持 hover 查看详情
      - 新增分组筛选:下拉选择或模糊搜索分组名过滤用户
      - 专属分组替换:点击专属分组弹出操作菜单,选择目标分组后
        自动授予新分组权限、迁移绑定的 Key、移除旧分组权限
      - 后端新增 POST /admin/users/:id/replace-group 端点,事务内
        完成分组替换并失效认证缓存
      ba7d2aec