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('