diff --git a/ui/suite/chat/chat.html b/ui/suite/chat/chat.html
index 4ea38f7..faa2867 100644
--- a/ui/suite/chat/chat.html
+++ b/ui/suite/chat/chat.html
@@ -817,55 +817,65 @@ function finalizeStreaming() {
}
function processMessage(data) {
- // If content contains JSON signals, extract and handle them
- if (data.content && typeof data.content === "string" && data.content.includes('{')) {
- var signalRegex = /\{[^{}]*"type"\s*:\s*"(thinking|thinking_clear)"[^{}]*\}/g;
- var match;
- var hasAnySignal = false;
-
- while ((match = signalRegex.exec(data.content)) !== null) {
- try {
- var jsonStr = match[0];
- var inner = JSON.parse(jsonStr);
- hasAnySignal = true;
-
- if (inner.type === "thinking") {
- showThinkingIndicator(inner.content);
- isThinking = true; // Mark thinking state - hide bot messages
- } else if (inner.type === "thinking_clear") {
- hideThinkingIndicator();
- isThinking = false; // Thinking done - allow bot messages to show
- }
-
- // Remove this signal from the content
- data.content = data.content.replace(jsonStr, "");
- // Reset regex index since we modified the string
- signalRegex.lastIndex = 0;
- } catch (e) {
- console.error("Failed to parse signal:", e);
+ // Check if content contains thinking signals (from GPT-oSS model)
+ if (data.content && typeof data.content === "string") {
+ var content = data.content;
+ var hasThinking = content.includes('"type":"thinking"') || content.includes('"type":"thinking_clear"');
+
+ if (hasThinking) {
+ // Extract ALL thinking content and thinking_clear signals
+ var thinkingContent = [];
+ var hasThinkingClear = false;
+
+ // Match all thinking objects including those with content
+ var thinkingRegex = /\{"content":"[^"]*","type":"thinking"\}/g;
+ var clearRegex = /\{"type":"thinking_clear"\}/g;
+
+ // Find all thinking signals
+ var match;
+ while ((match = thinkingRegex.exec(content)) !== null) {
+ try {
+ var obj = JSON.parse(match[0]);
+ if (obj.content) {
+ thinkingContent.push(obj.content);
+ }
+ // Remove from content
+ content = content.replace(match[0], "");
+ } catch (e) {}
+ }
+
+ // Check for thinking_clear
+ if (clearRegex.test(content)) {
+ hasThinkingClear = true;
+ content = content.replace(clearRegex, "");
+ }
+
+ // Reset regex
+ thinkingRegex.lastIndex = 0;
+
+ // Show/hide thinking indicator
+ if (thinkingContent.length > 0) {
+ isThinking = true;
+ showThinkingIndicator(thinkingContent.join(""));
+ }
+ if (hasThinkingClear) {
+ isThinking = false;
+ hideThinkingIndicator();
+ }
+
+ // Update data.content with cleaned content
+ data.content = content;
+
+ // If content is now empty and not complete, skip
+ if (content.trim() === "" && !data.is_complete) {
+ return;
}
}
-
- if (hasAnySignal && data.content.trim() === "" && !data.is_complete) {
- return;
- }
- }
-
- // Fallback for direct type matches
- if (data.type === "thinking") {
- showThinkingIndicator(data.content);
- isThinking = true;
- return;
- }
- if (data.type === "thinking_clear") {
- hideThinkingIndicator();
- isThinking = false;
- return;
}
// Skip showing bot messages while thinking is active
if (isThinking && data.message_type === MessageType.BOT_RESPONSE) {
- console.log("Hiding bot message while thinking:", data.content?.substring(0, 50));
+ console.log("Hiding bot message while thinking");
return;
}