From 91269c91a18cc1c15c56a324a4f0debdb5e085f9 Mon Sep 17 00:00:00 2001 From: John Chen Date: Fri, 19 Sep 2025 10:58:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=B5=81=E4=B8=BA[xxxx]=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E6=97=B6=E4=BC=9A=E9=87=8D=E5=A4=8D=E8=BE=93=E5=87=BA1?= =?UTF-8?q?=E6=AC=A1=20(#5673)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复最后一个流为[xxxx]格式时会重复输出1次 issue #5292 当最后一个流中包含[xxxx]格式时,会输出2次。第一次在parseCite方法中if (isStreamEnd) {分支内输出,第二次在调用getResponseData时会输出buffer中的内容,导致重复。 * add test case --------- Co-authored-by: archer <545436317@qq.com> --- packages/service/core/ai/utils.ts | 1 + .../core/ai/parseStreamResponse.test.ts | 24 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/service/core/ai/utils.ts b/packages/service/core/ai/utils.ts index a8a84a867..75eca8998 100644 --- a/packages/service/core/ai/utils.ts +++ b/packages/service/core/ai/utils.ts @@ -243,6 +243,7 @@ export const parseLLMStreamResponse = () => { // 结束时,返回所有剩余内容 if (isStreamEnd) { const content = citeBuffer + text; + citeBuffer = ''; // 清空缓冲区,避免重复输出 return { content: removeDatasetCiteText(content, false) }; diff --git a/test/cases/service/core/ai/parseStreamResponse.test.ts b/test/cases/service/core/ai/parseStreamResponse.test.ts index 2599025c5..407450d03 100644 --- a/test/cases/service/core/ai/parseStreamResponse.test.ts +++ b/test/cases/service/core/ai/parseStreamResponse.test.ts @@ -158,9 +158,7 @@ describe('Parse dataset cite content test', async () => { data: [ { content: '知识库' }, { content: '问答系统' }, - { content: '[67e517e747' }, - { content: '67063e882d' }, - { content: '6861](CITE)' } + { content: '[67e517e74767063e882d6861](CITE)' } ], correct: { content: '知识库问答系统[67e517e74767063e882d6861](CITE)', @@ -400,6 +398,19 @@ describe('Parse dataset cite content test', async () => { content: '知识库问答系统[id](CITE)[67e517e74767063e882d6861](CITE)', responseContent: '知识库问答系统' } + }, + { + // [id](CITE) + data: [ + { content: '知识库' }, + { content: '问答系统' }, + { content: '[i' }, + { content: 'd](CITE)' } + ], + correct: { + content: '知识库问答系统[id](CITE)', + responseContent: '知识库问答系统' + } } ]; @@ -409,7 +420,8 @@ describe('Parse dataset cite content test', async () => { let answer = ''; let responseContent = ''; - part.data.forEach((item, index) => { + const list = [...part.data, { content: '' }]; + list.forEach((item, index) => { const formatPart = { choices: [ { @@ -418,9 +430,7 @@ describe('Parse dataset cite content test', async () => { content: item.content, reasoning_content: '' }, - finish_reason: (index === part.data.length - 1 - ? 'stop' - : null) as CompletionFinishReason + finish_reason: (index === list.length - 2 ? 'stop' : null) as CompletionFinishReason } ] };