Skip to content

Commit 8d27bc6

Browse files
committed
feat(tarko-web-ui): streaming thinking rendering support
fix(tarko): detect new thinking sessions to prevent cross-session accumulation feat(tarko): implement independent thinking messages with dedicated role Revert "feat(tarko): implement independent thinking messages with dedicated role" This reverts commit f3e1d6d434973c7817eb1cda838f2e6060b715c4. fix(tarko): improve thinking session detection to prevent cross-session accumulation chore(tarko-web-ui): tweaks fix(tarko): handle thinking events before assistant message creation
1 parent 7bcff07 commit 8d27bc6

2 files changed

Lines changed: 58 additions & 11 deletions

File tree

multimodal/tarko/agent-web-ui/src/common/state/actions/eventProcessors/handlers/MessageHandler.ts

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -267,25 +267,71 @@ export class ThinkingMessageHandler
267267

268268
set(messagesAtom, (prev: Record<string, Message[]>) => {
269269
const sessionMessages = prev[sessionId] || [];
270-
const lastAssistantIndex = [...sessionMessages]
271-
.reverse()
272-
.findIndex((m) => m.role === 'assistant');
270+
const eventMessageId = event.messageId;
271+
let existingMessageIndex = -1;
272+
273+
// First try to find by messageId if available
274+
if (eventMessageId) {
275+
existingMessageIndex = sessionMessages.findIndex(
276+
(msg) => msg.messageId === eventMessageId && msg.role === 'assistant',
277+
);
278+
}
273279

274-
if (lastAssistantIndex !== -1) {
275-
const actualIndex = sessionMessages.length - 1 - lastAssistantIndex;
276-
const message = sessionMessages[actualIndex];
280+
// If not found by messageId, try to find the last assistant message
281+
if (existingMessageIndex === -1) {
282+
const lastAssistantIndex = [...sessionMessages]
283+
.reverse()
284+
.findIndex((m) => m.role === 'assistant');
285+
if (lastAssistantIndex !== -1) {
286+
existingMessageIndex = sessionMessages.length - 1 - lastAssistantIndex;
287+
}
288+
}
289+
290+
if (existingMessageIndex !== -1) {
291+
// Update existing assistant message
292+
const message = sessionMessages[existingMessageIndex];
293+
let newThinking: string;
294+
295+
if (event.type === 'assistant_streaming_thinking_message') {
296+
// For streaming thinking messages, use messageId to determine if this is a new thinking session
297+
const currentMessageId = message.messageId;
298+
const isNewThinkingSession = !eventMessageId ||
299+
!currentMessageId ||
300+
currentMessageId !== eventMessageId;
301+
302+
newThinking = isNewThinkingSession
303+
? event.content
304+
: (message.thinking || '') + event.content;
305+
} else {
306+
// For final thinking messages, always replace the content
307+
newThinking = event.content;
308+
}
277309

278310
return {
279311
...prev,
280312
[sessionId]: [
281-
...sessionMessages.slice(0, actualIndex),
282-
{ ...message, thinking: event.content },
283-
...sessionMessages.slice(actualIndex + 1),
313+
...sessionMessages.slice(0, existingMessageIndex),
314+
{ ...message, thinking: newThinking, messageId: eventMessageId || message.messageId },
315+
...sessionMessages.slice(existingMessageIndex + 1),
284316
],
285317
};
286-
}
318+
} else {
319+
// No existing assistant message found, create a new one with thinking content
320+
const newMessage: Message = {
321+
id: event.id || uuidv4(),
322+
role: 'assistant',
323+
content: '',
324+
timestamp: event.timestamp,
325+
thinking: event.content,
326+
messageId: eventMessageId,
327+
isStreaming: event.type === 'assistant_streaming_thinking_message' && !event.isComplete,
328+
};
287329

288-
return prev;
330+
return {
331+
...prev,
332+
[sessionId]: [...sessionMessages, newMessage],
333+
};
334+
}
289335
});
290336
}
291337
}

multimodal/tarko/agent-web-ui/src/common/state/actions/eventProcessors/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const processEventAction = atom(null, async (get, set, params: EventProce
2020
if (isReplayMode) {
2121
const skipInReplay = [
2222
'assistant_streaming_message',
23+
'assistant_streaming_thinking_message',
2324
'assistant_streaming_tool_call',
2425
'final_answer_streaming',
2526
];

0 commit comments

Comments
 (0)