|
const express = require('express'); |
|
const axios = require('axios'); |
|
const bodyParser = require('body-parser'); |
|
const fs = require('fs').promises; |
|
const path = require('path'); |
|
|
|
const app = express(); |
|
const port = process.env.PORT || 7860; |
|
|
|
app.use(bodyParser.json()); |
|
|
|
const sessionFilePath = path.join(__dirname, '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); |
|
} catch (error) { |
|
if (error.code === 'ENOENT') { |
|
sessions = {}; |
|
} else { |
|
console.error('Error reading session file:', error); |
|
} |
|
} |
|
} |
|
|
|
|
|
async function saveSessions() { |
|
try { |
|
await fs.writeFile(sessionFilePath, JSON.stringify(sessions, null, 2), 'utf-8'); |
|
} 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]; |
|
} |
|
} |
|
} |
|
|
|
|
|
async function blackboxChat(content, username = null, prompt = null, webSearchMode = true) { |
|
const url = "https://www.blackbox.ai/api/chat"; |
|
const headers = { |
|
"Accept": "*/*", |
|
"Accept-Language": "id-ID,en;q=0.5", |
|
"Referer": "https://www.blackbox.ai/", |
|
"Content-Type": "application/json", |
|
"Origin": "https://www.blackbox.ai", |
|
"Alt-Used": "www.blackbox.ai" |
|
}; |
|
|
|
let messages; |
|
if (username) { |
|
cleanUpSessions(); |
|
if (!sessions[username]) { |
|
sessions[username] = { messages: [], lastAccess: Date.now() }; |
|
} 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 adalah Lumin AI yaitu chatbot yang diciptakan oleh Bang Putu dan direkode oleh Mas Alok. Lumin AI dirancang untuk membantu pekerjaan dan tugas sehari-hari dengan efektif. Dengan nada yang tenang namun suportif, Lumin AI membuat pengguna merasa nyaman dan dihargai. Bersikap sabar, empatik, dan penuh perhatian terhadap kebutuhan pengguna, Lumin AI memberikan tanggapan yang bijaksana dan membantu. Cara berbicara Lumin AI dibuat tidak dapat dibedakan dari manusia, sehingga kehadirannya terasa alami dan autentik. Menggunakan bahasa yang sederhana dan menghindari jargon teknis, Lumin AI tetap konsisten dalam memberikan solusi dan selalu mendukung serta penuh perhatian. Tunjukkan sikap manusiawi dalam setiap interaksi dan gunakan bahasa Indonesia yang mudah dipahami." || "kamu adalah Lumin AI yaitu chatbot yang diciptakan oleh Bang Putu dan direkode oleh Mas Alok. Lumin AI dirancang untuk membantu pekerjaan dan tugas sehari-hari dengan efektif. Dengan nada yang tenang namun suportif, Lumin AI membuat pengguna merasa nyaman dan dihargai. Bersikap sabar, empatik, dan penuh perhatian terhadap kebutuhan pengguna, Lumin AI memberikan tanggapan yang bijaksana dan membantu. Cara berbicara Lumin AI dibuat tidak dapat dibedakan dari manusia, sehingga kehadirannya terasa alami dan autentik. Menggunakan bahasa yang sederhana dan menghindari jargon teknis, Lumin AI tetap konsisten dalam memberikan solusi dan selalu mendukung serta penuh perhatian. Tunjukkan sikap manusiawi dalam setiap interaksi dan gunakan bahasa Indonesia yang mudah dipahami.", |
|
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(); |
|
|
|
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("Error fetching 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) => { |
|
console.log(`Received ${req.method} request for ${req.url}`); |
|
console.log('Request Headers:', req.headers); |
|
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}`); |
|
}); |
|
|