shaw
d44582dc31
feat: 适配claude新opus周限规则
2025-10-04 10:49:40 +08:00
wfunc
ea0f818251
feat(claude): limit 5-hour warning notifications to prevent spam
...
## Problem
- Original implementation sends webhook notification on EVERY request when
account reaches 5-hour limit warning status
- Users receive hundreds of duplicate notifications within same 5-hour window
## Solution
- Add `maxFiveHourWarningsPerWindow` config (default: 1, max: 10)
- Track warning count per session window with metadata:
- fiveHourWarningWindow: identifies current window
- fiveHourWarningCount: tracks notifications sent
- fiveHourWarningLastSentAt: last notification timestamp
- Only send notification if count < max limit
- Auto-reset counters when entering new 5-hour window
## Changes
- Add warning limit control in constructor
- Add `_clearFiveHourWarningMetadata()` helper method
- Update `updateSessionWindowStatus()` with notification throttling
- Clear warning metadata on window refresh and manual schedule recovery
## Configuration
- Environment: CLAUDE_5H_WARNING_MAX_NOTIFICATIONS (1-10)
- Config: config.claude.fiveHourWarning.maxNotificationsPerWindow
- Default: 1 notification per window
## Testing
- Tested with accounts reaching 5h limit
- Verified single notification per window
- Confirmed counter reset on new window
2025-10-02 23:31:52 +08:00
iaineng
782e912a0d
fix(oauth): auto-refresh expired tokens in fetchOAuthUsage
...
Replace direct token decryption with getValidAccessToken call to
enable automatic token expiration check and refresh. This fixes
authentication_error when fetching OAuth usage data with expired
access tokens.
2025-10-01 11:59:03 +08:00
iaineng
11c214449f
feat(api): add Claude OAuth usage endpoint with async loading
...
Add dedicated API endpoint to fetch Claude account OAuth usage data
asynchronously, improving user experience by eliminating the need for
multiple page refreshes to view session window statistics.
Backend changes:
- Add GET /admin/claude-accounts/usage endpoint for batch fetching
- Implement fetchOAuthUsage() to call Claude API /api/oauth/usage
- Add buildClaudeUsageSnapshot() to construct frontend data structure
- Add updateClaudeUsageSnapshot() to persist data to Redis
- Add _toNumberOrNull() helper for safe type conversion
- Update getAllAccounts() to return claudeUsage from Redis cache
Data structure:
- Store three window types: 5h, 7d, 7d-Opus
- Track utilization percentage and reset timestamps
- Calculate remaining seconds for each window
Performance optimizations:
- Concurrent batch requests using Promise.allSettled
- Graceful error handling per account
- Non-blocking async execution
2025-09-30 22:51:54 +08:00
shaw
fcf54565ec
chore: 其他文件修改
...
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-30 11:25:43 +08:00
shaw
b4d7ed06c5
fix: 修复5小时限制被停止调度未恢复的问题
2025-09-28 23:30:41 +08:00
shaw
5e015e87e0
style: 优化api-stats布局
2025-09-28 14:54:24 +08:00
shaw
b123cc35c1
feat: api-stats页面查询专属账号会话窗口
2025-09-28 14:36:38 +08:00
shaw
ea28222c71
feat: 支持账号维度的数据统计
2025-09-27 22:55:06 +08:00
shaw
00faa21e4b
fix: 修复claude账号限流不会自动恢复的bug
2025-09-24 09:36:42 +08:00
shaw
158a9b9a31
feat: 优化API Key批量创建和账户限流状态显示
...
- 添加 bedrockAccountId 和 rateLimitCost 字段到批量创建 API Key 功能
- 格式化 claudeAccountService 中的日志输出
- 改进账户视图中会话进度条样式,限流状态显示红色
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-14 11:59:09 +08:00
shaw
aabf909c61
fix:修复限流后未自动恢复调度的问题
2025-09-13 22:24:56 +08:00
shaw
7c4feec5aa
feat: 添加账户状态监控和自动恢复机制
...
- 实现账户健康度监控系统,支持30分钟内错误率检测
- 添加自动恢复机制,失败账户在30分钟后自动尝试恢复
- 优化账户选择策略,优先选择健康账户
- 增强Redis键管理,添加账户状态和错误追踪功能
- 改进Gemini服务错误处理和重试逻辑
- 新增standardGeminiRoutes标准化路由支持
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-11 22:02:53 +08:00
shaw
08946c67ea
feat: 新增 OpenAI-Responses 账户管理功能和独立自动停止标记机制
...
## 功能新增
- 实现 OpenAI-Responses 账户服务(openaiResponsesAccountService.js)
- 支持使用账户内置 API Key 进行请求转发
- 实现每日额度管理和重置机制
- 支持代理配置和优先级设置
- 实现 OpenAI-Responses 中继服务(openaiResponsesRelayService.js)
- 处理请求转发和响应流处理
- 自动记录使用统计信息
- 支持流式和非流式响应
- 新增管理界面的 OpenAI-Responses 账户管理功能
- 完整的 CRUD 操作支持
- 实时额度监控和状态管理
- 支持手动重置限流和每日额度
## 架构改进
- 引入独立的自动停止标记机制,区分不同原因的自动停止
- rateLimitAutoStopped: 限流自动停止
- fiveHourAutoStopped: 5小时限制自动停止
- tempErrorAutoStopped: 临时错误自动停止
- quotaAutoStopped: 额度耗尽自动停止
- 修复手动修改调度状态时自动恢复的问题
- 统一清理逻辑,防止状态冲突
## 其他优化
- getAccountUsageStats 支持不同账户类型参数
- 统一调度器支持 OpenAI-Responses 账户类型
- WebHook 通知增强,支持新账户类型的事件
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-10 15:41:52 +08:00
Edric Li
908e323db0
feat: 为普通Claude账户添加529错误处理功能
...
- 添加可配置的529错误处理机制,通过CLAUDE_OVERLOAD_HANDLING_MINUTES环境变量控制
- 支持流式和非流式请求的529错误检测
- 自动标记过载账户并在指定时间后恢复
- 成功请求后自动清除过载状态
- 默认禁用,需手动配置启用(0表示禁用,>0表示过载持续分钟数)
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-09 00:46:40 +08:00
shaw
399e6b9d8c
fix: 优化codex 429限流显示为恩替
2025-09-08 16:34:26 +08:00
Wesley Liddick
5c8136ddd4
Merge branch 'dev' into main
2025-09-08 16:14:54 +08:00
Edric Li
8cb9f52c1a
feat: 优化粘性会话TTL管理策略
...
- 将TTL默认值从15天改为1小时,更适合短期会话场景
- 将续期阈值默认设为0,默认不自动续期,提高控制精度
- 时间单位从天调整为小时/分钟,提供更细粒度的控制
- 添加环境变量配置支持:STICKY_SESSION_TTL_HOURS 和 STICKY_SESSION_RENEWAL_THRESHOLD_MINUTES
- 保持向后兼容性,所有现有部署将自动使用新的默认值
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-08 16:06:12 +08:00
Edric Li
b46ccb10d0
Revert "feat: 实现基于日费用的智能负载均衡策略"
...
This reverts commit 8976c470e584f1179bcfb30c4856aa6b76633484.
2025-09-08 16:06:12 +08:00
Edric Li
cc27b377d8
feat: 实现基于日费用的智能负载均衡策略
...
- 新增 sortAccountsByCost() 方法,支持按日费用排序账号
- 修改账号选择逻辑从时间排序改为费用排序
- 添加多层容错机制:单账号失败、全局失败、方法异常
- 费用获取失败的账号设为最低优先级,避免故障传播
- 费用相同时仍按时间排序,保持负载均衡
- 增强日志输出,显示账号费用排名和选中账号费用
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-08 16:06:12 +08:00
Edric Li
9cbf3195e0
feat: 优化粘性会话TTL管理策略
...
- 将默认TTL从1小时延长至15天,更适合长期项目开发
- 实现智能续期机制:剩余时间<14天时自动续期到15天
- 添加配置化支持:通过环境变量STICKY_SESSION_TTL_DAYS和STICKY_SESSION_RENEWAL_THRESHOLD_DAYS调整TTL策略
- 集成到所有调度器:Claude、OpenAI、Gemini的普通会话和分组会话
- 提升用户体验:活跃项目会话持续有效,停用项目自动清理
- 性能优化:智能判断减少不必要的Redis EXPIRE操作
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-08 16:06:12 +08:00
shaw
e824858d60
feat: claude账户支持使用统一的客户端标识
2025-09-08 11:35:44 +08:00
sczheng189
ae727d381c
fix:确保清楚了5xx错误导致的临时熔断状态,修复之前没有添加的5分钟定时器
2025-09-04 13:49:55 +08:00
sczheng189
4b0861eb7f
fix:修复了重置状态只删除js对象而没有删除redis的问题
2025-09-04 13:09:55 +08:00
iaineng
1ff14e38cb
feat: 添加Claude账户403错误处理和封禁状态支持
...
- 新增Claude账户403错误自动检测和处理机制
- 区分Claude账户401未授权和403封禁两种错误状态
- 支持非流式和流式请求中的401/403错误处理
- 优化Claude账户错误处理代码,减少重复逻辑
- 支持前端显示不同的Claude账户错误状态和颜色
- 完善Claude账户异常Webhook通知错误码区分
2025-09-04 00:50:28 +08:00
sczheng189
39c49fe2bb
feat: 添加统一Claude Code User-Agent支持及缓存管理功能
...
### **核心功能**
* **自动更新**:自动获取并使用最新的 “Claude Code” 客户端版本号。
* **智能缓存**:获取到的版本会缓存25小时,然后自动刷新。
* **独立开关**:每个账户都可以单独设置是否启用此功能。
### **前端界面**
* **新增开关**:账户设置里增加了“使用统一版本”的选项。
* **信息显示**:能直接看到当前正在使用的版本号。
* **手动刷新**:提供“清除缓存”按钮,可手动强制更新。
### **后端技术**
* **核心方法**:开发了新的后台功能,用于捕获、比较和管理版本号。
* **管理接口**:为管理员提供了新的API (`/admin/claude-code-version`),方便查询和刷新。
2025-09-03 20:14:58 +08:00
sczheng189
9c7ec8758d
resolve: 解决与upstream/dev的合并冲突
...
- 合并admin.js中的groupIds和autoStopOnWarning参数
- 统一AccountForm.vue中的错误提示文案和平台判断逻辑
- 保留AccountsView.vue中的分组过滤和ungrouped功能
- 确保Azure OpenAI账户创建和更新逻辑完整性
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-02 20:32:42 +08:00
sczheng189
37e6c14eac
feat: 完善账户多分组功能和Azure OpenAI支持
...
主要功能:
- 实现账户多分组调度功能完整支持
- 修复Azure OpenAI账户优先级显示问题(前端条件判断缺失)
- 修复未分组筛选功能失效(API参数处理)
- 修复Azure OpenAI账户创建错误调用Gemini API的问题
- 完善各平台分组信息支持和使用统计显示
- 统一删除账户时的分组清理逻辑
- 添加前端请求参数处理支持
技术改进:
- 前端支持多平台账户请求构造
- 后端统一groupInfos返回格式
- API客户端完善查询参数处理
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-02 20:16:20 +08:00
Wesley Liddick
d0eef7e98e
Merge pull request #314 from sczheng189/feat/5xx-error-circuit-breaker
...
feat: 改进5xx错误熔断机制和重置状态功能
2025-09-02 09:32:08 +08:00
sczheng189
f2c2bdf6d6
feat: 改进5xx错误熔断机制和重置状态功能
...
## 熔断机制优化
- 将5xx错误阈值从3次提升到10次,减少误触发
- 缩短临时错误恢复时间从60分钟到5分钟
- 支持所有5xx状态码(500-599)的统一处理
## 重置状态功能完善
后端 resetAccountStatus 新增清除:
- tempErrorAt 字段 (temp_error状态)
- sessionWindowStart/sessionWindowEnd 字段
- 5xx_errors Redis计数键
前端优化:
- 重置成功后强制刷新 loadAccounts(true)
- 避免缓存导致的状态显示不一致
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-01 21:39:39 +08:00
shaw
5cfa3cc72f
feat: 添加精确的账户费用计算和时区支持
...
- 实现基于模型使用量的精确每日费用计算
- 添加 dateHelper 工具支持时区转换
- 移除未使用的 webhook 配置代码
- 清理环境变量和配置文件中的 webhook 相关设置
- 优化前端费用显示,使用后端精确计算的数据
- 添加 DEBUG_HTTP_TRAFFIC 调试选项支持
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-09-01 11:29:16 +08:00
iaineng
26438e0c9b
fix: 修复Claude账户autoStopOnWarning字段无法更新的问题
...
在updateAccount方法的allowedUpdates数组中添加autoStopOnWarning字段,
解决通过管理后台API更新Claude账户时该字段被过滤掉的问题
2025-08-31 21:49:40 +08:00
shaw
e84c6a5555
feat: 实现基于费用的速率限制功能
...
- 新增 rateLimitCost 字段,支持按费用进行速率限制
- 新增 weeklyOpusCostLimit 字段,支持 Opus 模型周费用限制
- 优化速率限制逻辑,支持费用、请求数、token多维度控制
- 更新前端界面,添加费用限制配置选项
- 增强账户管理功能,支持费用统计和限制
- 改进 Redis 数据模型,支持费用计数器
- 优化价格计算服务,支持更精确的成本核算
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-31 17:27:37 +08:00
Wesley Liddick
222f4e44fe
Merge pull request #288 from sczheng189/feat/multi-group-scheduling
...
feat: 实现账户多分组调度功能
2025-08-26 08:58:33 +08:00
sczheng189
e69ab2161d
feat: 实现账户多分组调度功能
...
- 添加账户分组管理功能,支持创建、编辑、删除分组
- 实现基于分组的账户调度逻辑
- 添加分组权重和优先级支持
- 提供测试脚本验证多分组调度功能
- 修复代码格式化问题(统一使用LF换行符)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-25 20:11:18 +08:00
Wesley Liddick
6bcd7ed1fc
Merge pull request #286 from sczheng189/feat/5xx-error-circuit-breaker
...
feat: 扩展熔断机制支持所有5xx错误码
2025-08-25 19:43:08 +08:00
sczheng189
5366dc70e1
fix: 修复重置账号状态后仍被认为不可用的bug
...
问题描述:
- 重置账号状态时虽然正确设置了 schedulable: 'true'
- 但在账号选择逻辑中缺少对 schedulable !== 'false' 的检查
- 导致重置后的账号仍被认为不可用
修复内容:
- selectAvailableAccount: 在 activeAccounts 过滤中添加 schedulable 检查
- selectAccountForApiKey: 在绑定账户和 sharedAccounts 过滤中添加 schedulable 检查
- 确保重置状态后的账号能正确被识别为可用
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-25 19:18:51 +08:00
sczheng189
f4f88091c1
feat: 扩展熔断机制支持所有5xx错误码
...
- 扩展错误检测从单一500错误到所有5xx错误码(500-599)
- 新增temp_error状态,连续3次5xx错误触发临时熔断
- 支持流式和非流式请求的统一5xx错误处理
- 添加定时清理机制,60分钟后自动恢复temp_error状态
- 完善错误计数和清理逻辑,提高系统可靠性
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-25 19:14:14 +08:00
shaw
b426a759a8
feat: 支持后台配置webhook
2025-08-23 20:20:32 +08:00
shaw
cb29b3f7e4
fix: 代理ip使用重构为统一方法
2025-08-20 23:21:32 +08:00
shaw
a45c832278
feat: 统一代理配置管理,支持IPv4/IPv6协议族选择
...
- 新增统一代理工具 ProxyHelper,支持 SOCKS5/HTTP/HTTPS 代理
- 添加 IPv4/IPv6 协议族配置选项,默认使用 IPv4 确保兼容性
- 移除 OpenAI 路由中硬编码的 family: 4 限制
- 统一 8 个服务文件中的代理创建逻辑,避免重复维护
- 支持 OAuth 和 token 交换过程中的代理使用
- 新增配置项:PROXY_USE_IPV4(默认 true)
- 向后兼容:现有配置无需手动更新
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-20 22:36:34 +08:00
mouyong
5af8913954
refactor(backend): 统一账户平台标识字段
...
WHAT: 统一 Claude 账户的平台标识,从 claude-oauth 改为 claude
WHY: 简化平台标识命名规范,提高前后端数据一致性,为多平台支持奠定基础
HOW: 在账户创建和查询接口中添加 platform 字段支持;更新 claudeAccountService 默认平台标识;保持向后兼容性,旧数据自动使用默认值
2025-08-20 21:40:24 +08:00
shaw
3bcdb511fe
feat: 实现多服务账户缓存优化系统
...
- 添加通用LRU缓存工具类,支持过期时间和内存限制
- 实现缓存监控系统,提供统计和健康检查接口
- 为所有账户服务(Claude、Gemini、OpenAI、Bedrock、Claude Console)添加缓存层
- 优化账户选择性能,减少Redis查询频率
- 添加缓存统计监控端点 /admin/cache/stats
性能提升:
- 账户列表查询从O(n)优化到O(1)
- 减少90%以上的Redis查询
- 响应时间降低50ms以上
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-17 15:38:49 +08:00
shaw
043e3768ab
fix: 修复每次请求都要重新生成秘钥的问题
2025-08-16 23:49:19 +08:00
shaw
812e98355f
feat: 实现 OpenAI token 自动刷新功能并优化账户管理界面
...
主要更改:
1. OpenAI Token 自动刷新
- 实现 refreshAccessToken 函数,支持 OAuth 2.0 refresh_token grant type
- 使用 Codex CLI 官方 CLIENT_ID (app_EMoamEEZ73f0CkXaXp7hrann)
- 支持 SOCKS5 和 HTTP/HTTPS 代理
- 自动更新 access token、id token 和 refresh token
2. 账户管理界面优化
- 移除手动刷新 token 按钮(桌面端和移动端)
- 保留后端自动刷新机制
- 优化代码结构,删除不再需要的函数和变量
3. 测试和文档
- 添加 test-openai-refresh.js 测试脚本
- 创建详细的实现文档
技术细节:
- Token 端点: https://auth.openai.com/oauth/token
- 默认有效期: 1小时
- 加密存储: AES-256-CBC
所有平台现在都支持自动 token 刷新:
✅ Claude - OAuth 自动刷新
✅ Gemini - Google OAuth2 自动刷新
✅ OpenAI - OAuth 自动刷新(新实现)
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-15 16:56:44 +08:00
Wesley Liddick
925da6fb22
Merge pull request #249 from iRubbish/feat/webhook-manual-disable-notification
...
feat: 增强 webhook 通知功能,支持手动禁用账号通知
2025-08-14 21:47:01 +08:00
iRubbish
c9b0c3eb82
feat: 增强 webhook 通知功能,支持手动禁用账号通知
...
- 添加手动禁用账号时的 webhook 通知功能
- 支持所有账号类型:Claude OAuth、Claude Console、Gemini
- 新增错误代码:MANUALLY_DISABLED 系列
- 更新 README.md 文档,添加完整的 webhook 配置说明
- 包含企业微信配置示例和测试方法
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-14 18:28:48 +08:00
KevinLiao
b0622bdcbd
Merge branch 'main' of https://github.com/Wei-Shaw/claude-relay-service
2025-08-14 16:44:20 +08:00
KevinLiao
0e5f4e03c1
feat: 新增Claude账号订阅类型设置
...
1. OAuth可自动判断订阅类型,Setup Token请自行选择。无论那种类型都可以自己改
2. 优化调度,Pro账号不再接受opus模型请求的调度
2025-08-14 16:43:58 +08:00
weidian
e01e539108
feat: 添加账号异常状态 Webhook 通知功能
...
## 功能概述
- 新增账号禁用/异常状态的 Webhook 实时通知机制
- 支持 Claude OAuth、Claude Console、Gemini 三种平台的账号监控
- 提供完整的 Webhook 管理 API 和配置选项
## 主要变更
### 新增文件
- `src/utils/webhookNotifier.js`: Webhook 通知核心服务
- `src/routes/webhook.js`: Webhook 管理 API 路由
### 功能集成
- Claude OAuth 账号:unauthorized 状态 + token 刷新错误通知
- Claude Console 账号:blocked 状态通知
- Gemini 账号:token 刷新错误通知
### 配置支持
- 新增环境变量:WEBHOOK_ENABLED, WEBHOOK_URLS, WEBHOOK_TIMEOUT, WEBHOOK_RETRIES
- 支持多个 Webhook URL 并发通知
- 自动重试机制(指数退避)+ 超时保护
### 管理端点
- POST /admin/webhook/test: 测试连通性
- POST /admin/webhook/test-notification: 发送测试通知
- GET /admin/webhook/config: 查看配置信息
## 通知格式
```json
{
"type": "account_anomaly",
"data": {
"accountId": "uuid",
"accountName": "账号名称",
"platform": "claude-oauth|claude-console|gemini",
"status": "unauthorized|blocked|error",
"errorCode": "CLAUDE_OAUTH_UNAUTHORIZED",
"reason": "具体异常原因",
"timestamp": "2025-01-13T10:30:00.000Z"
}
}
```
🤖 Generated with [Claude Code](https://claude.ai/code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-08-13 17:52:46 +08:00