1. 04 Apr, 2026 9 commits
    • erio's avatar
      refactor: unify interval filtering and eliminate redundant Resolve calls · e88b2890
      erio authored
      - applyRequestTierOverrides now uses filterValidIntervals consistently
        with applyTokenOverrides (per_request/image modes were not filtering)
      - CostInput accepts optional pre-resolved pricing via Resolved field,
        eliminating duplicate Resolver.Resolve() calls in gateway billing paths
      e88b2890
    • erio's avatar
      refactor: extract computeTokenBreakdown to deduplicate billing logic · 3cd398b0
      erio authored
      - calculateTokenCost reduced from 80 to 15 lines
      - calculateCostInternal reduced from 91 to 15 lines
      - Shared logic in computeTokenBreakdown + computeCacheCreationCost
      - Unified rateMultiplier <= 0 protection in both paths
      3cd398b0
    • erio's avatar
      fix: billing mode display follows cost calculation result · f3ab3fe5
      erio authored
      Instead of hardcoding BillingMode="image" when ImageCount>0,
      let cost.BillingMode (set by CalculateCostUnified/CalculateImageCost)
      take priority. This ensures channel token pricing shows "token" mode.
      f3ab3fe5
    • erio's avatar
      feat: image output token billing, channel-mapped billing source, credits balance precheck · d72ac926
      erio authored
      - Parse candidatesTokensDetails from Gemini API to separate image/text output tokens
      - Add image_output_tokens and image_output_cost to usage_log (migration 089)
      - Support per-image-token pricing via output_cost_per_image_token from model pricing data
      - Channel pricing ImageOutputPrice override works in token billing mode
      - Auto-fill image_output_price in channel pricing form from model defaults
      - Add "channel_mapped" billing model source as new default (migration 088)
      - Bills by model name after channel mapping, before account mapping
      - Fix channel cache error TTL sign error (115s → 5s)
      - Fix Update channel only invalidating new groups, not removed groups
      - Fix frontend model_mapping clearing sending undefined instead of {}
      - Credits balance precheck via shared AccountUsageService cache before injection
      - Skip credits injection for accounts with insufficient balance
      - Don't mark credits exhausted for "exhausted your capacity on this model" 429s
      d72ac926
    • erio's avatar
      fix(channel): 全平台渠道映射覆盖 + 公共函数抽取 + 死代码清理 · eb385457
      erio authored
      - 4个缺失handler入口添加渠道映射+限制检查(ChatCompletions/Responses/Gemini)
      - 模型限制错误信息优化,区分"模型不可用"和"无账号"
      - OpenAI RecordUsage RequestedModel 改用 OriginalModel
      - ResolveChannelMappingAndRestrict/ReplaceModelInBody 抽取到 ChannelService 消除跨service重复
      - validateNoDuplicateModels 按 platform:model 去重
      - 删除 Channel.ResolveMappedModel 死代码和 CalculateCostWithChannel Deprecated方法
      - 移除冗余nil检查,抽取 validatePricingBillingMode 公共校验
      eb385457
    • erio's avatar
      fix(billing): 按次计费回退到默认 PerRequestPrice · 0fbc9a44
      erio authored
      ResolvedPricing 新增 DefaultPerRequestPrice,当无层级匹配时使用渠道的默认按次价格
      0fbc9a44
    • erio's avatar
      feat(billing): 网关计费迁移到 CalculateCostUnified + 模型限制错误统一 · 632035aa
      erio authored
      - GatewayService/OpenAIGatewayService 注入 ModelPricingResolver
      - RecordUsage 从旧路径迁移到 CalculateCostUnified(支持 per_request/image 模式)
      - 无渠道时自动回退旧路径,保持原有行为
      - 长上下文双倍计费仅在无渠道定价时生效
      - CostBreakdown 新增 BillingMode 字段,使用日志记录实际计费模式
      - 模型限制错误改为与"无可用账号"相同的 503 响应
      632035aa
    • erio's avatar
      983fe589
    • erio's avatar
      feat(channel): 渠道管理系统 — 多模式定价 + 统一计费解析 · 91c9b8d0
      erio authored
      Cherry-picked from release/custom-0.1.106: a9117600
      91c9b8d0
  2. 20 Mar, 2026 2 commits
  3. 19 Mar, 2026 1 commit
    • Remx's avatar
      feat(openai): 增加 gpt-5.4-mini/nano 模型支持与定价配置 · 42d73118
      Remx authored
      - 接入 gpt-5.4-mini/nano 模型识别与规范化,补充默认模型列表
      - 增加 gpt-5.4-mini/nano 输入/缓存命中/输出价格与计费兜底逻辑
      - 同步前端模型白名单与 OpenCode 配置
      - 补充 service tier(priority/flex) 计费回归测试
      42d73118
  4. 09 Mar, 2026 1 commit
  5. 06 Mar, 2026 2 commits
    • yangjianbo's avatar
      fix(openai): 修复 gpt-5.4 长上下文计费与快照白名单 · f3660264
      yangjianbo authored
      补齐 gpt-5.4 fallback 的长上下文计费元信息,\n确保超过 272000 输入 token 时对整次会话应用\n2x 输入与 1.5x 输出计费规则。\n\n同时将官方快照 gpt-5.4-2026-03-05 加入前端\n白名单候选与回归测试,避免 whitelist 模式误拦截。\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
      
      (cherry picked from commit d95497af87f608c6dadcbe7d6e851de9413ae147)
      f3660264
    • yangjianbo's avatar
      feat(openai): 增加 gpt-5.4 模型支持与定价配置 · 1a0d4ed6
      yangjianbo authored
      
      
      - 接入 gpt-5.4 模型识别与规范化,补充默认模型列表
      - 增加 gpt-5.4 输入/缓存命中/输出价格与计费兜底逻辑
      - 同步前端模型白名单与 OpenCode 上下文窗口(1050000/128000)
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      (cherry picked from commit 924476dcac6181cd0f3ee731ec7b73672ff03793)
      1a0d4ed6
  6. 03 Mar, 2026 1 commit
  7. 27 Feb, 2026 1 commit
    • erio's avatar
      fix: add 2K image default pricing at 1.5x base price · d1b684b7
      erio authored
      Previously 2K images used the same base price as 1K ($0.134).
      Now 2K uses 1.5x multiplier ($0.201), consistent with 4K using 2x ($0.268).
      
      - Backend: add 2K size branch in getDefaultImagePrice
      - Frontend: update 2K placeholder from 0.134 to 0.201
      - Tests: update assertions for new 2K default price
      d1b684b7
  8. 24 Feb, 2026 2 commits
  9. 14 Feb, 2026 1 commit
    • 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
  10. 10 Feb, 2026 1 commit
    • 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
  11. 02 Feb, 2026 2 commits
  12. 31 Jan, 2026 1 commit
  13. 05 Jan, 2026 1 commit
    • song's avatar
      feat: 图片生成计费功能 · d4c2b723
      song authored
      - 新增 Group 图片价格配置(image_price_1k/2k/4k)
      - BillingService 新增 CalculateImageCost 方法
      - AntigravityGatewayService 支持识别图片生成模型并按次计费
      - UsageLog 新增 image_count 和 image_size 字段
      - 前端分组管理支持配置图片价格(antigravity 和 gemini 平台)
      - 图片计费复用通用计费能力(余额检查、扣费、倍率、订阅限额)
      d4c2b723
  14. 25 Dec, 2025 1 commit
  15. 24 Dec, 2025 1 commit
  16. 20 Dec, 2025 1 commit
  17. 18 Dec, 2025 1 commit