diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index 7fb12aac..98519d4f 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -371,7 +371,6 @@ export function stripThinkTags(text: string): string { let result = ''; let depth = 0; let i = 0; - let inPartialTag = false; while (i < text.length) { if (text.startsWith('', i)) { @@ -380,24 +379,12 @@ export function stripThinkTags(text: string): string { } else if (text.startsWith('', i)) { if (depth > 0) depth--; i += 8; // length of '' - } else if (text.startsWith('', i)) { - inPartialTag = false; - } } return result; @@ -409,15 +396,18 @@ class ThinkTagSurroundingsRemover extends SurroundingsRemover { } removeThinkTags() { - // Try to remove opening tag, handling partial tokens during streaming - const foundOpenTag = this.removePrefix(''); - if (!foundOpenTag) { - // Let removePrefix handle partial matches character by character - this.removePrefix('<'); - this.removePrefix('think'); - this.removePrefix('>'); + // Handle token streaming character by character + const chars = ['<', 't', 'h', 'i', 'n', 'k', '>']; + let foundTag = true; + + for (const char of chars) { + if (!this.removePrefix(char)) { + foundTag = false; + break; + } } - return foundOpenTag; + + return foundTag; } 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 a145fba6..24ff8129 100644 --- a/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts +++ b/src/vs/workbench/contrib/chat/test/common/chatModel.test.ts @@ -15,9 +15,15 @@ suite('ChatModel - Think Tags', () => { response.updateContent({ kind: 'markdownContent', content: new MarkdownString('