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
shaw
e8e6f972b4
fix: 增强console账号test端点
2025-12-01 15:08:40 +08:00
shaw
02018e10f3
feat: 为console类型账号增加count_tokens端点判断
2025-12-01 10:14:12 +08: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
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
63a7c2514b
fix: 修复gemini-api账户共享池无法调度问题
2025-11-29 10:02:51 +08:00
shaw
28caa93d99
feat: 重新支持apikey费用排序功能
2025-11-28 15:32:50 +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
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
shaw
4d21c85f83
fix: claude转发移除x-authorization 头
2025-11-26 19:38:28 +08:00
shaw
3fb874fc29
feat: admin-next/api-stats查询被禁用的key增加名字显示
2025-11-26 10:18:43 +08:00
shaw
22fbabbc47
fix: 优化apikeys页面加载速度
2025-11-25 15:01:15 +08:00
shaw
25f455ac1c
fix: 适配claude新的usage接口
2025-11-25 10:54:21 +08:00
shaw
a4dcfb842e
refactor: 重构gemini转部分
2025-11-25 10:30:39 +08:00
shaw
a0a7aae28e
fix: 暂时移除gemini 的429处理
2025-11-24 10:53:51 +08:00
shaw
8863075fde
feat: 完善Gemini-Api账户相关的数据统计
2025-11-23 22:28:26 +08:00
shaw
bae39d5468
feat: 支持Gemini-Api接入
2025-11-23 22:00:13 +08:00
shaw
823be8acfc
fix: 修复gemini转发未响应问题
2025-11-20 21:02:43 +08:00
曾庆雷
94925e57bd
为gemini请求generateContext增加超时时长
2025-11-18 23:23:56 +08:00
曾庆雷
26ad7482ba
优化Gemini流式请求稳定性
...
- 添加TCP Keep-Alive支持防止长连接断开
- 移除流式请求的timeout限制
2025-11-18 23:19:28 +08:00
曾庆雷
47d7a394c9
仅对个人账户调用 tokeninfo/userinfo 接口
...
- 添加 projectId 非空判断,减少对企业账户的影响
- 优化错误日志级别为 warn
2025-11-14 11:17:14 +08:00
曾庆雷
a64b0d557f
Revert "修复loadCodeAssist中移除tokeninfo和userinfo调用"
...
This reverts commit baffd02b02 .
2025-11-14 11:17:14 +08:00
曾庆雷
91ad0658a9
实现listExperiments端点和通用转发机制
...
- 添加forwardToCodeAssist通用转发函数支持简单端点
- 添加handleSimpleEndpoint通用路由处理函数
- 注册listExperiments路由(v1internal和v1beta)
- 解决gemini-cli启动时404 Not Found错误
2025-11-12 14:32:45 +08:00
曾庆雷
baffd02b02
修复loadCodeAssist中移除tokeninfo和userinfo调用
...
解决使用GOOGLE_CLOUD_ACCESS_TOKEN时401错误,提升接口响应速度
2025-11-12 14:10:15 +08:00
sususu
9b15e08624
fix: 请求/v1/messages/count_tokens 的CanceledError 不再被记录为ERROR 日志
2025-11-05 09:47:37 +08:00
shaw
a2b04eea07
fix: 修复总费用被重置的bug
2025-10-30 15:59:24 +08:00
sususu98
1458d609ca
feat: 为 Claude Console 账户添加并发控制机制
...
实现了完整的 Claude Console 账户并发任务数控制功能,防止单账户过载,提升服务稳定性。
**核心功能**
- 🔒 **原子性并发控制**: 基于 Redis Sorted Set 实现的抢占式并发槽位管理,防止竞态条件
- 🔄 **自动租约刷新**: 流式请求每 5 分钟自动刷新租约,防止长连接租约过期
- 🚨 **智能降级处理**: 并发满额时自动清理粘性会话并重试其他账户(最多 1 次)
- 🎯 **专用错误码**: 引入 `CONSOLE_ACCOUNT_CONCURRENCY_FULL` 错误码,区分并发限制和其他错误
- 📊 **批量性能优化**: 调度器使用 Promise.all 并行查询账户并发数,减少 Redis 往返
**后端实现**
1. **Redis 并发控制方法** (src/models/redis.js)
- `incrConsoleAccountConcurrency()`: 增加并发计数(带租约)
- `decrConsoleAccountConcurrency()`: 释放并发槽位
- `refreshConsoleAccountConcurrencyLease()`: 刷新租约(流式请求)
- `getConsoleAccountConcurrency()`: 查询当前并发数
2. **账户服务增强** (src/services/claudeConsoleAccountService.js)
- 添加 `maxConcurrentTasks` 字段(默认 0 表示无限制)
- 获取账户时自动查询实时并发数 (`activeTaskCount`)
- 支持更新并发限制配置
3. **转发服务并发保护** (src/services/claudeConsoleRelayService.js)
- 请求前原子性抢占槽位,超限则立即回滚并抛出专用错误
- 流式请求启动定时器每 5 分钟刷新租约
- `finally` 块确保槽位释放(即使发生异常)
- 为每个请求分配唯一 `requestId` 用于并发追踪
4. **统一调度器优化** (src/services/unifiedClaudeScheduler.js)
- 获取可用账户时批量查询并发数(Promise.all 并行)
- 预检查并发限制,避免选择已满的账户
- 检查分组成员时也验证并发状态
- 所有账户并发满额时抛出专用错误码
5. **API 路由降级处理** (src/routes/api.js)
- 捕获 `CONSOLE_ACCOUNT_CONCURRENCY_FULL` 错误
- 自动清理粘性会话映射并重试(最多 1 次)
- 重试失败返回 503 错误和友好提示
- count_tokens 端点也支持并发满额重试
6. **管理端点验证** (src/routes/admin.js)
- 创建/更新账户时验证 `maxConcurrentTasks` 为非负整数
- 支持前端传入并发限制配置
**前端实现**
1. **表单字段** (web/admin-spa/src/components/accounts/AccountForm.vue)
- 添加"最大并发任务数"输入框(创建和编辑模式)
- 支持占位符提示"0 表示不限制"
- 表单数据自动映射到后端 API
2. **实时监控** (web/admin-spa/src/views/AccountsView.vue)
- 账户列表显示并发状态进度条和百分比
- 颜色编码:绿色(<80%)、黄色(80%-100%)、红色(100%)
- 显示"X / Y"格式的并发数(如"2 / 5")
- 未配置限制时显示"并发无限制"徽章
2025-10-21 13:43:57 +08:00
shaw
b61a3103e9
feat: claude转发增加runtimeAddon
2025-10-19 18:05:19 +08:00
shaw
edf302fd6b
chore: 去除claude转发冗余代码
2025-10-19 17:43:13 +08:00
shaw
abef8a4e31
feat: claude账号新增保存claude的uuid
2025-10-19 17:15:31 +08:00
shaw
d3489d1bfd
fix: 修复apikey最后使用账号为已删除的bug
2025-10-18 11:42:13 +08:00
shaw
1ed0ca31ec
fix: 修复因代理ip不可用导致axios的proxy回退到环境变量代理问题
2025-10-18 11:00:43 +08:00
shaw
2ec17360d6
fix: 修复oauth的claude账号在apikey最后使用显示未已删除的bug
2025-10-17 23:14:39 +08:00
shaw
17311f2d3b
fix: 修复apikey最后使用查找问题
2025-10-17 22:36:31 +08:00
shaw
b0e6ac3923
fix: 修复openai账号类型查找前缀
2025-10-17 21:15:56 +08:00
shaw
aa66d89021
fix: 修复gemini转发的部分bug
2025-10-17 20:15:50 +08:00
shaw
05f4454c10
feat: apikey显示最后调度的账号
2025-10-17 19:44:40 +08:00
shaw
484689e479
Merge branch 'dev' of github.com:Wei-Shaw/claude-relay-service into dev
2025-10-17 16:32:11 +08:00
shaw
9ed4a344be
fix: 修复gemini转发问题
2025-10-17 16:11:12 +08:00
sususu
b0917b75a4
feat: 新增Claude Console账户临时封禁处理和错误消息清理
...
- 新增 CLAUDE_CONSOLE_BLOCKED_HANDLING_MINUTES 配置项,自动处理账户临时禁用的 400 错误(如 "organization has been disabled"、"too many active sessions" 等)。
- 添加 errorSanitizer 工具模块,自动清理上游错误响应中的供应商特定信息(URL、供应商名称等),避免泄露中转服务商信息。
- 统一调度器现在会主动检查并恢复已过期的封禁账户,确保账户在临时封禁时长结束后可以立即重新使用。
2025-10-17 15:27:47 +08:00
shaw
f6eb077d82
fix: 优化pricing服务关停逻辑,确保定时器在清理阶段正确释放
2025-10-16 15:35:40 +08:00
shaw
83f7353284
fix: 修复console脏数据问题
2025-10-16 15:29:45 +08:00
shaw
2f0839c7da
feat: 合并 PR #578 并接入统一定价服务
2025-10-16 14:12:25 +08:00
shaw
d606cb2e38
fix: 优化模型价格文件更新策略
2025-10-16 10:46:45 +08:00
liangjie.wanglj
b9d2e855f3
claude console类型中增加claude-haiku-4-5-20251001、GLM、Kimi、Qwen模型支持;增加计费消息通知;Claude console 及 ccr模型匹配大小写不敏感
2025-10-16 09:53:42 +08:00