fix: 修复 OpenAI 兼容路由的 Claude API 认证和 Function Calling 支持

- 添加必需的系统消息 "You are Claude Code, Anthropic's official CLI for Claude."
- 修改 anthropic-beta header 为 OAuth-only 模式 (oauth-2025-04-20)
- 不再传递客户端 headers,使用固定的 4 个必需 headers
- 增强流式响应的 Function Calling 支持,正确处理 tool_use 事件
- 支持自定义 beta header 参数,允许不同路由使用不同的认证模式

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
shaw
2025-07-22 14:38:30 +08:00
parent 6ceed5c3ee
commit b2ad2a4a61
3 changed files with 46 additions and 18 deletions

View File

@@ -221,12 +221,12 @@ async function handleChatCompletion(req, res, apiKeyData) {
}
});
// 使用转换后的响应流
// 使用转换后的响应流 (使用 OAuth-only beta header不传递客户端 headers)
await claudeRelayService.relayStreamRequestWithUsageCapture(
claudeRequest,
apiKeyData,
res,
req.headers,
{},
(usage) => {
// 记录使用统计
if (usage && usage.input_tokens !== undefined && usage.output_tokens !== undefined) {
@@ -251,20 +251,22 @@ async function handleChatCompletion(req, res, apiKeyData) {
// 流转换器
(chunk) => {
return openaiToClaude.convertStreamChunk(chunk, req.body.model);
}
},
{ betaHeader: 'oauth-2025-04-20' }
);
} else {
// 非流式请求
logger.info(`📄 Processing OpenAI non-stream request for model: ${req.body.model}`);
// 发送请求到 Claude
// 发送请求到 Claude (使用 OAuth-only beta header不传递客户端 headers)
const claudeResponse = await claudeRelayService.relayRequest(
claudeRequest,
apiKeyData,
req,
res,
req.headers
{},
{ betaHeader: 'oauth-2025-04-20' }
);
// 解析 Claude 响应