From 249e25636099864e73cf87feb2c610be79059697 Mon Sep 17 00:00:00 2001 From: Dave Date: Sat, 29 Nov 2025 17:46:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Claude=20API=20?= =?UTF-8?q?400=20=E9=94=99=E8=AF=AF=EF=BC=9Atool=5Fresult/tool=5Fuse=20?= =?UTF-8?q?=E4=B8=8D=E5=8C=B9=E9=85=8D=E9=97=AE=E9=A2=98=20=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BF=A1=E6=81=AF:=20=20=20=20=20=20messages.14.conte?= =?UTF-8?q?nt.0:=20unexpected=20tool=5Fuse=5Fid=20found=20in=20tool=5Fresu?= =?UTF-8?q?lt=20blocks:=20toolu=5F01Ekn6YJMk7yt7hNcn4PZxtM.=20=20=20=20=20?= =?UTF-8?q?=20Each=20tool=5Fresult=20block=20must=20have=20a=20correspondi?= =?UTF-8?q?ng=20tool=5Fuse=20block=20in=20the=20previous=20message.=20?= =?UTF-8?q?=E6=A0=B9=E6=9C=AC=E5=8E=9F=E5=9B=A0:=20=20=20=20=20=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6:=20src/services/claudeRelayService.js=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=20=5FenforceCacheControlLimit()=20=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20=E5=8E=9F=E5=AE=9E=E7=8E=B0=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9A=20=20=20=20=20=201.=20=E5=BD=93=20cache=5Fcontrol=20?= =?UTF-8?q?=E5=9D=97=E8=B6=85=E8=BF=87=204=20=E4=B8=AA=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E5=88=A0=E9=99=A4=E6=95=B4=E4=B8=AA=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=9D=97=EF=BC=88splice=EF=BC=89=20=20=20=20=20=202.?= =?UTF-8?q?=20=E8=BF=99=E4=BC=9A=E5=88=A0=E9=99=A4=20tool=5Fuse=20?= =?UTF-8?q?=E5=9D=97=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=90=8E=E7=BB=AD=E7=9A=84?= =?UTF-8?q?=20tool=5Fresult=20=E6=89=BE=E4=B8=8D=E5=88=B0=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E7=9A=84=20tool=5Fuse=5Fid=20=20=20=20=20=203.=20?= =?UTF-8?q?=E4=B9=9F=E4=BC=9A=E5=88=A0=E9=99=A4=E7=94=A8=E6=88=B7=E7=9A=84?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E6=B6=88=E6=81=AF=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E4=B8=A2=E5=A4=B1=20=E9=87=8D?= =?UTF-8?q?=E8=A6=81=E8=83=8C=E6=99=AF=EF=BC=88=E5=AE=98=E6=96=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E7=A1=AE=E8=AE=A4=EF=BC=89=20=20=20=20=20=20=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=20Claude=20API=20=E5=AE=98=E6=96=B9=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=9A=20=20=20=20=20=20-=20=E6=9C=80=E5=A4=9A=E5=8F=AF?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=204=20=E4=B8=AA=20cache=5Fcontrol=20?= =?UTF-8?q?=E6=96=AD=E7=82=B9=20=20=20=20=20=20-=20=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E8=B6=85=E8=BF=87=E9=99=90=E5=88=B6=EF=BC=8CAPI=20=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E6=8A=A5=E9=94=99=EF=BC=8C=E5=8F=AA=E6=98=AF=E9=9D=99?= =?UTF-8?q?=E9=BB=98=E5=9C=B0=E5=BF=BD=E7=95=A5=E5=A4=9A=E4=BD=99=E7=9A=84?= =?UTF-8?q?=E6=96=AD=E7=82=B9=20=20=20=20=20=20-=20"20=20=E4=B8=AA?= =?UTF-8?q?=E5=9D=97=E5=9B=9E=E6=BA=AF=E7=AA=97=E5=8F=A3"=20=E6=98=AF?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=91=BD=E4=B8=AD=E6=A3=80=E6=9F=A5=E7=9A=84?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=EF=BC=8C=E4=B8=8E=E6=96=AD=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E9=99=90=E5=88=B6=E6=97=A0=E5=85=B3=20=20=20=20=20=20?= =?UTF-8?q?=E5=9B=A0=E6=AD=A4=EF=BC=8C=E8=BF=99=E4=B8=AA=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E5=8E=9F=E5=A7=8B=E8=AE=BE=E8=AE=A1=EF=BC=88=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=86=85=E5=AE=B9=E5=9D=97=EF=BC=89=E6=98=AF=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E4=B8=94=E6=9C=89=E5=AE=B3=E7=9A=84=E3=80=82?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E6=96=B9=E6=A1=88:=20=20=20=20=20=20?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=87=BD=E6=95=B0=E4=BD=86=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA=EF=BC=9A=E5=8F=AA=E5=88=A0=E9=99=A4=20cache?= =?UTF-8?q?=5Fcontrol=20=E5=B1=9E=E6=80=A7=EF=BC=8C=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=9C=AC=E8=BA=AB=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE;=20=20=20=20=20=20=E6=96=87=E4=BB=B6:=20src/?= =?UTF-8?q?services/claudeRelayService.js=20=E4=BF=AE=E6=94=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9:=20=20=20=20=20=20=E5=B0=86=20removeFromMessages()=20?= =?UTF-8?q?=E5=92=8C=20removeFromSystem()=20=E5=87=BD=E6=95=B0=E4=BB=8E"?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=95=B4=E4=B8=AA=E5=86=85=E5=AE=B9=E5=9D=97?= =?UTF-8?q?"=E6=94=B9=E4=B8=BA"=E5=8F=AA=E5=88=A0=E9=99=A4=20cache=5Fcontr?= =?UTF-8?q?ol=20=E5=B1=9E=E6=80=A7"=EF=BC=9A=20=20=20=20=20=20//=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=89=8D=EF=BC=9A=E7=9B=B4=E6=8E=A5=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=95=B4=E4=B8=AA=E5=86=85=E5=AE=B9=E5=9D=97=20=20=20?= =?UTF-8?q?=20=20=20message.content.splice(contentIndex,=201)=20=20=20=20?= =?UTF-8?q?=20=20//=20=E4=BF=AE=E6=94=B9=E5=90=8E=EF=BC=9A=E5=8F=AA?= =?UTF-8?q?=E5=88=A0=E9=99=A4=20cache=5Fcontrol=20=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E4=BF=9D=E7=95=99=E5=86=85=E5=AE=B9=20=20=20=20=20=20?= =?UTF-8?q?delete=20contentItem.cache=5Fcontrol=20=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E5=AF=B9=E6=AF=94;=20=20=20=20=20=20|=20=E5=9C=BA=E6=99=AF=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20|=20=E4=BF=AE=E5=A4=8D=E5=89=8D=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20|=20=E4=BF=AE=E5=A4=8D=E5=90=8E?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=20=20=20=20|-------?= =?UTF-8?q?-----|----------------|----------------|=20=20=20=20=20=20|=20?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=96=87=E6=9C=AC=E6=B6=88=E6=81=AF=20=20=20?= =?UTF-8?q?=20=20|=20=E2=9D=8C=20=E6=95=B4=E4=B8=AA=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=A2=AB=E5=88=A0=E9=99=A4=20=20=20=20=20=20|=20=E2=9C=85=20?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E6=B6=88=E6=81=AF=EF=BC=8C=E5=8F=AA=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E7=BC=93=E5=AD=98=E6=A0=87=E8=AE=B0=20|=20=20=20=20?= =?UTF-8?q?=20=20|=20tool=5Fuse=20=E5=9D=97=20|=20=E2=9D=8C=20=E8=A2=AB?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AF=BC=E8=87=B4=20400=20=E9=94=99=E8=AF=AF?= =?UTF-8?q?=20|=20=E2=9C=85=20=E4=BF=9D=E7=95=99=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E5=86=85=E5=AE=B9=20=20=20=20=20=20=20|=20=20=20=20=20=20|=20s?= =?UTF-8?q?ystem=20=E6=8F=90=E7=A4=BA=E8=AF=8D=20|=20=E2=9D=8C=20=E6=95=B4?= =?UTF-8?q?=E4=B8=AA=E6=8F=90=E7=A4=BA=E8=AF=8D=E8=A2=AB=E5=88=A0=E9=99=A4?= =?UTF-8?q?=20=20=20=20=20|=20=E2=9C=85=20=E4=BF=9D=E7=95=99=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E8=AF=8D=E5=86=85=E5=AE=B9=20=20=20=20=20=20|=20=20?= =?UTF-8?q?=20=20=20=20|=20=E7=BC=93=E5=AD=98=E5=8A=9F=E8=83=BD=20=20=20?= =?UTF-8?q?=20=20=20=20|=20=E2=9A=A0=EF=B8=8F=20=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E9=99=90=E5=88=B6=20=20=20=20=20=20=20=20|=20=E2=9C=85=20?= =?UTF-8?q?=E9=99=8D=E7=BA=A7=EF=BC=88=E4=B8=8D=E7=BC=93=E5=AD=98=E4=BD=86?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=AE=8C=E6=95=B4=EF=BC=89=20|?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/claudeRelayService.js | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/services/claudeRelayService.js b/src/services/claudeRelayService.js index dab6824a..ddf75f4e 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -789,7 +789,8 @@ class ClaudeRelayService { return total } - const removeFromMessages = () => { + // 只移除 cache_control 属性,保留内容本身,避免丢失用户消息 + const removeCacheControlFromMessages = () => { if (!Array.isArray(body.messages)) { return false } @@ -803,12 +804,8 @@ class ClaudeRelayService { for (let contentIndex = 0; contentIndex < message.content.length; contentIndex += 1) { const contentItem = message.content[contentIndex] if (contentItem && contentItem.cache_control) { - message.content.splice(contentIndex, 1) - - if (message.content.length === 0) { - body.messages.splice(messageIndex, 1) - } - + // 只删除 cache_control 属性,保留内容 + delete contentItem.cache_control return true } } @@ -817,7 +814,8 @@ class ClaudeRelayService { return false } - const removeFromSystem = () => { + // 只移除 cache_control 属性,保留 system 内容 + const removeCacheControlFromSystem = () => { if (!Array.isArray(body.system)) { return false } @@ -825,12 +823,8 @@ class ClaudeRelayService { for (let index = 0; index < body.system.length; index += 1) { const systemItem = body.system[index] if (systemItem && systemItem.cache_control) { - body.system.splice(index, 1) - - if (body.system.length === 0) { - delete body.system - } - + // 只删除 cache_control 属性,保留内容 + delete systemItem.cache_control return true } } @@ -841,12 +835,13 @@ class ClaudeRelayService { let total = countCacheControlBlocks() while (total > MAX_CACHE_CONTROL_BLOCKS) { - if (removeFromMessages()) { + // 优先从 messages 中移除 cache_control,再从 system 中移除 + if (removeCacheControlFromMessages()) { total -= 1 continue } - if (removeFromSystem()) { + if (removeCacheControlFromSystem()) { total -= 1 continue } From 392601efd510bf2f350ce382868b92004ee384ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 29 Nov 2025 09:51:09 +0000 Subject: [PATCH 2/2] chore: sync VERSION file with release v1.1.215 [skip ci] --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 983307ce..c13847ae 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.214 +1.1.215