From de24d420a46eacf1b1831a2909ea22b9f9d8d822 Mon Sep 17 00:00:00 2001 From: dreamhunter2333 Date: Wed, 17 Dec 2025 19:04:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=20Claude=20proxy?= =?UTF-8?q?=20=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E5=92=8C=20header=20?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 简化 stream 条件判断(去掉冗余的 || reqJson.stream) - 移除不必要的 else(stream 分支已有 return) - 删除客户端的 x-api-key header 避免冲突 - 精简 header 处理逻辑 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- src/providers/claude-proxy.ts | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/providers/claude-proxy.ts b/src/providers/claude-proxy.ts index 775fd72..18ba875 100644 --- a/src/providers/claude-proxy.ts +++ b/src/providers/claude-proxy.ts @@ -24,7 +24,7 @@ type ClaudeMessageResponse = { type ClaudeStreamEvent = { type: "message_start" | "content_block_start" | "content_block_delta" | - "content_block_stop" | "message_delta" | "message_stop" | "message_complete" | "ping" | "error"; + "content_block_stop" | "message_delta" | "message_stop" | "message_complete" | "ping" | "error"; message?: { usage: { input_tokens: number; @@ -63,16 +63,11 @@ const buildProxyRequest = ( // Remove Authorization header (client may send OpenAI format: "Authorization: Bearer sk-xxx") targetHeaders.delete("Authorization") + targetHeaders.delete("x-api-key") // Claude uses x-api-key header instead of Authorization targetHeaders.set("x-api-key", config.api_key) - // Required API version header - targetHeaders.set("anthropic-version", config.api_version || "2023-06-01") - - // Ensure content-type is set - targetHeaders.set("Content-Type", "application/json") - return new Request(targetUrl, { method: request.method, headers: targetHeaders, @@ -261,19 +256,15 @@ export default { // Map model name reqJson.model = deploymentName - // Force streaming for usage tracking - // Unlike OpenAI, Claude doesn't need stream_options - usage is always included - if (!stream) { - // Even for non-streaming, we might want to force stream for consistency - // But Claude's non-streaming response already includes usage, so we keep it as-is - } + // Note: Unlike OpenAI, Claude's non-streaming response already includes usage data, + // so we don't need to force stream=true for usage tracking // Build and send proxy request const proxyRequest = buildProxyRequest(c.req.raw, reqJson, config) const response = await fetch(proxyRequest) // Handle streaming response - if (stream || reqJson.stream) { + if (stream) { const [streamForClient, streamForServer] = response.body?.tee() || [] // Process stream in background to extract usage