refactor: separate content building for UI and persistence, filtering out thinking steps for improved clarity

This commit is contained in:
Anish Sarkar 2025-12-22 23:02:57 +05:30
parent 8a99752f2f
commit d75ddf6087

View file

@ -45,6 +45,7 @@ function extractThinkingSteps(content: unknown): ThinkingStep[] {
/** /**
* Convert backend message to assistant-ui ThreadMessageLike format * Convert backend message to assistant-ui ThreadMessageLike format
* Filters out 'thinking-steps' part as it's handled separately
*/ */
function convertToThreadMessage(msg: MessageRecord): ThreadMessageLike { function convertToThreadMessage(msg: MessageRecord): ThreadMessageLike {
let content: ThreadMessageLike["content"]; let content: ThreadMessageLike["content"];
@ -52,7 +53,17 @@ function convertToThreadMessage(msg: MessageRecord): ThreadMessageLike {
if (typeof msg.content === "string") { if (typeof msg.content === "string") {
content = [{ type: "text", text: msg.content }]; content = [{ type: "text", text: msg.content }];
} else if (Array.isArray(msg.content)) { } else if (Array.isArray(msg.content)) {
content = msg.content as ThreadMessageLike["content"]; // Filter out thinking-steps part - it's handled separately via messageThinkingSteps
const filteredContent = msg.content.filter(
(part: unknown) =>
!(typeof part === "object" &&
part !== null &&
"type" in part &&
(part as { type: string }).type === "thinking-steps")
);
content = filteredContent.length > 0
? (filteredContent as ThreadMessageLike["content"])
: [{ type: "text", text: "" }];
} else { } else {
content = [{ type: "text", text: String(msg.content) }]; content = [{ type: "text", text: String(msg.content) }];
} }
@ -244,8 +255,8 @@ export default function NewChatPage() {
} }
>(); >();
// Helper to build content (includes thinking steps for persistence) // Helper to build content for UI (without thinking-steps)
const buildContent = (): ThreadMessageLike["content"] => { const buildContentForUI = (): ThreadMessageLike["content"] => {
const parts: Array< const parts: Array<
| { type: "text"; text: string } | { type: "text"; text: string }
| { | {
@ -255,12 +266,31 @@ export default function NewChatPage() {
args: Record<string, unknown>; args: Record<string, unknown>;
result?: unknown; result?: unknown;
} }
| {
type: "thinking-steps";
steps: ThinkingStepData[];
}
> = []; > = [];
if (accumulatedText) {
parts.push({ type: "text", text: accumulatedText });
}
for (const toolCall of toolCalls.values()) {
if (TOOLS_WITH_UI.has(toolCall.toolName)) {
parts.push({
type: "tool-call",
toolCallId: toolCall.toolCallId,
toolName: toolCall.toolName,
args: toolCall.args,
result: toolCall.result,
});
}
}
return parts.length > 0
? (parts as ThreadMessageLike["content"])
: [{ type: "text", text: "" }];
};
// Helper to build content for persistence (includes thinking-steps)
const buildContentForPersistence = (): unknown[] => {
const parts: unknown[] = [];
// Include thinking steps for persistence // Include thinking steps for persistence
if (currentThinkingSteps.size > 0) { if (currentThinkingSteps.size > 0) {
parts.push({ parts.push({
@ -283,9 +313,7 @@ export default function NewChatPage() {
}); });
} }
} }
return parts.length > 0 return parts.length > 0 ? parts : [{ type: "text", text: "" }];
? (parts as ThreadMessageLike["content"])
: [{ type: "text", text: "" }];
}; };
// Add placeholder assistant message // Add placeholder assistant message
@ -372,7 +400,7 @@ export default function NewChatPage() {
accumulatedText += parsed.delta; accumulatedText += parsed.delta;
setMessages((prev) => setMessages((prev) =>
prev.map((m) => prev.map((m) =>
m.id === assistantMsgId ? { ...m, content: buildContent() } : m m.id === assistantMsgId ? { ...m, content: buildContentForUI() } : m
) )
); );
break; break;
@ -385,7 +413,7 @@ export default function NewChatPage() {
}); });
setMessages((prev) => setMessages((prev) =>
prev.map((m) => prev.map((m) =>
m.id === assistantMsgId ? { ...m, content: buildContent() } : m m.id === assistantMsgId ? { ...m, content: buildContentForUI() } : m
) )
); );
break; break;
@ -401,7 +429,7 @@ export default function NewChatPage() {
}); });
setMessages((prev) => setMessages((prev) =>
prev.map((m) => prev.map((m) =>
m.id === assistantMsgId ? { ...m, content: buildContent() } : m m.id === assistantMsgId ? { ...m, content: buildContentForUI() } : m
) )
); );
break; break;
@ -421,7 +449,7 @@ export default function NewChatPage() {
} }
setMessages((prev) => setMessages((prev) =>
prev.map((m) => prev.map((m) =>
m.id === assistantMsgId ? { ...m, content: buildContent() } : m m.id === assistantMsgId ? { ...m, content: buildContentForUI() } : m
) )
); );
break; break;
@ -459,8 +487,8 @@ export default function NewChatPage() {
reader.releaseLock(); reader.releaseLock();
} }
// Persist assistant message // Persist assistant message (with thinking steps for restoration on refresh)
const finalContent = buildContent(); const finalContent = buildContentForPersistence();
if (accumulatedText || toolCalls.size > 0) { if (accumulatedText || toolCalls.size > 0) {
appendMessage(threadId, { appendMessage(threadId, {
role: "assistant", role: "assistant",