2023-06-27 02:54:55 +02:00
|
|
|
const { v4: uuidv4 } = require("uuid");
|
2023-07-25 19:37:04 +02:00
|
|
|
const { reqBody, userFromSession, multiUserMode } = require("../utils/http");
|
2023-06-08 06:31:35 +02:00
|
|
|
const { Workspace } = require("../models/workspace");
|
|
|
|
const { chatWithWorkspace } = require("../utils/chats");
|
2023-07-25 19:37:04 +02:00
|
|
|
const { validatedRequest } = require("../utils/middleware/validatedRequest");
|
|
|
|
const { WorkspaceChats } = require("../models/workspaceChats");
|
|
|
|
const { SystemSettings } = require("../models/systemSettings");
|
2023-08-15 02:42:17 +02:00
|
|
|
const { Telemetry } = require("../models/telemetry");
|
2023-06-04 04:28:07 +02:00
|
|
|
|
|
|
|
function chatEndpoints(app) {
|
|
|
|
if (!app) return;
|
|
|
|
|
2023-07-25 19:37:04 +02:00
|
|
|
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";
|
2023-06-04 04:28:07 +02:00
|
|
|
|
2023-07-25 19:37:04 +02:00
|
|
|
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);
|
2023-08-15 02:42:17 +02:00
|
|
|
await Telemetry.sendTelemetry("sent_chat", {
|
|
|
|
multiUserMode: multiUserMode(response),
|
|
|
|
LLMSelection: process.env.LLM_PROVIDER || "openai",
|
|
|
|
VectorDbSelection: process.env.VECTOR_DB || "pinecone",
|
|
|
|
});
|
2023-07-25 19:37:04 +02:00
|
|
|
response.status(200).json({ ...result });
|
|
|
|
} catch (e) {
|
|
|
|
response.status(500).json({
|
|
|
|
id: uuidv4(),
|
|
|
|
type: "abort",
|
|
|
|
textResponse: null,
|
|
|
|
sources: [],
|
|
|
|
close: true,
|
|
|
|
error: e.message,
|
|
|
|
});
|
|
|
|
}
|
2023-06-08 22:13:48 +02:00
|
|
|
}
|
2023-07-25 19:37:04 +02:00
|
|
|
);
|
2023-06-04 04:28:07 +02:00
|
|
|
}
|
|
|
|
|
2023-06-08 06:31:35 +02:00
|
|
|
module.exports = { chatEndpoints };
|