c.ai-rip / src /index.js
Re7Pntx's picture
Update src/index.js
485a9c4
// for (let sign of ['unhandledRejection', 'uncaughtException']) process.on(sign, console.error)
const os = require('os')
const util = require('util')
const uuid = require('uuid')
const logger = require('morgan')
const express = require('express')
const puppeteer = require('puppeteer')
const rateLimit = require('express-rate-limit')
const CharacterAI = require('node_characterai')
const { execSync } = require('child_process')
const sessions = new Map()
const app = express()
app.set('trust proxy', 1)
app.set('json spaces', 4)
app.use(logger('dev'))
app.use(express.urlencoded({ extended: true }))
app.use(async (req, res, next) => {
for (let [sessionId, characterAI] of sessions) {
const timeReset = 10 * 60 * 1000 // 10 min
if (Date.now() - characterAI.lastFetch > timeReset) {
await characterAI.unauthenticate()
sessions.delete(sessionId)
}
}
next()
})
app.all('/', (req, res) => {
const obj = {}
const used = process.memoryUsage()
for (let key in used) obj[key] = `${Math.round(used[key] / 1000 / 1000 * 100) / 100} MB`
const disk = execSync('du -sh').toString().split('M')[0]
obj.diskUsage = `${disk} MB`
const totalmem = os.totalmem()
const freemem = os.freemem()
obj.memoryUsage =
`${((totalmem - freemem) / Math.pow(1024, 3)).toFixed(1)} GB / ${(totalmem / Math.pow(1024, 3)).toFixed(1)} GB`
res.json({
success: true,
message: 'Hello World',
uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4],
status: obj
})
})
app.get('/ip', (req, res) => res.send(req.ip))
app.get('/sessions', (_, res) => res.send(eval(Array.from(sessions))))
app.all('/api', rateLimit(), async (req, res) => {
if (!['GET', 'POST'].includes(req.method)) return res.json({ success: false, message: 'Method not allowed' })
try {
const { characterId, text, sessionId } = req.query
if (!characterId) return res.json({ success: false, message: 'Input parameter characterId' })
if (!text) return res.json({ success: false, message: 'Input parameter text' })
if (sessionId) {
if (!sessions.has(sessionId)) return res.json({ success: false, message: 'sessionId not found' })
const characterAI = sessions.get(sessionId)
sessions.set(sessionId, Object.assign(characterAI, { lastFetch: Date.now() }))
const chat = await characterAI.createOrContinueChat(characterId)
const response = await chat.sendAndAwaitResponse(text, true)
const urlAvatar = `https://characterai.io/i/80/static/avatars/${response.srcAvatarFileName}`
delete response.chat
res.json({
success: true,
message: 'sessionId will be deleted in 10 minutes if not used',
result: { ...response, urlAvatar, sessionId }
})
return
}
const id = uuid.v4()
const characterAI = new CharacterAI()
characterAI.requester.puppeteerPath = puppeteer.executablePath()
await characterAI.authenticateWithToken("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IkVqYmxXUlVCWERJX0dDOTJCa2N1YyJ9.eyJpc3MiOiJodHRwczovL2NoYXJhY3Rlci1haS51cy5hdXRoMC5jb20vIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMDg2NTM4ODk3NzExMTkwMDMxMzYiLCJhdWQiOlsiaHR0cHM6Ly9hdXRoMC5jaGFyYWN0ZXIuYWkvIiwiaHR0cHM6Ly9jaGFyYWN0ZXItYWkudXMuYXV0aDAuY29tL3VzZXJpbmZvIl0sImlhdCI6MTY5NTAzNjI0MywiZXhwIjoxNjk3NjI4MjQzLCJhenAiOiJkeUQzZ0UyODFNcWdJU0c3RnVJWFloTDJXRWtucVp6diIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwifQ.u-xoQMpUFjTL2kfsoDj0-rPWtdW4lZ6N512YY8DZ8dX7S7noGRRVz_kTvmmhJ7hkn6PSAjUNwmxWssDEdtJW1JuNuNzyTAosCzdFxd7BTeFr-xTyr4XbQEphIt4rLGDWbrVpjo462EouYSQGIp-UA5PpZur39I3Ng0s5e2IPWtZk0fsri2d4pQv4ut7nEv9_Dmg3YXMm72YJcxFwlddwKzMr58hV_S2RNtekQl6ZrMZkEcyigRTI5rOrOU5xh3SHCEUo_EhkoupJlRHxHVzmN2jrXmSHhFCf08Lfwvhswbl7dduH1lch5EiijqX_RI5AC1BUYDTlfuBckrqUokfLgw")
sessions.set(id, Object.assign(characterAI, { lastFetch: Date.now() }))
const chat = await characterAI.createOrContinueChat(characterId)
const response = await chat.sendAndAwaitResponse(text, true)
const urlAvatar = `https://characterai.io/i/80/static/avatars/${response.srcAvatarFileName}`
delete response.chat
res.json({
success: true,
message: 'sessionId will be deleted in 10 minutes if not used',
result: { ...response, urlAvatar, sessionId: id }
})
} catch (e) {
console.log(e)
e = String(e)
res.json({
error: true,
message: e === '[object Object]' ? 'Internal Server Error' : e
})
}
})
const PORT = process.env.PORT || 7860
app.listen(PORT, () => console.log('App running on port', PORT))
// const { REPL_SLUG, REPL_OWNER } = process.env
// if (REPL_SLUG && REPL_OWNER)
setInterval(() => fetch(`https://c-ai.team-skizo.repl.co`, { method: 'head' }).catch(console.log), 20 * 1000)