Librechat

URL
https://librechat.smns-bw.org/
MongoDB Adminuser
mdbo
MongoDB Adminuser PW
••••••••••


npm läuft innerhalb des Containers!

Librechat updaten

docker compose down
git pull
docker compose pull
docker compose up -d

Nutzerstatistik auslesen

npm run user-stats

Dafür musste config/user-stats.js erweitert werden:

const path = require('path');
require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
const { silentExit } = require('./helpers');
const Conversation = require('~/models/schema/convoSchema');
const Message = require('~/models/schema/messageSchema');
const User = require('~/models/User');
const { Transaction } = require('~/models/Transaction'); // Correctly destructure to get the Transaction model
const connect = require('./connect');

(async () => {
  await connect();

  console.log('-----------------------------');
  console.log('Show the stats of all users');
  console.log('-----------------------------');

  let users = await User.find({});
  let userData = [];
  for (const user of users) {
    let conversationsCount = (await Conversation.count({ user: user._id })) ?? 0;
    let messagesCount = (await Message.count({ user: user._id })) ?? 0;

    // Aggregate transaction data for the user
    let transactions = await Transaction.find({ user: user._id });

    // Aggregate transaction data for the user
    let totalRawAmount = transactions.reduce((sum, tx) => sum + tx.rawAmount, 0);
    let totalTokenValue = transactions.reduce((sum, tx) => sum + tx.tokenValue, 0);

    userData.push({
      User: user.name,
      Email: user.email,
      Conversations: conversationsCount,
      Messages: messagesCount,
      TotalRawAmount: totalRawAmount,
      TotalTokenValue: totalTokenValue,
    });
  }

  userData.sort((a, b) => {
    if (a.Conversations !== b.Conversations) {
      return b.Conversations - a.Conversations;
    }

    return b.Messages - a.Messages;
  });

  console.table(userData);

  silentExit(0);
})();

process.on('uncaughtException', (err) => {
  if (!err.message.includes('fetch failed')) {
    console.error('There was an uncaught error:');
    console.error(err);
  }

  if (!err.message.includes('fetch failed')) {
    process.exit(1);
  }
});

Nutzern Balance/Token geben

Im Container:

npm run add-balance wiebke.walbaum@smns-bw.de 1000000000

Es läuft ein bash Skript add_balance.sh via Crontab alle 3min, dass jedem Nutzer, der keine Balance hat 1Mrd gibt:

*/3 *   * * *   root    /opt/librechat/add_balance.sh >> /opt/librechat/logs/add_balance.log 2>&1
#!/bin/bash

add_balance=${1:-1000000000}
response=$(docker exec LibreChat npm run list-balances | grep "has no balance")
emails=($(echo "$response" | grep -oP "[a-zA-Z0-9_.+-]+@[a-zA-Z-]+\.[a-zA-Z-.]+"))

for email in "${emails[@]}"; do
  docker exec LibreChat npm run add-balance "$email" "$add_balance"
done

Nutzer händisch anlegen

In den Container via sh:

docker exec -it LibreChat sh

Nutzer anlegen z.B.:

npm run create-user
Email:
> sven.hirth@smns-bw.de
Name: (default is: sven.hirth)
> Sven Hirth
Username: (default is: sven.hirth)
> shirth
Password: (leave blank, to generate one)
>
Your password is: abcdef123456
User created successfully!

Passwort dem Nutzer mitteilen.

Aktivitäten in der MongoDB

Connect:

docker exec -it chat-mongodb mongosh

Useful commands:

show dbs
use LibreChat
show collections
db.users.find()

User erstellen

db.createUser({ user: "mdbo", pwd: "<siehe oben>", roles: ["userAdminAnyDatabase", "readWriteAnyDatabase"] })

User löschen

db.users.deleteOne({email: 'tatjana.tull@smns-bw.de'});

User Rechte geben

db.grantRolesToUser("mdbo", ["clusterAdmin", "readAnyDatabase"]);

User Plugin auf DALL-E 3 setzen

db.users.update({provider: "local"}, {$set: {plugins: ['dalle']}}, {multi: true})

User händisch auf E-Mail verifiziert setzen

db.users.updateOne(
   { username: 'wwalbaum' },
   { $set:
      {
        emailVerified: true
      }
   }
)