|
|
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'); |
|
|
const SESSION_TIMEOUT = 5 * 60 * 1000; |
|
|
let sessions = {}; |
|
|
|
|
|
|
|
|
let totalRequests = 0; |
|
|
let requestTimestamps = []; |
|
|
|
|
|
|
|
|
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); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
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); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
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.`); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
result = result.replace(/\$@\$.*?\$@\$|v=.*?(\s|$)/g, '').trim(); |
|
|
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); |
|
|
|
|
|
|
|
|
app.use((req, res, next) => { |
|
|
totalRequests++; |
|
|
const now = Date.now(); |
|
|
requestTimestamps.push(now); |
|
|
requestTimestamps = requestTimestamps.filter(timestamp => now - timestamp <= 1000); |
|
|
next(); |
|
|
}); |
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
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, |
|
|
totalRequests: totalRequests, |
|
|
runtime: runtime |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
app.use((req, res) => { |
|
|
res.sendFile(path.join(__dirname, 'index.html')); |
|
|
}); |
|
|
|
|
|
app.listen(port, () => { |
|
|
console.log(`Server is listening at port:${port}`); |
|
|
}); |
|
|
|