IanShaw027
|
69a1006f4c
|
feat: 增强账户管理页面的过滤和统计功能
- 新增状态过滤器:支持按正常/异常/全部筛选账户
- 新增限流时间过滤器:支持按1h/5h/12h/1d筛选限流账户
- 新增账户统计弹窗:按平台类型和状态汇总账户数量
- 优化账户列表过滤逻辑,支持组合过滤条件
- 默认状态过滤为'正常',提升用户体验
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-12-05 02:54:14 +08:00 |
|
IanShaw027
|
4cf1762467
|
fix: 修复 ESLint curly 规则问题
- 在 if 语句后添加必需的大括号
- 修复 unifiedClaudeScheduler.js (1处)
- 修复 unstableUpstreamHelper.js (2处)
|
2025-12-05 02:28:30 +08:00 |
|
IanShaw027
|
0d64d40654
|
feat: 添加上游不稳定错误检测与账户临时不可用机制
## 背景
当上游 API(如 Anthropic、AWS Bedrock 等)出现临时故障时,服务会持续向故障
账户发送请求,导致用户体验下降。需要自动检测上游不稳定状态并临时排除故障账户。
## 改动内容
### 新增 unstableUpstreamHelper.js
- 检测多种上游不稳定错误模式
- 支持环境变量扩展检测规则
### 修改 unifiedClaudeScheduler.js
- 新增 markAccountTemporarilyUnavailable() 方法:标记账户临时不可用
- 新增 isAccountTemporarilyUnavailable() 方法:检查账户是否临时不可用
- 专属账户检查:claude-official、claude-console、bedrock 临时不可用时自动回退到池
- 池账户选择:跳过临时不可用的账户
### 修改 claudeRelayService.js
- _handleServerError() 方法增加临时不可用标记逻辑
- 5xx 错误时自动标记账户临时不可用(5分钟 TTL)
## 检测的状态码
| 分类 | 状态码 | 说明 |
|------|--------|------|
| 服务器错误 | 500-599 | 内部错误、服务不可用等 |
| 超时类 | 408 | 请求超时 |
| 连接类 | 499 | 客户端关闭请求 (Nginx) |
| 网关类 | 502, 503, 504 | 网关错误、服务不可用、网关超时 |
| CDN类 | 522 | Cloudflare 连接超时 |
| 语义类 | error.type = "server_error" | API 级别服务器错误 |
## 环境变量配置
- UNSTABLE_ERROR_TYPES: 额外的错误类型(逗号分隔)
- UNSTABLE_ERROR_KEYWORDS: 错误消息关键词(逗号分隔)
## Redis 键
- temp_unavailable:{accountType}:{accountId} - TTL 300秒
|
2025-12-05 02:28:30 +08:00 |
|
github-actions[bot]
|
1b18a1226d
|
chore: sync VERSION file with release v1.1.220 [skip ci]
v1.1.220
|
2025-12-04 13:01:54 +00:00 |
|
Wesley Liddick
|
0b2372abab
|
Merge pull request #756 from SunSeekerX/feature_api_disable_switch
feat(account): 新增账户自动防护禁用开关
|
2025-12-04 08:01:35 -05:00 |
|
SunSeekerX
|
8aca1f9dd1
|
feat(account): 新增账户自动防护禁用开关
支持 disableAutoProtection 配置项,启用后上游 401/400/429/529 错误不再自动禁用账户
|
2025-12-04 20:47:12 +08:00 |
|
atoz03
|
95ef04c1a3
|
fix: 保持仪表盘趋势图非负并纠正小时区间
- 小时粒度请求使用用户选择的起止时间,避免近24小时被截成整天
- 修正日期展示格式化逻辑,减少时区偏移导致的窗口错位
- 趋势图 Y 轴(Token/请求数/费用等)强制最小值为 0,防止出现负刻度
|
2025-12-04 17:05:36 +08:00 |
|
atoz03
|
4919e392a5
|
feat: 仪表盘日期筛选默认今日并记忆用户偏好
|
2025-12-04 16:48:11 +08:00 |
|
atoz03
|
354d8da13f
|
feat:已修复详情弹窗位置问题:RecordDetailModal 现在 append-to-body、destroy-on-close,并设定 top="10vh",点击列表底部的“详情”不会被滚动容器截断或浮在页面顶部看不到。
|
2025-12-04 15:17:48 +08:00 |
|
atoz03
|
3df0c7c650
|
feat:已修复 ESLint no-shadow 问题:geminiApiAccountService 不再重复声明,改用顶部引入的实例。后端/前端 lint 均通过(npm run lint:check、cd web/admin-spa && npm run lint)
|
2025-12-04 15:05:09 +08:00 |
|
atoz03
|
6a3dce523b
|
chore: format usage stats route
|
2025-12-04 15:02:07 +08:00 |
|
atoz03
|
9fe2918a54
|
feat: keep API key stats modal and add timeline entry point
|
2025-12-04 14:56:27 +08:00 |
|
atoz03
|
92b30e1924
|
feat: add API key usage timeline API and admin UI
|
2025-12-04 14:41:38 +08:00 |
|
github-actions[bot]
|
b63f2f78fc
|
chore: sync VERSION file with release v1.1.219 [skip ci]
v1.1.219
|
2025-12-04 01:48:56 +00:00 |
|
Wesley Liddick
|
c971d239ff
|
Merge pull request #752 from IanShaw027/fix/filter-cloudflare-cdn-headers
fix: 过滤 Cloudflare CDN headers 以防止 API 安全检查
|
2025-12-03 20:48:41 -05:00 |
|
Wesley Liddick
|
01d6e30e82
|
Merge pull request #751 from atoz03/feature/account-sort-toggle [skip ci]
feat(accounts): 支持账户排序正序/倒序切换
|
2025-12-03 20:48:24 -05:00 |
|
IanShaw027
|
5fd78b6411
|
fix: 过滤 Cloudflare CDN headers 以防止 API 安全检查
使用 Cloudflare 橙色云(CDN 代理模式)时,Cloudflare 会自动添加 CDN 相关的 headers
(cf-*, x-forwarded-*, cdn-loop 等),这会触发上游 API 提供商的安全检查:
1. 已确认问题:88code API 检测到 CDN headers 后返回 403 Forbidden,
导致 Codex CLI 无法使用
2. 潜在风险:其他 API 提供商(OpenAI、Anthropic)可能也会因检测到
代理/CDN 特征而采取限制措施
创建统一的 headerFilter 工具类,在所有转发服务中过滤 Cloudflare CDN headers,
使转发请求伪装成正常的直接客户端请求。
1. 新增 src/utils/headerFilter.js
- 统一的 CDN headers 过滤列表(13 个 Cloudflare headers)
- 提供 filterForOpenAI() 和 filterForClaude() 方法
- 在现有过滤逻辑基础上添加 CDN header 过滤
2. 更新 src/services/openaiResponsesRelayService.js
- 使用 filterForOpenAI() 替代内联的 _filterRequestHeaders()
- 保持向后兼容性
3. 更新 src/services/claudeRelayService.js
- 使用 filterForClaude() 替代 _filterClientHeaders() 实现
- 简化代码,移除重复的 header 列表定义
4. 修复 src/routes/openaiRoutes.js
- 添加对 input 字段的类型检查(可以是数组或字符串)
- 防止 "startsWith is not a function" 错误
x-real-ip, x-forwarded-for, x-forwarded-proto, x-forwarded-host,
x-forwarded-port, x-accel-buffering, cf-ray, cf-connecting-ip,
cf-ipcountry, cf-visitor, cf-request-id, cdn-loop, true-client-ip
- ✅ Codex CLI 通过中转服务成功调用 88code API(之前返回 403)
- ✅ 保留所有业务必需的 headers(conversation_id、session_id 等)
- ✅ 移除所有 Cloudflare CDN 痕迹
- ✅ 保持橙色云的 DDoS 防护和 CDN 加速优势
- ✅ Docker 构建成功
1. 解决 88code 403 问题,Codex CLI 可正常使用
2. 降低因 CDN/代理特征被上游 API 识别的风险
3. 提升与各种 API 提供商的兼容性
4. 统一管理 CDN headers 过滤逻辑,便于维护
|
2025-12-03 07:07:12 -08:00 |
|
atoz03
|
9ad5c85c2c
|
feat(accounts): 支持排序切换正序/倒序
- 统一下拉选择器和表头的排序变量
- 再次点击同一排序选项/列头时切换排序方向
- 动态更新排序图标指示当前方向
|
2025-12-03 20:25:26 +08:00 |
|
github-actions[bot]
|
279cd72f23
|
chore: sync VERSION file with release v1.1.218 [skip ci]
v1.1.218
|
2025-12-02 12:52:01 +00:00 |
|
shaw
|
81e89d2dc4
|
feat: 支持sessionKey完成oauth授权
|
2025-12-02 20:43:47 +08:00 |
|
github-actions[bot]
|
c38b3d2a78
|
chore: sync VERSION file with release v1.1.217 [skip ci]
v1.1.217
|
2025-12-01 07:13:46 +00:00 |
|
shaw
|
e8e6f972b4
|
fix: 增强console账号test端点
|
2025-12-01 15:08:40 +08:00 |
|
shaw
|
d3155b82ea
|
style: 优化表格布局
|
2025-12-01 14:20:53 +08:00 |
|
shaw
|
02018e10f3
|
feat: 为console类型账号增加count_tokens端点判断
|
2025-12-01 10:14:12 +08:00 |
|
github-actions[bot]
|
e17cd1d61b
|
chore: sync VERSION file with release v1.1.216 [skip ci]
v1.1.216
|
2025-11-30 13:13:59 +00:00 |
|
Wesley Liddick
|
b9d53647bd
|
Merge pull request #727 from xilu0/main
fix: 修复 Claude API 400 错误:tool_result/tool_use 不匹配问题
|
2025-11-30 08:13:43 -05:00 |
|
github-actions[bot]
|
a872529b2e
|
chore: sync VERSION file with release v1.1.215 [skip ci]
v1.1.215
|
2025-11-29 13:31:00 +00:00 |
|
shaw
|
dfee7be944
|
fix: 调整gemini-api BaseApi后缀以适配更多端点
|
2025-11-29 21:30:28 +08:00 |
|
github-actions[bot]
|
392601efd5
|
chore: sync VERSION file with release v1.1.215 [skip ci]
|
2025-11-29 09:51:09 +00:00 |
|
Dave
|
249e256360
|
fix: 修复 Claude API 400 错误:tool_result/tool_use 不匹配问题
错误信息:
messages.14.content.0: unexpected tool_use_id found in tool_result blocks: toolu_01Ekn6YJMk7yt7hNcn4PZxtM.
Each tool_result block must have a corresponding tool_use block in the previous message.
根本原因:
文件: src/services/claudeRelayService.js 中的 _enforceCacheControlLimit() 方法
原实现问题:
1. 当 cache_control 块超过 4 个时,直接删除整个内容块(splice)
2. 这会删除 tool_use 块,导致后续的 tool_result 找不到对应的 tool_use_id
3. 也会删除用户的文本消息,导致上下文丢失
重要背景(官方文档确认)
根据 Claude API 官方文档:
- 最多可定义 4 个 cache_control 断点
- 如果超过限制,API 不会报错,只是静默地忽略多余的断点
- "20 个块回溯窗口" 是缓存命中检查的范围,与断点数量限制无关
因此,这个函数的原始设计(删除内容块)是不必要且有害的。
修复方案:
保留函数但修改行为:只删除 cache_control 属性,保留内容本身
修改位置;
文件: src/services/claudeRelayService.js
修改内容:
将 removeFromMessages() 和 removeFromSystem() 函数从"删除整个内容块"改为"只删除 cache_control 属性":
// 修改前:直接删除整个内容块
message.content.splice(contentIndex, 1)
// 修改后:只删除 cache_control 属性,保留内容
delete contentItem.cache_control
效果对比;
| 场景 | 修复前 | 修复后 |
|------------|----------------|----------------|
| 用户文本消息 | ❌ 整个消息被删除 | ✅ 保留消息,只移除缓存标记 |
| tool_use 块 | ❌ 被删除导致 400 错误 | ✅ 保留完整内容 |
| system 提示词 | ❌ 整个提示词被删除 | ✅ 保留提示词内容 |
| 缓存功能 | ⚠️ 强制限制 | ✅ 降级(不缓存但内容完整) |
|
2025-11-29 17:50:45 +08:00 |
|
github-actions[bot]
|
876b126ce0
|
chore: sync VERSION file with release v1.1.214 [skip ci]
v1.1.214
|
2025-11-29 06:13:56 +00:00 |
|
shaw
|
6ec4f4bf5b
|
fix: 修复claude console账号Test未响应的的bug
|
2025-11-29 14:13:28 +08:00 |
|
shaw
|
326adaaeca
|
fix: 修复Openai-api账户分组调度设置问题
|
2025-11-29 14:12:42 +08:00 |
|
shaw
|
d89344ad87
|
fix: 修复Gemini-api账户分组调度设置不生效的问题
|
2025-11-29 14:11:58 +08:00 |
|
shaw
|
68f003976e
|
style: 优化表格显示固定列宽
|
2025-11-29 11:20:07 +08:00 |
|
shaw
|
63a7c2514b
|
fix: 修复gemini-api账户共享池无法调度问题
|
2025-11-29 10:02:51 +08:00 |
|
github-actions[bot]
|
c6a7771b81
|
chore: sync VERSION file with release v1.1.213 [skip ci]
v1.1.213
|
2025-11-28 09:17:29 +00:00 |
|
shaw
|
b58b8b1ac7
|
feat: 支持apikey测试claude端点
|
2025-11-28 17:16:37 +08:00 |
|
shaw
|
53553c7e76
|
fix: 修复gemini api类型账户绑定显示问题
|
2025-11-28 16:33:31 +08:00 |
|
shaw
|
4a0ba6ed63
|
fix: 修复gemini api账户转发的传参问题
|
2025-11-28 16:20:26 +08:00 |
|
shaw
|
28caa93d99
|
feat: 重新支持apikey费用排序功能
|
2025-11-28 15:32:50 +08:00 |
|
shaw
|
d9476230c6
|
fix: 修复apikey窗口限制时间显示异常的问题
|
2025-11-28 14:02:58 +08:00 |
|
shaw
|
49645e8a50
|
feat: 增强claude转发特征模拟
|
2025-11-28 13:54:42 +08:00 |
|
shaw
|
7db70e2dc0
|
feat: 为claude类型账号增加测试功能
|
2025-11-28 10:51:01 +08:00 |
|
shaw
|
fd2b8a0114
|
refacto: 重构admin.js
|
2025-11-27 22:16:45 +08:00 |
|
shaw
|
851809a132
|
Merge branch 'xilu0/main'
|
2025-11-27 20:41:37 +08:00 |
|
shaw
|
4aeb47062b
|
fix: droid增加comm端点
|
2025-11-27 20:38:50 +08:00 |
|
github-actions[bot]
|
0c124ef37b
|
chore: sync VERSION file with release v1.1.212 [skip ci]
|
2025-11-27 02:57:21 +00:00 |
|
Dave King
|
94ff095754
|
fix: 修复Redis映射表竞态条件导致API Key临时失效问题
问题:编辑API Key后立即使用时会偶现(概率1%)报"API密钥已过期"错误,
一会儿后自动恢复。这是因为updateApiKey()方法未传递hashedKey参数给
setApiKey(),导致映射表未更新而主数据已更新的不一致状态。
修复:
- updateApiKey()传递keyData.apiKey(hashedKey)给setApiKey()
- 确保每次更新API Key时映射表也被同步更新
- 添加日志记录帮助监控映射表问题
细节:
1. updateApiKey(): 传递hashedKey参数确保映射表一致性
2. validateApiKey(): 添加警告日志检测映射表缺失
3. updateApiKey(): 增强日志记录"hashMap updated"
这解决了Redis双重存储(apikey:{id}和apikey:hash_map)的
竞态条件问题。
Fix: #API-Key-Expiry-Race-Condition
|
2025-11-27 10:56:58 +08:00 |
|
github-actions[bot]
|
291642d8ff
|
chore: sync VERSION file with release v1.1.211 [skip ci]
|
2025-11-26 11:45:41 +00:00 |
|