1. 28 Dec, 2025 11 commits
  2. 27 Dec, 2025 7 commits
  3. 26 Dec, 2025 20 commits
    • IanShaw027's avatar
      feat(test): 添加 Gemini 双响应格式支持 · 2714be99
      IanShaw027 authored
      添加对两种 Gemini 响应格式的支持:
      - AI Studio: `{"candidates": [...]}`
      - Gemini CLI: `{"response": {"candidates": [...]}}`
      
      通过 unwrap 逻辑自动检测并适配两种格式,确保账号测试功能
      对所有 Gemini 账号类型都能正常工作。
      
      合并 PR #43 的剩余功能到 PR #37
      2714be99
    • IanShaw027's avatar
      fix(lint): 修复 gofmt 格式问题 · d8518180
      IanShaw027 authored
      修复 golangci-lint 检查失败的问题:
      - gemini_token_provider.go: 删除 import 后多余空行
      - gemini_token_refresher.go: 删除 import 后多余空行
      
      Fixes CI golangci-lint check for PR #37
      d8518180
    • IanShaw027's avatar
      refactor: 统一使用 mergeMap 函数提升代码一致性 · 576bf463
      IanShaw027 authored
      根据 Gemini CLI 代码审查建议:
      
      ## 修改内容
      - 将 Gemini OAuth 同步中的 `mergeJSONB` 调用替换为 `mergeMap`
      - 删除不再使用的 `mergeJSONB` 函数定义
      
      ## 原因
      - 其他平台(OpenAI、Anthropic)的账户同步都使用 `mergeMap`
      - `mergeJSONB` 是为旧的 `model.JSONB` 类型设计,与重构后的架构不一致
      - 统一函数命名提高代码可读性和可维护性
      
      ## 影响范围
      - backend/internal/service/crs_sync_service.go (4处替换)
      - backend/internal/service/account.go (删除 mergeJSONB 函数)
      
      ## 验证
      ✓ 编译通过
      ✓ 功能逻辑无变化(mergeMap 和 mergeJSONB 实现相同)
      576bf463
    • IanShaw027's avatar
      fix(backend): 适配重构后的架构修复 Gemini OAuth 集成 · 9db52838
      IanShaw027 authored
      ## 主要修改
      
      1. **移除 model 包引用**
         - 删除所有 `internal/model` 包的 import
         - 使用 service 包中的类型定义(Account, Platform常量等)
      
      2. **修复类型转换**
         - JSONB → map[string]any
         - 添加 mergeJSONB 辅助函数
         - 添加 Account.IsGemini() 方法
      
      3. **更新中间件调用**
         - GetUserFromContext → GetAuthSubjectFromContext
         - 适配新的并发控制签名(传递 ID 和 Concurrency 而不是完整对象)
      
      4. **修复 handler 层**
         - 更新 gemini_v1beta_handler.go
         - 修正 billing 检查和 usage 记录
      
      ## 影响范围
      - backend/internal/service/gemini_*.go
      - backend/internal/service/account_test_service.go
      - backend/internal/service/crs_sync_service.go
      - backend/internal/handler/gemini_v1beta_handler.go
      - backend/internal/handler/gateway_handler.go
      - backend/internal/handler/admin/account_handler.go
      9db52838
    • ianshaw's avatar
      fix(sse): 修复非标准 SSE 格式解析问题 · 16eec4eb
      ianshaw authored
      部分上游 API 返回的 SSE 格式不符合标准规范:
      - 标准格式: `data: {...}`(冒号后有空格)
      - 非标准格式: `data:{...}`(冒号后无空格)
      
      使用预编译正则 `^data:\s*` 统一处理两种格式。
      16eec4eb
    • Forest's avatar
      refactor: 封装 Redis key 生成函数 · 06d5876b
      Forest authored
      06d5876b
    • Forest's avatar
      refactor: 调整项目结构为单向依赖 · e5a77853
      Forest authored
      e5a77853
    • ianshaw's avatar
    • ianshaw's avatar
      feat(service): 改进 Gemini OAuth 服务层,区分 Code Assist 和 AI Studio 客户端 · 456e8984
      ianshaw authored
      OAuth 服务改进:
      - 添加 GetOAuthConfig 返回 AI Studio OAuth 可用性
      - Code Assist 强制使用内置 Gemini CLI 客户端
      - AI Studio OAuth 要求用户配置自定义 OAuth 客户端
      - ExchangeCode/RefreshToken 接口添加 oauthType 参数
      - 添加 unauthorized_client 错误的向后兼容重试逻辑
      
      兼容层改进:
      - 403 重试逻辑仅对 Code Assist OAuth 生效
      - 添加 insufficient-scope 错误检测,避免无效重试
      - 上游错误消息脱敏处理(隐藏 API key 等敏感信息)
      - 改进错误提示,显示更多上游错误详情
      456e8984
    • ianshaw's avatar
      fix(backend): 移除对已删除 ports 包的依赖 · 85fd1e4a
      ianshaw authored
      适配 main 分支的 ports 目录删除重构:
      - 将 ports 包中的接口移至 service 包
      - 更新 repository 层的导入路径
      85fd1e4a
    • ianshaw's avatar
      fix(backend): 修复 golangci-lint 报告的格式和代码规范问题 · 6682d06c
      ianshaw authored
      - gofmt: 修复 account_handler.go, models.go, gemini_messages_compat_service.go 的格式
      - staticcheck ST1005: 将 error strings 改为小写开头
      6682d06c
    • ianshaw's avatar
      fix(backend): 修复 golangci-lint 报告的问题 · efa470ef
      ianshaw authored
      - gofmt: 修复代码格式问题
      - errcheck: 处理 WriteString 和 Close 返回值
      - staticcheck: 错误信息改为小写开头
      - staticcheck: 移除无效的 nil 检查
      - staticcheck: 使用 append 替换循环
      - staticcheck: 使用无条件的 TrimPrefix
      - ineffassign: 移除无效赋值
      - unused: 移除未使用的 geminiOAuthService 字段
      - 重新生成 wire_gen.go
      efa470ef
    • ianshaw's avatar
      feat(backend): 实现 Gemini AI Studio OAuth 和消息兼容服务 · b2d71da2
      ianshaw authored
      - gemini_oauth_service.go: 新增 AI Studio OAuth 类型支持
      - gemini_token_provider.go: Token 提供器增强
      - gemini_messages_compat_service.go: 支持 AI Studio 端点
      - account_test_service.go: Gemini 账户可用性检测
      - gateway_service.go: 网关服务适配
      - openai_gateway_service.go: OpenAI 兼容层调整
      b2d71da2
    • ianshaw's avatar
      feat(backend): 完善 Gemini OAuth Token 处理 · 03a8ae62
      ianshaw authored
      - 修复 account_handler 中 token 字段类型转换(int64 转 string)
      - 增强 Account.GetCredential 支持多种数值类型(float64, int, json.Number 等)
      - 添加 Account.IsGemini() 方法用于平台判断
      - 优化 refresh_token 和 scope 的空值处理
      03a8ae62
    • ianshaw's avatar
      feat(handler): 添加 Gemini OAuth Handler 和完善依赖注入 · e36fb98f
      ianshaw authored
      - 新增 Gemini OAuth 授权处理器
      - 扩展账号和网关处理器支持 Gemini
      - 注册 Gemini 相关路由
      - 更新 Wire 依赖注入配置(所有层)
      - 更新 Docker Compose 配置
      e36fb98f
    • ianshaw's avatar
      feat(service): 扩展 CRS 同步和定价服务支持 Gemini · 55258bf0
      ianshaw authored
      - CRS 同步服务新增 Gemini 账号同步逻辑(+273行)
      - 定价服务扩展 Gemini 模型定价计算(+99行)
      - 更新 Token 刷新服务集成 Gemini
      - 更新相关单元测试
      55258bf0
    • ianshaw's avatar
      feat(service): 实现 Gemini OAuth 和 Token 管理服务 · dc109827
      ianshaw authored
      - 实现 OAuth 授权流程服务
      - 添加 Token 提供者和自动刷新机制
      - 实现 Gemini Messages API 兼容层
      - 更新服务容器注册
      dc109827
    • ianshaw's avatar
      feat(service): 定义 Gemini 服务端口接口 · 71c28e43
      ianshaw authored
      - 定义 OAuth 服务接口
      - 定义 Token 缓存服务接口
      - 定义 Code Assist 服务接口
      71c28e43
    • shaw's avatar
      chore: 调整403重试次数跟间隔 · b3463769
      shaw authored
      b3463769
    • Forest's avatar
      refactor: 调整 server 目录结构 · 57fd1722
      Forest authored
      57fd1722
  4. 25 Dec, 2025 2 commits