1. 08 Feb, 2026 2 commits
    • erio's avatar
      fix: parse Gemini native request format in ParseGatewayRequest for correct session hash generation · 35598d56
      erio authored
      ParseGatewayRequest only parsed Anthropic format (system/messages),
      ignoring Gemini native format (systemInstruction/contents). This caused
      GenerateSessionHash to produce identical hashes for all Gemini sessions.
      
      Add protocol parameter to ParseGatewayRequest to branch between
      Anthropic and Gemini parsing. Update GenerateSessionHash message
      traversal to extract text from both formats.
      35598d56
    • erio's avatar
      fix: prevent sessionHash collision for different users with same messages · 5c76b9e4
      erio authored
      Mix SessionContext (ClientIP, UserAgent, APIKeyID) into
      GenerateSessionHash 3rd-level fallback to differentiate requests
      from different users sending identical content.
      
      Also switch hashContent from SHA256-truncated to XXHash64 for
      better performance, and optimize Trie Lua script to match from
      longest prefix first.
      5c76b9e4
  2. 07 Feb, 2026 9 commits
  3. 06 Feb, 2026 3 commits
    • 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
    • yangjianbo's avatar
      fix(兼容): 将 Kimi cached_tokens 映射到 Claude 标准 cache_read_input_tokens · c6a456c7
      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>
      c6a456c7
  4. 05 Feb, 2026 3 commits
    • shaw's avatar
      feat: 新增全局错误透传规则功能 · 39e05a2d
      shaw authored
      支持管理员配置上游错误如何返回给客户端:
      - 新增 ErrorPassthroughRule 数据模型和 Ent Schema
      - 实现规则的 CRUD API(/admin/error-passthrough-rules)
      - 支持按错误码、关键词匹配,支持 any/all 匹配模式
      - 支持按平台过滤(anthropic/openai/gemini/antigravity)
      - 支持透传或自定义响应状态码和错误消息
      - 实现两级缓存(Redis + 本地内存)和多实例同步
      - 集成到 gateway_handler 的错误处理流程
      - 新增前端管理界面组件
      - 新增单元测试覆盖核心匹配逻辑
      
      优化:
      - 移除 refreshLocalCache 中的冗余排序(数据库已排序)
      - 后端 Validate() 增加匹配条件非空校验
      39e05a2d
    • shaw's avatar
      feat: 支持用户专属分组倍率配置 · 2b192f7d
      shaw authored
      2b192f7d
    • shaw's avatar
      fix(gateway): 修复工具名转换破坏 Anthropic 特殊工具的问题 · 05af95da
      shaw authored
      未知工具名不再进行 PascalCase/snake_case 转换,保持原样透传。
      修复 text_editor_20250728 等 Anthropic 特殊工具被错误转换的问题。
      05af95da
  5. 04 Feb, 2026 1 commit
    • shaw's avatar
      fix(gateway): 修复模型前缀映射逻辑错误 · 8f397548
      shaw authored
      问题:normalizeClaudeModelForAnthropic 函数错误地将长模型ID截断为短ID,
      导致 APIKey 账号的模型名被错误修改。
      
      修复:
      - 删除错误的 normalizeClaudeModelForAnthropic 函数和 anthropicPrefixMappings 变量
      - 直接使用 claude.NormalizeModelID(正确的短ID->长ID扩展)
      - APIKey 账号无显式映射时透传原始模型名
      8f397548
  6. 03 Feb, 2026 3 commits
    • bayma888's avatar
      fix(lint): format gateway_service.go with gofmt · 3fed478e
      bayma888 authored
      3fed478e
    • bayma888's avatar
      feat(api-key): add independent quota and expiration support · 6146be14
      bayma888 authored
      This feature allows API Keys to have their own quota limits and expiration
      times, independent of the user's balance.
      
      Backend:
      - Add quota, quota_used, expires_at fields to api_key schema
      - Implement IsExpired() and IsQuotaExhausted() checks in middleware
      - Add ResetQuota and ClearExpiration API endpoints
      - Integrate quota billing in gateway handlers (OpenAI, Anthropic, Gemini)
      - Include quota/expiration fields in auth cache for performance
      - Expiration check returns 403, quota exhausted returns 429
      
      Frontend:
      - Add quota and expiration inputs to key create/edit dialog
      - Add quick-select buttons for expiration (+7, +30, +90 days)
      - Add reset quota confirmation dialog
      - Add expires_at column to keys list
      - Add i18n translations for new features (en/zh)
      
      Migration:
      - Add 045_add_api_key_quota.sql for new columns
      6146be14
    • JIA-ss's avatar
      fix(api): 修复 thinking 块被意外修改导致的 400 错误 · ad90bb46
      JIA-ss authored
      
      
      问题描述:
      使用扩展思考功能时,偶现以下错误:
      "thinking or redacted_thinking blocks in the latest assistant message cannot be modified"
      
      根因分析:
      当代理服务修改请求体中的某些字段时(如 metadata.user_id、model),
      使用 map[string]any 解析整个 JSON 后重新序列化,导致:
      1. 字段顺序改变(Go map 序列化按字母排序)
      2. 数字格式变化(如 1.0 → 1)
      3. Unicode 转义变化
      
      Claude API 对 thinking 块进行字节级验证,任何变化都会触发错误。
      
      修复内容:
      1. identity_service.go - RewriteUserID/RewriteUserIDWithMasking
         使用 json.RawMessage 保留其他字段的原始字节
      
      2. gateway_service.go - replaceModelInBody
         使用 json.RawMessage 保留其他字段的原始字节
      
      3. gateway_service.go - normalizeClaudeOAuthRequestBody
         保留 messages 的原始字节,跳过包含 thinking 块的消息修改
      
      4. gateway_service.go - isThinkingBlockSignatureError
         添加 "cannot be modified" 错误检测,触发自动重试
      
      5. antigravity_gateway_service.go - isSignatureRelatedError
         添加 "cannot be modified" 错误检测
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      ad90bb46
  7. 02 Feb, 2026 4 commits
  8. 30 Jan, 2026 3 commits
  9. 29 Jan, 2026 3 commits
  10. 28 Jan, 2026 8 commits
  11. 27 Jan, 2026 1 commit