mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-10 16:22:38 +02:00
refactor: separate content building for UI and persistence, filtering out thinking steps for improved clarity
This commit is contained in:
parent
8a99752f2f
commit
d75ddf6087
1 changed files with 44 additions and 16 deletions
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue