From 72b3a0902aeac64ca77a213d1e474f2230cd2d06 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Tue, 10 Mar 2026 17:40:22 -0700 Subject: [PATCH] Fix de-dup of user messages --- server/src/routes.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/server/src/routes.ts b/server/src/routes.ts index 23ac615..6ea9357 100644 --- a/server/src/routes.ts +++ b/server/src/routes.ts @@ -16,10 +16,23 @@ type IncomingChatMessage = { name?: string; }; -function sameMessage(a: IncomingChatMessage, b: IncomingChatMessage) { +function sameMessage( + a: { role: string; content: string; name?: string | null }, + b: { role: string; content: string; name?: string | null } +) { return a.role === b.role && a.content === b.content && (a.name ?? null) === (b.name ?? null); } +function isToolCallLogMetadata(value: unknown) { + if (!value || typeof value !== "object" || Array.isArray(value)) return false; + const record = value as Record; + return record.kind === "tool_call"; +} + +function isToolCallLogMessage(message: { role: string; metadata: unknown }) { + return message.role === "tool" && isToolCallLogMetadata(message.metadata); +} + async function storeNonAssistantMessages(chatId: string, messages: IncomingChatMessage[]) { const incoming = messages.filter((m) => m.role !== "assistant"); if (!incoming.length) return; @@ -27,13 +40,13 @@ async function storeNonAssistantMessages(chatId: string, messages: IncomingChatM const existing = await prisma.message.findMany({ where: { chatId }, orderBy: { createdAt: "asc" }, - select: { role: true, content: true, name: true }, + select: { role: true, content: true, name: true, metadata: true }, }); - const existingNonAssistant = existing.filter((m) => m.role !== "assistant"); + const existingNonAssistant = existing.filter((m) => m.role !== "assistant" && !isToolCallLogMessage(m)); let sharedPrefix = 0; const max = Math.min(existingNonAssistant.length, incoming.length); - while (sharedPrefix < max && sameMessage(existingNonAssistant[sharedPrefix] as IncomingChatMessage, incoming[sharedPrefix])) { + while (sharedPrefix < max && sameMessage(existingNonAssistant[sharedPrefix], incoming[sharedPrefix])) { sharedPrefix += 1; }