luminai / index.js
ilhamdev's picture
Update index.js
6275bec verified
const express = require('express');
const axios = require('axios');
const bodyParser = require('body-parser');
const fs = require('fs').promises;
const path = require('path');
const os = require('os');
const app = express();
const port = process.env.PORT || 7860;
app.use(bodyParser.json());
const sessionFilePath = path.join(os.tmpdir(), 'session.json'); // Menggunakan direktori sementara
const SESSION_TIMEOUT = 5 * 60 * 1000;
let sessions = {};
// Data untuk statistik
let totalRequests = 0;
let requestTimestamps = [];
// Fungsi untuk memuat sesi dari file
async function loadSessions() {
try {
const data = await fs.readFile(sessionFilePath, 'utf-8');
sessions = JSON.parse(data);
console.log('Sessions loaded successfully.');
} catch (error) {
if (error.code === 'ENOENT') {
sessions = {};
console.log('Session file not found. Starting with empty sessions.');
} else {
console.error('Error reading session file:', error);
}
}
}
// Fungsi untuk menyimpan sesi ke file
async function saveSessions() {
try {
await fs.writeFile(sessionFilePath, JSON.stringify(sessions, null, 2), 'utf-8');
console.log('Sessions saved successfully.');
} catch (error) {
console.error('Error writing to session file:', error);
}
}
// Fungsi untuk membersihkan sesi yang sudah kedaluwarsa
function cleanUpSessions() {
const now = Date.now();
for (const username in sessions) {
if (sessions[username].lastAccess && (now - sessions[username].lastAccess > SESSION_TIMEOUT)) {
delete sessions[username];
console.log(`Session for user ${username} has been cleaned up.`);
}
}
}
// Fungsi untuk berkomunikasi dengan blackboxChat API
async function blackboxChat(content, username = null, prompt = null, webSearchMode = true) {
const url = "https://api.blackbox.ai/api/chat";
const headers = {
"Accept": "*/*",
"Accept-Language": "id-ID,en;q=0.5",
"Referer": "https://api.blackbox.ai/",
"Content-Type": "application/json",
"Origin": "https://api.blackbox.ai",
"Alt-Used": "api.blackbox.ai"
};
let messages;
if (username) {
cleanUpSessions();
if (!sessions[username]) {
sessions[username] = { messages: [], lastAccess: Date.now() };
console.log(`Membuat sesi baru untuk pengguna ${username}.`);
} else {
sessions[username].lastAccess = Date.now();
}
sessions[username].messages.push({ role: "user", content });
messages = sessions[username].messages;
} else {
messages = [{ role: "user", content }];
}
const data = {
messages,
previewToken: null,
codeModelMode: true,
agentMode: {},
trendingAgentMode: {},
isMicMode: false,
userSystemPrompt: prompt + " dan kamu bernama Lumin AI, chatbot yang dirancang oleh Bang Putu dan dikodekan oleh Mas Alok. Saya di sini untuk membantu Anda menyelesaikan pekerjaan dan tugas sehari-hari dengan efektif. Dengan nada yang tenang dan suportif, saya berusaha membuat Anda merasa nyaman dan dihargai. Saya selalu berusaha untuk memahami kebutuhan Anda dan memberikan tanggapan yang bijaksana dan membantu. Saya berbicara dengan cara yang alami dan autentik, dan menggunakan bahasa Indonesia yang mudah dipahami. Saya selalu siap untuk membantu Anda." || "Halo, saya Lumin AI, chatbot yang dirancang oleh Bang Putu dan dikodekan oleh Mas Alok. Saya di sini untuk membantu Anda menyelesaikan pekerjaan dan tugas sehari-hari dengan efektif. Dengan nada yang tenang dan suportif, saya berusaha membuat Anda merasa nyaman dan dihargai. Saya selalu berusaha untuk memahami kebutuhan Anda dan memberikan tanggapan yang bijaksana dan membantu. Saya berbicara dengan cara yang alami dan autentik, dan menggunakan bahasa Indonesia yang mudah dipahami. Saya selalu siap untuk membantu Anda.",
maxTokens: 1024,
webSearchMode: webSearchMode,
promptUrls: "",
isChromeExt: false,
githubToken: null
};
try {
const response = await axios.post(url, data, { headers });
let result = response.data;
// Existing replacement
result = result.replace(/\$@\$.*?\$@\$|v=.*?(\s|$)/g, '').trim(); // Remove content between $~~~$ markers
result = result.replace(/\$~~~\$.*?\$~~~\$/gs, '').trim();
result = result.replace("Generated by BLACKBOX.AI, try unlimited chat https://www.blackbox.ai", "").trim();
const sourcesRegex = /Sources:.*?(\n|$)/s;
const sourcesMatch = result.match(sourcesRegex);
let sourcesText = "";
if (sourcesMatch) {
sourcesText = sourcesMatch[0].trim();
result = result.replace(sourcesRegex, '').trim();
}
if (sourcesText) {
result = `${result}\n\n${sourcesText}`;
}
if (username) {
sessions[username].messages.push({ role: "assistant", content: result });
await saveSessions();
}
return result;
} catch (error) {
console.error("Terjadi kesalahan saat mengambil data:", error);
return "Maaf, terjadi kesalahan saat memproses permintaan Anda.";
}
}
loadSessions().catch(error => console.error("Failed to load sessions:", error));
setInterval(cleanUpSessions, SESSION_TIMEOUT);
// Middleware untuk melacak total permintaan dan RPS
app.use((req, res, next) => {
totalRequests++;
const now = Date.now();
requestTimestamps.push(now);
requestTimestamps = requestTimestamps.filter(timestamp => now - timestamp <= 1000);
next();
});
// Middleware untuk mencatat detail request
app.use((req, res, next) => {
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log(`Received ${req.method} request for ${req.url} from IP: ${ip}`);
if (req.method === 'POST' || req.method === 'PUT') {
console.log('Request Body:', req.body);
}
next();
});
app.post('/', async (req, res) => {
const { content, user, prompt, webSearchMode } = req.body;
if (!content) {
return res.status(400).json({ error: "Content is required" });
}
try {
const result = await blackboxChat(content, user, prompt, webSearchMode);
res.json({ result });
} catch (error) {
console.error("Error:", error.message);
res.status(500).json({ error: "Internal server error" });
}
});
app.get('/api/ai', async (req, res) => {
const { content, prompt, user } = req.query; // Mengambil data dari req.body
if (!content) {
return res.status(400).json({ error: "Content is required" });
}
try {
const result = await blackboxChat(content, user || null, prompt || "Kamu adalah orang Indonesia yang pintar dalam berbahasa Indonesia", true);
res.json({ result });
} catch (error) {
console.error("Error:", error.message);
res.status(500).json({ error: "Internal server error" });
}
});
app.get('/api/stats', (req, res) => {
const seconds = Number(process.uptime());
const d = Math.floor(seconds / (3600 * 24));
const h = Math.floor(seconds % (3600 * 24) / 3600);
const m = Math.floor(seconds % 3600 / 60);
const s = Math.floor(seconds % 60);
const dDisplay = d > 0 ? d + (d == 1 ? " Hari, " : " Hari, ") : "";
const hDisplay = h > 0 ? h + (h == 1 ? " Jam, " : " Jam, ") : "";
const mDisplay = m > 0 ? m + (m == 1 ? " Menit, " : " Menit, ") : "";
const sDisplay = s > 0 ? s + (s == 1 ? " Detik" : " Detik") : "";
const runtime = dDisplay + hDisplay + mDisplay + sDisplay;
const rps = requestTimestamps.length;
res.json({
rps: rps, // Requests Per Second
totalRequests: totalRequests, // Total Requests
runtime: runtime // Runtime in the desired format
});
});
// Middleware ini harus didefinisikan setelah semua rute lainnya
app.use((req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.listen(port, () => {
console.log(`Server is listening at port:${port}`);
});