From 0754621485970601c80ae9b4345c2d08a0bc64eb Mon Sep 17 00:00:00 2001 From: Moshi Wei Date: Sun, 23 Nov 2025 03:41:35 +0800 Subject: [PATCH] optimize title generation speed --- app/(chat)/api/chat/route.ts | 26 +++++++++++++++++++++----- lib/db/queries.ts | 18 ++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index 52d41fb8aa..9d78c308de 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -36,12 +36,13 @@ import { saveChat, saveMessages, updateChatLastContextById, + updateChatTitleById, } from "@/lib/db/queries"; import type { DBMessage } from "@/lib/db/schema"; import { ChatSDKError } from "@/lib/errors"; import type { ChatMessage } from "@/lib/types"; import type { AppUsage } from "@/lib/usage"; -import { convertToUIMessages, generateUUID } from "@/lib/utils"; +import { convertToUIMessages, generateUUID, getTextFromMessage } from "@/lib/utils"; import { generateTitleFromUserMessage } from "../../actions"; import { type PostRequestBody, postRequestBodySchema } from "./schema"; @@ -135,16 +136,31 @@ export async function POST(request: Request) { // Only fetch messages if chat already exists messagesFromDb = await getMessagesByChatId({ id }); } else { - const title = await generateTitleFromUserMessage({ - message, - }); + // Generate temporary title immediately (non-blocking) + const messageText = getTextFromMessage(message); + const temporaryTitle = messageText.length > 60 + ? `${messageText.slice(0, 60).trim()}...` + : messageText || "New Chat"; await saveChat({ id, userId: session.user.id, - title, + title: temporaryTitle, visibility: selectedVisibilityType, }); + + // Generate real title asynchronously in the background + // Don't await - let it run in parallel + generateTitleFromUserMessage({ message }) + .then((realTitle) => { + updateChatTitleById({ chatId: id, title: realTitle }).catch((err) => { + console.warn("Failed to update chat title", id, err); + }); + }) + .catch((err) => { + console.warn("Failed to generate chat title", id, err); + }); + // New chat - no need to fetch messages, it's empty } diff --git a/lib/db/queries.ts b/lib/db/queries.ts index 20195140a8..532daea09c 100644 --- a/lib/db/queries.ts +++ b/lib/db/queries.ts @@ -521,6 +521,24 @@ export async function updateChatLastContextById({ } } +export async function updateChatTitleById({ + chatId, + title, +}: { + chatId: string; + title: string; +}) { + try { + return await db + .update(chat) + .set({ title }) + .where(eq(chat.id, chatId)); + } catch (error) { + console.warn("Failed to update title for chat", chatId, error); + return; + } +} + export async function getMessageCountByUserId({ id, differenceInHours,