diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index df982d6c..7fb12aac 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -409,16 +409,15 @@ class ThinkTagSurroundingsRemover extends SurroundingsRemover { } removeThinkTags() { - const foundTag = this.removePrefix(''); - if (!foundTag) { - // Handle partial tags during streaming - if (this.originalS.startsWith(''); + if (!foundOpenTag) { + // Let removePrefix handle partial matches character by character + this.removePrefix('<'); + this.removePrefix('think'); + this.removePrefix('>'); } - return true; + return foundOpenTag; } deltaInfo(recentlyAddedTextLen: number) { diff --git a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts index 8269d4fa..a145fba6 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts @@ -8,8 +8,20 @@ import { Response, stripThinkTags } from '../../../common/chatModel'; import { MarkdownString } from '../../../../../../base/common/htmlContent'; suite('ChatModel - Think Tags', () => { - test('handles partial tags during streaming', () => { - const response = new Response(new MarkdownString(' { + const response = new Response(new MarkdownString('<')); + assert.strictEqual(response.toString(), ''); + + response.updateContent({ kind: 'markdownContent', content: new MarkdownString('') }); assert.strictEqual(response.toString(), ''); response.updateContent({ kind: 'markdownContent', content: new MarkdownString('test') });