shaw
|
61838cdb3d
|
fix: 兼容GLM等API的usage数据解析
部分第三方API(如GLM)的SSE响应格式与标准Claude API不同:
- 标准Claude: input_tokens在message_start中
- GLM等API: 所有tokens都在message_delta中
现在从message_delta中也解析input_tokens和cache相关字段,
如果message_start中没有值则使用message_delta中的数据。
|
2025-12-23 19:42:52 +08:00 |
|
dexcoder6
|
50dba656fd
|
feat: 添加用户余额充值/退款功能 (#17)
## 功能特性
### 前端
- 在用户列表操作列添加充值和退款按钮
- 实现充值/退款对话框,支持输入金额和备注
- 从编辑用户表单中移除余额字段,防止直接修改
- 添加余额不足验证,实时显示操作后余额
- 优化备注提示词,提供多种场景示例
### 后端
- 为 redeem_codes 表添加 notes 字段(迁移文件)
- 在 UpdateUserBalance 接口添加 notes 参数支持
- 添加余额验证:金额必须大于0,操作后余额不能为负
- UpdateUser 接口移除 balance 字段处理,防止误操作
- 完整的审计日志和缓存管理
## 安全保护
- 前端:余额不足时禁用提交按钮,实时提示
- 后端:双重验证(输入金额 > 0 + 结果余额 >= 0)
- 权限:仅管理员可访问(AdminAuth 中间件)
- 审计:所有操作记录到 redeem_codes 表
## 修改文件
后端:
- backend/migrations/004_add_redeem_code_notes.sql
- backend/internal/model/redeem_code.go
- backend/internal/service/admin_service.go
- backend/internal/handler/admin/user_handler.go
前端:
- frontend/src/views/admin/UsersView.vue
- frontend/src/api/admin/users.ts
- frontend/src/i18n/locales/zh.ts
- frontend/src/i18n/locales/en.ts
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2025-12-23 16:29:57 +08:00 |
|
shaw
|
f25ac3aff5
|
feat: OpenAI OAuth账号显示Codex使用量
从响应头提取x-codex-*使用量信息并保存到账号Extra字段,
前端账号列表展示5h/7d窗口的使用进度条。
|
2025-12-23 16:26:07 +08:00 |
|
shaw
|
e53b34f321
|
Merge PR #15: feat: 增强用户管理功能,添加用户名、微信号和备注字段
|
2025-12-23 14:03:07 +08:00 |
|
shaw
|
12ddae0184
|
fix: 优化OpenAI模型定价查找的回退逻辑
当模型ID在model_pricing.json中找不到时,增加智能回退策略:
- gpt-5.2-codex → 回退到 gpt-5.2
- gpt-5.2-20251222 → 去掉日期后缀回退到 gpt-5.2
- 最终回退到 DefaultTestModel (gpt-5.1-codex)
|
2025-12-23 13:58:56 +08:00 |
|
shaw
|
7b9c3f165e
|
feat: 账号管理新增使用统计功能
- 新增账号统计弹窗,展示30天使用数据
- 显示总费用、请求数、日均费用、日均请求等汇总指标
- 显示今日概览、最高费用日、最高请求日
- 包含费用与请求趋势图(双Y轴)
- 复用模型分布图组件展示模型使用分布
- 显示实际扣费和标准计费(标准计费以较淡颜色显示)
|
2025-12-23 13:42:33 +08:00 |
|
dexcoder6
|
0b8e84f942
|
feat: 增强用户管理功能,添加用户名、微信号和备注字段
- 新增User模型字段:username(用户名)、wechat(微信号)、notes(备注)
- 扩展用户搜索功能,支持通过用户名和微信号搜索
- 添加用户个人资料更新功能,用户可自行编辑用户名和微信号
- 管理员用户列表新增用户名、微信号、备注显示列
- 备注字段仅对管理员可见,增强数据安全性
- 完善中英文国际化翻译
- 修复国际化文件中重复属性的TypeScript错误
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2025-12-23 11:26:22 +08:00 |
|
shaw
|
d9e27df9af
|
feat: 账号列表显示所属分组
- Account模型新增Groups虚拟字段
- 账号列表API预加载Group信息
- 账号管理页面新增分组列,使用GroupBadge展示
|
2025-12-23 11:20:02 +08:00 |
|
shaw
|
f0fabf89a1
|
feat: 用户列表显示订阅分组及剩余天数
- User模型新增Subscriptions关联
- 用户列表批量加载订阅信息避免N+1查询
- GroupBadge组件支持显示剩余天数(过期红色、<=3天红色、<=7天橙色)
- 用户管理页面新增订阅分组列
|
2025-12-23 11:03:10 +08:00 |
|
shaw
|
5bbfbcdae9
|
fix: 修复订阅窗口过期后进度条显示不正确的问题
问题:滑动窗口过期后(如昨天用满额度),前端仍显示历史数据(红色进度条100%、"即将重置")
解决:
- 后端返回数据前检查窗口是否过期,过期则清零展示数据
- 前端处理 window_start 为 null 的情况,显示"窗口未激活"
- 不影响实际的窗口激活逻辑,窗口仍从当天零点开始
|
2025-12-23 10:38:15 +08:00 |
|
shaw
|
eb55947ec4
|
fix: 修复golangci-lint检查问题
- 移除OpenAIGatewayHandler中未使用的userService字段
- 将账号类型判断的if-else链改为switch语句
|
2025-12-23 10:25:32 +08:00 |
|
shaw
|
fda753278c
|
feat: 平台图标与计费修复
- fix(billing): 修复 OpenAI 兼容 API 缓存 token 重复计费问题
- fix(auth): 隐藏数据库错误详情,返回通用服务不可用错误
- feat(ui): 新增 PlatformIcon 组件,GroupBadge 支持平台颜色区分
- feat(ui): 账号管理新增重置状态按钮,重授权后自动清除错误
- feat(ui): 分组管理新增计费类型列,显示订阅限额信息
- ui: 首页 GPT 状态改为已支持
|
2025-12-23 10:01:58 +08:00 |
|
shaw
|
6c469b42ed
|
feat: 新增支持codex转发
|
2025-12-22 22:58:31 +08:00 |
|
shaw
|
dacf3a2a6e
|
fix: 去掉accept-encoding透传
|
2025-12-21 21:30:19 +08:00 |
|
Forest
|
aa89777dda
|
ci(backend): 调整 embed server
|
2025-12-20 16:44:25 +08:00 |
|
Forest
|
1e1f3c0c74
|
ci(backend): 添加 gofmt 配置
|
2025-12-20 16:19:40 +08:00 |
|
Forest
|
1fab9204eb
|
ci(backend): 添加 unused 配置
|
2025-12-20 16:12:44 +08:00 |
|
Forest
|
0338c83b90
|
ci(backend): 添加 errcheck 配置
|
2025-12-20 15:52:13 +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 |
|
shaw
|
587012396b
|
feat: 支持创建管理员APIKEY
|
2025-12-20 15:11:43 +08:00 |
|
shaw
|
adebd941e1
|
fix: 修复Oauth账号自动刷新token失败的bug
|
2025-12-20 13:01:58 +08:00 |
|
Forest
|
cceada7dae
|
refactor(backend): service http ports
|
2025-12-20 11:57:02 +08:00 |
|
shaw
|
5c2e7ae265
|
fix: 调整订阅计费时间窗口为每日0点
- 窗口激活/重置时使用当天零点而非精确时间
- 使用服务器本地时区计算零点(支持 UTC+8 等时区)
- 窗口重置时失效 Redis 缓存,避免数据不一致
|
2025-12-20 11:33:06 +08:00 |
|
shaw
|
420bedd615
|
Merge PR #8: refactor(backend): 添加 service 缓存端口
|
2025-12-20 11:05:01 +08:00 |
|
shaw
|
0484c59ead
|
feat: /admin/usage页面增加模型分布情况显示
|
2025-12-20 10:06:55 +08:00 |
|
Forest
|
7bbf621490
|
refactor(backend): 添加 service 缓存端口
|
2025-12-19 23:44:18 +08:00 |
|
Forest
|
e99b344b2b
|
refactor(backend): 引入端口接口模式
|
2025-12-19 21:26:19 +08:00 |
|
shaw
|
d1f0902ec0
|
feat(account): 支持账号级别拦截预热请求
- 新增 intercept_warmup_requests 配置项,存储在 credentials 字段
- 启用后,标题生成、Warmup 等预热请求返回 mock 响应,不消耗上游 token
- 前端支持所有账号类型(OAuth、Setup Token、API Key)的开关配置
- 修复 OAuth 凭证刷新时丢失非 token 配置的问题
|
2025-12-19 16:39:25 +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
|
e769f67699
|
fix(setup): 支持从配置文件读取 Setup Wizard 监听地址
Setup Wizard 之前硬编码使用 8080 端口,现在支持从 config.yaml 或
环境变量 (SERVER_HOST, SERVER_PORT) 读取监听地址,方便用户在端口
被占用时使用其他地址启动初始化向导。
|
2025-12-19 11:21:58 +08:00 |
|
shaw
|
52d2ae9708
|
feat(gateway): 添加 /v1/messages/count_tokens 端点
实现 Claude API 的 token 计数功能,支持 OAuth、SetupToken 和 ApiKey 三种账号类型。
特点:
- 校验订阅/余额(不扣费)
- 不计算用户和账号并发
- 不记录使用量
- 支持模型映射(ApiKey 账号)
- 支持 OAuth 账号的指纹管理和 401 重试
|
2025-12-19 11:12:41 +08:00 |
|
shaw
|
2e59998c51
|
fix: 代理表单字段保存时自动去除前后空格
前后端同时处理,防止因意外空格导致代理连接失败
|
2025-12-19 10:39:30 +08:00 |
|
shaw
|
c15b419c4c
|
feat(backend): 添加 event_logging 接口直接返回200
将原本在nginx处理的遥测日志请求移至后端,
忽略Claude Code客户端发送的日志数据。
|
2025-12-19 09:39:57 +08:00 |
|
Forest
|
236908c03d
|
refactor(backend): 拆分 Wire ProviderSet
|
2025-12-19 00:03:29 +08:00 |
|
shaw
|
9b4fc42457
|
feat: 实现后台在线更新功能
- 前端添加更新和重启按钮,支持一键更新 Release 构建
- 修复条件判断优先级问题,确保错误/成功状态正确显示
- 后端使用原子文件替换模式,确保更新过程安全可靠
- 在可执行文件同目录创建临时文件,保证 rename 原子性
- 删除未使用的 copyFile 函数,保持代码整洁
|
2025-12-18 21:15:10 +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 |
|
江西小徐
|
2392e7cf99
|
fix: 修复并发请求时共享httpClient.Transport导致的竞态条件
问题描述:
当多个请求并发执行且使用不同代理配置时,它们会同时修改共享的
s.httpClient.Transport,导致请求可能使用错误的代理(数据泄露风险)
或意外失败。
修复方案:
为需要代理的请求创建独立的http.Client,而不是修改共享的httpClient.Transport。
改动内容:
- 新增 buildUpstreamRequestResult 结构体,返回请求和可选的独立client
- 修改 buildUpstreamRequest 方法,配置代理时创建独立client
- 更新 Forward 方法,根据是否有代理选择合适的client
|
2025-12-18 18:14:48 +08:00 |
|
shaw
|
8e4bd42e8c
|
fix: 修复安装/升级无法重启服务的问题
|
2025-12-18 17:44:49 +08:00 |
|
shaw
|
e2ae9fe50b
|
fix: release error
|
2025-12-18 17:02:21 +08:00 |
|
shaw
|
6cf60176c3
|
fix: release error
|
2025-12-18 15:56:13 +08:00 |
|
shaw
|
642842c29e
|
First commit
|
2025-12-18 13:50:39 +08:00 |
|