From ca027ecb904bbae4cb59b1d57d05c7f0e0361958 Mon Sep 17 00:00:00 2001 From: RedwindA Date: Fri, 16 Jan 2026 04:22:05 +0800 Subject: [PATCH 1/5] feat(droid): add prompt_cache_retention and safety_identifier to fieldsToRemove --- src/routes/openaiRoutes.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/routes/openaiRoutes.js b/src/routes/openaiRoutes.js index b222c1c5..f6ca5888 100644 --- a/src/routes/openaiRoutes.js +++ b/src/routes/openaiRoutes.js @@ -274,7 +274,9 @@ const handleResponses = async (req, res) => { 'text_formatting', 'truncation', 'text', - 'service_tier' + 'service_tier', + 'prompt_cache_retention', + 'safety_identifier' ] fieldsToRemove.forEach((field) => { delete req.body[field] From 64db4a270d7dca4b592de69ed7498d70e7e42f26 Mon Sep 17 00:00:00 2001 From: Richard Hao Date: Sun, 18 Jan 2026 10:58:11 +0800 Subject: [PATCH 2/5] fix: handle bedrock content block start/stop events --- src/services/bedrockRelayService.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/services/bedrockRelayService.js b/src/services/bedrockRelayService.js index 0a73e115..1355dc41 100644 --- a/src/services/bedrockRelayService.js +++ b/src/services/bedrockRelayService.js @@ -588,6 +588,17 @@ class BedrockRelayService { } } + if (bedrockChunk.type === 'content_block_start') { + return { + type: 'content_block_start', + data: { + type: 'content_block_start', + index: bedrockChunk.index || 0, + content_block: bedrockChunk.content_block || { type: 'text', text: '' } + } + } + } + if (bedrockChunk.type === 'content_block_delta') { return { type: 'content_block_delta', @@ -598,6 +609,16 @@ class BedrockRelayService { } } + if (bedrockChunk.type === 'content_block_stop') { + return { + type: 'content_block_stop', + data: { + type: 'content_block_stop', + index: bedrockChunk.index || 0 + } + } + } + if (bedrockChunk.type === 'message_delta') { return { type: 'message_delta', From 81a3e26e271a86fd6535fa2f0d4e724d4e9bc905 Mon Sep 17 00:00:00 2001 From: Richard Hao Date: Sun, 18 Jan 2026 11:36:45 +0800 Subject: [PATCH 3/5] fix: correct Bedrock SSE stream event format to match Claude API spec - message_start: nest fields inside 'message' object with type: 'message' - content_block_delta: add type field to data - message_delta: add type field to data - message_stop: remove usage field, just return type - Extract usage from message_delta instead of message_stop --- src/services/bedrockRelayService.js | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/services/bedrockRelayService.js b/src/services/bedrockRelayService.js index 1355dc41..87e65105 100644 --- a/src/services/bedrockRelayService.js +++ b/src/services/bedrockRelayService.js @@ -343,8 +343,8 @@ class BedrockRelayService { res.write(`event: ${claudeEvent.type}\n`) res.write(`data: ${JSON.stringify(claudeEvent.data)}\n\n`) - // 提取使用统计 - if (claudeEvent.type === 'message_stop' && claudeEvent.data.usage) { + // 提取使用统计 (usage is reported in message_delta per Claude API spec) + if (claudeEvent.type === 'message_delta' && claudeEvent.data.usage) { totalUsage = claudeEvent.data.usage } @@ -576,14 +576,17 @@ class BedrockRelayService { return { type: 'message_start', data: { - type: 'message', - id: `msg_${Date.now()}_bedrock`, - role: 'assistant', - content: [], - model: this.defaultModel, - stop_reason: null, - stop_sequence: null, - usage: bedrockChunk.message?.usage || { input_tokens: 0, output_tokens: 0 } + type: 'message_start', + message: { + id: `msg_${Date.now()}_bedrock`, + type: 'message', + role: 'assistant', + content: [], + model: this.defaultModel, + stop_reason: null, + stop_sequence: null, + usage: bedrockChunk.message?.usage || { input_tokens: 0, output_tokens: 0 } + } } } } @@ -603,6 +606,7 @@ class BedrockRelayService { return { type: 'content_block_delta', data: { + type: 'content_block_delta', index: bedrockChunk.index || 0, delta: bedrockChunk.delta || {} } @@ -623,6 +627,7 @@ class BedrockRelayService { return { type: 'message_delta', data: { + type: 'message_delta', delta: bedrockChunk.delta || {}, usage: bedrockChunk.usage || {} } @@ -633,7 +638,7 @@ class BedrockRelayService { return { type: 'message_stop', data: { - usage: bedrockChunk.usage || {} + type: 'message_stop' } } } From c7d7bf47d670d87585a4ed2194e5f3c858d4ebd0 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 21 Jan 2026 10:06:24 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0claude=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7oauth=E9=93=BE=E6=8E=A5=E7=94=9F=E6=88=90=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/oauthHelper.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/oauthHelper.js b/src/utils/oauthHelper.js index 556e4243..6d9ded0c 100644 --- a/src/utils/oauthHelper.js +++ b/src/utils/oauthHelper.js @@ -13,8 +13,8 @@ const OAUTH_CONFIG = { AUTHORIZE_URL: 'https://claude.ai/oauth/authorize', TOKEN_URL: 'https://console.anthropic.com/v1/oauth/token', CLIENT_ID: '9d1c250a-e61b-44d9-88ed-5944d1962f5e', - REDIRECT_URI: 'https://console.anthropic.com/oauth/code/callback', - SCOPES: 'org:create_api_key user:profile user:inference', + REDIRECT_URI: 'https://platform.claude.com/oauth/code/callback', + SCOPES: 'org:create_api_key user:profile user:inference user:sessions:claude_code', SCOPES_SETUP: 'user:inference' // Setup Token 只需要推理权限 } @@ -35,6 +35,7 @@ function generateState() { /** * 生成随机的 code verifier(PKCE) + * 符合 RFC 7636 标准:32字节随机数 → base64url编码 → 43字符 * @returns {string} base64url 编码的随机字符串 */ function generateCodeVerifier() { From 0f5321b0ef1493ff0e57b25ca4068ba62d0bd8d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Jan 2026 02:19:34 +0000 Subject: [PATCH 5/5] chore: sync VERSION file with release v1.1.260 [skip ci] --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 02fbc144..7ce90746 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.259 +1.1.260