+
+
+
+
-
- Recommended size at least 800x200
+
+ Appearance Settings
+
+
+ Customize the appearance settings of your platform.
+
+
+
+
+
+ Custom Logo
+
+
+ Change the logo that appears in the sidebar.
+
+
+
+
![Uploaded Logo]({logo})
+ (e.target.src = prefersDarkMode
+ ? AnythingLLMLight
+ : AnythingLLMDark)
+ }
+ />
+
+
+
+
+
+
+ Upload your logo. Recommended size: 800x200.
+
+
-
-
-
-
-
-
-
- {errorMsg && (
-
- {errorMsg}
+
+
+
+ Custom Messages
+
+
+ Change the default messages that are displayed to the users.
+
+
+
+ {messages.map((message, index) => (
+
+ {message.user && (
+
+ )}
+ {message.response && (
+
+ )}
+
+ ))}
+
+
+
+
+
+ {hasChanges && (
+
+
+
+ )}
- )}
-
- {successMsg && (
-
- {successMsg}
-
- )}
+ {errorMsg && (
+
+ {errorMsg}
+
+ )}
+ {successMsg && (
+
+ {successMsg}
+
+ )}
+
);
diff --git a/server/endpoints/system.js b/server/endpoints/system.js
index 8b1588a7..ff656a02 100644
--- a/server/endpoints/system.js
+++ b/server/endpoints/system.js
@@ -35,6 +35,7 @@ const {
DARK_LOGO_FILENAME,
} = require("../utils/files/logo");
const { Telemetry } = require("../models/telemetry");
+const { WelcomeMessages } = require("../models/welcomeMessages");
function systemEndpoints(app) {
if (!app) return;
@@ -477,6 +478,53 @@ function systemEndpoints(app) {
}
}
);
+
+ app.get("/system/welcome-messages", async function (request, response) {
+ try {
+ const welcomeMessages = await WelcomeMessages.getMessages();
+ response.status(200).json({ success: true, welcomeMessages });
+ } catch (error) {
+ console.error("Error fetching welcome messages:", error);
+ response
+ .status(500)
+ .json({ success: false, message: "Internal server error" });
+ }
+ });
+
+ app.post(
+ "/system/set-welcome-messages",
+ [validatedRequest],
+ async (request, response) => {
+ try {
+ if (
+ response.locals.multiUserMode &&
+ response.locals.user?.role !== "admin"
+ ) {
+ return response.sendStatus(401).end();
+ }
+
+ const { messages = [] } = reqBody(request);
+ if (!Array.isArray(messages)) {
+ return response.status(400).json({
+ success: false,
+ message: "Invalid message format. Expected an array of messages.",
+ });
+ }
+
+ await WelcomeMessages.saveAll(messages);
+ return response.status(200).json({
+ success: true,
+ message: "Welcome messages saved successfully.",
+ });
+ } catch (error) {
+ console.error("Error processing the welcome messages:", error);
+ response.status(500).json({
+ success: true,
+ message: "Error saving the welcome messages.",
+ });
+ }
+ }
+ );
}
module.exports = { systemEndpoints };
diff --git a/server/models/welcomeMessages.js b/server/models/welcomeMessages.js
new file mode 100644
index 00000000..437dd97c
--- /dev/null
+++ b/server/models/welcomeMessages.js
@@ -0,0 +1,89 @@
+const WelcomeMessages = {
+ tablename: "welcome_messages",
+ colsInit: `
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ user TEXT NOT NULL,
+ response TEXT NOT NULL,
+ orderIndex INTEGER,
+ createdAt TEXT DEFAULT CURRENT_TIMESTAMP
+ `,
+
+ migrateTable: async function () {
+ const { checkForMigrations } = require("../utils/database");
+ console.log(
+ `\x1b[34m[MIGRATING]\x1b[0m Checking for Welcome Messages migrations`
+ );
+ const db = await this.db(false);
+ await checkForMigrations(this, db);
+ db.close();
+ },
+
+ migrations: function () {
+ return [];
+ },
+
+ db: async function (tracing = true) {
+ const sqlite3 = require("sqlite3").verbose();
+ const { open } = require("sqlite");
+
+ const db = await open({
+ filename: `${
+ !!process.env.STORAGE_DIR ? `${process.env.STORAGE_DIR}/` : "storage/"
+ }anythingllm.db`,
+ driver: sqlite3.Database,
+ });
+
+ await db.exec(
+ `PRAGMA foreign_keys = ON;CREATE TABLE IF NOT EXISTS ${this.tablename} (${this.colsInit})`
+ );
+
+ if (tracing) {
+ db.on("trace", (sql) => console.log(sql));
+ }
+
+ return db;
+ },
+
+ get: async function (clause = "") {
+ const db = await this.db();
+ const result = await db
+ .get(`SELECT * FROM ${this.tablename} WHERE ${clause}`)
+ .then((res) => res || null);
+ db.close();
+ return result;
+ },
+
+ where: async function (clause = null, limit = null) {
+ const db = await this.db();
+ const results = await db.all(
+ `SELECT * FROM ${this.tablename} ${clause ? `WHERE ${clause}` : ""} ${
+ !!limit ? `LIMIT ${limit}` : ""
+ }`
+ );
+ db.close();
+ return results;
+ },
+
+ saveAll: async function (messages) {
+ const db = await this.db();
+ await db.run(`DELETE FROM ${this.tablename}`);
+ for (const [index, message] of messages.entries()) {
+ await db.run(
+ `INSERT INTO ${this.tablename} (user, response, orderIndex) VALUES (?, ?, ?)`,
+ [message.user, message.response, index]
+ );
+ }
+ db.close();
+ },
+
+ getMessages: async function () {
+ const db = await this.db();
+ const results = await db.all(
+ `SELECT user, response FROM ${this.tablename} ORDER BY orderIndex ASC`
+ );
+ db.close();
+ return results;
+ },
+};
+
+module.exports.WelcomeMessages = WelcomeMessages;
diff --git a/server/utils/database/index.js b/server/utils/database/index.js
index 65f9707e..0cdc7ba1 100644
--- a/server/utils/database/index.js
+++ b/server/utils/database/index.js
@@ -61,6 +61,7 @@ async function validateTablePragmas(force = false) {
const { DocumentVectors } = require("../../models/vectors");
const { WorkspaceChats } = require("../../models/workspaceChats");
const { Invite } = require("../../models/invite");
+ const { WelcomeMessages } = require("../../models/welcomeMessages");
await SystemSettings.migrateTable();
await User.migrateTable();
@@ -70,6 +71,7 @@ async function validateTablePragmas(force = false) {
await DocumentVectors.migrateTable();
await WorkspaceChats.migrateTable();
await Invite.migrateTable();
+ await WelcomeMessages.migrateTable();
} catch (e) {
console.error(`validateTablePragmas: Migrations failed`, e);
}