Commit Graph

621 Commits

Author SHA1 Message Date
lusipad
06b18b7186 refactor: extract isProAccount helper for Pro account detection
Extract duplicate Pro account detection logic into a reusable helper
function that handles both API-returned (hasClaudePro) and locally
configured (accountType) data sources.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 08:12:51 +08:00
lusipad
12cb841a64 refactor: address Copilot review feedback
- Import isOpus45OrNewer from modelHelper instead of duplicating code
- Remove invalid 'claude_free' check (only 'free' is used in practice)
2025-12-05 07:56:53 +08:00
lusipad
dc868522cf fix: apply ESLint curly rule and remove useless escape chars 2025-12-05 07:49:55 +08:00
lusipad
b94bd2b822 feat(account): 支持 Pro 账号使用 Opus 4.5+ 模型
Opus 4.5 已对 Claude Pro 用户开放,调整账户模型限制逻辑:

- Pro 账号:支持 Opus 4.5+,不支持历史版本 (3.x/4.0/4.1)
- Free 账号:不支持任何 Opus 模型
- Max 账号:支持所有 Opus 版本

修改内容:
- 新增 isOpus45OrNewer() 函数用于精确识别模型版本
- 更新 claudeAccountService.js 中的账户选择逻辑
- 更新 unifiedClaudeScheduler.js 中的模型支持检查
- 新增测试脚本验证官方模型名称识别

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 07:38:55 +08:00
SunSeekerX
8aca1f9dd1 feat(account): 新增账户自动防护禁用开关
支持 disableAutoProtection 配置项,启用后上游 401/400/429/529 错误不再自动禁用账户
2025-12-04 20:47:12 +08: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
shaw
81e89d2dc4 feat: 支持sessionKey完成oauth授权 2025-12-02 20:43:47 +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
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
shaw
dfee7be944 fix: 调整gemini-api BaseApi后缀以适配更多端点 2025-11-29 21:30:28 +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
d89344ad87 fix: 修复Gemini-api账户分组调度设置不生效的问题 2025-11-29 14:11:58 +08:00
shaw
63a7c2514b fix: 修复gemini-api账户共享池无法调度问题 2025-11-29 10:02:51 +08:00
shaw
b58b8b1ac7 feat: 支持apikey测试claude端点 2025-11-28 17:16:37 +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
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
89238818eb fix: 修复apikeys页面状态排序失效的问题 2025-11-26 19:45:15 +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
6e95607285 fix: 修复apikeys页面窗口限制显示错误的bug 2025-11-26 10:09:58 +08:00
shaw
919501a2f1 Merge branch 'fix/gemini-projectid-fallback' into dev 2025-11-25 20:44:48 +08:00
shaw
dea6964116 fix: 修复apikeys页面部分bug 2025-11-25 20:38:52 +08:00
曾庆雷
b619208970 修复:移除请求参数 projectId 降级,改为实时获取
根本原因:请求参数中的 projectId 是客户端缓存的,属于之前账户,
导致账户切换后使用错误的 projectId,返回 403 权限错误。

修改内容:
1. 移除对 request.project 的降级依赖
2. 当账户无 projectId 和 tempProjectId 时,实时调用 loadCodeAssist
3. 获取后缓存到 tempProjectId 供后续请求使用
4. 如果仍无法获取,返回 403 配置错误

影响端点:
- /v1internal:generateContent
- /v1internal:streamGenerateContent
2025-11-25 19:32:38 +08:00
曾庆雷
e0500f0530 修复:Gemini OAuth 账户 projectId 降级逻辑缺失
修复 3 个端点未使用 tempProjectId 的问题:
- /messages
- /v1internal:generateContent
- /v1internal:streamGenerateContent

优先级链:projectId -> tempProjectId -> 请求参数 -> null
2025-11-25 19:06:55 +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
8f2cf211de fix: 修复gemini重置状态按钮未显示的问题 2025-11-24 14:49:12 +08:00
shaw
a0a7aae28e fix: 暂时移除gemini 的429处理 2025-11-24 10:53:51 +08:00
shaw
7706d3480d fix: 修复codex的ua正则条件 2025-11-23 22:51:56 +08:00
shaw
53d2f1ff9b fix: 更新codex默认提示词 2025-11-23 22:41:24 +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
mikewong23571
c47bb7295e perf(proxy): cache agents with opt-in pooling 2025-11-22 05:01:46 -08:00
shaw
c33771ef82 fix: split SSE chunks per event to avoid JSON parse errors 2025-11-22 18:10:54 +08:00
Dave King
6f9ac4aa84 feat: add Gemini account rate limit handling and hoist variable declarations in standard routes. 2025-11-22 14:04:58 +08:00
shaw
823be8acfc fix: 修复gemini转发未响应问题 2025-11-20 21:02:43 +08:00
VeroFess
9b0a1f9bda 实现 Codex compact 转发:新增 /responses/compact 路由,选择 compact 上游端点,并在 compact 请求中去除 store 参数以避免 400 2025-11-20 20:05:10 +08:00
曾庆雷
9eccc7da49 实现SSE心跳机制和非阻塞响应结束 2025-11-19 11:59:38 +08:00
曾庆雷
94925e57bd 为gemini请求generateContext增加超时时长 2025-11-18 23:23:56 +08:00