findme-19 commited on
Commit
8c5b822
0 Parent(s):
Files changed (5) hide show
  1. .gitattributes +35 -0
  2. Dockerfile +25 -0
  3. README.md +10 -0
  4. index.js +229 -0
  5. 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
+ }