findme-19
commited on
Commit
•
8c5b822
0
Parent(s):
commit me
Browse files- .gitattributes +35 -0
- Dockerfile +25 -0
- README.md +10 -0
- index.js +229 -0
- package.json +8 -0
.gitattributes
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
Dockerfile
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM node:latest
|
2 |
+
|
3 |
+
RUN apt-get update && apt-get install -y \
|
4 |
+
chromium \
|
5 |
+
libnss3-dev \
|
6 |
+
&& rm -rf /var/lib/apt/lists/*
|
7 |
+
|
8 |
+
RUN useradd -o -u 1000 user
|
9 |
+
|
10 |
+
USER user
|
11 |
+
|
12 |
+
ENV HOME=/home/user \
|
13 |
+
PATH=/home/user/.local/bin:$PATH
|
14 |
+
|
15 |
+
WORKDIR $HOME/app
|
16 |
+
|
17 |
+
COPY --chown=user package*.json $HOME/app
|
18 |
+
|
19 |
+
RUN npm i
|
20 |
+
|
21 |
+
COPY --chown=user . $HOME/app
|
22 |
+
|
23 |
+
EXPOSE 7860
|
24 |
+
|
25 |
+
CMD ["node", "index"]
|
README.md
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Ut
|
3 |
+
emoji: 📉
|
4 |
+
colorFrom: red
|
5 |
+
colorTo: gray
|
6 |
+
sdk: docker
|
7 |
+
pinned: false
|
8 |
+
---
|
9 |
+
|
10 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
index.js
ADDED
@@ -0,0 +1,229 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
const os = require('os')
|
2 |
+
const bytes = require('bytes')
|
3 |
+
const logger = require('morgan')
|
4 |
+
const express = require('express')
|
5 |
+
const puppeteer = require('puppeteer')
|
6 |
+
const CharacterAI = require('node_characterai')
|
7 |
+
const Parser = require('node_characterai/parser')
|
8 |
+
const ms = require('ms')
|
9 |
+
let lid = process.env['token']
|
10 |
+
const app = express()
|
11 |
+
app.set('json spaces', 4)
|
12 |
+
app.use(logger('dev'))
|
13 |
+
let user = []
|
14 |
+
app.all('/', (req, res) => {
|
15 |
+
const obj = {}
|
16 |
+
const used = process.memoryUsage()
|
17 |
+
for (let key in used) obj[key] = formatSize(used[key])
|
18 |
+
|
19 |
+
const totalmem = os.totalmem()
|
20 |
+
const freemem = os.freemem()
|
21 |
+
obj.memoryUsage = `${formatSize(totalmem - freemem)} / ${formatSize(totalmem)}`
|
22 |
+
|
23 |
+
res.json({
|
24 |
+
success: true,
|
25 |
+
message: 'Hello World!',
|
26 |
+
uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4],
|
27 |
+
status: obj
|
28 |
+
})
|
29 |
+
})
|
30 |
+
|
31 |
+
app.get('/api', async (req, res) => {
|
32 |
+
let cid
|
33 |
+
if (req.query.token) {
|
34 |
+
if (user.find(v => v.id == req.query.token)) {
|
35 |
+
cid = user.find(v => v.id == req.query.token).cs
|
36 |
+
} else {
|
37 |
+
try {
|
38 |
+
cid = new CharacterAI()
|
39 |
+
cid.puppeteerPath = "usr/bin/chromium"
|
40 |
+
await cid.authenticateWithToken(req.query.token)
|
41 |
+
user.push({
|
42 |
+
id: req.query.token,
|
43 |
+
cs: cid,
|
44 |
+
expired: Date.now() + ms('1h')
|
45 |
+
})
|
46 |
+
} catch (e) {
|
47 |
+
return res.send({
|
48 |
+
success: false,
|
49 |
+
message: e.toString()
|
50 |
+
})
|
51 |
+
}
|
52 |
+
}
|
53 |
+
} else {
|
54 |
+
if (!user.find(v => v.id == lid)) {
|
55 |
+
try {
|
56 |
+
cid = new CharacterAI()
|
57 |
+
cid.puppeteerPath = "usr/bin/chromium"
|
58 |
+
await cid.authenticateWithToken(lid)
|
59 |
+
user.push({
|
60 |
+
id: lid,
|
61 |
+
cs: cid
|
62 |
+
})
|
63 |
+
} catch (e) {
|
64 |
+
return res.send({
|
65 |
+
success: false,
|
66 |
+
message: e.toString()
|
67 |
+
})
|
68 |
+
}
|
69 |
+
} else {
|
70 |
+
cid = user.find(v => v.id == lid).cs
|
71 |
+
}
|
72 |
+
}
|
73 |
+
try {
|
74 |
+
let { characterId, text, sessionId } = req.query
|
75 |
+
if (!characterId) return res.json({ success: false, message: 'Input parameter characterId' })
|
76 |
+
if (!text) return res.json({ success: false, message: 'Input parameter text' })
|
77 |
+
|
78 |
+
if (!sessionId) {
|
79 |
+
const request = await cid.requester.request('https://beta.character.ai/chat/history/create/', {
|
80 |
+
headers: cid.getHeaders(), method: 'POST',
|
81 |
+
body: Parser.stringify({ character_external_id: characterId })
|
82 |
+
})
|
83 |
+
if (!request.ok()) return res.json({ success: false, message: 'Couldn\'t create a new chat' })
|
84 |
+
|
85 |
+
const json = await Parser.parseJSON(request)
|
86 |
+
sessionId = json.external_id
|
87 |
+
}
|
88 |
+
|
89 |
+
const chat = await cid.createOrContinueChat(characterId, sessionId)
|
90 |
+
const response = await chat.sendAndAwaitResponse(text, true)
|
91 |
+
const urlAvatar = `https://characterai.io/i/80/static/avatars/${response.srcAvatarFileName}`
|
92 |
+
|
93 |
+
delete response.chat
|
94 |
+
res.json({
|
95 |
+
success: true,
|
96 |
+
message: '',
|
97 |
+
result: { ...response, urlAvatar, sessionId }
|
98 |
+
})
|
99 |
+
} catch (e) {
|
100 |
+
console.log(e)
|
101 |
+
res.json({ error: true, message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e) })
|
102 |
+
}
|
103 |
+
})
|
104 |
+
|
105 |
+
app.get('/api/chara/info', async (req, res) => {
|
106 |
+
let cid
|
107 |
+
if (req.query.token) {
|
108 |
+
if (user.find(v => v.id == req.query.token)) {
|
109 |
+
cid = user.find(v => v.id == req.query.token).cs
|
110 |
+
} else {
|
111 |
+
try {
|
112 |
+
cid = new CharacterAI()
|
113 |
+
cid.puppeteerPath = "usr/bin/chromium"
|
114 |
+
await cid.authenticateWithToken(req.query.token)
|
115 |
+
user.push({
|
116 |
+
id: req.query.token,
|
117 |
+
cs: cid,
|
118 |
+
expired: Date.now() + ms('1h')
|
119 |
+
})
|
120 |
+
} catch (e) {
|
121 |
+
return res.send({
|
122 |
+
success: false,
|
123 |
+
message: e.toString()
|
124 |
+
})
|
125 |
+
}
|
126 |
+
}
|
127 |
+
} else {
|
128 |
+
if (!user.find(v => v.id == lid)) {
|
129 |
+
try {
|
130 |
+
cid = new CharacterAI()
|
131 |
+
cid.puppeteerPath = "usr/bin/chromium"
|
132 |
+
await cid.authenticateWithToken(lid)
|
133 |
+
user.push({
|
134 |
+
id: lid,
|
135 |
+
cs: cid
|
136 |
+
})
|
137 |
+
} catch (e) {
|
138 |
+
return res.send({
|
139 |
+
success: false,
|
140 |
+
message: e.toString()
|
141 |
+
})
|
142 |
+
}
|
143 |
+
} else {
|
144 |
+
cid = user.find(v => v.id == lid).cs
|
145 |
+
}
|
146 |
+
}
|
147 |
+
try {
|
148 |
+
const { characterId } = req.query
|
149 |
+
if (!characterId) return res.json({ success: false, message: 'Input parameter characterId' })
|
150 |
+
|
151 |
+
const result = await cid.fetchCharacterInfo(characterId)
|
152 |
+
if (!result) return res.json({ success: false, message: 'Invalid characterId' })
|
153 |
+
|
154 |
+
res.json({ success: true, message: '', result })
|
155 |
+
} catch (e) {
|
156 |
+
console.log(e)
|
157 |
+
res.json({ error: true, message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e) })
|
158 |
+
}
|
159 |
+
})
|
160 |
+
|
161 |
+
app.get('/api/chara/search', async (req, res) => {
|
162 |
+
let cid
|
163 |
+
if (req.query.token) {
|
164 |
+
if (user.find(v => v.id == req.query.token)) {
|
165 |
+
cid = user.find(v => v.id == req.query.token).cs
|
166 |
+
} else {
|
167 |
+
try {
|
168 |
+
cid = new CharacterAI()
|
169 |
+
cid.puppeteerPath = "usr/bin/chromium"
|
170 |
+
await cid.authenticateWithToken(req.query.token)
|
171 |
+
user.push({
|
172 |
+
id: req.query.token,
|
173 |
+
cs: cid,
|
174 |
+
expired: Date.now() + ms('1h')
|
175 |
+
})
|
176 |
+
} catch (e) {
|
177 |
+
return res.send({
|
178 |
+
success: false,
|
179 |
+
message: e.toString()
|
180 |
+
})
|
181 |
+
}
|
182 |
+
}
|
183 |
+
} else {
|
184 |
+
if (!user.find(v => v.id == lid)) {
|
185 |
+
try {
|
186 |
+
cid = new CharacterAI()
|
187 |
+
cid.puppeteerPath = "usr/bin/chromium"
|
188 |
+
await cid.authenticateWithToken(lid)
|
189 |
+
user.push({
|
190 |
+
id: lid,
|
191 |
+
cs: cid
|
192 |
+
})
|
193 |
+
} catch (e) {
|
194 |
+
return res.send({
|
195 |
+
success: false,
|
196 |
+
message: e.toString()
|
197 |
+
})
|
198 |
+
}
|
199 |
+
} else {
|
200 |
+
cid = user.find(v => v.id == lid).cs
|
201 |
+
}
|
202 |
+
}
|
203 |
+
try {
|
204 |
+
const { name } = req.query
|
205 |
+
if (!name) return res.json({ success: false, message: 'Input parameter name' })
|
206 |
+
|
207 |
+
const { characters } = await cid.searchCharacters(name)
|
208 |
+
if (!characters.length) return res.json({ success: false, message: 'Character not found' })
|
209 |
+
|
210 |
+
res.json({ success: true, message: '', result: characters })
|
211 |
+
} catch (e) {
|
212 |
+
console.log(e)
|
213 |
+
res.json({ error: true, message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e) })
|
214 |
+
}
|
215 |
+
})
|
216 |
+
setInterval(async() => {
|
217 |
+
for (let u of user) {
|
218 |
+
if (u.expired && Date.now() >= u.expired) {
|
219 |
+
user = user.filter(v => v.id !== u.id)
|
220 |
+
}
|
221 |
+
}
|
222 |
+
}, 2000)
|
223 |
+
const PORT = process.env.PORT || 7860
|
224 |
+
app.listen(PORT, async () => {
|
225 |
+
console.log('App running on port', PORT)
|
226 |
+
})
|
227 |
+
function formatSize(num) {
|
228 |
+
return bytes(+num, { unitSeparator: ' ' })
|
229 |
+
}
|
package.json
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"dependencies": {
|
3 |
+
"express": "*",
|
4 |
+
"morgan": "*",
|
5 |
+
"node_characterai": "*",
|
6 |
+
"ms": "*"
|
7 |
+
}
|
8 |
+
}
|