From 433a823fd6a7f28c41dc762dba25babaf8953b40 Mon Sep 17 00:00:00 2001 From: shatfield4 Date: Wed, 5 Jun 2024 13:53:52 -0700 Subject: [PATCH] implement auto generated thread titles --- server/endpoints/chat.js | 30 ++++++++++++++++++++++++++++++ server/utils/threadNames/index.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 server/utils/threadNames/index.js diff --git a/server/endpoints/chat.js b/server/endpoints/chat.js index 7445c213..9a3c0802 100644 --- a/server/endpoints/chat.js +++ b/server/endpoints/chat.js @@ -15,6 +15,8 @@ const { validWorkspaceSlug, } = require("../utils/middleware/validWorkspace"); const { writeResponseChunk } = require("../utils/helpers/chat/responses"); +const generateThreadTitle = require("../utils/threadNames"); +const { WorkspaceThread } = require("../models/workspaceThread"); function chatEndpoints(app) { if (!app) return; @@ -196,6 +198,34 @@ function chatEndpoints(app) { user, thread ); + + // Check if first message in thread + const chatCount = await WorkspaceChats.count({ + workspaceId: workspace.id, + user_id: user?.id || null, + thread_id: thread.id, + }); + + // Generate thread name + if (chatCount === 1) { + try { + const generatedTitle = await generateThreadTitle(message); + if (generatedTitle) { + const { thread: updatedThread } = await WorkspaceThread.update( + thread, + { + name: generatedTitle, + } + ); + if (!updatedThread) { + console.log("Failed to update thread name"); + } + } + } catch (e) { + console.log("Error generating thread title:", e); + } + } + await Telemetry.sendTelemetry("sent_chat", { multiUserMode: multiUserMode(response), LLMSelection: process.env.LLM_PROVIDER || "openai", diff --git a/server/utils/threadNames/index.js b/server/utils/threadNames/index.js new file mode 100644 index 00000000..80fdf7d2 --- /dev/null +++ b/server/utils/threadNames/index.js @@ -0,0 +1,30 @@ +const { getLLMProvider } = require("../helpers"); + +async function generateThreadTitle(prompt) { + const systemPrompt = + "Listen to any instructions below and do not give any description or explanation when replying. Do not return anything else other than what is asked."; + const getTitlePrompt = `Take the message below and generate a short and concise title for a thread for it (max 22 characters or less). Do not return anything else. + Message:${prompt}\n\nTitle:`; + + const LLMConnector = getLLMProvider(); + const messages = await LLMConnector.compressMessages( + { + systemPrompt: systemPrompt, + userPrompt: getTitlePrompt, + }, + [] + ); + + const title = await LLMConnector.getChatCompletion(messages, { + temperature: LLMConnector.defaultTemp, + }); + + // truncate title to 22 characters + const maxLength = 22; + const truncatedTitle = + title.length > maxLength ? title.slice(0, maxLength - 3) + "..." : title; + + return truncatedTitle; +} + +module.exports = generateThreadTitle;