song
84d6480b4e
fix(ci): simple release 不嵌入前端
2026-01-04 15:59:21 +08:00
song
c0e296f4a9
feat(ci): 增加 SIMPLE_RELEASE 参数支持简化发布
2026-01-04 15:59:21 +08:00
song
0dc4b113d8
fix(antigravity): 统一转发日志格式,添加 session_id 追踪
2026-01-04 15:59:21 +08:00
song
c8e55ab2ac
fix: 移除 antigravity 模块中的 [Debug] 日志
...
这些调试日志不应在生产环境中输出。
2026-01-04 15:59:21 +08:00
song
fb9930004c
ci: DockerHub 配置可选,未配置时自动跳过
2026-01-04 15:59:21 +08:00
shaw
678b088a13
Merge PR #137 : fix(frontend): 修复跨时区日期范围筛选问题
2026-01-04 14:29:28 +08:00
shaw
fac19d258d
fix(oauth): 修复claude cookie添加账号时会话混淆的问题
2026-01-04 14:20:17 +08:00
shaw
70e9329e64
feat(proxy): 统一代理配置并支持 SOCKS5H 协议
...
- 新增 proxyutil 包,统一 HTTP/HTTPS/SOCKS5/SOCKS5H 代理配置逻辑
- SOCKS5H 支持服务端 DNS 解析,避免本地 DNS 泄露
- 移除 ProxyStrict 宽松模式,代理失败直接返回错误不回退直连
- 前端代理管理页面支持 SOCKS5H 协议的添加/编辑/批量导入
- 补充 IPv6 地址和特殊字符密码的边界测试
2026-01-04 11:43:58 +08:00
Yuhao Jiang
600f9ce254
fix(frontend): 修复跨时区日期范围筛选问题
...
当管理员在比服务器时区更早的时区(如芝加哥 UTC-6)访问使用记录页面时,
由于服务器时区(如中国 UTC+8)已经是"明天",导致最新的记录无法显示。
修复方案:
- DateRangePicker: 将日期选择器的 max 限制从"今天"改为"明天"
- UsageView: 默认和重置时的 endDate 使用"明天"而非"今天"
这样可以确保跨时区场景下用户能看到所有最新记录。
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2026-01-03 21:04:34 -06:00
shaw
a11c71cea9
fix: 修复创建账号schedulable值默认为false的bug
2026-01-04 10:45:18 +08:00
shaw
d9b1587982
feat(gateway): 实现 Claude Code 系统提示词智能注入
2026-01-04 10:38:13 +08:00
shaw
631ba25e04
Merge branch 'feature/atomic-scheduling-v2'
2026-01-03 13:35:19 +08:00
song
d2aaf0b491
refactor(service): 将 AccountUsageService 的包级缓存改为依赖注入
2026-01-03 13:10:43 +08:00
ianshaw
1710779157
test: 暂时跳过 TestGetAccountsLoadBatch 集成测试
...
该测试在 CI 环境中失败,需要进一步调试。
暂时跳过以让 CI 通过,后续在本地 Docker 环境中修复。
2026-01-02 19:24:01 -08:00
ianshaw
b8779764b5
perf: 优化负载感知调度的准确性和响应速度
...
基于 Codex 审查建议的性能优化。
负载批量查询优化:
- getAccountsLoadBatchScript 添加过期槽位清理
- 使用 ZREMRANGEBYSCORE 在计数前清理过期条目
- 防止过期槽位导致负载率计算偏高
- 提升负载感知调度的准确性
等待循环优化:
- waitForSlotWithPingTimeout 添加立即获取尝试
- 避免不必要的 initialBackoff 延迟
- 低负载场景下减少响应延迟
测试改进:
- 取消跳过 TestGetAccountsLoadBatch 集成测试
- 过期槽位清理应该修复了 CI 中的计数问题
影响:
- 更准确的负载感知调度决策
- 更快的槽位获取响应
- 更好的测试覆盖率
2026-01-02 19:24:01 -08:00
ianshaw
681a357e07
fix: 修复 SSE/JSON 转义和 nil 安全问题
...
基于 Codex 审查建议修复关键安全问题。
SSE/JSON 转义修复:
- handleStreamingAwareError: 使用 json.Marshal 替代字符串拼接
- sendMockWarmupStream: 使用 json.Marshal 生成 message_start 事件
- 防止错误消息中的特殊字符导致无效 JSON
Nil 安全检查:
- SelectAccountWithLoadAwareness: 粘性会话层添加 s.cache != nil 检查
- BindStickySession: 添加 s.cache == nil 检查
- 防止 cache 未初始化时的运行时 panic
影响:
- 提升 SSE 错误处理的健壮性
- 避免客户端 JSON 解析失败
- 增强代码防御性编程
2026-01-02 19:24:01 -08:00
ianshaw
e876d54a48
fix: 恢复 Google One 功能兼容性
...
恢复 main 分支的 gemini_oauth_service.go 以保持与 Google One 功能的兼容性。
变更:
- 添加 Google One tier 常量定义
- 添加存储空间 tier 阈值常量
- 支持 google_one OAuth 类型
- 包含 RefreshAccountGoogleOneTier 等 Google One 相关方法
原因:
- atomic-scheduling 恢复时使用了旧版本的文件
- 需要保持与 main 分支 Google One 功能(PR #118)的兼容性
- 避免编译错误(handler 代码依赖这些方法)
2026-01-02 19:24:01 -08:00
ianshaw
7568dc8500
Reapply "feat(gateway): 实现负载感知的账号调度优化 ( #114 )" ( #117 )
...
This reverts commit c5c12d4c8b .
2026-01-02 19:24:01 -08:00
song
0452f32003
feat(antigravity): 支持 Gemini cachedContentTokenCount 映射到 Claude cache_read_input_tokens
...
- 在 GeminiUsageMetadata 添加 CachedContentTokenCount 字段
- 修正 token 映射:Gemini promptTokenCount 包含缓存,Claude input_tokens 不包含
- 流式和非流式响应均已支持
2026-01-03 01:26:18 +08:00
song
9ed823fdbd
fix: 移除 antigravity 模块中的 [Debug] 日志
...
这些调试日志不应在生产环境中输出。
2026-01-03 00:36:48 +08:00
song
45e28dd9c1
fix(lint): 修复 gofmt 格式问题
2026-01-03 00:32:54 +08:00
song
2e60a5964e
docs(i18n): 更新 Antigravity 混合调度选项的文案
...
- 显示名称改为「在 /v1/messages 中使用」
- 添加更醒目的警告提示,强调 Antigravity 和 Anthropic 账号不能混用
2026-01-03 00:22:35 +08:00
song
ec03f82fb9
revert(antigravity): 恢复 Claude 模型 thinking 功能
...
还原 b6d1e7a 中错误禁用 Claude thinking 的逻辑:
- 移除 isThinkingEnabled 对 allowDummyThought 的依赖
- 移除非 Gemini 模型时清除 Thinking 配置的代码
- 恢复 buildParts 中 thinking block 的原始处理逻辑
- 移除不再使用的 isValidThoughtSignature 函数
2026-01-03 00:08:00 +08:00
song
4543a6f043
refactor(antigravity): 统一额度刷新机制与 Claude 一致
...
将 Antigravity 的额度刷新从后台定时刷新改为按需获取模式,与 Claude 统一:
- 删除 AntigravityQuotaRefresher 后台服务
- 新增 QuotaFetcher 接口和 AntigravityQuotaFetcher 实现
- 前端改为调用 usage API 获取额度,支持 loading/error 状态
- 统一使用内存缓存(10 分钟 TTL)
2026-01-02 22:41:55 +08:00
song
8a50ca592a
test: 更新 haiku 模型映射测试用例
2026-01-02 17:50:39 +08:00
song
7f5ec28488
docs: 添加 Simple Mode 说明和 Antigravity 已知问题
2026-01-02 17:46:39 +08:00
song
991c3ea68b
refactor(antigravity): haiku 模型映射到 sonnet
2026-01-02 17:46:39 +08:00
song
b2b842bf7a
refactor(antigravity): countTokens 端点直接返回空值
...
- Gemini 端点 countTokens 直接返回 {"totalTokens": 0}
- Claude 端点 countTokens 返回 {"input_tokens": 0}
- 移除透传上游和本地估算逻辑
2026-01-02 17:46:39 +08:00
shaw
9d3ec9e627
feat(keys): 适配 Antigravity 和 Gemini 平台的使用教程与 CCS 导入
...
- UseKeyModal: 添加 Antigravity 两级 Tab (Claude Code / Gemini CLI)
- UseKeyModal: 添加 Gemini 平台的 Gemini CLI 教程
- UseKeyModal: Antigravity 平台统一使用 /antigravity 后缀
- KeysView: CCS 导入支持 Antigravity (询问客户端) / Gemini / OpenAI
- i18n: 添加相关中英文翻译
2026-01-02 15:53:05 +08:00
shaw
b1528e9dec
Merge PR #126 : feat(antigravity): 添加 models 端点支持
2026-01-02 14:28:21 +08:00
song
f1fdb5d38f
refactor: /antigravity/v1/models 使用专用 handler
...
不再复用 Models(),避免内部 ForcePlatform 判断
2026-01-02 10:32:20 +08:00
song
6cc7f9978c
merge: 合并 upstream/main
2026-01-02 10:22:29 +08:00
song
95d09f60f8
feat(antigravity): 添加 models 端点支持
...
- /antigravity/models: 返回全部模型(Claude + Gemini)
- /antigravity/v1/models: 返回全部模型(Claude API 格式)
- /antigravity/v1beta/models: 仅返回 Gemini 模型(v1beta 格式)
统一管理 antigravity 模型定义,避免重复代码
2026-01-02 10:21:05 +08:00
shaw
106e59b753
Merge PR #122 : feat: 用户自定义属性系统 + Wechat 字段迁移
2026-01-01 20:25:50 +08:00
Edric Li
759291db02
fix: update integration tests for UserListFilters
...
Update user_repo_integration_test.go to use the new UserListFilters
struct instead of individual parameters for ListWithFilters calls.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 19:13:58 +08:00
Edric Li
d8e2812d80
fix: resolve CI failures
...
- Fix gofmt formatting issue in user_service.go
- Remove unused sql field from userAttributeValueRepository
- Update ListWithFilters signature in test stubs to match interface
- Remove Wechat field from test user data
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 19:09:06 +08:00
Edric Li
404bf0f8d2
refactor: migrate wechat to user attributes and enhance users list
...
Migrate the hardcoded wechat field to the new extensible user
attributes system and improve the users management UI.
Migration:
- Add migration 019 to move wechat data to user_attribute_values
- Remove wechat field from User entity, DTOs, and API contracts
- Clean up wechat-related code from backend and frontend
UsersView enhancements:
- Add text labels to action buttons (Filter Settings, Column Settings,
Attributes Config) for better UX
- Change status column to show colored dot + Chinese text instead of
English text
- Add dynamic attribute columns support with batch loading
- Add column visibility settings with localStorage persistence
- Add filter settings modal for search and filter preferences
- Update i18n translations
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 18:59:38 +08:00
Edric Li
f44cf642bc
feat(frontend): add user attributes management UI
...
Add Vue components and API client for managing user custom attributes.
- Add userAttributes API client with CRUD operations
- Add UserAttributeForm component for displaying/editing attribute values
- Add UserAttributesConfigModal for attribute definition management
- Support all attribute types: text, textarea, number, email, url,
date, select, multi_select
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 18:59:06 +08:00
Edric Li
3c3fed886f
feat(backend): add user custom attributes system
...
Add a flexible user attribute system that allows admins to define
custom fields for users (text, textarea, number, email, url, date,
select, multi_select types).
- Add Ent schemas for UserAttributeDefinition and UserAttributeValue
- Add service layer with validation logic
- Add repository layer with batch operations support
- Add admin API endpoints for CRUD and reorder operations
- Add batch API for loading attribute values for multiple users
- Add database migration (018_user_attributes.sql)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 18:58:34 +08:00
shaw
2c71c8b968
Merge PR #119 : 支持自定义模型和优化模型选择
2026-01-01 17:02:54 +08:00
shaw
901b03b870
Merge PR #118 : feat(gemini): 添加 Google One 存储空间推断 Tier 功能
2026-01-01 16:54:30 +08:00
Edric Li
7331220e06
Merge remote-tracking branch 'upstream/main'
...
# Conflicts:
# frontend/src/components/account/CreateAccountModal.vue
2026-01-01 16:18:34 +08:00
Edric Li
fb86002ef9
feat: 添加模型白名单选择器组件,同步 new-api 模型列表
...
- 新增 ModelWhitelistSelector.vue 支持模型白名单多选
- 新增 ModelIcon.vue 显示品牌图标(基于 @lobehub/icons)
- 新增 useModelWhitelist.ts 硬编码各平台模型列表
- 更新账号编辑表单支持模型白名单配置
- 支持 Claude/OpenAI/Gemini/智谱/百度/讯飞等主流平台
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 16:03:48 +08:00
IanShaw027
1d5e05b8ca
fix: 修复 P0 安全和并发问题
...
- 修复敏感信息泄露:移除 Drive API 完整响应体打印,只记录状态码
- 修复并发安全问题:升级为 RWMutex,读写分离提升性能
- 修复资源泄漏风险:使用 defer 确保 resp.Body 正确关闭
2026-01-01 15:35:08 +08:00
IanShaw027
c63192fcb5
fix(test): 修复 CI 测试和 lint 错误
...
- 为所有 mock 实现添加 GetByIDs 方法以满足 AccountRepository 接口
- 重构 account_handler.go 中的类型断言,使用类型安全的变量
- 修复 gofmt 格式问题
2026-01-01 15:16:12 +08:00
IanShaw027
48764e15a5
test(gemini): 添加 Drive API 和 OAuth 服务单元测试
...
- 新增 drive_client_test.go:Drive API 客户端单元测试
- 新增 gemini_oauth_service_test.go:OAuth 服务单元测试
- 重构 account_handler.go:改进 RefreshTier API 实现
- 优化 drive_client.go:增强错误处理和重试逻辑
- 完善 repository 和 service 层:支持批量 tier 刷新
- 更新迁移文件编号:017 -> 024(避免冲突)
2026-01-01 15:07:16 +08:00
IanShaw027
34bbfb5dd2
fix(lint): 修复 golangci-lint 检查错误
...
- 修复未检查的错误返回值 (errcheck)
- 移除未使用的 httpClient 字段 (unused)
- 修复低效赋值问题 (ineffassign)
- 使用 switch 替代 if-else 链 (staticcheck QF1003)
- 修复错误字符串首字母大写问题 (staticcheck ST1005)
- 运行 gofmt 格式化代码
2026-01-01 14:07:37 +08:00
ianshaw
7df914af06
feat(gemini): 添加 Google One 存储空间推断 Tier 功能
...
## 功能概述
通过 Google Drive API 获取存储空间配额来推断 Google One 订阅等级,并优化统一的配额显示系统。
## 后端改动
- 新增 Drive API 客户端 (drive_client.go)
- 支持代理和指数退避重试
- 处理 403/429 错误
- 添加 Tier 推断逻辑 (inferGoogleOneTier)
- 支持 6 种 tier 类型:AI_PREMIUM, GOOGLE_ONE_STANDARD, GOOGLE_ONE_BASIC, FREE, GOOGLE_ONE_UNKNOWN, GOOGLE_ONE_UNLIMITED
- 集成到 OAuth 流程
- ExchangeCode: 授权时自动获取 tier
- RefreshAccountToken: Token 刷新时更新 tier (24小时缓存)
- 新增管理 API 端点
- POST /api/v1/admin/accounts/:id/refresh-tier (单个账号刷新)
- POST /api/v1/admin/accounts/batch-refresh-tier (批量刷新)
## 前端改动
- 更新 AccountQuotaInfo.vue
- 添加 Google One tier 标签映射
- 添加 tier 颜色样式 (紫色/蓝色/绿色/灰色/琥珀色)
- 更新 AccountUsageCell.vue
- 添加 Google One tier 显示逻辑
- 根据 oauth_type 区分显示方式
- 添加国际化翻译 (en.ts, zh.ts)
- aiPremium, standard, basic, free, personal, unlimited
## Tier 推断规则
- >= 2TB: AI Premium
- >= 200GB: Google One Standard
- >= 100GB: Google One Basic
- >= 15GB: Free
- > 100TB: Unlimited (G Suite legacy)
- 其他/失败: Unknown (显示为 Personal)
## 优雅降级
- Drive API 失败时使用 GOOGLE_ONE_UNKNOWN
- 不阻断 OAuth 流程
- 24小时缓存避免频繁调用
## 测试
- ✅ 后端编译成功
- ✅ 前端构建成功
- ✅ 所有代码符合现有规范
2025-12-31 21:45:24 -08:00
shaw
4f13c8de0d
Merge PR #110 : refactor(antigravity): 简化模型映射逻辑,支持前缀匹配
...
- 删除 GeminiQuotaService 及相关代码
- 删除负载感知调度(SelectAccountWithLoadAwareness)
- 简化并发控制,删除账号级等待队列
- 模型映射改用前缀匹配,覆盖版本变化
Closes #110
2026-01-01 11:21:09 +08:00
shaw
2a395d12a6
Merge branch 'feature/atomic-scheduling'
2026-01-01 11:05:22 +08:00