anything-llm/server/endpoints/chat.js

81 lines
2.8 KiB
JavaScript
Raw Normal View History

const { v4: uuidv4 } = require("uuid");
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");
const { validatedRequest } = require("../utils/middleware/validatedRequest");
const { WorkspaceChats } = require("../models/workspaceChats");
const { SystemSettings } = require("../models/systemSettings");
const { Telemetry } = require("../models/telemetry");
const { escape } = require("sqlstring-sqlite");
2023-06-04 04:28:07 +02:00
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 = ${escape(slug)}`)
: await Workspace.get(`slug = ${escape(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
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,
});
}
}
);
2023-06-04 04:28:07 +02:00
}
2023-06-08 06:31:35 +02:00
module.exports = { chatEndpoints };