usage good
This commit is contained in:
@@ -12,7 +12,8 @@
|
|||||||
"Bash(node debug-search.js:*)",
|
"Bash(node debug-search.js:*)",
|
||||||
"Bash(node update-referent.js:*)",
|
"Bash(node update-referent.js:*)",
|
||||||
"Bash(node:*)",
|
"Bash(node:*)",
|
||||||
"Bash(curl:*)"
|
"Bash(curl:*)",
|
||||||
|
"Bash(npx tsc:*)"
|
||||||
],
|
],
|
||||||
"deny": [],
|
"deny": [],
|
||||||
"ask": []
|
"ask": []
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export function UsageAnalytics() {
|
|||||||
|
|
||||||
const { data: users = [] } = useCollection<LibreChatUser>("users", { limit: 1000 });
|
const { data: users = [] } = useCollection<LibreChatUser>("users", { limit: 1000 });
|
||||||
const { data: conversations = [] } = useCollection<LibreChatConversation>("conversations", { limit: 1000 });
|
const { data: conversations = [] } = useCollection<LibreChatConversation>("conversations", { limit: 1000 });
|
||||||
const { data: transactions = [] } = useCollection<LibreChatTransaction>("transactions", { limit: 1000 });
|
const { data: transactions = [] } = useCollection<LibreChatTransaction>("transactions", { limit: 10000 });
|
||||||
const { data: balances = [] } = useCollection<LibreChatBalance>("balances", { limit: 1000 });
|
const { data: balances = [] } = useCollection<LibreChatBalance>("balances", { limit: 1000 });
|
||||||
|
|
||||||
const calculateStats = useCallback(() => {
|
const calculateStats = useCallback(() => {
|
||||||
@@ -56,7 +56,7 @@ export function UsageAnalytics() {
|
|||||||
// Analyser les doublons dans les balances
|
// Analyser les doublons dans les balances
|
||||||
const userCounts = new Map<string, number>();
|
const userCounts = new Map<string, number>();
|
||||||
balances.forEach((balance) => {
|
balances.forEach((balance) => {
|
||||||
const userId = balance.user;
|
const userId = String(balance.user);
|
||||||
userCounts.set(userId, (userCounts.get(userId) || 0) + 1);
|
userCounts.set(userId, (userCounts.get(userId) || 0) + 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ export function UsageAnalytics() {
|
|||||||
const duplicateDetails = Array.from(userCounts.entries())
|
const duplicateDetails = Array.from(userCounts.entries())
|
||||||
.filter(([, count]) => count > 1)
|
.filter(([, count]) => count > 1)
|
||||||
.map(([userId, count]) => {
|
.map(([userId, count]) => {
|
||||||
const userBalances = balances.filter(b => b.user === userId);
|
const userBalances = balances.filter(b => String(b.user) === userId);
|
||||||
const totalCredits = userBalances.reduce((sum, b) => sum + (b.tokenCredits || 0), 0);
|
const totalCredits = userBalances.reduce((sum, b) => sum + (b.tokenCredits || 0), 0);
|
||||||
return {
|
return {
|
||||||
userId,
|
userId,
|
||||||
@@ -96,7 +96,7 @@ export function UsageAnalytics() {
|
|||||||
// NOUVEAU : Identifier les utilisateurs fantômes
|
// NOUVEAU : Identifier les utilisateurs fantômes
|
||||||
console.log("=== ANALYSE DES UTILISATEURS FANTÔMES ===");
|
console.log("=== ANALYSE DES UTILISATEURS FANTÔMES ===");
|
||||||
const userIds = new Set(users.map(user => user._id));
|
const userIds = new Set(users.map(user => user._id));
|
||||||
const balanceUserIds = balances.map(balance => balance.user);
|
const balanceUserIds = balances.map(balance => String(balance.user));
|
||||||
const phantomUsers = balanceUserIds.filter(userId => !userIds.has(userId));
|
const phantomUsers = balanceUserIds.filter(userId => !userIds.has(userId));
|
||||||
const uniquePhantomUsers = [...new Set(phantomUsers)];
|
const uniquePhantomUsers = [...new Set(phantomUsers)];
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ export function UsageAnalytics() {
|
|||||||
|
|
||||||
// Calculer les crédits des utilisateurs fantômes
|
// Calculer les crédits des utilisateurs fantômes
|
||||||
const phantomCredits = balances
|
const phantomCredits = balances
|
||||||
.filter(balance => uniquePhantomUsers.includes(balance.user))
|
.filter(balance => uniquePhantomUsers.includes(String(balance.user)))
|
||||||
.reduce((sum, balance) => sum + (balance.tokenCredits || 0), 0);
|
.reduce((sum, balance) => sum + (balance.tokenCredits || 0), 0);
|
||||||
|
|
||||||
console.log("Crédits des utilisateurs fantômes:", phantomCredits);
|
console.log("Crédits des utilisateurs fantômes:", phantomCredits);
|
||||||
@@ -113,7 +113,7 @@ export function UsageAnalytics() {
|
|||||||
|
|
||||||
// Analyser les utilisateurs fantômes
|
// Analyser les utilisateurs fantômes
|
||||||
const phantomDetails = uniquePhantomUsers.map(userId => {
|
const phantomDetails = uniquePhantomUsers.map(userId => {
|
||||||
const userBalances = balances.filter(b => b.user === userId);
|
const userBalances = balances.filter(b => String(b.user) === userId);
|
||||||
const totalCredits = userBalances.reduce((sum, b) => sum + (b.tokenCredits || 0), 0);
|
const totalCredits = userBalances.reduce((sum, b) => sum + (b.tokenCredits || 0), 0);
|
||||||
return { userId, totalCredits, count: userBalances.length };
|
return { userId, totalCredits, count: userBalances.length };
|
||||||
});
|
});
|
||||||
@@ -134,13 +134,13 @@ export function UsageAnalytics() {
|
|||||||
// Grouper les balances par utilisateur
|
// Grouper les balances par utilisateur
|
||||||
const balancesByUser = new Map<string, LibreChatBalance[]>();
|
const balancesByUser = new Map<string, LibreChatBalance[]>();
|
||||||
balances.forEach((balance) => {
|
balances.forEach((balance) => {
|
||||||
const userId = balance.user;
|
const balanceUserId = String(balance.user);
|
||||||
// Ignorer les utilisateurs fantômes (qui n'existent plus)
|
// Ignorer les utilisateurs fantômes (qui n'existent plus)
|
||||||
if (users.some(user => user._id === userId)) {
|
if (users.some(user => user._id === balanceUserId)) {
|
||||||
if (!balancesByUser.has(userId)) {
|
if (!balancesByUser.has(balanceUserId)) {
|
||||||
balancesByUser.set(userId, []);
|
balancesByUser.set(balanceUserId, []);
|
||||||
}
|
}
|
||||||
balancesByUser.get(userId)!.push(balance);
|
balancesByUser.get(balanceUserId)!.push(balance);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -186,17 +186,19 @@ export function UsageAnalytics() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Calculer les conversations par utilisateur
|
// Calculer les conversations par utilisateur
|
||||||
|
// conv.user est un STRING
|
||||||
conversations.forEach((conv) => {
|
conversations.forEach((conv) => {
|
||||||
const userStat = userStats.get(conv.user);
|
const userStat = userStats.get(String(conv.user));
|
||||||
if (userStat) {
|
if (userStat) {
|
||||||
userStat.conversations++;
|
userStat.conversations++;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Calculer les tokens par utilisateur depuis les transactions
|
// Calculer les tokens par utilisateur depuis les transactions
|
||||||
|
// transaction.user est un ObjectId, on le convertit en string
|
||||||
let totalTokensConsumed = 0;
|
let totalTokensConsumed = 0;
|
||||||
transactions.forEach((transaction) => {
|
transactions.forEach((transaction) => {
|
||||||
const userStat = userStats.get(transaction.user);
|
const userStat = userStats.get(String(transaction.user));
|
||||||
if (userStat && transaction.rawAmount) {
|
if (userStat && transaction.rawAmount) {
|
||||||
const tokens = Math.abs(Number(transaction.rawAmount) || 0);
|
const tokens = Math.abs(Number(transaction.rawAmount) || 0);
|
||||||
userStat.tokens += tokens;
|
userStat.tokens += tokens;
|
||||||
|
|||||||
27
debug-analytics.js
Normal file
27
debug-analytics.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
const { MongoClient } = require('mongodb');
|
||||||
|
|
||||||
|
async function debug() {
|
||||||
|
const uri = 'mongodb://7qV5rRanD6UwANNO:NK1EFfaKpJZcTQlmm7pDUUI7Yk7yqxN6@51.254.197.189:27017/librechat?authSource=admin';
|
||||||
|
const client = new MongoClient(uri);
|
||||||
|
await client.connect();
|
||||||
|
const db = client.db('librechat');
|
||||||
|
|
||||||
|
// Vérifier les types
|
||||||
|
const user = await db.collection('users').findOne({});
|
||||||
|
const tx = await db.collection('transactions').findOne({});
|
||||||
|
const conv = await db.collection('conversations').findOne({});
|
||||||
|
|
||||||
|
console.log('=== TYPES DES IDs ===');
|
||||||
|
console.log('user._id:', typeof user._id, '->', user._id);
|
||||||
|
console.log('transaction.user:', typeof tx.user, '->', tx.user);
|
||||||
|
console.log('conversation.user:', typeof conv.user, '->', conv.user);
|
||||||
|
|
||||||
|
console.log('\n=== COMPARAISONS ===');
|
||||||
|
console.log('user._id === tx.user:', user._id === tx.user);
|
||||||
|
console.log('String(user._id) === String(tx.user):', String(user._id) === String(tx.user));
|
||||||
|
console.log('user._id.toString() === conv.user:', user._id.toString() === conv.user);
|
||||||
|
|
||||||
|
await client.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
debug().catch(console.error);
|
||||||
Reference in New Issue
Block a user