- 26 Dec, 2025 16 commits
-
-
ianshaw authored
- 新增 /auth/callback 路由用于接收 OAuth 授权回调 - 优化路由配置和文档 - 统一代码格式
-
ianshaw authored
- 新增中文 Gemini OAuth 相关翻译(步骤说明、错误提示等) - 新增英文 Gemini OAuth 相关翻译 - 添加 Gemini 账号类型、平台名称等基础翻译 - 优化代码格式
-
ianshaw authored
- 统一移除语句末尾分号,规范代码格式 - 优化组件类型定义和 props 声明 - 改进组件文档和示例代码 - 提升代码可读性和一致性
-
ianshaw authored
- CreateAccountModal: 添加 Gemini 平台选项和 OAuth 授权流程 - EditAccountModal: 支持 Gemini 账号编辑 - OAuthAuthorizationFlow: 新增 Gemini 平台 OAuth 流程处理(支持 state 参数) - ReAuthAccountModal: 支持 Gemini 账号重新授权 - 优化代码格式和组件逻辑
-
ianshaw authored
- 新增 /admin/gemini API 接口封装(generateAuthUrl, exchangeCode) - 新增 useGeminiOAuth composable 处理 Gemini OAuth 流程 - 新增 OAuthCallbackView 视图用于接收 OAuth 回调 - 支持 code/state 参数提取和 credentials 构建
-
ianshaw authored
- 修复 account_handler 中 token 字段类型转换(int64 转 string) - 增强 Account.GetCredential 支持多种数值类型(float64, int, json.Number 等) - 添加 Account.IsGemini() 方法用于平台判断 - 优化 refresh_token 和 scope 的空值处理
-
ianshaw authored
- 新增 Gemini OAuth 授权处理器 - 扩展账号和网关处理器支持 Gemini - 注册 Gemini 相关路由 - 更新 Wire 依赖注入配置(所有层) - 更新 Docker Compose 配置
-
ianshaw authored
- CRS 同步服务新增 Gemini 账号同步逻辑(+273行) - 定价服务扩展 Gemini 模型定价计算(+99行) - 更新 Token 刷新服务集成 Gemini - 更新相关单元测试
-
ianshaw authored
- 实现 OAuth 授权流程服务 - 添加 Token 提供者和自动刷新机制 - 实现 Gemini Messages API 兼容层 - 更新服务容器注册
-
ianshaw authored
- 定义 OAuth 服务接口 - 定义 Token 缓存服务接口 - 定义 Code Assist 服务接口
-
ianshaw authored
- 添加 Gemini OAuth 客户端实现 - 实现 Redis 基础的 Token 缓存 - 添加 gemini-cli Code Assist 客户端封装
-
ianshaw authored
- 添加 Gemini OAuth 配置结构 - 实现 geminicli 包(OAuth、Token、CodeAssist 类型) - 更新配置示例文件
-
shaw authored
-
shaw authored
-
Forest authored
-
NepetaLemon authored
* refactor: 自定义业务错误 * refactor: 隐藏服务器错误与统一 panic 响应
-
- 25 Dec, 2025 17 commits
-
-
shaw authored
-
Forest authored
-
Forest authored
-
hi_yueban authored
* fix: 修复 OpenAI 账号 5h/7d 使用限制显示错误的问题 问题描述: - 账号管理页面中,OpenAI OAuth 账号的 5h 列显示 7 天的剩余时间 - 7d 列却显示几小时的剩余时间 - 根本原因: OpenAI 响应头中 primary/secondary 的实际含义与代码假设相反 修复方案: 1. 后端归一化 (openai_gateway_service.go): - 根据 window_minutes 动态判断哪个是 5h/7d 限制 - 新增规范字段 codex_5h_* 和 codex_7d_* - 保留旧字段以兼容性 2. 前端适配 (AccountUsageCell.vue): - 优先使用新的规范字段 - Fallback 到旧字段时基于 window_minutes 动态判断 - 更新 computed 属性命名 3. 类型定义更新 (types/index.ts): - 添加新的规范字段定义 - 更新注释说明实际语义由 window_minutes 决定
🤖 Generated with Claude Code and Codex collaboration Co-Authored-By:Claude Sonnet 4.5 <noreply@anthropic.com> Co-Authored-By:
OpenAI Codex <noreply@openai.com> * fix: 改进窗口判断逻辑,修复两个窗口都小于阈值时的bug 问题: 当两个窗口都小于360分钟时(如 primary=180分钟,secondary=300分钟), 之前的逻辑会导致: - primary5h = true, secondary5h = true - 5h 字段会使用 primary(错误) - 7d 字段没有数据(bug) 修复方案: 改用比较策略: 1. 当两个窗口都存在时:较小的分配给5h,较大的分配给7d 2. 当只有一个窗口时:根据大小(<=360分钟)判断是5h还是7d 3. 确保数据不会丢失,逻辑更健壮 示例: - Primary: 180分钟, Secondary: 300分钟 → 5h 使用 Primary(180分钟), 7d 使用 Secondary(300分钟) ✓
🤖 Generated with Claude Code Co-Authored-By:Claude Sonnet 4.5 <noreply@anthropic.com> * fix: 修正窗口大小判断逻辑 - 不能用剩余时间判断窗口类型 **严重bug修复:** 之前的 fallback 逻辑错误地使用 reset_after_seconds 来判断窗口大小。 问题示例: - 周限制(7d)剩余 2h → reset_after_seconds = 7200秒 - 5h限制 剩余 4h → reset_after_seconds = 14400秒 - 错误逻辑:7200/60 < 14400/60,把周限制当成5h
❌ 根本问题: - window_minutes = 窗口的总大小(300 or 10080) - reset_after_seconds = 距离重置的剩余时间(变化的) - 不能用剩余时间来判断窗口类型! 修复方案: 1. **只使用 window_minutes** 来判断窗口大小 2. 移除错误的 reset_after_seconds fallback 3. 如果 window_minutes 都不存在,使用传统假设 4. 添加详细注释说明这个陷阱🤖 Generated with Claude Code Co-Authored-By:Claude Sonnet 4.5 <noreply@anthropic.com> * fix: 修复 lint 问题 - 改进 fallback 逻辑的变量赋值 问题: 第882-883行的简单布尔赋值可能触发 ineffassign 或 staticcheck 警告: use5hFromSecondary = snapshot.SecondaryUsedPercent != nil use7dFromPrimary = snapshot.PrimaryUsedPercent != nil 修复: 改用明确的 if 语句检查任意字段是否存在,更符合代码意图: - 如果 secondary 的任意字段存在,将其视为 5h - 如果 primary 的任意字段存在,将其视为 7d 这样逻辑更清晰,也避免了 lint 警告。 --------- Co-authored-by:
Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by:
OpenAI Codex <noreply@openai.com>
-
shaw authored
-
shaw authored
-
Forest authored
-
刀刀 authored
* feat: http 400 返回具体错误 * 更新 workflows * 优化打包/docker 构建流程 * 400 是返回 原始错误 - json 格式 * feat: 非 cc请求时补充 system * go mod tidy
-
IanShaw authored
* fix(service): 修复 OpenAI Responses API 测试负载配置 - 所有账号类型统一添加 instructions 字段(不再仅限 OAuth) - Responses API 要求所有请求必须包含 instructions 参数 * feat(crs-sync): CRS 同步时自动刷新 OAuth token 并保留完整 extra 字段 **核心功能**: - CRSSyncService 注入 OAuth 服务依赖(Anthropic + OpenAI) - 账号创建/更新后自动刷新 OAuth token,确保可用性 - 完整保留 CRS extra 字段,避免数据丢失 **Extra 字段增强**: - 保留 CRS 所有原始 extra 字段 - 新增同步元数据: crs_account_id, crs_kind, crs_synced_at - Claude 账号: 从 credentials 提取 org_uuid/account_uuid 到 extra - OpenAI 账号: 映射 crs_email -> email **Token 刷新逻辑**: - 新增 refreshOAuthToken() 方法处理 Anthropic/OpenAI 平台 - 保留原有 credentials 字段,仅更新 token 相关字段 - 刷新失败静默处理,不中断同步流程 **依赖注入**: - wire_gen.go: CRSSyncService 新增 oAuthService/openaiOAuthService * style(crs-sync): 使用 switch 替代 if-else 修复 golangci-lint 警告 - 将 refreshOAuthToken 中的 if-else 改为 switch 语句 - 符合 staticcheck 规范 - 添加 default 分支处理未知平台
-
shaw authored
-
shaw authored
- 添加从 CRS 同步账户功能 (Claude OAuth/API Key, OpenAI OAuth/Responses) - 添加批量编辑账户功能,支持 JSONB 字段智能合并 - 新增 CRSSyncService、BulkUpdate 仓储方法 - 前端新增 SyncFromCrsModal 和 BulkEditAccountModal 组件
-
ianshaw authored
格式化前端业务代码,符合代码规范 - 统一代码风格 - 修复 ESLint 警告
-
ianshaw authored
修复 golangci-lint 错误检查问题 - 使用匿名函数包装 defer Close() 并忽略错误 - 符合 Go 最佳实践
-
ianshaw authored
-
ianshaw authored
-
ianshaw authored
- 新增 BulkUpdate 仓储方法,使用单条 SQL 更新所有账户 - credentials/extra 使用 COALESCE(...) || ? 合并,只更新传入的 key - name/proxy_id/concurrency/priority/status 只在提供时更新 - 分组绑定仍逐账号处理(需要独立操作) - 前端优化:Base URL 留空则不修改,按勾选字段更新 - 完善 i18n 文案:说明留空不修改、批量更新行为
-
ianshaw authored
- 新增批量更新账户凭据接口(account_uuid/org_uuid/intercept_warmup_requests) - 新增前端批量编辑模态框组件 - 优化 CRS 同步逻辑,改进 extra 字段处理 - 优化 CRS 同步 UI,添加更详细的结果展示 - 完善国际化文案(中英文)
-
- 24 Dec, 2025 7 commits
-
-
ianshaw authored
- 添加账户同步 API 接口 (account_handler.go) - 实现 CRS 同步服务 (crs_sync_service.go) - 添加前端同步对话框组件 (SyncFromCrsModal.vue) - 更新账户管理界面支持同步操作 - 添加账户仓库批量创建方法 - 添加中英文国际化翻译 - 更新依赖注入配置
-
ianshaw authored
- 添加 backend/config.yaml 到 .gitignore(包含敏感信息) - 添加 deploy/config.yaml 到 .gitignore(包含敏感信息) - 添加 backend/.installed 到 .gitignore - 还原 Makefile 到原始版本
-
shaw authored
-
shaw authored
- 后台系统设置新增文档链接(doc_url)配置项 - 首页顶部导航栏显示文档链接图标(条件渲染) - Footer区域添加文档链接和GitHub链接 - 支持中英文国际化
-
Forest authored
-
shaw authored
问题:旧方案使用计数器模式,每次acquire都刷新TTL,导致僵尸数据永不过期 解决方案: - 每个槽位使用独立Redis Key: concurrency:account:{id}:{requestID} - 利用Redis原生TTL,每个槽位独立5分钟过期 - 服务崩溃后僵尸数据自动清理,无需手动干预 - 兼容多实例K8s部署 技术改动: - 新增SCAN脚本统计活跃槽位数量 - 移除冗余的releaseScript,直接使用DEL命令 - Wait队列TTL只在首次创建时设置,避免刷新 -
shaw authored
- 修复 Admin Dashboard Handler 遗漏返回 rpm/tpm 字段 - 将性能统计时间窗口从1分钟改为5分钟平均值,数据更稳定
-