song
|
2bd288a677
|
Merge branch 'main' into feature/antigravity_auth
|
2025-12-29 17:04:40 +08:00 |
|
song
|
234e98f1b3
|
feat(antigravity): 保存 ineligibleTiers 原因信息
|
2025-12-29 16:55:17 +08:00 |
|
song
|
b31bfd53ab
|
feat(antigravity): 添加专用路由,支持仅使用 antigravity 账户
添加 /antigravity/v1/* 和 /antigravity/v1beta/* 路由:
- 通过 ForcePlatform 中间件强制使用 antigravity 平台
- 跳过混合调度逻辑,仅调度 antigravity 账户
- 支持按分组优先查找,找不到时回退查询全部 antigravity 账户
修复 context key 类型不匹配问题:
- middleware 和 service 统一使用字符串常量 "ctx_force_platform"
- 解决 Go context.Value() 类型+值匹配导致的读取失败
其他改动:
- 嵌入式前端中间件白名单添加 /antigravity/ 路径
- e2e 测试 Gemini 端点 URL 添加 endpointPrefix 支持
|
2025-12-29 16:52:55 +08:00 |
|
song
|
1ad29032d3
|
feat(antigravity): 添加混合调度可选功能
- 后端:账户模型添加 IsMixedSchedulingEnabled() 方法,读取 extra.mixed_scheduling
- 后端:gateway_service 和 gemini_messages_compat_service 支持混合调度逻辑
- 后端:分组创建支持指定 platform 参数
- 前端:账户创建/编辑弹窗添加混合调度开关(仅 antigravity 账户显示)
- 前端:混合调度开关添加问号图标和 tooltip 说明
- 前端:GroupSelector 支持根据 mixedScheduling 属性过滤分组
- 前端:分组创建支持选择 platform
- 测试:e2e 测试添加 ENDPOINT_PREFIX 环境变量支持混合/隔离模式测试
- 测试:删除过时的 Claude signature 测试用例
|
2025-12-29 09:44:39 +08:00 |
|
shaw
|
31fef105c7
|
refactor: 移除旧版数据库配置的简易模式实现
移除与 PR #66 冲突的旧版简易模式实现(commit 7d4b7de)。
新版简易模式通过 run_mode 配置文件/环境变量控制,无需数据库设置。
后端变更:
- 移除 SettingKeySimpleMode 常量
- 移除 SystemSettings/PublicSettings 中的 SimpleMode 字段
- 移除 setting_handler 中的简易模式切换逻辑
- 移除 userService 依赖(不再需要自动设置管理员并发数)
前端变更:
- 移除 appStore.simpleMode 状态
- 移除设置页面的"使用模式"设置区块
- 移除 GroupsView 中的简易模式相关逻辑
- 移除相关国际化文案
|
2025-12-29 09:17:00 +08:00 |
|
IanShaw027
|
ecfad788d9
|
feat(全栈): 实现简易模式核心功能
**功能概述**:
实现简易模式(Simple Mode),为个人用户和小团队提供简化的使用体验,隐藏复杂的分组、订阅、配额等概念。
**后端改动**:
1. 配置系统
- 新增 run_mode 配置项(standard/simple)
- 支持环境变量 RUN_MODE
- 默认值为 standard
2. 数据库初始化
- 自动创建3个默认分组:anthropic-default、openai-default、gemini-default
- 默认分组配置:无并发限制、active状态、非独占
- 幂等性保证:重复启动不会重复创建
3. 账号管理
- 创建账号时自动绑定对应平台的默认分组
- 如果未指定分组,自动查找并绑定默认分组
**前端改动**:
1. 状态管理
- authStore 新增 isSimpleMode 计算属性
- 从后端API获取并同步运行模式
2. UI隐藏
- 侧边栏:隐藏分组管理、订阅管理、兑换码菜单
- 账号管理页面:隐藏分组列
- 创建/编辑账号对话框:隐藏分组选择器
3. 路由守卫
- 限制访问分组、订阅、兑换码相关页面
- 访问受限页面时自动重定向到仪表板
**配置示例**:
```yaml
run_mode: simple
run_mode: standard
```
**影响范围**:
- 后端:配置、数据库迁移、账号服务
- 前端:认证状态、路由、UI组件
- 部署:配置文件示例
**兼容性**:
- 简易模式和标准模式可无缝切换
- 不需要数据迁移
- 现有数据不受影响
|
2025-12-29 03:24:15 +08:00 |
|
song
|
cf1d0f23cc
|
feat(antigravity): 添加账户类型(tier)显示功能
|
2025-12-29 01:25:09 +08:00 |
|
song
|
995adaeee4
|
test: 添加 Claude signature 场景 e2e 测试
- 新增 TestClaudeMessagesWithClaudeSignature 测试
- 验证历史 thinking block 带有 Claude signature 时的处理
- 修复配额刷新服务的次要问题
|
2025-12-29 00:44:07 +08:00 |
|
shaw
|
30b95cf5ce
|
fix(usage): 分离 API 响应和窗口统计缓存,修复 5h 窗口未激活时的显示 bug
问题:
1. WindowStats 与 API 响应一起缓存 10 分钟,导致费用数据更新延迟
2. 当 5h 窗口未激活(ResetsAt 为空)时,FiveHour 为 nil,导致所有窗口的 WindowStats 都无法显示
修复:
- 分离缓存:API 响应缓存 10 分钟,窗口统计独立缓存 1 分钟
- RemainingSeconds 每次请求时实时计算
- FiveHour 对象始终创建(即使 ResetsAt 为空)
- addWindowStats 增强防护,支持 FiveHour 为 nil 时仍处理其他窗口
|
2025-12-28 23:12:44 +08:00 |
|
song
|
08ce6de4db
|
feat(antigravity): 添加配额窗口显示功能
后端:
- 新增 AntigravityQuotaRefresher 定时刷新配额
- Client 添加 FetchAvailableModels 方法获取模型配额
- 配额数据存入 account.extra.quota 字段
前端:
- AccountUsageCell 支持显示 Antigravity 账户配额
- UsageProgressBar 新增 amber 颜色
- 显示 G3P/G3F/G3I/C4.5 四个配额进度条
|
2025-12-28 22:29:01 +08:00 |
|
shaw
|
7d4b7deea9
|
feat: 添加简单模式功能
新增简单模式设置,适合个人使用场景:
- 隐藏多用户管理相关菜单(用户管理、兑换码等)
- 自动关闭用户注册功能
- 管理员并发数自动设为无限制(99999)
- 侧边栏根据模式动态调整菜单项
同时优化分组页面的"专属分组"功能,添加帮助提示说明使用场景
|
2025-12-28 22:19:18 +08:00 |
|
song
|
ad15d9970c
|
fix(gateway): Antigravity 账户 count_tokens 返回估算值
Antigravity 不支持 count_tokens 转发,直接返回估算值,
与 Antigravity-Manager 和 proxycast 实现保持一致。
修复 count_tokens 请求选择到 Antigravity 账户时导致 401 的问题。
|
2025-12-28 21:56:52 +08:00 |
|
song
|
9594c9c83a
|
fix(antigravity): 修复 Gemini 3 thought_signature 和 schema 验证问题
- 添加 dummyThoughtSignature 常量,在 thinking 模式下为无 signature 的 tool_use 自动添加
- 增强 cleanJSONSchema:过滤 required 中不存在的属性,确保 type/properties 字段存在
- 扩展 excludedSchemaKeys:增加 $id, $ref, strict, const, examples 等不支持的字段
- 修复 429 重试逻辑:仅在所有重试失败后才标记账户为 rate_limited
- 添加 e2e 集成测试:TestClaudeMessagesWithThinkingAndTools
|
2025-12-28 21:25:04 +08:00 |
|
song
|
b0389ca4d2
|
feat: 实现 Antigravity Claude → Gemini 协议转换,haiku 映射到 gemini-3-flash
|
2025-12-28 18:41:55 +08:00 |
|
song
|
1d085d982b
|
feat: 完善 Antigravity 多平台网关支持,修复 Gemini handler 分流逻辑
|
2025-12-28 17:48:52 +08:00 |
|
song
|
6648e6506c
|
feat: 添加 Antigravity (Cloud AI Companion) OAuth 授权支持
|
2025-12-28 15:54:42 +08:00 |
|
shaw
|
fbdff4f34f
|
fix: 防止订阅过期时间超出 JSON 序列化范围
问题:当分配订阅天数过大时,expires_at 年份可能超过 9999,
导致 time.Time JSON 序列化失败(RFC 3339 要求年份 <= 9999),
使后台无法显示和删除异常数据。
修复:
- handler 层添加 validity_days 最大值验证(max=36500,即100年)
- service 层添加 MaxValidityDays 和 MaxExpiresAt 双重保护
- 启动时自动修复已存在的异常数据(expires_at > 2099年)
|
2025-12-28 11:45:41 +08:00 |
|
shaw
|
0aa480283f
|
Merge branch 'feat/deferred-batch-update'
|
2025-12-28 11:28:06 +08:00 |
|
shaw
|
cd9d31f5f2
|
fix: 修复NeedsRefresh bug导致刷新失败的问题
|
2025-12-28 11:23:52 +08:00 |
|
noreply
|
cbfce49aa1
|
feat: Schedule batch update for account last_used_at
Implement deferred batch update mechanism to reduce database load:
- Add DeferredService for batching account last_used_at updates
- Add TimingWheelService for efficient recurring task scheduling
- Integrate with GatewayService and OpenAIGatewayService
- Implement BatchUpdateLastUsed repository method using CASE...WHEN SQL
- Fix golangci-lint error: Replace interface{} with any
Benefits:
- Reduces database writes by batching updates (10-second intervals)
- Improves request throughput by deferring non-critical updates
- Maintains accurate account usage tracking for scheduling
|
2025-12-28 09:49:54 +08:00 |
|
shaw
|
0b9c4ae69e
|
fix: 修复claude setup token授权效期短的问题
|
2025-12-27 20:42:00 +08:00 |
|
shaw
|
0d5a8a95c8
|
fix: 修复claude token刷新失效的问题
|
2025-12-27 20:13:39 +08:00 |
|
shaw
|
0743652d92
|
Merge branch 'feature/ui-and-backend-improvements'
|
2025-12-27 16:33:57 +08:00 |
|
IanShaw027
|
227d506c53
|
feat(backend): 增强使用统计和API密钥功能
- 优化使用统计处理逻辑
- 增强API密钥仓储层功能
- 改进账户使用服务
- 完善API契约测试覆盖
|
2025-12-27 16:03:57 +08:00 |
|
shaw
|
f1e47291cd
|
fix: 修复账号更新时分组绑定操作顺序导致的数据不一致问题
原逻辑先执行 Update 再验证 GroupIDs,如果验证失败会导致账号已更新但返回错误。
现改为先验证分组是否存在,再执行 Update 和 BindGroups。
|
2025-12-27 14:57:43 +08:00 |
|
shaw
|
d7e9ae38e4
|
Merge PR #49: feat: cc/codex/gemini 增加账号重试功能
|
2025-12-27 13:59:00 +08:00 |
|
shaw
|
2101f1d1c8
|
fix: 修复claude OAuth账户刷新token失败的bug
|
2025-12-27 13:50:35 +08:00 |
|
daodao97
|
f0f920e49f
|
feat: cc/codex/gemini 增加账号重试
|
2025-12-27 12:27:47 +08:00 |
|
daodao97
|
95583fce83
|
feat: cc/codex support account retry
|
2025-12-27 12:05:38 +08:00 |
|
IanShaw027
|
2714be99a9
|
feat(test): 添加 Gemini 双响应格式支持
添加对两种 Gemini 响应格式的支持:
- AI Studio: `{"candidates": [...]}`
- Gemini CLI: `{"response": {"candidates": [...]}}`
通过 unwrap 逻辑自动检测并适配两种格式,确保账号测试功能
对所有 Gemini 账号类型都能正常工作。
合并 PR #43 的剩余功能到 PR #37
|
2025-12-26 22:31:12 +08:00 |
|
IanShaw027
|
d851818035
|
fix(lint): 修复 gofmt 格式问题
修复 golangci-lint 检查失败的问题:
- gemini_token_provider.go: 删除 import 后多余空行
- gemini_token_refresher.go: 删除 import 后多余空行
Fixes CI golangci-lint check for PR #37
|
2025-12-26 22:24:22 +08:00 |
|
IanShaw027
|
576bf4639c
|
refactor: 统一使用 mergeMap 函数提升代码一致性
根据 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 实现相同)
|
2025-12-26 22:15:15 +08:00 |
|
IanShaw027
|
9db52838b5
|
fix(backend): 适配重构后的架构修复 Gemini OAuth 集成
## 主要修改
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
|
2025-12-26 22:07:55 +08:00 |
|
IanShaw027
|
bfcd9501c2
|
merge: 合并 upstream/main 解决 PR #37 冲突
- 删除 backend/internal/model/account.go 符合重构方向
- 合并最新的项目结构重构
- 包含 SSE 格式解析修复
- 更新依赖和配置文件
|
2025-12-26 21:56:08 +08:00 |
|
shaw
|
2d89f36687
|
Merge PR #42: fix(sse): 修复非标准 SSE 格式解析问题
|
2025-12-26 21:31:34 +08:00 |
|
ianshaw
|
16eec4eb41
|
fix(sse): 修复非标准 SSE 格式解析问题
部分上游 API 返回的 SSE 格式不符合标准规范:
- 标准格式: `data: {...}`(冒号后有空格)
- 非标准格式: `data:{...}`(冒号后无空格)
使用预编译正则 `^data:\s*` 统一处理两种格式。
|
2025-12-26 03:49:55 -08:00 |
|
Forest
|
06d5876b02
|
refactor: 封装 Redis key 生成函数
|
2025-12-26 16:47:44 +08:00 |
|
Forest
|
e5a77853b0
|
refactor: 调整项目结构为单向依赖
|
2025-12-26 16:45:40 +08:00 |
|
ianshaw
|
3559830882
|
fix(service): 应用德摩根定律修复 staticcheck QF1001 警告
|
2025-12-26 00:11:04 -08:00 |
|
ianshaw
|
456e8984b0
|
feat(service): 改进 Gemini OAuth 服务层,区分 Code Assist 和 AI Studio 客户端
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 等敏感信息)
- 改进错误提示,显示更多上游错误详情
|
2025-12-26 00:11:03 -08:00 |
|
ianshaw
|
85fd1e4a2c
|
fix(backend): 移除对已删除 ports 包的依赖
适配 main 分支的 ports 目录删除重构:
- 将 ports 包中的接口移至 service 包
- 更新 repository 层的导入路径
|
2025-12-26 00:11:03 -08:00 |
|
ianshaw
|
6682d06c99
|
fix(backend): 修复 golangci-lint 报告的格式和代码规范问题
- gofmt: 修复 account_handler.go, models.go, gemini_messages_compat_service.go 的格式
- staticcheck ST1005: 将 error strings 改为小写开头
|
2025-12-26 00:11:03 -08:00 |
|
ianshaw
|
efa470efc7
|
fix(backend): 修复 golangci-lint 报告的问题
- gofmt: 修复代码格式问题
- errcheck: 处理 WriteString 和 Close 返回值
- staticcheck: 错误信息改为小写开头
- staticcheck: 移除无效的 nil 检查
- staticcheck: 使用 append 替换循环
- staticcheck: 使用无条件的 TrimPrefix
- ineffassign: 移除无效赋值
- unused: 移除未使用的 geminiOAuthService 字段
- 重新生成 wire_gen.go
|
2025-12-26 00:11:03 -08:00 |
|
ianshaw
|
b2d71da2a2
|
feat(backend): 实现 Gemini AI Studio OAuth 和消息兼容服务
- 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 兼容层调整
|
2025-12-26 00:11:03 -08:00 |
|
ianshaw
|
03a8ae62e5
|
feat(backend): 完善 Gemini OAuth Token 处理
- 修复 account_handler 中 token 字段类型转换(int64 转 string)
- 增强 Account.GetCredential 支持多种数值类型(float64, int, json.Number 等)
- 添加 Account.IsGemini() 方法用于平台判断
- 优化 refresh_token 和 scope 的空值处理
|
2025-12-26 00:09:46 -08:00 |
|
ianshaw
|
e36fb98fb9
|
feat(handler): 添加 Gemini OAuth Handler 和完善依赖注入
- 新增 Gemini OAuth 授权处理器
- 扩展账号和网关处理器支持 Gemini
- 注册 Gemini 相关路由
- 更新 Wire 依赖注入配置(所有层)
- 更新 Docker Compose 配置
|
2025-12-26 00:09:46 -08:00 |
|
ianshaw
|
55258bf099
|
feat(service): 扩展 CRS 同步和定价服务支持 Gemini
- CRS 同步服务新增 Gemini 账号同步逻辑(+273行)
- 定价服务扩展 Gemini 模型定价计算(+99行)
- 更新 Token 刷新服务集成 Gemini
- 更新相关单元测试
|
2025-12-26 00:09:04 -08:00 |
|
ianshaw
|
dc109827b7
|
feat(service): 实现 Gemini OAuth 和 Token 管理服务
- 实现 OAuth 授权流程服务
- 添加 Token 提供者和自动刷新机制
- 实现 Gemini Messages API 兼容层
- 更新服务容器注册
|
2025-12-26 00:09:04 -08:00 |
|
ianshaw
|
71c28e436a
|
feat(service): 定义 Gemini 服务端口接口
- 定义 OAuth 服务接口
- 定义 Token 缓存服务接口
- 定义 Code Assist 服务接口
|
2025-12-26 00:08:27 -08:00 |
|
shaw
|
b3463769dc
|
chore: 调整403重试次数跟间隔
|
2025-12-26 14:19:57 +08:00 |
|