import express, { Request, Response } from "express"; import { prisma as db } from "@repo/db/client"; import { resolveAiProvider, getLlm } from "../ai/llm-factory"; const router = express.Router(); const FALLBACK_GREETINGS = [ "How can I help you today?", "What can I do for you today?", "Ready when you are.", "What's on your mind today?", "Let's get started.", ]; let cachedGreeting: { text: string; date: string } | null = null; function todayKey() { return new Date().toISOString().slice(0, 10); } router.get("/", async (_req: Request, res: Response): Promise => { try { const today = todayKey(); if (cachedGreeting && cachedGreeting.date === today) { return res.status(200).json({ greeting: cachedGreeting.text }); } const aiSettings = await db.aiSettings.findFirst(); const activeAi = aiSettings ? resolveAiProvider(aiSettings) : null; if (!activeAi) { const fallback = FALLBACK_GREETINGS[Math.floor(Math.random() * FALLBACK_GREETINGS.length)]; return res.status(200).json({ greeting: fallback }); } const llm = getLlm(activeAi.provider, activeAi.key, activeAi.model); const result = await llm.invoke([ { role: "system", content: "Generate a single short AI greeting, similar to how ChatGPT or Claude greets users. Keep it to one short sentence. Examples of the style: 'How can I help you today?', 'What's on your mind?', 'Ready when you are.', 'What can I do for you today?'. Be warm but concise. Do not use emojis. Do not mention names. Vary each greeting.", }, { role: "user", content: "Generate a short greeting.", }, ]); const greeting = typeof result.content === "string" ? result.content.trim() : FALLBACK_GREETINGS[0]!; cachedGreeting = { text: greeting, date: today }; return res.status(200).json({ greeting }); } catch { const fallback = FALLBACK_GREETINGS[Math.floor(Math.random() * FALLBACK_GREETINGS.length)]; return res.status(200).json({ greeting: fallback }); } }); export default router;