song
1c42403e6d
fix(Antigravity): 支持无 project_id 的账户类型
...
- 移除 project_id 强制检查,部分账户类型 API 不返回此字段
- 重构:提取 antigravity.NewAPIRequest() 统一创建 API 请求
- quota_refresher: 无 project_id 时仍可更新 tier 信息
2025-12-30 23:42:50 +08:00
shaw
c328b741cb
Merge PR #73 : feat(antigravity): 添加 Antigravity (Cloud AI Companion) 平台支持
...
新增功能:
- Antigravity OAuth 授权流程支持
- Claude → Gemini 协议转换(Claude API 请求自动转换为 Gemini 格式)
- 配额刷新和状态显示
- 混合调度功能,支持 Anthropic 和 Antigravity 账户混合使用
- /antigravity 专用路由,支持仅使用 Antigravity 账户
- 前端 Antigravity 服务商标识和账户管理功能
冲突解决:
- CreateAccountModal.vue: 合并 data-tour 属性和 mixed-scheduling 属性
- EditAccountModal.vue: 合并 data-tour 属性和 mixed-scheduling 属性
代码质量改进:
- 修复 antigravity 类型文件的 gofmt 格式问题(struct 字段对齐、interface{} → any)
- 移除 .golangci.yml 中的 gofmt 排除规则
- 修复测试文件的格式问题
2025-12-29 20:32:20 +08:00
song
bc75edd800
style: interface{} → any (gofmt rewrite rule)
2025-12-29 18:05:05 +08:00
song
026740b5e5
fix: 删除未使用的代码并修复格式
...
- 删除 client.go 中未使用的 proxyURL 字段
- 删除 AntigravityGatewayService 中未使用的字段和方法
- 修复 gofmt 格式问题
2025-12-29 17:54:38 +08:00
song
21a04332ec
fix: 修复 golangci-lint 检查错误
...
- SA1029: 创建 ctxkey 包定义类型安全的 context key
- ST1005: 错误字符串首字母改小写
- errcheck: 显式忽略 bytes.Buffer.Write 返回值
- 修复单元测试中 GatewayService 缺少 cfg 字段的问题
2025-12-29 17:46:52 +08:00
song
234e98f1b3
feat(antigravity): 保存 ineligibleTiers 原因信息
2025-12-29 16:55:17 +08:00
song
cf1d0f23cc
feat(antigravity): 添加账户类型(tier)显示功能
2025-12-29 01:25:09 +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
song
635d7e77e1
fix(antigravity): 只有 Gemini 模型支持 dummy thought signature
...
参考 Antigravity-Manager 的实现:
- 添加 allowDummyThought 参数,只有 gemini-* 模型才启用
- Claude 模型通过 Vertex API 需要有效的 thought signatures
- thinking block 保留原有 signature
- tool_use 只在 Gemini 模型时才使用 dummy signature
2025-12-28 21:36:21 +08:00
song
ba9eb684ed
fix(antigravity): 与 proxycast 保持一致的 thought_signature 处理
...
- function_call 无条件添加 dummy thought_signature(与 proxycast 一致)
- thinking block 在 thinking 模式下统一使用 dummy signature 替换历史无效 signature
- 添加测试用例:TestClaudeMessagesWithInvalidThinkingSignature
2025-12-28 21:29:16 +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
ff06583c5d
Merge branch 'main' into feature/antigravity_auth
2025-12-28 18:46:18 +08:00
song
b0389ca4d2
feat: 实现 Antigravity Claude → Gemini 协议转换,haiku 映射到 gemini-3-flash
2025-12-28 18:41:55 +08:00
song
6648e6506c
feat: 添加 Antigravity (Cloud AI Companion) OAuth 授权支持
2025-12-28 15:54:42 +08:00
IanShaw027
506cb21cb1
refactor(frontend): UI/UX改进和组件优化
...
- DataTable组件操作列自适应
- 优化各种Modal弹窗
- 统一API调用方式(AbortSignal)
- 添加全局订阅状态管理
- 优化各管理视图的交互和布局
- 修复国际化翻译问题
2025-12-28 14:53:36 +08:00
IanShaw
254f12543c
feat(frontend): 前端界面优化与使用统计功能增强 ( #46 )
...
* feat(frontend): 前端界面优化与使用统计功能增强
主要改动:
1. 表格布局统一优化
- 新增 TablePageLayout 通用布局组件
- 统一所有管理页面的表格样式和交互
- 优化 DataTable、Pagination、Select 等通用组件
2. 使用统计功能增强
- 管理端: 添加完整的筛选和显示功能
- 用户端: 完善 API Key 列显示
- 后端: 优化使用统计数据结构和查询
3. 账户组件优化
- 优化 AccountStatsModal、AccountUsageCell 等组件
- 统一进度条和统计显示样式
4. 其他改进
- 完善中英文国际化
- 统一页面样式和交互体验
- 优化各视图页面的响应式布局
* fix(test): 修复 stubUsageLogRepo.ListWithFilters 测试 stub
测试用例 GET /api/v1/usage 返回 500 是因为 stub 方法未实现,
现在正确返回基于 UserID 过滤的日志数据。
* feat(frontend): 统一日期时间显示格式
**主要改动**:
1. 增强 utils/format.ts:
- 新增 formatDateOnly() - 格式: YYYY-MM-DD
- 新增 formatDateTime() - 格式: YYYY-MM-DD HH:mm:ss
2. 全局替换视图中的格式化函数:
- 移除各视图中的自定义 formatDate 函数
- 统一导入使用 @/utils/format 中的函数
- created_at/updated_at 使用 formatDateTime
- expires_at 使用 formatDateOnly
3. 受影响的视图 (8个):
- frontend/src/views/user/KeysView.vue
- frontend/src/views/user/DashboardView.vue
- frontend/src/views/user/UsageView.vue
- frontend/src/views/user/RedeemView.vue
- frontend/src/views/admin/UsersView.vue
- frontend/src/views/admin/UsageView.vue
- frontend/src/views/admin/RedeemView.vue
- frontend/src/views/admin/SubscriptionsView.vue
**效果**:
- 日期统一显示为 YYYY-MM-DD
- 时间统一显示为 YYYY-MM-DD HH:mm:ss
- 提升可维护性,避免格式不一致
* fix(frontend): 补充遗漏的时间格式化统一
**补充修复**(基于 code review 发现的遗漏):
1. 增强 utils/format.ts:
- 新增 formatTime() - 格式: HH:mm
2. 修复 4 个遗漏的文件:
- src/views/admin/UsersView.vue
* 删除 formatExpiresAt(),改用 formatDateTime()
* 修复订阅过期时间 tooltip 显示格式不一致问题
- src/views/user/ProfileView.vue
* 删除 formatMemberSince(),改用 formatDate(date, 'YYYY-MM')
* 统一会员起始时间显示格式
- src/views/user/SubscriptionsView.vue
* 修改 formatExpirationDate() 使用 formatDateOnly()
* 保留天数计算逻辑
- src/components/account/AccountStatusIndicator.vue
* 删除本地 formatTime(),改用 utils/format 中的统一函数
* 修复 rate limit 和 overload 重置时间显示
**验证**:
- TypeScript 类型检查通过 ✓
- 前端构建成功 ✓
- 所有剩余的 toLocaleString() 都是数字格式化,属于正确用法 ✓
**效果**:
- 订阅过期时间统一为 YYYY-MM-DD HH:mm:ss
- 会员起始时间统一为 YYYY-MM
- 重置时间统一为 HH:mm
- 消除所有不规范的原生 locale 方法调用
2025-12-27 10:50:25 +08:00
ianshaw
eea949853a
feat(geminicli): 添加内置 Gemini CLI OAuth 客户端常量和改进配置逻辑
...
- 添加 GeminiCLIOAuthClientID/Secret 常量(Gemini CLI 公开 OAuth 客户端)
- 更新 DefaultAIStudioScopes 使用 generative-language.retriever(符合 Google 文档)
- EffectiveOAuthConfig 支持自动回退到内置客户端
- 内置客户端自动过滤受限 scope(如 generative-language)
- 添加 scope 向后兼容性处理
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
040dc27ea5
feat(backend): 添加 Gemini/Google API 基础包
...
- 新增 pkg/gemini: 模型定义与回退列表
- 新增 pkg/googleapi: Google API 错误状态处理
- 新增 pkg/geminicli/models.go: CLI 模型结构
- 更新 constants.go: AI Studio 相关常量
- 更新 oauth.go: 支持 AI Studio OAuth 流程,凭据通过环境变量配置
2025-12-26 00:10:44 -08:00
ianshaw
aea48ae1ab
feat(config): 新增 Gemini 配置项和 geminicli 核心包
...
- 添加 Gemini OAuth 配置结构
- 实现 geminicli 包(OAuth、Token、CodeAssist 类型)
- 更新配置示例文件
2025-12-26 00:08:27 -08:00
NepetaLemon
8d7a497553
refactor: 自定义业务错误 ( #33 )
...
* refactor: 自定义业务错误
* refactor: 隐藏服务器错误与统一 panic 响应
2025-12-26 08:47:00 +08:00
Forest
eeaff85e47
refactor: 自定义业务错误
2025-12-25 21:06:40 +08:00
shaw
aaadd6ed04
fix(dashboard): 修复性能指标 RPM/TPM 显示为0的问题
...
- 修复 Admin Dashboard Handler 遗漏返回 rpm/tpm 字段
- 将性能统计时间窗口从1分钟改为5分钟平均值,数据更稳定
2025-12-24 19:58:33 +08:00
shaw
7d9a757a26
feat(dashboard): 添加 RPM/TPM 性能指标
...
在 Dashboard 中用 RPM/TPM 卡片替换原来的"今日缓存"卡片,
实时显示最近1分钟的请求数和 Token 吞吐量。
2025-12-24 10:24:02 +08:00
Forest
bbf4024dc7
refactor(usage): 移动 usage 查询到 services
2025-12-24 08:41:31 +08:00
shaw
6c469b42ed
feat: 新增支持codex转发
2025-12-22 22:58:31 +08:00
Forest
1e1f3c0c74
ci(backend): 添加 gofmt 配置
2025-12-20 16:19:40 +08:00
NepetaLemon
c6b3de1199
ci(backend): 添加 github actions ( #10 )
...
## 变更内容
### CI/CD
- 添加 GitHub Actions 工作流(test + golangci-lint)
- 添加 golangci-lint 配置,启用 errcheck/govet/staticcheck/unused/depguard
- 通过 depguard 强制 service 层不能直接导入 repository
### 错误处理修复
- 修复 CSV 写入、SSE 流式输出、随机数生成等未处理的错误
- GenerateRedeemCode() 现在返回 error
### 资源泄露修复
- 统一使用 defer func() { _ = xxx.Close() }() 模式
### 代码清理
- 移除未使用的常量
- 简化 nil map 检查
- 统一代码格式
2025-12-20 02:29:52 -05:00
Forest
e99b344b2b
refactor(backend): 引入端口接口模式
2025-12-19 21:26:19 +08:00
shaw
ee86dbca9d
feat(account): 账号测试支持选择模型
...
- 新增 GET /api/v1/admin/accounts/:id/models 接口获取账号可用模型
- 账号测试弹窗新增模型选择下拉框
- 测试时支持传入 model_id 参数,不传则默认使用 Sonnet
- API Key 账号支持根据 model_mapping 映射测试模型
- 将模型常量提取到 claude 包统一管理
2025-12-19 16:00:09 +08:00
shaw
1ed93a5fd0
refactor: 提取 Claude 客户端常量到独立包
...
- 新增 internal/pkg/claude 包统一管理 Claude Code 相关常量
- 统一账号测试逻辑,所有账号类型使用相同的 Claude Code 风格请求
- 网关服务使用常量包替换硬编码的 beta header 字符串
2025-12-19 15:22:52 +08:00
shaw
8e81e395b3
refactor: 使用行业标准方案重构服务重启逻辑
...
重构内容:
- 移除复杂的 sudo systemctl restart 方案
- 改用 os.Exit(0) + systemd Restart=always 的标准做法
- 删除 sudoers 配置及相关代码
- 删除 sub2api-sudoers 文件
优势:
- 代码从 85+ 行简化到 47 行
- 无需 sudo 权限配置
- 无需特殊用户 shell 配置
- 更简单、更可靠
- 符合行业最佳实践(Docker/K8s 等均采用此方案)
工作原理:
- 服务调用 os.Exit(0) 优雅退出
- systemd 检测到退出后自动重启(Restart=always)
2025-12-18 20:32:24 +08:00
shaw
f0e89992f7
fix: 使用 setsid 确保重启命令独立于父进程执行
...
问题原因:
- cmd.Start() 启动的子进程与父进程在同一会话中
- 当 systemctl restart 发送 SIGTERM 给父进程时
- 子进程可能也会被终止,导致重启命令无法完成
修复内容:
- 使用 setsid 创建新会话,子进程完全独立于父进程
- 分离标准输入/输出/错误流
- 确保即使父进程被 kill,重启命令仍能执行完成
2025-12-18 20:00:53 +08:00
shaw
4eaa0cf14a
fix: 使用完整路径执行 sudo 和 systemctl 命令
...
问题原因:
- systemd 服务的 PATH 环境变量可能受限
- 直接使用 "sudo" 可能找不到可执行文件
修复内容:
- 添加 findExecutable 函数动态查找可执行文件路径
- 先尝试 exec.LookPath,再检查常见系统路径
- 添加日志显示实际使用的路径,方便调试
- 兼容不同 Linux 发行版的路径差异
2025-12-18 19:58:25 +08:00
shaw
e9ec2280ec
fix: 修复 sudo 在非交互模式下无法执行的问题
...
问题原因:
- sudo 命令没有 -n 选项
- 在后台服务中,sudo 会尝试从终端读取密码
- 由于没有终端,命令静默失败
修复内容:
- 添加 sudo -n 选项强制非交互模式
- 如果需要密码会立即失败并返回错误,而不是挂起
2025-12-18 19:37:41 +08:00
shaw
8e4bd42e8c
fix: 修复安装/升级无法重启服务的问题
2025-12-18 17:44:49 +08:00
shaw
642842c29e
First commit
2025-12-18 13:50:39 +08:00