From 8281c532f25989550b84e9176b9f2003c8efab77 Mon Sep 17 00:00:00 2001 From: Huarch Date: Tue, 19 May 2026 15:59:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BC=9A=E8=AF=9D=E6=A0=87?= =?UTF-8?q?=E9=A2=98=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/chat.ts | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/routes/chat.ts b/src/routes/chat.ts index ed59f78..72b3af3 100644 --- a/src/routes/chat.ts +++ b/src/routes/chat.ts @@ -278,18 +278,27 @@ export const buildChatRouter = ( const assistantText = collectTextContent(assistantMessage?.parts ?? []); const existingSessionTitle = sessionBridge.getSessionTitle(binding.sessionId); let sessionTitle = existingSessionTitle; + const { userMessageCount, assistantMessageCount } = + await getConversationTurnStats(runtime, binding.sessionId); const shouldGenerateTitle = - !existingSessionTitle && - (await isFirstRoundConversation(runtime, binding.sessionId)); + userMessageCount <= 3 && + assistantMessageCount >= 1; if (shouldGenerateTitle) { sessionTitle = await generateSessionTitle(runtime, { sessionId: binding.sessionId, latestUserMessage: parsed.data.message, + fallbackTitle: existingSessionTitle, }); - sessionBridge.setSessionTitle(binding.sessionId, sessionTitle); + if (sessionTitle !== existingSessionTitle) { + sessionBridge.setSessionTitle(binding.sessionId, sessionTitle); + } } if (!streamClosed && !res.writableEnded && !res.destroyed) { - if (shouldGenerateTitle && sessionTitle) { + if ( + shouldGenerateTitle && + sessionTitle && + sessionTitle !== existingSessionTitle + ) { res.write( toSse("session_title", { session_id: clientSessionId, @@ -1044,16 +1053,25 @@ const buildTitleConversationContext = async ( .slice(0, 2400); }; -const isFirstRoundConversation = async ( +const getConversationTurnStats = async ( runtime: OpencodeRuntimeAdapter, sessionId: string, ) => { const messages = await runtime.messages(sessionId, 12); - const chatMessageCount = messages.filter( - (message) => - message.info.role === "user" || message.info.role === "assistant", - ).length; - return chatMessageCount === 2; + return messages.reduce( + (stats, message) => { + if (message.info.role === "user") { + stats.userMessageCount += 1; + } else if (message.info.role === "assistant") { + stats.assistantMessageCount += 1; + } + return stats; + }, + { + userMessageCount: 0, + assistantMessageCount: 0, + }, + ); }; const normalizeGeneratedTitle = (rawTitle: string, fallback: string) => {