Download cai.js from aseli/ut: direct link, hf CLI and curl.
- Browser
- Download file 3.74 kB
-
https://huggingface.co/spaces/aseli/ut/resolve/main/cai.js
- Command line
-
hf download hf://spaces/aseli/ut/cai.js
-
curl -L -o cai.js https://huggingface.co/spaces/aseli/ut/resolve/main/cai.js
3.74 kB
| const express = require('express'); | |
| const CharacterAI = require('node_characterai'); | |
| const app = express(); | |
| const PORT = 7860; | |
| const DEFAULT_TOKEN = process.env['TOKEN_CAI']; // ganti dengan token default Anda | |
| const SESSION_DURATION = 14400000; // 4 jam dalam milidetik | |
| let sessions = []; | |
| const createSession = async (token) => { | |
| const existingSession = sessions.find(v => v.token === token); | |
| if (existingSession) { | |
| return existingSession; | |
| } | |
| const characterAI = new CharacterAI(); | |
| await characterAI.authenticateWithToken(token); | |
| const session = { | |
| token, | |
| characterAI, | |
| lastUsed: Date.now(), // Tambahkan waktu terakhir digunakan | |
| browser: characterAI.unauthenticate, // Simpan instance browser | |
| isDefault: token === DEFAULT_TOKEN | |
| }; | |
| sessions.push(session); | |
| return session; | |
| }; | |
| const getSession = async (token) => { | |
| let session = sessions.find(s => s.token === token); | |
| if (session) { | |
| session.lastUsed = Date.now(); // Update waktu terakhir digunakan | |
| return session; | |
| } else { | |
| return await createSession(token); | |
| } | |
| }; | |
| const cleanExpiredSessions = async () => { | |
| const now = Date.now(); // Ambil waktu saat ini | |
| const expiredSessions = sessions.filter(session => !session.isDefault && session.lastUsed <= now - SESSION_DURATION); | |
| // Tutup browser dari sesi yang tidak digunakan lebih dari 1 jam | |
| for (const session of expiredSessions) { | |
| if (session.browser) { | |
| await session.browser(); | |
| } | |
| } | |
| // Hapus sesi yang tidak digunakan lebih dari 1 jam dari array sessions | |
| sessions = sessions.filter(session => session.isDefault || session.lastUsed > now - SESSION_DURATION); | |
| }; | |
| // Jalankan pembersihan sesi tidak digunakan setiap 10 menit | |
| setInterval(cleanExpiredSessions, 10 * 60 * 1000); | |
| app.use(express.json()); | |
| app.set('json spaces', 4); | |
| app.get('/', async (req, res) => { | |
| res.send('halo dunia') | |
| console.log(sessions) | |
| console.log(new Date().toLocaleString('id-ID', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' })); | |
| }) | |
| app.get('/api', async (req, res) => { | |
| const { token, text, characterId, sessionId } = req.query; | |
| console.log("token access: " + (token || DEFAULT_TOKEN)) | |
| try { | |
| const session = token ? await getSession(token) : await createSession(DEFAULT_TOKEN); | |
| const chat = await session.characterAI.createOrContinueChat(characterId); | |
| sessionId ? await chat.changeToConversationId(sessionId, true) : await chat.saveAndStartNewChat() | |
| const response = await chat.sendAndAwaitResponse(text, true); | |
| console.log(response) | |
| response.sessionId = response?.chat?.externalId | |
| response.characterId = response?.chat?.characterId | |
| delete response.chat | |
| res.send({ success: true, result: response }); | |
| console.log('api done') | |
| } catch (error) { | |
| res.status(500).json({ error: error.message }); | |
| } | |
| }); | |
| app.get('/api/chara/search', async (req, res) => { | |
| const { name, token } = req.query; | |
| try { | |
| const session = token ? await getSession(token) : await createSession(DEFAULT_TOKEN); | |
| const characters = await session.characterAI.searchCharacters(name); | |
| res.send({ success: true, result: characters.characters }); | |
| console.log('search done') | |
| } catch (error) { | |
| res.status(500).json({ error: error.message }); | |
| } | |
| }); | |
| app.get('/api/chara/info', async (req, res) => { | |
| const { characterId, token } = req.query; | |
| try { | |
| const session = token ? await getSession(token) : await createSession(DEFAULT_TOKEN); | |
| const characterInfo = await session.characterAI.fetchCharacterInfo(characterId); | |
| res.json({ success: true, result: characterInfo }); | |
| console.log('info done') | |
| } catch (error) { | |
| res.status(500).json({ error: error.message }); | |
| } | |
| }); | |
| app.listen(PORT, () => { | |
| console.log(`Server running on port ${PORT}`); | |
| }); | |