- 20 Dec, 2025 10 commits
-
-
Forest authored
-
Forest authored
-
Forest authored
-
Forest authored
-
NepetaLemon authored
## 变更内容 ### 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 检查 - 统一代码格式 -
shaw authored
-
shaw authored
-
Forest authored
-
shaw authored
- 窗口激活/重置时使用当天零点而非精确时间 - 使用服务器本地时区计算零点(支持 UTC+8 等时区) - 窗口重置时失效 Redis 缓存,避免数据不一致
-
shaw authored
-
- 19 Dec, 2025 9 commits
-
-
Forest authored
-
Forest authored
-
shaw authored
- 新增 intercept_warmup_requests 配置项,存储在 credentials 字段 - 启用后,标题生成、Warmup 等预热请求返回 mock 响应,不消耗上游 token - 前端支持所有账号类型(OAuth、Setup Token、API Key)的开关配置 - 修复 OAuth 凭证刷新时丢失非 token 配置的问题
-
shaw authored
- 新增 GET /api/v1/admin/accounts/:id/models 接口获取账号可用模型 - 账号测试弹窗新增模型选择下拉框 - 测试时支持传入 model_id 参数,不传则默认使用 Sonnet - API Key 账号支持根据 model_mapping 映射测试模型 - 将模型常量提取到 claude 包统一管理
-
shaw authored
- 新增 internal/pkg/claude 包统一管理 Claude Code 相关常量 - 统一账号测试逻辑,所有账号类型使用相同的 Claude Code 风格请求 - 网关服务使用常量包替换硬编码的 beta header 字符串
-
shaw authored
Setup Wizard 之前硬编码使用 8080 端口,现在支持从 config.yaml 或 环境变量 (SERVER_HOST, SERVER_PORT) 读取监听地址,方便用户在端口 被占用时使用其他地址启动初始化向导。
-
shaw authored
实现 Claude API 的 token 计数功能,支持 OAuth、SetupToken 和 ApiKey 三种账号类型。 特点: - 校验订阅/余额(不扣费) - 不计算用户和账号并发 - 不记录使用量 - 支持模型映射(ApiKey 账号) - 支持 OAuth 账号的指纹管理和 401 重试
-
shaw authored
前后端同时处理,防止因意外空格导致代理连接失败
-
shaw authored
将原本在nginx处理的遥测日志请求移至后端, 忽略Claude Code客户端发送的日志数据。
-
- 18 Dec, 2025 13 commits
-
-
Forest authored
-
shaw authored
将后端路由与前端API调用对齐: - /user/profile -> /users/me - PUT /user/password -> POST /users/me/password
-
Forest authored
-
shaw authored
- 前端添加更新和重启按钮,支持一键更新 Release 构建 - 修复条件判断优先级问题,确保错误/成功状态正确显示 - 后端使用原子文件替换模式,确保更新过程安全可靠 - 在可执行文件同目录创建临时文件,保证 rename 原子性 - 删除未使用的 copyFile 函数,保持代码整洁
-
shaw authored
重构内容: - 移除复杂的 sudo systemctl restart 方案 - 改用 os.Exit(0) + systemd Restart=always 的标准做法 - 删除 sudoers 配置及相关代码 - 删除 sub2api-sudoers 文件 优势: - 代码从 85+ 行简化到 47 行 - 无需 sudo 权限配置 - 无需特殊用户 shell 配置 - 更简单、更可靠 - 符合行业最佳实践(Docker/K8s 等均采用此方案) 工作原理: - 服务调用 os.Exit(0) 优雅退出 - systemd 检测到退出后自动重启(Restart=always)
-
shaw authored
问题原因: - cmd.Start() 启动的子进程与父进程在同一会话中 - 当 systemctl restart 发送 SIGTERM 给父进程时 - 子进程可能也会被终止,导致重启命令无法完成 修复内容: - 使用 setsid 创建新会话,子进程完全独立于父进程 - 分离标准输入/输出/错误流 - 确保即使父进程被 kill,重启命令仍能执行完成
-
shaw authored
问题原因: - systemd 服务的 PATH 环境变量可能受限 - 直接使用 "sudo" 可能找不到可执行文件 修复内容: - 添加 findExecutable 函数动态查找可执行文件路径 - 先尝试 exec.LookPath,再检查常见系统路径 - 添加日志显示实际使用的路径,方便调试 - 兼容不同 Linux 发行版的路径差异
-
shaw authored
问题原因: - sudo 命令没有 -n 选项 - 在后台服务中,sudo 会尝试从终端读取密码 - 由于没有终端,命令静默失败 修复内容: - 添加 sudo -n 选项强制非交互模式 - 如果需要密码会立即失败并返回错误,而不是挂起
-
江西小徐 authored
问题描述: 当多个请求并发执行且使用不同代理配置时,它们会同时修改共享的 s.httpClient.Transport,导致请求可能使用错误的代理(数据泄露风险) 或意外失败。 修复方案: 为需要代理的请求创建独立的http.Client,而不是修改共享的httpClient.Transport。 改动内容: - 新增 buildUpstreamRequestResult 结构体,返回请求和可选的独立client - 修改 buildUpstreamRequest 方法,配置代理时创建独立client - 更新 Forward 方法,根据是否有代理选择合适的client
-
shaw authored
-
shaw authored
-
shaw authored
-
shaw authored
-