1. 05 Apr, 2026 2 commits
  2. 04 Apr, 2026 4 commits
  3. 03 Apr, 2026 2 commits
  4. 02 Apr, 2026 14 commits
  5. 01 Apr, 2026 7 commits
  6. 31 Mar, 2026 11 commits
    • fix: move image count n to OtherRatio to prevent double-counting · ab99c308
      The previous commit commented out AddOtherRatio("n") in the Ali
      adaptor to fix double-counting but this could cause billing evasion
      when n is specified via extra["parameters"] instead of request.N.
      
      Root cause: ImagePriceRatio in GetTokenCountMeta() already included
      n, AND channel adaptors added OtherRatio("n"), resulting in n²
      billing.
      
      Proper fix:
      - Remove n from ImagePriceRatio (keep sizeRatio * qualityRatio only)
      - In ImageHelper, add default OtherRatio("n") when adaptor hasn't
        set one; set fallback tokens to 1 (base unit)
      - Restore Ali adaptor's AddOtherRatio("n") — it uses actual upstream
        parameters/response count, preventing billing evasion
      CaIon committed
    • fix(EditChannelModal): enhance clipboard handling with error checks · 670abee2
      Added checks to ensure clipboard functionality is available before attempting to read from it. Improved error handling during clipboard read operations to prevent unhandled exceptions.
      CaIon committed
    • feat: add clipboard magic string for quick channel creation from token copy · 8bb9a42f
      When copying a token, users can now choose "Copy Connection String" which
      encodes both the API key and server URL as a JSON clipboard payload
      (type: newapi_channel_conn). When opening the channel creation form, the
      clipboard is auto-detected and a banner offers to fill key + base_url,
      eliminating repeated tab-switching when connecting to another new-api instance.
      CaIon committed
    • Merge pull request #3462 from DaZuiZui/main · 3734059d
      docs(zh-TW): fix missing content and add partner logo
      Calcium-Ion committed
    • Merge pull request #3474 from wans10/main · 26ce873f
      fix(dashboard): 修复消耗分布图表悬浮时滚动条闪烁
      Calcium-Ion committed
    • refactor: use POST for account binding endpoints and normalize reset responses · e099117c
      - Switch /api/oauth/email/bind and /api/oauth/wechat/bind from GET to
        POST with JSON body for better REST semantics
      - Normalize password reset endpoint to return consistent responses
      - Apply url.QueryEscape to WeChat code parameter for robustness
      CaIon committed
    • style: enhance footer layout and add custom class for styling · 310d618a
      - Refactor Footer component to use a semantic <footer> element for better accessibility.
      - Update CSS to include a new class for the custom footer, allowing for relative positioning.
      - Adjust layout to improve responsiveness and visual alignment of footer content.
      CaIon committed
    • fix: harden SSRF protection for unauthenticated and user-level endpoints · 20399d3c
      - Add ValidateURLWithFetchSetting check before fetching MJ image URLs
        in RelayMidjourneyImage (unauthenticated endpoint)
      - Add ValidateURLWithFetchSetting check before fetching video URLs
        in VideoProxy (upstream-controlled URL)
      - Enable ApplyIPFilterForDomain by default to prevent DNS rebinding
        bypass of SSRF protection
      - Elevate FetchModels endpoint from AdminAuth to RootAuth
      - Update frontend: mark domain IP filtering as recommended, update
        description and i18n translations (zh-CN/zh-TW/en/fr/ja/ru/vi)
      CaIon committed
    • Comment out price data adjustment logic · 53aeee4f
      Comment out code that modifies price data based on image count.
      测试发现,如果是接入阿里百炼平台的qwen-image-2.0系列模型,这边计费的时候会出现 0.2*n*倍率*n的情况,最前面的0.2*n会直接显示为模型价格。
      例如:
      日志详情	模型价格 $0.600000,专属倍率 0.3
      其他详情	大小 1080*1920, 品质 standard, 生成数量 3, 其他倍率 n: 3.000000
      计费过程	模型价格:$0.600000 * 专属倍率:0.3 = $0.180000
      刘泓宾 committed
    • feat: record stream interruption reasons via StreamStatus · 5238f279
      - Add StreamStatus type (relay/common) to track stream end reason
        (done/timeout/client_gone/scanner_error/eof/panic/ping_fail) and
        accumulate soft errors during streaming via sync.Once + sync.Mutex.
      - Add StreamResult (relay/helper) as the callback interface: adapters
        call sr.Error() for soft errors, sr.Stop() for fatal, sr.Done() for
        normal completion. No early-return problem — multiple errors per chunk
        are naturally supported.
      - Refactor StreamScannerHandler callback from func(string) bool to
        func(string, *StreamResult). All 9 channel adapters updated.
      - Write stream_status into log other JSON field (admin-only) with
        status ok/error, end_reason, error_count, and error messages.
      - Frontend: display stream status in log detail expansion for admins.
      CaIon committed