1. 04 Apr, 2026 5 commits
    • 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
      refactor(channel): 抽取渠道映射公共函数 + OpenAI映射到body + 空响应修复 + 清理日志 · 4ea8b4cb
      erio authored
      - 抽取 ResolveChannelMappingAndRestrict 统一入口(5处→1个方法)
      - 抽取 BuildModelMappingChain 到 ChannelMappingResult 方法(5处→1行调用)
      - OpenAI 三入口 Forward 前应用渠道映射到请求体
      - OpenAI Responses/Messages 限制检查添加错误响应
      - 清理前端 3 处 console.log 调试日志
      4ea8b4cb
    • erio's avatar
      feat(channel): 通配符定价匹配 + OpenAI BillingModelSource + 按次价格校验 + 用户端计费模式展示 · 8d03c52e
      erio authored
      - 定价查找支持通配符(suffix *),最长前缀优先匹配
      - 模型限制(restrict_models)同样支持通配符匹配
      - OpenAI 网关接入渠道映射/BillingModelSource/模型限制
      - 按次/图片计费模式创建时强制要求价格或层级(前后端)
      - 用户使用记录列表增加计费模式 badge 列
      8d03c52e
    • erio's avatar
      feat(billing): 网关计费迁移到 CalculateCostUnified + 模型限制错误统一 · 632035aa
      erio authored
      - GatewayService/OpenAIGatewayService 注入 ModelPricingResolver
      - RecordUsage 从旧路径迁移到 CalculateCostUnified(支持 per_request/image 模式)
      - 无渠道时自动回退旧路径,保持原有行为
      - 长上下文双倍计费仅在无渠道定价时生效
      - CostBreakdown 新增 BillingMode 字段,使用日志记录实际计费模式
      - 模型限制错误改为与"无可用账号"相同的 503 响应
      632035aa
    • erio's avatar
      feat(usage): 使用记录增加计费模式字段 — 记录/展示/筛选 token/按次/图片 · a51e0047
      erio authored
      - DB: usage_logs 表新增 billing_mode VARCHAR(20) 列
      - 后端: RecordUsage 写入时根据 image_count 判定计费模式
      - 前端: 使用记录表格新增计费模式 badge 列 + 筛选下拉
      a51e0047
  2. 28 Mar, 2026 1 commit
    • wucm667's avatar
      fix(billing): 计费始终使用用户请求的原始模型,而非映射后的上游模型 · f5764d8d
      wucm667 authored
      当账号配置了模型映射(如 claude-sonnet-4-6 → glm-5.0)时,系统错误地
      使用映射后的上游模型名计算费用。由于上游模型(如 glm-5.0)在定价系统中
      没有价格配置,导致计费失败后被静默置为 0,用户不被扣费。
      
      修改 forwardResultBillingModel 优先返回请求模型名,并移除 OpenAI 路径
      中 BillingModel 字段对计费模型的覆盖逻辑。
      f5764d8d
  3. 24 Mar, 2026 1 commit
  4. 23 Mar, 2026 1 commit
  5. 22 Mar, 2026 1 commit
  6. 20 Mar, 2026 1 commit
  7. 17 Mar, 2026 1 commit
    • Ethan0x0000's avatar
      feat(service): record upstream model across all gateway paths · 2e4ac88a
      Ethan0x0000 authored
      Propagate UpstreamModel through ForwardResult and OpenAIForwardResult in Anthropic direct, API-key passthrough, Bedrock, and OpenAI gateway flows. Extract optionalNonEqualStringPtr and optionalTrimmedStringPtr into usage_log_helpers.go. Store upstream_model only when it differs from the requested model.
      
      Also introduces anthropicPassthroughForwardInput struct to reduce parameter count.
      2e4ac88a
  8. 16 Mar, 2026 1 commit
    • QTom's avatar
      fix(gateway): 防止 OpenAI Codex 跨用户串流 · ab4e8b2c
      QTom authored
      根因:多个用户共享同一 OAuth 账号时,conversation_id/session_id 头
      未做用户隔离,导致上游 chatgpt.com 将不同用户的请求关联到同一会话。
      
      HTTP SSE 修复:
      - 新增 isolateOpenAISessionID(apiKeyID, raw),将 API Key ID 混入
        session 标识符(xxhash),确保不同 Key 的用户产生不同上游会话
      - buildUpstreamRequest: OAuth 分支先 Del 客户端透传的 session 头,
        再用隔离值覆盖
      - buildUpstreamRequestOpenAIPassthrough: 透传路径同样隔离
      - ForwardAsAnthropic: Anthropic Messages 兼容路径同步修复
      - buildOpenAIWSHeaders: WS 路径的 OAuth session 头同步隔离
      ab4e8b2c
  9. 15 Mar, 2026 2 commits
    • erio's avatar
      feat(ops): add ignore insufficient balance errors toggle and extract error constants · cfe72159
      erio authored
      - Add 5th error filter switch IgnoreInsufficientBalanceErrors to suppress
        upstream insufficient balance / insufficient_quota errors from ops log
      - Extract hardcoded error strings into package-level constants for
        shouldSkipOpsErrorLog, normalizeOpsErrorType, classifyOpsPhase, and
        classifyOpsIsBusinessLimited
      - Define ErrNoAvailableAccounts sentinel error and replace all
        errors.New("no available accounts") call sites
      - Update tests to use require.ErrorIs with the sentinel error
      cfe72159
    • Ethan0x0000's avatar
      feat: 完善使用记录端点可观测性与分布统计 · eefab159
      Ethan0x0000 authored
      将入站、上游与路径三类端点分布统一到使用记录页的一致化卡片交互中,并补齐端点元数据与统计链路,提升排障与流量分析效率。
      eefab159
  10. 14 Mar, 2026 1 commit
  11. 12 Mar, 2026 1 commit
  12. 11 Mar, 2026 6 commits
  13. 09 Mar, 2026 3 commits
  14. 08 Mar, 2026 1 commit
  15. 07 Mar, 2026 5 commits
  16. 06 Mar, 2026 5 commits
  17. 05 Mar, 2026 4 commits
    • erio's avatar
    • erio's avatar
      refactor: unify post-usage billing logic and fix account quota calculation · 02dea7b0
      erio authored
      - Extract postUsageBilling() to consolidate billing logic across
        GatewayService.RecordUsage, RecordUsageWithLongContext, and
        OpenAIGatewayService.RecordUsage, eliminating ~120 lines of
        duplicated code
      - Fix account quota to use TotalCost × accountRateMultiplier
        (was using raw TotalCost, inconsistent with account cost stats)
      - Fix RecordUsageWithLongContext API Key quota only updating in
        balance mode (now updates regardless of billing type)
      - Fix WebSocket client disconnect detection on Windows by adding
        "an established connection was aborted" to known disconnect errors
      02dea7b0
    • erio's avatar
      feat: add quota limit for API key accounts · 05527b13
      erio authored
      - Add configurable spending limit (quota_limit) for apikey-type accounts
      - Atomic quota accumulation via PostgreSQL JSONB operations on TotalCost
      - Scheduler filters out over-quota accounts with outbox-triggered snapshot refresh
      - Display quota usage ($used / $limit) in account capacity column
      - Add "Reset Quota" action in account menu to reset usage to zero
      - Editing account settings preserves quota_used (no accidental reset)
      - Covers all 3 billing paths: Anthropic, Gemini, OpenAI RecordUsage
      
      chore: bump version to 0.1.90.4
      05527b13
    • yangjianbo's avatar
      feat(openai-ws): 合并 WS v2 透传模式与前端 ws mode · 1d0872e7
      yangjianbo authored
      
      
      新增 OpenAI WebSocket v2 passthrough relay 数据面与服务适配层,
      支持按账号 ws mode 在 ctx_pool 与 passthrough 间路由。
      
      同步调整前端 OpenAI ws mode 选项为 off/ctx_pool/passthrough,
      并补充 i18n 文案与对应单测。
      
      新增 Caddyfile.dmit 与 docker-compose-aicodex.yml 部署配置,
      用于宿主机场景下的反向代理与服务编排。
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      1d0872e7