feat: 实现 Claude Code headers 动态管理功能

- 创建 claudeCodeHeadersService 管理各账号的 Claude Code headers
- 自动捕获成功请求的 headers 并按账号存储在 Redis
- 智能版本管理,只保留最新版本的 headers
- OpenAI 转发时根据账号动态获取对应的 headers
- 添加管理端点查看和清除各账号的 headers 信息
- 完整支持 Claude Code 必需的 beta headers

解决了 "This credential is only authorized for use with Claude Code" 错误
避免了固定版本号带来的风控问题

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
shaw
2025-07-22 16:03:31 +08:00
parent b2ad2a4a61
commit dabf3bf7ea
6 changed files with 410 additions and 12 deletions

View File

@@ -8,6 +8,7 @@ const claudeAccountService = require('./claudeAccountService');
const sessionHelper = require('../utils/sessionHelper');
const logger = require('../utils/logger');
const config = require('../../config/config');
const claudeCodeHeadersService = require('./claudeCodeHeadersService');
class ClaudeRelayService {
constructor() {
@@ -128,6 +129,11 @@ class ClaudeRelayService {
if (isRateLimited) {
await claudeAccountService.removeAccountRateLimit(accountId);
}
// 存储成功请求的 Claude Code headers
if (clientHeaders && Object.keys(clientHeaders).length > 0) {
await claudeCodeHeadersService.storeAccountHeaders(accountId, clientHeaders);
}
}
// 记录成功的API调用
@@ -651,6 +657,11 @@ class ClaudeRelayService {
if (isRateLimited) {
await claudeAccountService.removeAccountRateLimit(accountId);
}
// 存储成功请求的 Claude Code headers流式请求
if (clientHeaders && Object.keys(clientHeaders).length > 0) {
await claudeCodeHeadersService.storeAccountHeaders(accountId, clientHeaders);
}
}
logger.debug('🌊 Claude stream response with usage capture completed');