From 0755ffb155bbd27bfe171c0913113db98a85312d Mon Sep 17 00:00:00 2001 From: Deekshith Reddy Alugubelli <149993483+DeekshithReddyA@users.noreply.github.com> Date: Sat, 6 Sep 2025 17:18:08 +0530 Subject: [PATCH 1/2] Add title generation from user message --- backend/routes/ai.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/routes/ai.ts b/backend/routes/ai.ts index c7d63fba..bd2aa510 100644 --- a/backend/routes/ai.ts +++ b/backend/routes/ai.ts @@ -1,6 +1,6 @@ import { Router } from "express"; import { CreateChatSchema, MODELS, Role } from "../types"; -import { createCompletion } from "../openrouter"; +import { createCompletion, generateTitleFromUserMessage } from "../openrouter"; import { InMemoryStore } from "../InMemoryStore"; import { authMiddleware } from "../auth-middleware"; import { PrismaClient } from "../generated/prisma"; @@ -138,12 +138,13 @@ router.post("/chat", authMiddleware, async (req, res) => { } if (!execution) { + const title = await generateTitleFromUserMessage({ message: data.message }); await prismaClient.$transaction([ prismaClient.execution.create({ data: { id: conversationId, userId, - title: data.message.slice(0, 20) + "...", + title, type: "CONVERSATION", externalId: conversationId } From 38f2683a404113905d88311ebb07c96634494c4f Mon Sep 17 00:00:00 2001 From: Deekshith Reddy Alugubelli <149993483+DeekshithReddyA@users.noreply.github.com> Date: Sat, 6 Sep 2025 17:19:56 +0530 Subject: [PATCH 2/2] title generation function --- backend/openrouter.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/backend/openrouter.ts b/backend/openrouter.ts index f9d56d08..67cdfa0e 100644 --- a/backend/openrouter.ts +++ b/backend/openrouter.ts @@ -82,3 +82,39 @@ export const createCompletion = async ( }) } +export async function generateTitleFromUserMessage({ + message, +}: { + message: string; +}) { + const systemPrompt = `\n + - you will generate a short title based on the first message a user begins a conversation with + - ensure it is not more than 50 characters long + - the title should be a summary of the user's message + - do not use quotes or colons`; + + const response = await fetch('https://openrouter.ai/api/v1/chat/completions', { + method: 'POST', + headers: { + Authorization: `Bearer ${OPENROUTER_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: 'openai/gpt-4o-mini', + messages: [ + { role: 'system', content: systemPrompt }, + { role: 'user', content: message }, + ], + stream: false, + }), + }); + + if (!response.ok) { + return message.slice(0, 20) + "..."; + } + + const data = await response.json(); + const title = data.choices?.[0]?.message?.content?.trim() || ''; + return title; +} +