1. 06 Feb, 2026 3 commits
  2. 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
  3. 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
  4. 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
  5. 02 Feb, 2026 4 commits
  6. 30 Jan, 2026 3 commits
  7. 29 Jan, 2026 3 commits
  8. 28 Jan, 2026 8 commits
  9. 27 Jan, 2026 1 commit
  10. 25 Jan, 2026 1 commit
    • ianshaw's avatar
      feat(gemini): 支持 Gemini CLI 粘性会话与跨账号 thoughtSignature 清理 · 839975b0
      ianshaw authored
      ## 问题背景
      
      1. Gemini CLI 没有明确的会话标识(如 Claude Code 的 metadata.user_id)
      2. thoughtSignature 与具体上游账号强绑定,跨账号使用会导致 400 错误
      3. 粘性会话切换账号或 cache 丢失时,旧签名会导致请求失败
      
      ## 解决方案
      
      ### 1. Gemini CLI 会话标识提取
      
      - 从 `x-gemini-api-privileged-user-id` header 和请求体中的 tmp 目录哈希生成会话标识
      - 组合策略:SHA256(privileged-user-id + ":" + tmp_dir_hash)
      - 正则提取:`/\.gemini/tmp/([A-Fa-f0-9]{64})`
      
      ### 2. 跨账号 thoughtSignature 清理
      
      实现三种场景的智能清理:
      
      1. **Cache 命中 + 账号切换**
         - 粘性会话绑定的账号与当前选择的账号不同时清理
      
      2. **同一请求内 failover 切换**
         - 通过 sessionBoundAccountID 跟踪,检测重试时的账号切换
      
      3. **Gemini CLI + Cache 未命中 + 含签名**
         - 预防性清理,避免 cache 丢失后首次转发就 400
         - 仅对 Gemini CLI 请求且请求体包含 thoughtSignature 时触发
      
      ## 修改内容
      
      ### backend/internal/handler/gemini_v1beta_handler.go
      - 添加 `extractGeminiCLISessionHash` 函数提取 Gemini CLI 会话标识
      - 添加 `isGeminiCLIRequest` 函数识别 Gemini CLI 请求
      - 实现账号切换检测与 thoughtSignature 清理逻辑
      - 添加 `geminiCLITmpDirRegex` 正则表达式
      
      ### backend/internal/service/gateway_service.go
      - 添加 `GetCachedSessionAccountID` 方法查询粘性会话绑定的账号 ID
      
      ### backend/internal/service/gemini_native_signature_cleaner.go (新增)
      - 实现 `CleanGeminiNativeThoughtSignatures` 函数
      - 递归清理 JSON 中的所有 thoughtSignature 字段
      - 支持任意 JSON 顶层类型(object/array)
      
      ### backend/internal/handler/gemini_cli_session_test.go (新增)
      - 测试 Gemini CLI 会话哈希提取逻辑
      - 测试 tmp 目录正则匹配
      - 覆盖有/无 privileged-user-id 的场景
      
      ## 影响范围
      
      - 修复 Gemini CLI 多轮对话时账号切换导致的 400 错误
      - 提高粘性会话的稳定性和容错能力
      - 不影响其他客户端(Claude Code 等)的会话标识生成
      
      ## 测试
      
      - 单元测试:go test -tags=unit ./internal/handler -run TestExtractGeminiCLISessionHash
      - 单元测试:go test -tags=unit ./internal/handler -run TestGeminiCLITmpDirRegex
      - 编译验证:go build ./cmd/server
      839975b0
  11. 23 Jan, 2026 1 commit
  12. 20 Jan, 2026 2 commits
  13. 19 Jan, 2026 5 commits
  14. 18 Jan, 2026 2 commits