const { v4: uuidv4 } = require("uuid"); const { reqBody, userFromSession, multiUserMode } = require("../utils/http"); const { Workspace } = require("../models/workspace"); const { chatWithWorkspace } = require("../utils/chats"); const { validatedRequest } = require("../utils/middleware/validatedRequest"); const { WorkspaceChats } = require("../models/workspaceChats"); const { SystemSettings } = require("../models/systemSettings"); const { Telemetry } = require("../models/telemetry"); function chatEndpoints(app) { if (!app) return; app.post( "/workspace/:slug/chat", [validatedRequest], async (request, response) => { try { const user = await userFromSession(request, response); const { slug } = request.params; const { message, mode = "query" } = reqBody(request); const workspace = multiUserMode(response) ? await Workspace.getWithUser(user, `slug = '${slug}'`) : await Workspace.get(`slug = '${slug}'`); if (!workspace) { response.sendStatus(400).end(); return; } if (multiUserMode(response) && user.role !== "admin") { const limitMessages = (await SystemSettings.get(`label = 'limit_user_messages'`)) ?.value === "true"; if (limitMessages) { const systemLimit = Number( (await SystemSettings.get(`label = 'message_limit'`))?.value ); if (!!systemLimit) { const currentChatCount = await WorkspaceChats.count( `user_id = ${user.id} AND createdAt > datetime(CURRENT_TIMESTAMP, '-1 days')` ); if (currentChatCount >= systemLimit) { response.status(500).json({ id: uuidv4(), type: "abort", textResponse: null, sources: [], close: true, error: `You have met your maximum 24 hour chat quota of ${systemLimit} chats set by the instance administrators. Try again later.`, }); return; } } } } const result = await chatWithWorkspace(workspace, message, mode, user); await Telemetry.sendTelemetry("sent_chat", { multiUserMode: multiUserMode(response), LLMSelection: process.env.LLM_PROVIDER || "openai", VectorDbSelection: process.env.VECTOR_DB || "pinecone", }); response.status(200).json({ ...result }); } catch (e) { response.status(500).json({ id: uuidv4(), type: "abort", textResponse: null, sources: [], close: true, error: e.message, }); } } ); } module.exports = { chatEndpoints };