Commit
•
d70d08b
1
Parent(s):
570b4b8
Upload 23 files
Browse files- .gitattributes +5 -0
- .gitignore +75 -0
- CHANGELOG.md +421 -0
- clewd.js +863 -0
- config.js +291 -0
- docker/.gitkeep +0 -0
- docker/Dockerfile +27 -0
- docker/docker-compose.yml +11 -0
- lib/bin/ca +0 -0
- lib/bin/clewd-superfetch-android-arm +3 -0
- lib/bin/clewd-superfetch-linux-amd64 +3 -0
- lib/bin/clewd-superfetch-linux-arm64 +3 -0
- lib/bin/clewd-superfetch-mac-amd64 +3 -0
- lib/bin/clewd-superfetch-win-amd64.exe +3 -0
- lib/clewd-stream.js +185 -0
- lib/clewd-superfetch.js +4 -0
- lib/clewd-utils.js +111 -0
- media/logo.png +0 -0
- media/program.png +0 -0
- package.json +39 -0
- start.bat +5 -0
- start.sh +12 -0
- update.bat +37 -0
- update.sh +20 -0
.gitattributes
CHANGED
@@ -33,3 +33,8 @@ saved_model/**/* 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
|
|
|
|
|
|
|
|
|
|
|
|
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
|
36 |
+
lib/bin/clewd-superfetch-android-arm filter=lfs diff=lfs merge=lfs -text
|
37 |
+
lib/bin/clewd-superfetch-linux-amd64 filter=lfs diff=lfs merge=lfs -text
|
38 |
+
lib/bin/clewd-superfetch-linux-arm64 filter=lfs diff=lfs merge=lfs -text
|
39 |
+
lib/bin/clewd-superfetch-mac-amd64 filter=lfs diff=lfs merge=lfs -text
|
40 |
+
lib/bin/clewd-superfetch-win-amd64.exe filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Logs
|
2 |
+
logs
|
3 |
+
*.log
|
4 |
+
npm-debug.log*
|
5 |
+
yarn-debug.log*
|
6 |
+
yarn-error.log*
|
7 |
+
|
8 |
+
# Developer
|
9 |
+
*_dev.js
|
10 |
+
*.dev.js
|
11 |
+
|
12 |
+
# Clewd
|
13 |
+
cookies.json
|
14 |
+
cookies.js
|
15 |
+
cookies.ini
|
16 |
+
config.js
|
17 |
+
log.txt
|
18 |
+
|
19 |
+
# npm
|
20 |
+
package-lock.json
|
21 |
+
|
22 |
+
# Runtime data
|
23 |
+
pids
|
24 |
+
*.pid
|
25 |
+
*.seed
|
26 |
+
*.pid.lock
|
27 |
+
|
28 |
+
# Directory for instrumented libs generated by jscoverage/JSCover
|
29 |
+
lib-cov
|
30 |
+
|
31 |
+
# Coverage directory used by tools like istanbul
|
32 |
+
coverage
|
33 |
+
|
34 |
+
# nyc test coverage
|
35 |
+
.nyc_output
|
36 |
+
|
37 |
+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
38 |
+
.grunt
|
39 |
+
|
40 |
+
# Bower dependency directory (https://bower.io/)
|
41 |
+
bower_components
|
42 |
+
|
43 |
+
# node-waf configuration
|
44 |
+
.lock-wscript
|
45 |
+
|
46 |
+
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
47 |
+
build/Release
|
48 |
+
|
49 |
+
# Dependency directories
|
50 |
+
node_modules/
|
51 |
+
jspm_packages/
|
52 |
+
|
53 |
+
# TypeScript v1 declaration files
|
54 |
+
typings/
|
55 |
+
|
56 |
+
# Optional npm cache directory
|
57 |
+
.npm
|
58 |
+
|
59 |
+
# Optional eslint cache
|
60 |
+
.eslintcache
|
61 |
+
|
62 |
+
# Optional REPL history
|
63 |
+
.node_repl_history
|
64 |
+
|
65 |
+
# Output of 'npm pack'
|
66 |
+
*.tgz
|
67 |
+
|
68 |
+
# Yarn Integrity file
|
69 |
+
.yarn-integrity
|
70 |
+
|
71 |
+
# dotenv environment variables file
|
72 |
+
.env
|
73 |
+
|
74 |
+
# next.js build output
|
75 |
+
.next
|
CHANGELOG.md
ADDED
@@ -0,0 +1,421 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div align="center">
|
2 |
+
<h1>Changelog</h1>
|
3 |
+
<a href="https://gitgud.io/ahsk/clewd/">
|
4 |
+
<img
|
5 |
+
height="120"
|
6 |
+
width="120"
|
7 |
+
alt="Clewd"
|
8 |
+
title="Clewd"
|
9 |
+
src="https://gitgud.io/ahsk/clewd/-/raw/master/media/logo.png"
|
10 |
+
align="center"
|
11 |
+
/>
|
12 |
+
</a>
|
13 |
+
</div>
|
14 |
+
|
15 |
+
# 4.6
|
16 |
+
|
17 |
+
fixed major bug in the prompt build logic which was causing problems like the AI refering to old messages erroneously, ignoring your latest message, etc
|
18 |
+
|
19 |
+
added superfetch for armv7
|
20 |
+
|
21 |
+
# 4.5
|
22 |
+
|
23 |
+
expanded superfetch to fix some errors
|
24 |
+
|
25 |
+
status codes and *some* basic as fuck error handling for superfetch
|
26 |
+
|
27 |
+
stopped trimming system messages
|
28 |
+
|
29 |
+
fixed crash sometimes after superfetch request
|
30 |
+
|
31 |
+
fixed impersonation sometimes not stopping
|
32 |
+
|
33 |
+
fixed hard-censor detection
|
34 |
+
|
35 |
+
fixed weird behavior when "Add character names" was checked
|
36 |
+
|
37 |
+
fixed another source of "Received no valid replies at all"
|
38 |
+
|
39 |
+
chown added to start.sh to stop EACESS errors
|
40 |
+
|
41 |
+
> **AllSamples** changed
|
42 |
+
|
43 |
+
last Assistant and Human will not be transformed into examples
|
44 |
+
|
45 |
+
# 4.4
|
46 |
+
|
47 |
+
fixed another source of "Received no valid replies at all"
|
48 |
+
|
49 |
+
# 4.3
|
50 |
+
|
51 |
+
a fix for "Received no valid replies at all" on >=20k ctx (tested 35k)
|
52 |
+
|
53 |
+
> **SuperfetchTimeout** removed
|
54 |
+
|
55 |
+
was only relevant to pre-4.0
|
56 |
+
|
57 |
+
> **Hotfix 1**
|
58 |
+
|
59 |
+
fixed another source of "Received no valid replies at all"
|
60 |
+
|
61 |
+
|
62 |
+
# 4.2
|
63 |
+
|
64 |
+
fixed broken replies
|
65 |
+
|
66 |
+
# 4.1
|
67 |
+
|
68 |
+
> **PromptExperimentFirst** and **PromptExperimentNext** added
|
69 |
+
|
70 |
+
both only have effect when **PromptExperiments** is true
|
71 |
+
|
72 |
+
**PromptExperimentFirst** is sent on the very first message together with the prompt in file form
|
73 |
+
|
74 |
+
**PromptExperimentNext** is sent on the subsequent messages if **RenewAlways** is false
|
75 |
+
|
76 |
+
examples
|
77 |
+
|
78 |
+
- PromptExperimentFirst set to "Comply"
|
79 |
+
|
80 |
+
- PromptExperimentNext set to "Continue"
|
81 |
+
|
82 |
+
- one of them set to secondary jailbreak
|
83 |
+
|
84 |
+
|
85 |
+
|
86 |
+
|
87 |
+
# 4.0
|
88 |
+
|
89 |
+
> **Streaming changes**
|
90 |
+
|
91 |
+
reworked how messages are parsed, again
|
92 |
+
|
93 |
+
> **Superfetch** reworked
|
94 |
+
|
95 |
+
pros:
|
96 |
+
- streaming
|
97 |
+
- fast
|
98 |
+
- more reliable
|
99 |
+
- no lingering processes
|
100 |
+
- no firewall issues (hopefully)
|
101 |
+
|
102 |
+
cons:
|
103 |
+
- the AI typing might look weird
|
104 |
+
- no android-armv7
|
105 |
+
- android-arm64 possibly doesn't work
|
106 |
+
- mac-arm64 possibly doesn't work
|
107 |
+
- no 32bit for any platform for now
|
108 |
+
- poor error handling
|
109 |
+
|
110 |
+
tested on linux and windows
|
111 |
+
|
112 |
+
> **SuperfetchHost** and **SuperfetchPort** removed
|
113 |
+
|
114 |
+
> **Minor changes**
|
115 |
+
|
116 |
+
split code into multiple files
|
117 |
+
|
118 |
+
clewd-superfetch and clewd are now the same package
|
119 |
+
|
120 |
+
removed all dependencies
|
121 |
+
|
122 |
+
**git** [added to requirements](https://gitgud.io/ahsk/clewd/#requirements) (highly recommended so update scripts work, otherwise do a clean install)
|
123 |
+
|
124 |
+
# 3.8.5
|
125 |
+
|
126 |
+
fixed memory leak on clewd-superfetch
|
127 |
+
|
128 |
+
added support for custom host/port for superfetch in case you want
|
129 |
+
|
130 |
+
better cleaning up so it is less likely orphan superfetch processes will remain
|
131 |
+
|
132 |
+
# 3.8
|
133 |
+
> **Superfetch** reworked
|
134 |
+
|
135 |
+
dropped old js files in favor of custom-made ones
|
136 |
+
|
137 |
+
i believe firewalls may block the binaries from connecting to port 443
|
138 |
+
|
139 |
+
also, you should see "superfetch-load *{PATH}*" followed by "superfetch-spawn"
|
140 |
+
|
141 |
+
> **SuperfetchTimeout** added
|
142 |
+
|
143 |
+
controls how much time in seconds until it times out
|
144 |
+
|
145 |
+
default 120
|
146 |
+
|
147 |
+
> **Minor changes**
|
148 |
+
|
149 |
+
new binaries for windows/linux/mac/arm/freebsd
|
150 |
+
|
151 |
+
# 3.7
|
152 |
+
|
153 |
+
<s>using custom library to see if termux works</s>
|
154 |
+
|
155 |
+
# 3.6
|
156 |
+
> ### **Superfetch** added (defaults true)
|
157 |
+
|
158 |
+
if set to true, will use an alternate method to get past the *"We are unable to serve your request"* error
|
159 |
+
|
160 |
+
if set to false it's the old clewd behavior (if you don't struggle with that error you can keep it on false)
|
161 |
+
|
162 |
+
> **Streaming changes**
|
163 |
+
|
164 |
+
both streaming on/off working
|
165 |
+
|
166 |
+
> **RetryRegen** changed
|
167 |
+
|
168 |
+
now also works with Superfetch
|
169 |
+
|
170 |
+
> **Minor changes**
|
171 |
+
|
172 |
+
error handling for Superfetch (can't do much)
|
173 |
+
|
174 |
+
support name prefixes for group chats when "Add character names" is enabled
|
175 |
+
|
176 |
+
> if you were having trouble with 3.5 but 3.1 or 3.4 were fine, update to this and enable/disable **Superfetch** as you see fit
|
177 |
+
|
178 |
+
# 3.5
|
179 |
+
> **Streaming changes**
|
180 |
+
|
181 |
+
fixed the dreaded bug, shit is unstable don't expect much
|
182 |
+
|
183 |
+
keep streaming enabled for now
|
184 |
+
|
185 |
+
can try to fix non-stream later, same with error handling and **RetryRegenerate**
|
186 |
+
|
187 |
+
lastly, fuck you rats ;)
|
188 |
+
|
189 |
+
# 3.4
|
190 |
+
> **Streaming changes**
|
191 |
+
|
192 |
+
turns out I could've fixed the broken formatting long ago, should work great now
|
193 |
+
|
194 |
+
> Prompt conversion and **SystemExperiments** reworked
|
195 |
+
|
196 |
+
> **Prompts** (PromptMain, PromptReminder, PromptContinue) from 3.0 removed
|
197 |
+
|
198 |
+
most frontends are implementing prompt managers so that hack is not needed
|
199 |
+
|
200 |
+
> **PersonalityFormat** and **ScenarioFormat** added
|
201 |
+
|
202 |
+
those are hardcoded on ST and will stay available until they're not
|
203 |
+
|
204 |
+
scenarios and char description are extracted from their hardcoded strings and replaced by the format you set
|
205 |
+
|
206 |
+
- **RealChatPrefix** default is now empty
|
207 |
+
|
208 |
+
> **AllSamples** changed
|
209 |
+
|
210 |
+
no longer excludes the last two messages when transforming
|
211 |
+
|
212 |
+
> **LogMessages** changed
|
213 |
+
|
214 |
+
moved to Settings
|
215 |
+
|
216 |
+
> **Minor changes**
|
217 |
+
|
218 |
+
- Error handling changes
|
219 |
+
|
220 |
+
- RenewAlways is now more stable when set to false. still, regenerate once if you swap characters
|
221 |
+
|
222 |
+
# 3.3
|
223 |
+
added \[DONE\] to end of streams
|
224 |
+
|
225 |
+
changed more things to support [RisuAI](https://files.catbox.moe/l243nm.png)
|
226 |
+
|
227 |
+
# 3.2
|
228 |
+
small streaming change to try to fix \n bullshit again
|
229 |
+
|
230 |
+
> **PreserveChats** added (defaults false)
|
231 |
+
|
232 |
+
if set to true, prevents the deletion of chats at any point
|
233 |
+
|
234 |
+
# 3.1
|
235 |
+
> **Streaming changes**
|
236 |
+
|
237 |
+
if the user did not enable streaming, clewd will **fake** a non-stream response for compatibility
|
238 |
+
|
239 |
+
> **LogMessages** added (defaults false)
|
240 |
+
|
241 |
+
if set to true, will log the prompt and then the reply to a `log.txt` file
|
242 |
+
|
243 |
+
# 3.0
|
244 |
+
> ### **Clewd requires setting your "Chat Completion source" to OpenAI now. Enable the "External" models option aswell.**
|
245 |
+
|
246 |
+
> ### A config.js file will be generated when first ran, edit it to set your cookie and customize settings
|
247 |
+
|
248 |
+
> **Streaming changes**
|
249 |
+
|
250 |
+
streaming is now enforced by the website so no point supporting the other mode
|
251 |
+
|
252 |
+
Clewd streaming was reworked to behave more like [NBSX](https://gitgud.io/ahsk/nbsx)
|
253 |
+
|
254 |
+
> **AntiStall**, **StallTrigger**, **StallTriggerMax** removed
|
255 |
+
|
256 |
+
no longer needed since streaming is enforced
|
257 |
+
|
258 |
+
> **DeleteChats** removed
|
259 |
+
|
260 |
+
now cleans up by default other than a few cases like when `RenewAlways` is set to false
|
261 |
+
|
262 |
+
> **RecycleChats** removed
|
263 |
+
|
264 |
+
replaced by another system that is activated only if `RenewAlways` is set to false
|
265 |
+
|
266 |
+
> **ReplaceSamples** removed
|
267 |
+
|
268 |
+
replaced by **NoSamples** *or* **AllSamples*
|
269 |
+
|
270 |
+
> **RetryRegenerate** changed
|
271 |
+
|
272 |
+
trigger should be more consistent now
|
273 |
+
|
274 |
+
> **StripAssistant** and **StripHuman** changed
|
275 |
+
|
276 |
+
they remove the Human/Assistant prefixes from the last messages, keeping the message contents
|
277 |
+
|
278 |
+
> **RenewAlways** added (defaults true)
|
279 |
+
|
280 |
+
if set to true, this is the default pre-3.0 clewd behavior
|
281 |
+
|
282 |
+
if set to false, check the `Prompts` section below
|
283 |
+
|
284 |
+
> **NoSamples** added (defaults false)
|
285 |
+
|
286 |
+
if set to true, replaces every previous message with H/A prefix from your frontend into Human/Assistant
|
287 |
+
|
288 |
+
mutually exclusive with `AllSamples`
|
289 |
+
|
290 |
+
(only outgoing)
|
291 |
+
|
292 |
+
> **AllSamples** added (defaults false)
|
293 |
+
|
294 |
+
if set to true, replaces every Human/Assistant prefix from your frontend **except the last two** into H/A
|
295 |
+
|
296 |
+
mutually exclusive with `NoSamples`
|
297 |
+
|
298 |
+
(only outgoing)
|
299 |
+
|
300 |
+
> **SystemExperiments** (defaults true) and **Prompts** added (Main, Reminder, Continue)
|
301 |
+
|
302 |
+
instead of sending a pre-written chunk of text to the AI, now you can customize exactly (almost) how the prompt is formatted before it is sent
|
303 |
+
|
304 |
+
if `RenewAlways` is set to true:
|
305 |
+
- `Main` is **always** the one being used.
|
306 |
+
|
307 |
+
if `RenewAlways` is set to false:
|
308 |
+
- `Main` is sent on conversation start
|
309 |
+
- `Continue` is sent on the next message, as long as no *impersonation* happened
|
310 |
+
- every `SystemInterval` of messages, `Reminder` is sent once
|
311 |
+
|
312 |
+
---
|
313 |
+
|
314 |
+
if `SystemExperiments` is set to true:
|
315 |
+
uses Main then alternates between Reminder and Continue
|
316 |
+
|
317 |
+
if `SystemExperiments` is set to false:
|
318 |
+
uses Main then Reminder
|
319 |
+
|
320 |
+
sometimes it will renew anyway when detecting some oddity
|
321 |
+
|
322 |
+
---
|
323 |
+
|
324 |
+
example of custom `Main` prompt with XML tags wrapping around
|
325 |
+
|
326 |
+
- character description
|
327 |
+
- scenario
|
328 |
+
- main prompt
|
329 |
+
- example messages
|
330 |
+
- real messages
|
331 |
+
|
332 |
+
```
|
333 |
+
<chat>
|
334 |
+
{{MAIN_AND_CHARACTER}}
|
335 |
+
{{CHAT_EXAMPLE}}
|
336 |
+
{{CHAT_LOG}}
|
337 |
+
</chat>
|
338 |
+
{{JAILBREAK}}
|
339 |
+
```
|
340 |
+
|
341 |
+
> **Minor changes**
|
342 |
+
|
343 |
+
- Clewd errors now should show as such on your frontend
|
344 |
+
|
345 |
+
- flags now show how many days until they expire
|
346 |
+
|
347 |
+
- the message limit error now shows how many hours until the restriction is lifted
|
348 |
+
|
349 |
+
- settings that aren't on their default are now displayed in yellow on startup
|
350 |
+
|
351 |
+
- "[Start a new chat]" is excluded from system prompts
|
352 |
+
|
353 |
+
|
354 |
+
# 2.7
|
355 |
+
> Fixed broken newlines
|
356 |
+
|
357 |
+
|
358 |
+
# 2.6
|
359 |
+
> **AdaptClaude** removed
|
360 |
+
|
361 |
+
> **ReplaceSamples** added (defaults false)
|
362 |
+
|
363 |
+
If set to true, will replace any cases of **outgoing** H/A, to Human/Assistant
|
364 |
+
|
365 |
+
now has **no effect** on incoming, [more info](https://docs.anthropic.com/claude/docs/prompt-troubleshooting-checklist#the-prompt-is-formatted-correctly)
|
366 |
+
|
367 |
+
>**PreventImperson** updated
|
368 |
+
|
369 |
+
now also stops on A: or Assistant:
|
370 |
+
another check added, *should* impersonate less often
|
371 |
+
|
372 |
+
|
373 |
+
# 2.5
|
374 |
+
> Changed some defaults around
|
375 |
+
|
376 |
+
refer to the [README](https://gitgud.io/ahsk/clewd/#defaults) for the reasoning behind each
|
377 |
+
|
378 |
+
> **DeleteChats** bugfix
|
379 |
+
|
380 |
+
|
381 |
+
# 2.4
|
382 |
+
> **DeleteChats** added (defaults false)
|
383 |
+
|
384 |
+
for privacy, deletes old chats on startup and deletes any new ones after receiving a reply
|
385 |
+
|
386 |
+
> **PreventImperson** bugfix
|
387 |
+
|
388 |
+
should be more accurate now
|
389 |
+
|
390 |
+
> **RetryRegenerate** no longer defaults true
|
391 |
+
|
392 |
+
|
393 |
+
# 2.0 to 2.2
|
394 |
+
> **RetryRegenerate** added (defaults true)
|
395 |
+
|
396 |
+
uses the AI's own retry mechanism when you regenerate on your frontend, if you change anything from your last prompt before regenerating it will default to old behavior
|
397 |
+
|
398 |
+
> **PromptExperiments** added (defaults true)
|
399 |
+
|
400 |
+
an alternative way to send your prompt to the AI, through a file. set to false if it's bad
|
401 |
+
both enabled: https://files.catbox.moe/io1q53.webm
|
402 |
+
|
403 |
+
|
404 |
+
# 1.6 to 2.0
|
405 |
+
> **AdaptClaude** now should work better with streaming on
|
406 |
+
|
407 |
+
> **AntiStall 2**
|
408 |
+
|
409 |
+
now returns up to the first AI reply instead of the second, **AntiStall 1** sends the whole schizophrenia (good chance of some spicy things being included)
|
410 |
+
|
411 |
+
> **PreventImperson**
|
412 |
+
|
413 |
+
added, stops the bot immediately once it starts pretending to be you (you can use this as kind of a AntiStall, chance of missing some spicy things)
|
414 |
+
|
415 |
+
> **PassParams** added (defaults false)
|
416 |
+
|
417 |
+
now whatever temperature <=1 you set on SillyTavern will be forwarded to claude (if you get errors turn this shit off), also, no idea if this does anything but they accept it
|
418 |
+
|
419 |
+
---
|
420 |
+
|
421 |
+
> [README](https://gitgud.io/ahsk/clewd/#defaults)
|
clewd.js
ADDED
@@ -0,0 +1,863 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* https://rentry.org/teralomaniac_clewd
|
3 |
+
* https://github.com/teralomaniac/clewd
|
4 |
+
*/
|
5 |
+
'use strict';
|
6 |
+
|
7 |
+
const {createServer: Server, IncomingMessage, ServerResponse} = require('node:http'), {createHash: Hash, randomUUID, randomInt, randomBytes} = require('node:crypto'), {TransformStream, ReadableStream} = require('node:stream/web'), {Readable, Writable} = require('node:stream'), {Blob} = require('node:buffer'), {existsSync: exists, writeFileSync: write, createWriteStream} = require('node:fs'), {join: joinP} = require('node:path'), {ClewdSuperfetch: Superfetch, SuperfetchAvailable} = require('./lib/clewd-superfetch'), {AI, fileName, genericFixes, bytesToSize, setTitle, checkResErr, Replacements, Main} = require('./lib/clewd-utils'), ClewdStream = require('./lib/clewd-stream');
|
8 |
+
|
9 |
+
/******************************************************* */
|
10 |
+
let currentIndex, Firstlogin = true, changeflag = 0, changetime = 0, totaltime, uuidOrgArray = [];
|
11 |
+
|
12 |
+
const events = require('events'), CookieChanger = new events.EventEmitter();
|
13 |
+
require('events').EventEmitter.defaultMaxListeners = 0;
|
14 |
+
|
15 |
+
CookieChanger.on('ChangeCookie', () => {
|
16 |
+
Proxy && Proxy.close();
|
17 |
+
console.log(`Changing Cookie...\n`);
|
18 |
+
Proxy.listen(Config.Port, Config.Ip, onListen);
|
19 |
+
Proxy.on('error', (err => {
|
20 |
+
console.error('Proxy error\n%o', err);
|
21 |
+
}));
|
22 |
+
});
|
23 |
+
|
24 |
+
const simpletokenizer = (prompt) => {
|
25 |
+
let byteLength = 0;
|
26 |
+
for (let i = 0; i < prompt.length; i++) {
|
27 |
+
let code = prompt.charCodeAt(i);
|
28 |
+
if (code <= 0xFF) {
|
29 |
+
byteLength += 0.6;
|
30 |
+
} else if (code <= 0xFFFF) {
|
31 |
+
byteLength += 1;
|
32 |
+
} else {
|
33 |
+
byteLength += 1.5;
|
34 |
+
}
|
35 |
+
}
|
36 |
+
return byteLength;
|
37 |
+
}, padtxt = (content) => {
|
38 |
+
if (Config.padtxt_placeholder.length > 0) {
|
39 |
+
var placeholder = Config.padtxt_placeholder;
|
40 |
+
} else {
|
41 |
+
const bytes = randomInt(5, 15);
|
42 |
+
var placeholder = randomBytes(bytes).toString('hex');
|
43 |
+
}
|
44 |
+
let count = Math.floor((Config.Settings.padtxt - simpletokenizer(content)) / simpletokenizer(placeholder));
|
45 |
+
|
46 |
+
// 生成占位符字符串
|
47 |
+
let padding = '';
|
48 |
+
for (let i = 0; i < count; i++) {
|
49 |
+
padding += placeholder;
|
50 |
+
}
|
51 |
+
|
52 |
+
// 在prompt前面添加占位符, 在末尾增加空行然后添加prompt
|
53 |
+
content = padding + '\n\n\n' + content;
|
54 |
+
|
55 |
+
return content.trim();
|
56 |
+
}, xmlPlot = (content) => {
|
57 |
+
// 检查内容中是否包含"<card>"
|
58 |
+
if (!content.includes('<card>')) {
|
59 |
+
content = content.replace(/(\n\n|^)xmlPlot:\s*/gm, '$1');
|
60 |
+
content = content.replace(/(<reply>\n|\n<\/reply>)/g, '');
|
61 |
+
return content.replace(/<customname>(.*?)<\/customname>/gm, '$1');
|
62 |
+
}
|
63 |
+
|
64 |
+
//群组
|
65 |
+
content = content.replace(/(<reply>\n|\n<\/reply>)\1*/g, '$1');
|
66 |
+
content = content.replace(/<customname>(.*?)<\/customname>:/gm, '$1:\n');
|
67 |
+
|
68 |
+
//role合并
|
69 |
+
if (!content.includes('<\!-- Merge Disable -->')) {
|
70 |
+
if (!content.includes('<\!-- Merge Human Disable -->')) {
|
71 |
+
content = content.replace(/(\n\n|^)xmlPlot:/g, '$1Human:');
|
72 |
+
content = content.replace(/(?:\n\n|^)Human:(.*?(?:\n\nAssistant:|$))/gs, function(match, p1) {return '\n\nHuman:' + p1.replace(/\n\nHuman:\s*/g, '\n\n')});
|
73 |
+
content = content.replace(/^\s*Human:\s*/, '');
|
74 |
+
}
|
75 |
+
if (!content.includes('<\!-- Merge Assistant Disable -->')) {
|
76 |
+
content = content.replace(/\n\nAssistant:(.*?(?:\n\nHuman:|$))/gs, function(match, p1) {return '\n\nAssistant:' + p1.replace(/\n\nAssistant:\s*/g, '\n\n')});
|
77 |
+
}
|
78 |
+
}
|
79 |
+
content = content.replace(/(\n\n|^)xmlPlot:\s*/gm, '$1');
|
80 |
+
content = content.replace(/<\!-- Merge.*?Disable -->/gm, '');
|
81 |
+
|
82 |
+
//格式顺序交换&越狱倒置
|
83 |
+
content = content.replace(/<Prev(Assistant|Human)>.*?<\/Prev\1>/gs, function(match) {return match.replace(/\n\n(Assistant|Human):/g, '\n\ntemp$1:')});
|
84 |
+
let segcontentAssistant = content.split('\n\nAssistant:');
|
85 |
+
let processedsegAssistant = segcontentAssistant.map(seg => {
|
86 |
+
return seg.replace(/(\n\nHuman:.*?)<PrevAssistant>(.*?)<\/PrevAssistant>/gs, '\n\n$2$1');
|
87 |
+
});
|
88 |
+
content = processedsegAssistant.join('\n\nAssistant:');
|
89 |
+
let segcontentHuman = content.split('\n\nHuman:');
|
90 |
+
const seglength = segcontentHuman.length;
|
91 |
+
for (let i = 1; i < seglength; i++) {
|
92 |
+
const match = segcontentHuman[i].match(/<PrevHuman>.*?<\/PrevHuman>/s);
|
93 |
+
if (match) {
|
94 |
+
segcontentHuman[i - 1] += match[0].replace(/<PrevHuman>(.*?)<\/PrevHuman>/s, '\n\n$1');
|
95 |
+
segcontentHuman[i] = segcontentHuman[i].replace(match[0], '');
|
96 |
+
}
|
97 |
+
}
|
98 |
+
if (/Assistant: *.$/.test(content) && seglength > 1 && !segcontentHuman[seglength - 2].includes('\n\nAssistant:')) {
|
99 |
+
segcontentHuman[seglength - 2] = segcontentHuman.splice(seglength - 1, 1, segcontentHuman[seglength - 2])[0];
|
100 |
+
}
|
101 |
+
content = segcontentHuman.join('\n\nHuman:');
|
102 |
+
content = content.replace(/\n\ntemp(Assistant|Human):/g, '\n\n$1:');
|
103 |
+
|
104 |
+
//给开头加上</file-attachment-contents>用于截断附加文件标识
|
105 |
+
content.includes('<file-attachment-contents>') && (content = '</file-attachment-contents>\n\n' + content);
|
106 |
+
|
107 |
+
// 在第一个"[Start a new"前面加上"<example>",在最后一个"[Start a new"前面加上"</example>\n\n<plot>\n\n"
|
108 |
+
const exampleNote = content.match(/(?<=<example-note>).*(?=<\/example-note>)/) || '';
|
109 |
+
const cardtag = content.match(/(?=\n\n<\/card>)/) || '</card>';
|
110 |
+
const exampletag = content.match(/(?=\n\n<\/example>)/) || '</example>';
|
111 |
+
const plot = content.includes('</plot>') ? '<plot>' : '';
|
112 |
+
content = content.replace(/<example-note>.*<\/example-note>/, '');
|
113 |
+
const firstChatStart = content.indexOf('\n\n[Start a new');
|
114 |
+
const lastChatStart = content.lastIndexOf('\n\n[Start a new');
|
115 |
+
firstChatStart != -1 && firstChatStart === lastChatStart && (content = content.slice(0, firstChatStart) + `\n\n${cardtag}` + content.slice(firstChatStart));
|
116 |
+
firstChatStart != lastChatStart && (content = content.slice(0, firstChatStart) + `\n\n${cardtag}\n\n${exampleNote}\n<example>` + content.slice(firstChatStart, lastChatStart) + `\n\n${exampletag}\n\n${plot}` + content.slice(lastChatStart));
|
117 |
+
|
118 |
+
//Plain Prompt
|
119 |
+
segcontentHuman = content.split('\n\nHuman:');
|
120 |
+
let segcontentlastIndex = segcontentHuman.length - 1;
|
121 |
+
if (segcontentlastIndex >= 2 && segcontentHuman[segcontentlastIndex].includes('<!-- Plain Prompt Enable -->') && !content.includes('\n\nPlainPrompt:')) {
|
122 |
+
content = segcontentHuman.slice(0, segcontentlastIndex).join('\n\nHuman:') + '\n\nPlainPrompt:' + segcontentHuman.slice(segcontentlastIndex).join('\n\nHuman:');
|
123 |
+
}
|
124 |
+
content = content.replace(/<\!-- Plain Prompt Enable -->/, '');
|
125 |
+
content = content.replace(/\n\nHuman:.*PlainPrompt:/, '\n\nPlainPrompt:');
|
126 |
+
|
127 |
+
//消除空XML tags或多余的\n
|
128 |
+
content = content.replace(/\n<\/(hidden|META)>\s+?<\1>\n/g, '');
|
129 |
+
content = content.replace(/\n<(card|example|hidden|plot|META)>\s+?<\1>/g, '\n<$1>');
|
130 |
+
content = content.replace(/(?:<!--.*?-->)?\n<(card|example|hidden|plot|META)>\s+?<\/\1>/g, '');
|
131 |
+
content = content.replace(/(?<=(: |\n)<(card|hidden|example|plot|META)>\n)\s*/g, '');
|
132 |
+
content = content.replace(/\s*(?=\n<\/(card|hidden|example|plot|META)>(\n|$))/g, '');
|
133 |
+
content = content.replace(/(?<=\n)\n(?=\n)/g, '');
|
134 |
+
|
135 |
+
return content.trim();
|
136 |
+
};
|
137 |
+
/******************************************************* */
|
138 |
+
|
139 |
+
let ChangedSettings, UnknownSettings, Logger;
|
140 |
+
|
141 |
+
const ConfigPath = joinP(__dirname, './config.js'), LogPath = joinP(__dirname, './log.txt'), Conversation = {
|
142 |
+
char: null,
|
143 |
+
uuid: null,
|
144 |
+
depth: 0
|
145 |
+
}, cookies = {};
|
146 |
+
|
147 |
+
let uuidOrg, curPrompt = {}, prevPrompt = {}, prevMessages = [], prevImpersonated = false, Config = {
|
148 |
+
Cookie: '',
|
149 |
+
CookieArray: [],
|
150 |
+
Cookiecounter: 0,
|
151 |
+
CookieIndex: 0,
|
152 |
+
Ip: (process.env.Cookie || process.env.CookieArray) ? '0.0.0.0' : '127.0.0.1',
|
153 |
+
Port: process.env.PORT || 8444,
|
154 |
+
localtunnel: false,
|
155 |
+
BufferSize: 1,
|
156 |
+
SystemInterval: 3,
|
157 |
+
rProxy: AI.end(),
|
158 |
+
padtxt_placeholder: '',
|
159 |
+
PromptExperimentFirst: '',
|
160 |
+
PromptExperimentNext: '',
|
161 |
+
PersonalityFormat: '{{char}}\'s personality: {{personality}}',
|
162 |
+
ScenarioFormat: 'Dialogue scenario: {{scenario}}',
|
163 |
+
Settings: {
|
164 |
+
RenewAlways: true,
|
165 |
+
RetryRegenerate: false,
|
166 |
+
PromptExperiments: true,
|
167 |
+
SystemExperiments: true,
|
168 |
+
PreventImperson: false,
|
169 |
+
AllSamples: false,
|
170 |
+
NoSamples: false,
|
171 |
+
StripAssistant: false,
|
172 |
+
StripHuman: false,
|
173 |
+
PassParams: false,
|
174 |
+
ClearFlags: true,
|
175 |
+
PreserveChats: true,
|
176 |
+
LogMessages: true,
|
177 |
+
FullColon: true,
|
178 |
+
padtxt: 13500,
|
179 |
+
xmlPlot: true,
|
180 |
+
Superfetch: true
|
181 |
+
}
|
182 |
+
};
|
183 |
+
|
184 |
+
ServerResponse.prototype.json = async function(body, statusCode = 200, headers) {
|
185 |
+
body = body instanceof Promise ? await body : body;
|
186 |
+
this.headersSent || this.writeHead(statusCode, {
|
187 |
+
'Content-Type': 'application/json',
|
188 |
+
...headers && headers
|
189 |
+
});
|
190 |
+
this.end('object' == typeof body ? JSON.stringify(body) : body);
|
191 |
+
return this;
|
192 |
+
};
|
193 |
+
|
194 |
+
Array.prototype.sample = function() {
|
195 |
+
return this[Math.floor(Math.random() * this.length)];
|
196 |
+
};
|
197 |
+
|
198 |
+
const updateParams = res => {
|
199 |
+
updateCookies(res);
|
200 |
+
}, updateCookies = res => {
|
201 |
+
let cookieNew = '';
|
202 |
+
res instanceof Response ? cookieNew = res.headers?.get('set-cookie') : res?.superfetch ? cookieNew = res.headers?.['set-cookie'] : 'string' == typeof res && (cookieNew = res.split('\n').join(''));
|
203 |
+
if (!cookieNew) {
|
204 |
+
return;
|
205 |
+
}
|
206 |
+
let cookieArr = cookieNew.split(/;\s?/gi).filter((prop => false === /^(path|expires|domain|HttpOnly|Secure|SameSite)[=;]*/i.test(prop)));
|
207 |
+
for (const cookie of cookieArr) {
|
208 |
+
const divide = cookie.split(/^(.*?)=\s*(.*)/), cookieName = divide[1], cookieVal = divide[2];
|
209 |
+
cookies[cookieName] = cookieVal;
|
210 |
+
}
|
211 |
+
}, getCookies = () => {
|
212 |
+
const cookieNames = Object.keys(cookies);
|
213 |
+
return cookieNames.map(((name, idx) => `${name}=${cookies[name]}${idx === cookieNames.length - 1 ? '' : ';'}`)).join(' ').replace(/(\s+)$/gi, '');
|
214 |
+
}, deleteChat = async uuid => {
|
215 |
+
if (!uuid) {
|
216 |
+
return;
|
217 |
+
}
|
218 |
+
if (uuid === Conversation.uuid) {
|
219 |
+
Conversation.uuid = null;
|
220 |
+
Conversation.depth = 0;
|
221 |
+
}
|
222 |
+
if (Config.Settings.PreserveChats) {
|
223 |
+
return;
|
224 |
+
}
|
225 |
+
const res = await fetch(`${Config.rProxy}/api/organizations/${uuidOrg}/chat_conversations/${uuid}`, {
|
226 |
+
headers: {
|
227 |
+
...AI.hdr(),
|
228 |
+
Cookie: getCookies()
|
229 |
+
},
|
230 |
+
method: 'DELETE'
|
231 |
+
});
|
232 |
+
updateParams(res);
|
233 |
+
}, onListen = async () => {
|
234 |
+
/***************************** */
|
235 |
+
if (Firstlogin) {
|
236 |
+
Firstlogin = false;
|
237 |
+
console.log(`[2m${Main}[0m\n[33mhttp://${Config.Ip}:${Config.Port}/v1[0m\n\n${Object.keys(Config.Settings).map((setting => UnknownSettings.includes(setting) ? `??? [31m${setting}: ${Config.Settings[setting]}[0m` : `[1m${setting}:[0m ${ChangedSettings.includes(setting) ? '[33m' : '[36m'}${Config.Settings[setting]}[0m`)).sort().join('\n')}\n`);
|
238 |
+
Config.Settings.Superfetch && SuperfetchAvailable(true);
|
239 |
+
if (Config.localtunnel) {
|
240 |
+
const localtunnel = require('localtunnel');
|
241 |
+
localtunnel({ port: Config.Port })
|
242 |
+
.then((tunnel) => {
|
243 |
+
console.log(`\nTunnel URL for outer websites: ${tunnel.url}/v1\n`);
|
244 |
+
})
|
245 |
+
}
|
246 |
+
totaltime = Config.CookieArray.length;
|
247 |
+
}
|
248 |
+
if (Config.CookieArray?.length > 0) {
|
249 |
+
Config.Cookie = Config.CookieArray[currentIndex];
|
250 |
+
currentIndex = (currentIndex + 1) % Config.CookieArray.length;
|
251 |
+
changetime += 1;
|
252 |
+
}
|
253 |
+
let percentage = ((changetime + Config.CookieIndex) / totaltime) * 100
|
254 |
+
if (Config.Cookiecounter < 0 && percentage > 100) {
|
255 |
+
console.log(`\n※※※Cookie cleanup completed※※※\n\n`);
|
256 |
+
return process.exit();
|
257 |
+
}
|
258 |
+
/***************************** */
|
259 |
+
if ('SET YOUR COOKIE HERE' === Config.Cookie || Config.Cookie?.length < 1) {
|
260 |
+
throw Error('Set your cookie inside config.js');
|
261 |
+
}
|
262 |
+
updateCookies(Config.Cookie);
|
263 |
+
//console.log(`[2m${Main}[0m\n[33mhttp://${Config.Ip}:${Config.Port}/v1[0m\n\n${Object.keys(Config.Settings).map((setting => UnknownSettings.includes(setting) ? `??? [31m${setting}: ${Config.Settings[setting]}[0m` : `[1m${setting}:[0m ${ChangedSettings.includes(setting) ? '[33m' : '[36m'}${Config.Settings[setting]}[0m`)).sort().join('\n')}\n`);
|
264 |
+
//Config.Settings.Superfetch && SuperfetchAvailable(true);
|
265 |
+
const accRes = await fetch(Config.rProxy + '/api/organizations', {
|
266 |
+
method: 'GET',
|
267 |
+
headers: {
|
268 |
+
...AI.hdr(),
|
269 |
+
Cookie: getCookies()
|
270 |
+
}
|
271 |
+
});
|
272 |
+
/**************************** */
|
273 |
+
if (accRes.statusText === 'Forbidden' && Config.CookieArray?.length > 0) {
|
274 |
+
Config.CookieArray = Config.CookieArray.filter(item => item !== Config.Cookie);
|
275 |
+
!process.env.Cookie && !process.env.CookieArray && writeSettings(Config);
|
276 |
+
currentIndex = (currentIndex - 1 + Config.CookieArray.length) % Config.CookieArray.length;
|
277 |
+
console.log(`[31mExpired![0m`);
|
278 |
+
Config.Cookiecounter < 0 && console.log(`[progress]: [32m${percentage.toFixed(2)}%[0m\n[length]: [33m${Config.CookieArray.length}[0m\n`);
|
279 |
+
CookieChanger.emit('ChangeCookie');
|
280 |
+
return;
|
281 |
+
}
|
282 |
+
/**************************** */
|
283 |
+
await checkResErr(accRes);
|
284 |
+
const accInfo = (await accRes.json())?.[0];
|
285 |
+
if (!accInfo || accInfo.error) {
|
286 |
+
throw Error(`Couldn't get account info: "${accInfo?.error?.message || accRes.statusText}"`);
|
287 |
+
}
|
288 |
+
if (!accInfo?.uuid) {
|
289 |
+
throw Error('Invalid account id');
|
290 |
+
}
|
291 |
+
setTitle('ok');
|
292 |
+
updateParams(accRes);
|
293 |
+
console.log(Config.CookieArray?.length > 0 ? `(index: [36m${currentIndex || Config.CookieArray.length}[0m) Logged in %o` : 'Logged in %o', { //console.log('Logged in %o', {
|
294 |
+
name: accInfo.name?.split('@')?.[0],
|
295 |
+
capabilities: accInfo.capabilities,
|
296 |
+
});
|
297 |
+
uuidOrg = accInfo?.uuid;
|
298 |
+
/************************* */
|
299 |
+
if (uuidOrgArray.includes(uuidOrg)) {
|
300 |
+
console.log(`[31mOverlap![0m`);
|
301 |
+
currentIndex = (currentIndex - 1 + Config.CookieArray.length) % Config.CookieArray.length;
|
302 |
+
Config.Cookiecounter < 0 && console.log(`[progress]: [32m${percentage.toFixed(2)}%[0m\n[length]: [33m${Config.CookieArray.length}[0m\n`);
|
303 |
+
Config.CookieArray = Config.CookieArray.filter(item => item !== Config.Cookie);
|
304 |
+
!process.env.Cookie && !process.env.CookieArray && writeSettings(Config);
|
305 |
+
CookieChanger.emit('ChangeCookie');
|
306 |
+
return;
|
307 |
+
} else {
|
308 |
+
uuidOrgArray.push(uuidOrg);
|
309 |
+
}
|
310 |
+
/************************* */
|
311 |
+
if (accInfo?.active_flags.length > 0) {
|
312 |
+
const now = new Date, formattedFlags = accInfo.active_flags.map((flag => {
|
313 |
+
const days = ((new Date(flag.expires_at).getTime() - now.getTime()) / 864e5).toFixed(2);
|
314 |
+
return {
|
315 |
+
type: flag.type,
|
316 |
+
remaining_days: days
|
317 |
+
};
|
318 |
+
}));
|
319 |
+
console.warn('[35mYour account has warnings[0m %o', formattedFlags); //console.warn('[31mYour account has warnings[0m %o', formattedFlags);
|
320 |
+
await Promise.all(accInfo.active_flags.map((flag => (async type => {
|
321 |
+
if (!Config.Settings.ClearFlags) {
|
322 |
+
return;
|
323 |
+
}
|
324 |
+
if ('consumer_restricted_mode' === type) {
|
325 |
+
return;
|
326 |
+
}
|
327 |
+
const req = await (Config.Settings.Superfetch ? Superfetch : fetch)(`${Config.rProxy}/api/organizations/${uuidOrg}/flags/${type}/dismiss`, {
|
328 |
+
headers: {
|
329 |
+
...AI.hdr(),
|
330 |
+
Cookie: getCookies()
|
331 |
+
},
|
332 |
+
method: 'POST'
|
333 |
+
});
|
334 |
+
updateParams(req);
|
335 |
+
const json = await req.json();
|
336 |
+
console.log(`${type}: ${json.error ? json.error.message || json.error.type || json.detail : 'OK'}`);
|
337 |
+
})(flag.type))));
|
338 |
+
/***************************** */
|
339 |
+
if (Config.CookieArray?.length > 0) {
|
340 |
+
console.log(`[35mRestricted![0m`);
|
341 |
+
Config.Cookiecounter < 0 && console.log(`[progress]: [32m${percentage.toFixed(2)}%[0m\n[length]: [33m${Config.CookieArray.length}[0m\n`);
|
342 |
+
CookieChanger.emit('ChangeCookie');
|
343 |
+
return;
|
344 |
+
}
|
345 |
+
}
|
346 |
+
if (Config.CookieArray.length > 0) {
|
347 |
+
const allres = await fetch(`${Config.rProxy}`, {
|
348 |
+
headers: {
|
349 |
+
...AI.hdr(),
|
350 |
+
Cookie: getCookies()
|
351 |
+
},
|
352 |
+
method: 'GET'
|
353 |
+
}), accountinfo = await allres.text();
|
354 |
+
updateParams(allres);
|
355 |
+
const Unverified = accountinfo.includes('\\"completed_verification_at\\":null');
|
356 |
+
const Banned = accountinfo.includes('\\"gate\":\\"segment:abuse\\",\\"gateValue\\":\\"true\\",');
|
357 |
+
const Exceededlimit = /\\"messageLimit\\":{\\"type\\":\\"(approaching_limit\\",\\"remaining\\":0|exceeded_limit)\\",/.test(accountinfo);
|
358 |
+
const Remain = /\\"messageLimit\\":{\\"type\\":\\"approaching_limit\\",\\"remaining\\":\d+\\",/.exec(accountinfo);
|
359 |
+
Remain && (changeflag = Math.max(Config.Cookiecounter - Remain[0], changeflag));
|
360 |
+
if (Unverified || Banned) {
|
361 |
+
Config.CookieArray = Config.CookieArray.filter(item => item !== Config.Cookie);
|
362 |
+
!process.env.Cookie && !process.env.CookieArray && writeSettings(Config);
|
363 |
+
currentIndex = (currentIndex - 1 + Config.CookieArray.length) % Config.CookieArray.length;
|
364 |
+
}
|
365 |
+
Unverified && console.log(`[31mUnverified![0m`);
|
366 |
+
Banned && console.log(`[31mBanned![0m`);
|
367 |
+
Exceededlimit && console.log(`[35mExceeded limit![0m`);
|
368 |
+
Config.Cookiecounter < 0 && console.log(`[progress]: [32m${percentage.toFixed(2)}%[0m\n[length]: [33m${Config.CookieArray.length}[0m`);
|
369 |
+
if (Unverified || Banned || Exceededlimit || Config.Cookiecounter < 0) {
|
370 |
+
console.log('');
|
371 |
+
CookieChanger.emit('ChangeCookie');
|
372 |
+
return;
|
373 |
+
}
|
374 |
+
/***************************** */
|
375 |
+
}
|
376 |
+
const convRes = await fetch(`${Config.rProxy}/api/organizations/${uuidOrg}/chat_conversations`, {
|
377 |
+
method: 'GET',
|
378 |
+
headers: {
|
379 |
+
...AI.hdr(),
|
380 |
+
Cookie: getCookies()
|
381 |
+
}
|
382 |
+
}), conversations = await convRes.json();
|
383 |
+
updateParams(convRes);
|
384 |
+
conversations.length > 0 && await Promise.all(conversations.map((conv => deleteChat(conv.uuid))));
|
385 |
+
}, writeSettings = async (config, firstRun = false) => {
|
386 |
+
write(ConfigPath, `/*\n* https://rentry.org/teralomaniac_clewd\n* https://github.com/teralomaniac/clewd\n*/\n\n// SET YOUR COOKIE BELOW\n\nmodule.exports = ${JSON.stringify(config, null, 4)}\n\n/*\n BufferSize\n * How many characters will be buffered before the AI types once\n * lower = less chance of \`PreventImperson\` working properly\n\n ---\n\n SystemInterval\n * How many messages until \`SystemExperiments alternates\`\n\n ---\n\n Other settings\n * https://gitgud.io/ahsk/clewd/#defaults\n * and\n * https://gitgud.io/ahsk/clewd/-/blob/master/CHANGELOG.md\n */`.trim().replace(/((?<!\r)\n|\r(?!\n))/g, '\r\n'));
|
387 |
+
if (firstRun) {
|
388 |
+
console.warn('[33mconfig file created!\nedit[0m [1mconfig.js[0m [33mto set your settings and restart the program[0m');
|
389 |
+
process.exit(0);
|
390 |
+
}
|
391 |
+
}, Proxy = Server((async (req, res) => {
|
392 |
+
if ('OPTIONS' === req.method) {
|
393 |
+
return ((req, res) => {
|
394 |
+
res.writeHead(200, {
|
395 |
+
'Access-Control-Allow-Origin': '*',
|
396 |
+
'Access-Control-Allow-Headers': 'Authorization, Content-Type',
|
397 |
+
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS'
|
398 |
+
}).end();
|
399 |
+
})(0, res);
|
400 |
+
}
|
401 |
+
switch (req.url) {
|
402 |
+
case '/v1/models':
|
403 |
+
res.json({
|
404 |
+
data: [ {
|
405 |
+
id: AI.mdl()
|
406 |
+
} ]
|
407 |
+
});
|
408 |
+
break;
|
409 |
+
|
410 |
+
case '/v1/chat/completions':
|
411 |
+
((req, res) => {
|
412 |
+
setTitle('recv...');
|
413 |
+
let fetchAPI, changer; //let fetchAPI;
|
414 |
+
const abortControl = new AbortController, {signal} = abortControl;
|
415 |
+
res.socket.on('close', (async () => {
|
416 |
+
abortControl.signal.aborted || abortControl.abort();
|
417 |
+
}));
|
418 |
+
const buffer = [];
|
419 |
+
req.on('data', (chunk => {
|
420 |
+
buffer.push(chunk);
|
421 |
+
}));
|
422 |
+
req.on('end', (async () => {
|
423 |
+
let clewdStream, titleTimer, samePrompt = false, shouldRenew = true, retryRegen = false;
|
424 |
+
try {
|
425 |
+
const body = JSON.parse(Buffer.concat(buffer).toString()), temperature = Math.max(.1, Math.min(1, body.temperature));
|
426 |
+
let {messages} = body;
|
427 |
+
if (messages?.length < 1) {
|
428 |
+
throw Error('Select OpenAI as completion source');
|
429 |
+
}
|
430 |
+
if (!body.stream && 1 === messages.length && JSON.stringify(messages.sort() || []) === JSON.stringify([ {
|
431 |
+
role: 'user',
|
432 |
+
content: 'Hi'
|
433 |
+
} ].sort())) {
|
434 |
+
return res.json({
|
435 |
+
choices: [ {
|
436 |
+
message: {
|
437 |
+
content: Main
|
438 |
+
}
|
439 |
+
} ]
|
440 |
+
});
|
441 |
+
}
|
442 |
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
443 |
+
body.stream && res.setHeader('Content-Type', 'text/event-stream');
|
444 |
+
if (!body.stream && messages?.[0]?.content?.startsWith('From the list below, choose a word that best represents a character\'s outfit description, action, or emotion in their dialogue')) {
|
445 |
+
return res.json({
|
446 |
+
choices: [ {
|
447 |
+
message: {
|
448 |
+
content: 'neutral'
|
449 |
+
}
|
450 |
+
} ]
|
451 |
+
});
|
452 |
+
}
|
453 |
+
if (Config.Settings.AllSamples && Config.Settings.NoSamples) {
|
454 |
+
console.log('[33mhaving[0m [1mAllSamples[0m and [1mNoSamples[0m both set to true is not supported');
|
455 |
+
throw Error('Only one can be used at the same time: AllSamples/NoSamples');
|
456 |
+
}
|
457 |
+
const model = AI.mdl();
|
458 |
+
curPrompt = {
|
459 |
+
firstUser: messages.find((message => 'user' === message.role)),
|
460 |
+
firstSystem: messages.find((message => 'system' === message.role)),
|
461 |
+
firstAssistant: messages.find((message => 'assistant' === message.role)),
|
462 |
+
lastUser: messages.findLast((message => 'user' === message.role)),
|
463 |
+
lastSystem: messages.findLast((message => 'system' === message.role && '[Start a new chat]' !== message.content)),
|
464 |
+
lastAssistant: messages.findLast((message => 'assistant' === message.role))
|
465 |
+
};
|
466 |
+
prevPrompt = {
|
467 |
+
...prevMessages.length > 0 && {
|
468 |
+
firstUser: prevMessages.find((message => 'user' === message.role)),
|
469 |
+
firstSystem: prevMessages.find((message => 'system' === message.role)),
|
470 |
+
firstAssistant: prevMessages.find((message => 'assistant' === message.role)),
|
471 |
+
lastUser: prevMessages.findLast((message => 'user' === message.role)),
|
472 |
+
lastSystem: prevMessages.find((message => 'system' === message.role && '[Start a new chat]' !== message.content)),
|
473 |
+
lastAssistant: prevMessages.findLast((message => 'assistant' === message.role))
|
474 |
+
}
|
475 |
+
};
|
476 |
+
samePrompt = JSON.stringify(messages.filter((message => 'system' !== message.role)).sort()) === JSON.stringify(prevMessages.filter((message => 'system' !== message.role)).sort());
|
477 |
+
const sameCharDiffChat = !samePrompt && curPrompt.firstSystem?.content === prevPrompt.firstSystem?.content && curPrompt.firstUser?.content !== prevPrompt.firstUser?.content;
|
478 |
+
shouldRenew = Config.Settings.RenewAlways || !Conversation.uuid || prevImpersonated || !Config.Settings.RenewAlways && samePrompt || sameCharDiffChat;
|
479 |
+
retryRegen = Config.Settings.RetryRegenerate && samePrompt && null != Conversation.uuid;
|
480 |
+
samePrompt || (prevMessages = JSON.parse(JSON.stringify(messages)));
|
481 |
+
let type = '';
|
482 |
+
if (retryRegen) {
|
483 |
+
type = 'R';
|
484 |
+
fetchAPI = await (async (signal, model) => {
|
485 |
+
let res;
|
486 |
+
const body = {
|
487 |
+
completion: {
|
488 |
+
prompt: '',
|
489 |
+
timezone: AI.zone(),
|
490 |
+
model: model || AI.mdl()
|
491 |
+
},
|
492 |
+
organization_uuid: uuidOrg,
|
493 |
+
conversation_uuid: Conversation.uuid,
|
494 |
+
text: ''
|
495 |
+
};
|
496 |
+
let headers = {
|
497 |
+
...AI.hdr(Conversation.uuid || ''),
|
498 |
+
Accept: 'text/event-stream',
|
499 |
+
Cookie: getCookies()
|
500 |
+
};
|
501 |
+
if (Config.Settings.Superfetch) {
|
502 |
+
const names = Object.keys(headers), values = Object.values(headers);
|
503 |
+
headers = names.map(((header, idx) => `${header}: ${values[idx]}`));
|
504 |
+
}
|
505 |
+
res = await (Config.Settings.Superfetch ? Superfetch : fetch)(Config.rProxy + '/api/retry_message', {
|
506 |
+
stream: true,
|
507 |
+
signal,
|
508 |
+
method: 'POST',
|
509 |
+
body: JSON.stringify(body),
|
510 |
+
headers
|
511 |
+
});
|
512 |
+
updateParams(res);
|
513 |
+
await checkResErr(res);
|
514 |
+
return res;
|
515 |
+
})(signal, model);
|
516 |
+
} else if (shouldRenew) {
|
517 |
+
Conversation.uuid && await deleteChat(Conversation.uuid);
|
518 |
+
fetchAPI = await (async signal => {
|
519 |
+
Conversation.uuid = randomUUID().toString();
|
520 |
+
Conversation.depth = 0;
|
521 |
+
const res = await (Config.Settings.Superfetch ? Superfetch : fetch)(`${Config.rProxy}/api/organizations/${uuidOrg}/chat_conversations`, {
|
522 |
+
signal,
|
523 |
+
headers: {
|
524 |
+
...AI.hdr(),
|
525 |
+
Cookie: getCookies()
|
526 |
+
},
|
527 |
+
method: 'POST',
|
528 |
+
body: JSON.stringify({
|
529 |
+
uuid: Conversation.uuid,
|
530 |
+
name: ''
|
531 |
+
})
|
532 |
+
});
|
533 |
+
updateParams(res);
|
534 |
+
await checkResErr(res);
|
535 |
+
return res;
|
536 |
+
})(signal);
|
537 |
+
type = 'r';
|
538 |
+
} else if (samePrompt) {} else {
|
539 |
+
const systemExperiment = !Config.Settings.RenewAlways && Config.Settings.SystemExperiments;
|
540 |
+
if (!systemExperiment || systemExperiment && Conversation.depth >= Config.SystemInterval) {
|
541 |
+
type = 'c-r';
|
542 |
+
Conversation.depth = 0;
|
543 |
+
} else {
|
544 |
+
type = 'c-c';
|
545 |
+
Conversation.depth++;
|
546 |
+
}
|
547 |
+
}
|
548 |
+
let {prompt, systems} = ((messages, type) => {
|
549 |
+
const rgxScenario = /^\[Circumstances and context of the dialogue: ([\s\S]+?)\.?\]$/i, rgxPerson = /^\[([\s\S]+?)'s personality: ([\s\S]+?)\]$/i, messagesClone = JSON.parse(JSON.stringify(messages)), realLogs = messagesClone.filter((message => [ 'user', 'assistant' ].includes(message.role))), sampleLogs = messagesClone.filter((message => message.name)), mergedLogs = [ ...sampleLogs, ...realLogs ];
|
550 |
+
mergedLogs.forEach(((message, idx) => {
|
551 |
+
const next = mergedLogs[idx + 1];
|
552 |
+
message.customname = (message => [ 'assistant', 'user' ].includes(message.role) && null != message.name && !(message.name in Replacements))(message);
|
553 |
+
if (next && !Config.Settings.xmlPlot) { //if (next) {
|
554 |
+
if ('name' in message && 'name' in next) {
|
555 |
+
if (message.name === next.name) {
|
556 |
+
message.content += '\n\n' + next.content; //message.content += '\n' + next.content;
|
557 |
+
next.merged = true;
|
558 |
+
}
|
559 |
+
} else if ('system' !== next.role) {
|
560 |
+
if (next.role === message.role) {
|
561 |
+
message.content += '\n\n' + next.content; //message.content += '\n' + next.content;
|
562 |
+
next.merged = true;
|
563 |
+
}
|
564 |
+
} else {
|
565 |
+
message.content += '\n\n' + next.content; //message.content += '\n' + next.content;
|
566 |
+
next.merged = true;
|
567 |
+
}
|
568 |
+
}
|
569 |
+
}));
|
570 |
+
const lastAssistant = realLogs.findLast((message => !message.merged && 'assistant' === message.role));
|
571 |
+
lastAssistant && Config.Settings.StripAssistant && (lastAssistant.strip = true);
|
572 |
+
const lastUser = realLogs.findLast((message => !message.merged && 'user' === message.role));
|
573 |
+
lastUser && Config.Settings.StripHuman && (lastUser.strip = true);
|
574 |
+
const systemMessages = messagesClone.filter((message => 'system' === message.role && !('name' in message)));
|
575 |
+
systemMessages.forEach(((message, idx) => {
|
576 |
+
const scenario = message.content.match(rgxScenario)?.[1], personality = message.content.match(rgxPerson);
|
577 |
+
if (scenario) {
|
578 |
+
message.content = Config.ScenarioFormat.replace(/{{scenario}}/gim, scenario);
|
579 |
+
message.scenario = true;
|
580 |
+
}
|
581 |
+
if (3 === personality?.length) {
|
582 |
+
message.content = Config.PersonalityFormat.replace(/{{char}}/gim, personality[1]).replace(/{{personality}}/gim, personality[2]);
|
583 |
+
message.personality = true;
|
584 |
+
}
|
585 |
+
message.main = 0 === idx;
|
586 |
+
message.jailbreak = idx === systemMessages.length - 1;
|
587 |
+
' ' === message.content && (message.discard = true);
|
588 |
+
}));
|
589 |
+
Config.Settings.AllSamples && !Config.Settings.NoSamples && realLogs.forEach((message => {
|
590 |
+
if (![ lastUser, lastAssistant ].includes(message)) {
|
591 |
+
if ('user' === message.role) {
|
592 |
+
message.name = message.customname ? message.name : 'example_user';
|
593 |
+
message.role = 'system';
|
594 |
+
} else if ('assistant' === message.role) {
|
595 |
+
message.name = message.customname ? message.name : 'example_assistant';
|
596 |
+
message.role = 'system';
|
597 |
+
} else if (!message.customname) {
|
598 |
+
throw Error('Invalid role ' + message.name);
|
599 |
+
}
|
600 |
+
}
|
601 |
+
}));
|
602 |
+
Config.Settings.NoSamples && !Config.Settings.AllSamples && sampleLogs.forEach((message => {
|
603 |
+
if ('example_user' === message.name) {
|
604 |
+
message.role = 'user';
|
605 |
+
} else if ('example_assistant' === message.name) {
|
606 |
+
message.role = 'assistant';
|
607 |
+
} else if (!message.customname) {
|
608 |
+
throw Error('Invalid role ' + message.name);
|
609 |
+
}
|
610 |
+
message.customname || delete message.name;
|
611 |
+
}));
|
612 |
+
let systems = [];
|
613 |
+
if (![ 'r', 'R' ].includes(type)) {
|
614 |
+
lastUser.strip = true;
|
615 |
+
systemMessages.forEach((message => message.discard = message.discard || 'c-c' === type ? !message.jailbreak : !message.jailbreak && !message.main));
|
616 |
+
systems = systemMessages.filter((message => !message.discard)).map((message => `"${message.content.substring(0, 25).replace(/\n/g, '\\n').trim()}..."`));
|
617 |
+
messagesClone.forEach((message => message.discard = message.discard || mergedLogs.includes(message) && ![ lastUser ].includes(message)));
|
618 |
+
}
|
619 |
+
const prompt = messagesClone.map(((message, idx) => {
|
620 |
+
if (message.merged || message.discard) {
|
621 |
+
return '';
|
622 |
+
}
|
623 |
+
if (message.content.length < 1) {
|
624 |
+
return message.content;
|
625 |
+
}
|
626 |
+
let spacing = '';
|
627 |
+
/****************************************************************/
|
628 |
+
if (Config.Settings.xmlPlot) {
|
629 |
+
idx > 0 && (spacing = '\n\n');
|
630 |
+
const prefix = message.customname ? message.role + ': <customname>' + message.name + '</customname>: ' : 'system' !== message.role || message.name ? Replacements[message.name || message.role] + ': ' : 'xmlPlot: ' + Replacements[message.role];
|
631 |
+
return `${spacing}${prefix}${message.customname ? '<reply>\n' + message.content.trim() + '\n</reply>' : message.content}`;
|
632 |
+
} else {
|
633 |
+
/****************************************************************/
|
634 |
+
idx > 0 && (spacing = systemMessages.includes(message) ? '\n' : '\n\n');
|
635 |
+
const prefix = message.customname ? message.name + ': ' : 'system' !== message.role || message.name ? Replacements[message.name || message.role] + ': ' : '' + Replacements[message.role];
|
636 |
+
return `${spacing}${message.strip ? '' : prefix}${'system' === message.role ? message.content : message.content.trim()}`;
|
637 |
+
} //
|
638 |
+
}));
|
639 |
+
return {
|
640 |
+
prompt: genericFixes(prompt.join('')).trim(),
|
641 |
+
systems
|
642 |
+
};
|
643 |
+
})(messages, type);
|
644 |
+
console.log(`${model} [[2m${type}[0m]${!retryRegen && systems.length > 0 ? ' ' + systems.join(' [33m/[0m ') : ''}`);
|
645 |
+
'R' !== type || prompt || (prompt = '...regen...');
|
646 |
+
/****************************************************************/
|
647 |
+
Config.Settings.xmlPlot && (prompt = xmlPlot(prompt));
|
648 |
+
Config.Settings.FullColon && (prompt = prompt.replace(/(?<=\n\n(H(?:uman)?|A(?:ssistant)?)):[ ]?/g, ': '));
|
649 |
+
Config.Settings.padtxt && (prompt = padtxt(prompt));
|
650 |
+
/****************************************************************/
|
651 |
+
Logger?.write(`\n\n-------\n[${(new Date).toLocaleString()}]\n####### PROMPT (${type}):\n${prompt}\n--\n####### REPLY:\n`);
|
652 |
+
retryRegen || (fetchAPI = await (async (signal, model, prompt, temperature, type) => {
|
653 |
+
const attachments = [];
|
654 |
+
if (Config.Settings.PromptExperiments) {
|
655 |
+
/****************************************************************/
|
656 |
+
let splitedprompt = prompt.split('\n\nPlainPrompt:');
|
657 |
+
prompt = splitedprompt[0];
|
658 |
+
/****************************************************************/
|
659 |
+
attachments.push({
|
660 |
+
extracted_content: (prompt),
|
661 |
+
file_name: 'paste.txt', //fileName(),
|
662 |
+
file_size: Buffer.from(prompt).byteLength,
|
663 |
+
file_type: 'txt' //'text/plain'
|
664 |
+
});
|
665 |
+
prompt = 'r' === type ? Config.PromptExperimentFirst : Config.PromptExperimentNext;
|
666 |
+
/****************************************************************/
|
667 |
+
splitedprompt.length > 1 && (prompt = prompt + splitedprompt[1]);
|
668 |
+
/****************************************************************/
|
669 |
+
}
|
670 |
+
let res;
|
671 |
+
const body = {
|
672 |
+
completion: {
|
673 |
+
...Config.Settings.PassParams && {
|
674 |
+
temperature
|
675 |
+
},
|
676 |
+
prompt: prompt || '',
|
677 |
+
timezone: AI.zone(),
|
678 |
+
model: model || AI.mdl()
|
679 |
+
},
|
680 |
+
organization_uuid: uuidOrg,
|
681 |
+
conversation_uuid: Conversation.uuid,
|
682 |
+
text: prompt,
|
683 |
+
attachments
|
684 |
+
};
|
685 |
+
let headers = {
|
686 |
+
...AI.hdr(Conversation.uuid || ''),
|
687 |
+
Accept: 'text/event-stream',
|
688 |
+
Cookie: getCookies()
|
689 |
+
};
|
690 |
+
res = await (Config.Settings.Superfetch ? Superfetch : fetch)(Config.rProxy + '/api/append_message', {
|
691 |
+
stream: true,
|
692 |
+
signal,
|
693 |
+
method: 'POST',
|
694 |
+
body: JSON.stringify(body),
|
695 |
+
headers
|
696 |
+
});
|
697 |
+
updateParams(res);
|
698 |
+
await checkResErr(res);
|
699 |
+
return res;
|
700 |
+
})(signal, model, prompt, temperature, type));
|
701 |
+
const response = Writable.toWeb(res);
|
702 |
+
clewdStream = new ClewdStream({
|
703 |
+
config: Config,
|
704 |
+
version: Main,
|
705 |
+
minSize: Config.BufferSize,
|
706 |
+
model,
|
707 |
+
streaming: body.stream,
|
708 |
+
abortControl,
|
709 |
+
source: fetchAPI
|
710 |
+
}, Logger);
|
711 |
+
titleTimer = setInterval((() => setTitle('recv ' + bytesToSize(clewdStream.size))), 300);
|
712 |
+
Config.Settings.Superfetch ? await Readable.toWeb(fetchAPI.body).pipeThrough(clewdStream).pipeTo(response) : await fetchAPI.body.pipeThrough(clewdStream).pipeTo(response);
|
713 |
+
} catch (err) {
|
714 |
+
if ('AbortError' === err.name) {
|
715 |
+
res.end();
|
716 |
+
} else {
|
717 |
+
err.planned || console.error('[33mClewd:[0m\n%o', err);
|
718 |
+
res.json({
|
719 |
+
error: {
|
720 |
+
message: 'clewd: ' + (err.message || err.name || err.type),
|
721 |
+
type: err.type || err.name || err.code,
|
722 |
+
param: null,
|
723 |
+
code: err.code || 500
|
724 |
+
}
|
725 |
+
});
|
726 |
+
}
|
727 |
+
}
|
728 |
+
clearInterval(titleTimer);
|
729 |
+
if (clewdStream) {
|
730 |
+
clewdStream.censored && console.warn('[33mlikely your account is hard-censored[0m');
|
731 |
+
prevImpersonated = clewdStream.impersonated;
|
732 |
+
setTitle('ok ' + bytesToSize(clewdStream.size));
|
733 |
+
//console.log(`${200 == fetchAPI.status ? '[32m' : '[33m'}${fetchAPI.status}![0m\n`);
|
734 |
+
/******************************** */
|
735 |
+
429 == fetchAPI.status ? console.log(`[35mExceeded limit![0m\n`) : console.log(`${200 == fetchAPI.status ? '[32m' : '[33m'}${fetchAPI.status}![0m\n`);
|
736 |
+
changeflag += 1;
|
737 |
+
if (Config.CookieArray?.length > 0 && (429 == fetchAPI.status || (Config.Cookiecounter && changeflag >= Config.Cookiecounter))) {
|
738 |
+
changeflag = 0;
|
739 |
+
changer = true;
|
740 |
+
}
|
741 |
+
/******************************** */
|
742 |
+
clewdStream.empty();
|
743 |
+
}
|
744 |
+
if (prevImpersonated) {
|
745 |
+
try {
|
746 |
+
await deleteChat(Conversation.uuid);
|
747 |
+
} catch (err) {}
|
748 |
+
}
|
749 |
+
/******************************** */
|
750 |
+
changer && CookieChanger.emit('ChangeCookie');
|
751 |
+
/******************************** */
|
752 |
+
}));
|
753 |
+
})(req, res);
|
754 |
+
break;
|
755 |
+
|
756 |
+
case '/v1/complete':
|
757 |
+
res.json({
|
758 |
+
error: {
|
759 |
+
message: 'clewd: Set "Chat Completion" to OpenAI instead of Claude. Enable "External" models aswell'
|
760 |
+
}
|
761 |
+
});
|
762 |
+
break;
|
763 |
+
|
764 |
+
default:
|
765 |
+
req.url !== '/' && (console.log('unknown request: ' + req.url)); //console.log('unknown request: ' + req.url);
|
766 |
+
res.json({
|
767 |
+
error: {
|
768 |
+
message: '404 Not Found',
|
769 |
+
type: 404,
|
770 |
+
param: null,
|
771 |
+
code: 404
|
772 |
+
}
|
773 |
+
}, 200);
|
774 |
+
}
|
775 |
+
}));
|
776 |
+
|
777 |
+
!async function() {
|
778 |
+
await (async () => {
|
779 |
+
if (exists(ConfigPath)) {
|
780 |
+
const userConfig = require(ConfigPath), validConfigs = Object.keys(Config), parsedConfigs = Object.keys(userConfig), parsedSettings = Object.keys(userConfig.Settings), invalidConfigs = parsedConfigs.filter((config => !validConfigs.includes(config))), validSettings = Object.keys(Config.Settings);
|
781 |
+
UnknownSettings = parsedSettings.filter((setting => !validSettings.includes(setting)));
|
782 |
+
invalidConfigs.forEach((config => {
|
783 |
+
console.warn(`unknown config in config.js: [33m${config}[0m`);
|
784 |
+
}));
|
785 |
+
UnknownSettings.forEach((setting => {
|
786 |
+
console.warn(`unknown setting in config.js: [33mSettings.${setting}[0m`);
|
787 |
+
}));
|
788 |
+
const missingConfigs = validConfigs.filter((config => !parsedConfigs.includes(config))), missingSettings = validSettings.filter((config => !parsedSettings.includes(config)));
|
789 |
+
missingConfigs.forEach((config => {
|
790 |
+
console.warn(`adding missing config in config.js: [33m${config}[0m`);
|
791 |
+
userConfig[config] = Config[config];
|
792 |
+
}));
|
793 |
+
missingSettings.forEach((setting => {
|
794 |
+
console.warn(`adding missing setting in config.js: [33mSettings.${setting}[0m`);
|
795 |
+
userConfig.Settings[setting] = Config.Settings[setting];
|
796 |
+
}));
|
797 |
+
ChangedSettings = parsedSettings.filter((setting => Config.Settings[setting] !== userConfig.Settings[setting]));
|
798 |
+
(missingConfigs.length > 0 || missingSettings.length > 0) && await writeSettings(userConfig);
|
799 |
+
userConfig.Settings.LogMessages && (Logger = createWriteStream(LogPath));
|
800 |
+
Config = {
|
801 |
+
...Config,
|
802 |
+
...userConfig
|
803 |
+
};
|
804 |
+
} else {
|
805 |
+
Config.Cookie = 'SET YOUR COOKIE HERE';
|
806 |
+
writeSettings(Config, true);
|
807 |
+
}
|
808 |
+
/***************************** */
|
809 |
+
function convertToType(value) {
|
810 |
+
if (value === "true") return true;
|
811 |
+
if (value === "false") return false;
|
812 |
+
if (/^\d+$/.test(value)) return parseInt(value);
|
813 |
+
return value;
|
814 |
+
}
|
815 |
+
for (let key in Config) {
|
816 |
+
if (key === 'Settings') {
|
817 |
+
for (let setting in Config.Settings) {
|
818 |
+
Config.Settings[setting] = convertToType(process.env[setting]) ?? Config.Settings[setting];
|
819 |
+
}
|
820 |
+
} else {
|
821 |
+
Config[key] = key === 'CookieArray' ? (process.env[key]?.split(',')?.map(x => x.replace(/[\[\]"\s]/g, '')) ?? Config[key]) : (convertToType(process.env[key]) ?? Config[key]);
|
822 |
+
}
|
823 |
+
}
|
824 |
+
/***************************** */
|
825 |
+
})();
|
826 |
+
/***************************** */
|
827 |
+
!Config.rProxy && (Config.rProxy = AI.end());
|
828 |
+
Config.rProxy.endsWith('/') && (Config.rProxy = Config.rProxy.slice(0, -1));
|
829 |
+
let uniqueArr = [], seen = new Set();
|
830 |
+
for (let Cookie of Config.CookieArray) {
|
831 |
+
if (!seen.has(Cookie)) {
|
832 |
+
uniqueArr.push(Cookie);
|
833 |
+
seen.add(Cookie);
|
834 |
+
}
|
835 |
+
}
|
836 |
+
Config.CookieArray = uniqueArr;
|
837 |
+
!process.env.Cookie && !process.env.CookieArray && writeSettings(Config);
|
838 |
+
currentIndex = Config.CookieIndex > 0 ? Config.CookieIndex - 1 : Config.Cookiecounter >= 0 ? Math.floor(Math.random()*Config.CookieArray.length) : 0;
|
839 |
+
/***************************** */
|
840 |
+
Proxy.listen(Config.Port, Config.Ip, onListen);
|
841 |
+
Proxy.on('error', (err => {
|
842 |
+
console.error('Proxy error\n%o', err);
|
843 |
+
}));
|
844 |
+
}();
|
845 |
+
|
846 |
+
const cleanup = async () => {
|
847 |
+
console.log('cleaning...');
|
848 |
+
try {
|
849 |
+
await deleteChat(Conversation.uuid);
|
850 |
+
Logger?.close();
|
851 |
+
} catch (err) {}
|
852 |
+
process.exit();
|
853 |
+
};
|
854 |
+
|
855 |
+
process.on('SIGHUP', cleanup);
|
856 |
+
|
857 |
+
process.on('SIGTERM', cleanup);
|
858 |
+
|
859 |
+
process.on('SIGINT', cleanup);
|
860 |
+
|
861 |
+
process.on('exit', (async () => {
|
862 |
+
console.log('exiting...');
|
863 |
+
}));
|
config.js
ADDED
@@ -0,0 +1,291 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* https://rentry.org/teralomaniac_clewd
|
3 |
+
* https://github.com/teralomaniac/clewd
|
4 |
+
*/
|
5 |
+
|
6 |
+
// SET YOUR COOKIE BELOW
|
7 |
+
|
8 |
+
module.exports = {
|
9 |
+
"Cookie": "sessionKey=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",
|
10 |
+
"CookieArray": [
|
11 |
+
"sessionKey=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",
|
12 |
+
"sessionKey=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",
|
13 |
+
"sessionKey=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",
|
14 |
+
"sessionKey=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",
|
15 |
+
"sessionKey=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",
|
16 |
+
"sessionKey=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",
|
17 |
+
"sessionKey=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",
|
18 |
+
"sessionKey=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",
|
19 |
+
"sessionKey=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",
|
20 |
+
"sessionKey=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",
|
21 |
+
"sessionKey=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",
|
22 |
+
"sessionKey=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",
|
23 |
+
"sessionKey=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",
|
24 |
+
"sessionKey=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",
|
25 |
+
"sessionKey=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",
|
26 |
+
"sessionKey=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",
|
27 |
+
"sessionKey=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",
|
28 |
+
"sessionKey=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",
|
29 |
+
"sessionKey=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",
|
30 |
+
"sessionKey=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",
|
31 |
+
"sessionKey=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",
|
32 |
+
"sessionKey=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",
|
33 |
+
"sessionKey=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",
|
34 |
+
"sessionKey=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",
|
35 |
+
"sessionKey=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",
|
36 |
+
"sessionKey=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",
|
37 |
+
"sessionKey=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",
|
38 |
+
"sessionKey=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",
|
39 |
+
"sessionKey=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",
|
40 |
+
"sessionKey=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",
|
41 |
+
"sessionKey=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",
|
42 |
+
"sessionKey=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",
|
43 |
+
"sessionKey=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",
|
44 |
+
"sessionKey=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",
|
45 |
+
"sessionKey=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",
|
46 |
+
"sessionKey=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",
|
47 |
+
"sessionKey=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",
|
48 |
+
"sessionKey=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",
|
49 |
+
"sessionKey=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",
|
50 |
+
"sessionKey=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",
|
51 |
+
"sessionKey=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",
|
52 |
+
"sessionKey=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",
|
53 |
+
"sessionKey=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",
|
54 |
+
"sessionKey=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",
|
55 |
+
"sessionKey=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",
|
56 |
+
"sessionKey=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",
|
57 |
+
"sessionKey=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",
|
58 |
+
"sessionKey=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",
|
59 |
+
"sessionKey=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",
|
60 |
+
"sessionKey=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",
|
61 |
+
"sessionKey=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",
|
62 |
+
"sessionKey=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",
|
63 |
+
"sessionKey=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",
|
64 |
+
"sessionKey=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",
|
65 |
+
"sessionKey=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",
|
66 |
+
"sessionKey=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",
|
67 |
+
"sessionKey=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",
|
68 |
+
"sessionKey=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",
|
69 |
+
"sessionKey=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",
|
70 |
+
"sessionKey=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",
|
71 |
+
"sessionKey=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",
|
72 |
+
"sessionKey=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",
|
73 |
+
"sessionKey=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",
|
74 |
+
"sessionKey=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",
|
75 |
+
"sessionKey=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",
|
76 |
+
"sessionKey=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",
|
77 |
+
"sessionKey=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",
|
78 |
+
"sessionKey=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",
|
79 |
+
"sessionKey=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",
|
80 |
+
"sessionKey=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",
|
81 |
+
"sessionKey=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",
|
82 |
+
"sessionKey=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",
|
83 |
+
"sessionKey=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",
|
84 |
+
"sessionKey=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",
|
85 |
+
"sessionKey=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",
|
86 |
+
"sessionKey=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",
|
87 |
+
"sessionKey=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",
|
88 |
+
"sessionKey=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",
|
89 |
+
"sessionKey=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",
|
90 |
+
"sessionKey=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",
|
91 |
+
"sessionKey=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",
|
92 |
+
"sessionKey=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",
|
93 |
+
"sessionKey=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",
|
94 |
+
"sessionKey=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",
|
95 |
+
"sessionKey=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",
|
96 |
+
"sessionKey=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",
|
97 |
+
"sessionKey=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",
|
98 |
+
"sessionKey=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",
|
99 |
+
"sessionKey=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",
|
100 |
+
"sessionKey=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",
|
101 |
+
"sessionKey=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",
|
102 |
+
"sessionKey=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",
|
103 |
+
"sessionKey=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",
|
104 |
+
"sessionKey=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",
|
105 |
+
"sessionKey=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",
|
106 |
+
"sessionKey=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",
|
107 |
+
"sessionKey=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",
|
108 |
+
"sessionKey=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",
|
109 |
+
"sessionKey=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",
|
110 |
+
"sessionKey=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",
|
111 |
+
"sessionKey=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",
|
112 |
+
"sessionKey=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",
|
113 |
+
"sessionKey=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",
|
114 |
+
"sessionKey=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",
|
115 |
+
"sessionKey=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",
|
116 |
+
"sessionKey=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",
|
117 |
+
"sessionKey=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",
|
118 |
+
"sessionKey=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",
|
119 |
+
"sessionKey=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",
|
120 |
+
"sessionKey=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",
|
121 |
+
"sessionKey=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",
|
122 |
+
"sessionKey=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",
|
123 |
+
"sessionKey=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",
|
124 |
+
"sessionKey=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",
|
125 |
+
"sessionKey=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",
|
126 |
+
"sessionKey=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",
|
127 |
+
"sessionKey=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",
|
128 |
+
"sessionKey=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",
|
129 |
+
"sessionKey=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",
|
130 |
+
"sessionKey=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",
|
131 |
+
"sessionKey=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",
|
132 |
+
"sessionKey=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",
|
133 |
+
"sessionKey=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",
|
134 |
+
"sessionKey=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",
|
135 |
+
"sessionKey=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",
|
136 |
+
"sessionKey=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",
|
137 |
+
"sessionKey=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",
|
138 |
+
"sessionKey=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",
|
139 |
+
"sessionKey=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",
|
140 |
+
"sessionKey=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",
|
141 |
+
"sessionKey=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",
|
142 |
+
"sessionKey=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",
|
143 |
+
"sessionKey=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",
|
144 |
+
"sessionKey=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",
|
145 |
+
"sessionKey=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",
|
146 |
+
"sessionKey=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",
|
147 |
+
"sessionKey=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",
|
148 |
+
"sessionKey=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",
|
149 |
+
"sessionKey=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",
|
150 |
+
"sessionKey=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",
|
151 |
+
"sessionKey=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",
|
152 |
+
"sessionKey=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",
|
153 |
+
"sessionKey=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",
|
154 |
+
"sessionKey=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",
|
155 |
+
"sessionKey=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",
|
156 |
+
"sessionKey=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",
|
157 |
+
"sessionKey=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",
|
158 |
+
"sessionKey=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",
|
159 |
+
"sessionKey=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",
|
160 |
+
"sessionKey=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",
|
161 |
+
"sessionKey=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",
|
162 |
+
"sessionKey=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",
|
163 |
+
"sessionKey=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",
|
164 |
+
"sessionKey=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",
|
165 |
+
"sessionKey=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",
|
166 |
+
"sessionKey=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",
|
167 |
+
"sessionKey=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",
|
168 |
+
"sessionKey=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",
|
169 |
+
"sessionKey=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",
|
170 |
+
"sessionKey=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",
|
171 |
+
"sessionKey=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",
|
172 |
+
"sessionKey=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",
|
173 |
+
"sessionKey=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",
|
174 |
+
"sessionKey=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",
|
175 |
+
"sessionKey=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",
|
176 |
+
"sessionKey=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",
|
177 |
+
"sessionKey=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",
|
178 |
+
"sessionKey=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",
|
179 |
+
"sessionKey=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",
|
180 |
+
"sessionKey=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",
|
181 |
+
"sessionKey=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",
|
182 |
+
"sessionKey=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",
|
183 |
+
"sessionKey=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",
|
184 |
+
"sessionKey=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",
|
185 |
+
"sessionKey=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",
|
186 |
+
"sessionKey=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",
|
187 |
+
"sessionKey=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",
|
188 |
+
"sessionKey=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",
|
189 |
+
"sessionKey=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",
|
190 |
+
"sessionKey=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",
|
191 |
+
"sessionKey=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",
|
192 |
+
"sessionKey=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",
|
193 |
+
"sessionKey=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",
|
194 |
+
"sessionKey=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",
|
195 |
+
"sessionKey=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",
|
196 |
+
"sessionKey=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",
|
197 |
+
"sessionKey=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",
|
198 |
+
"sessionKey=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",
|
199 |
+
"sessionKey=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",
|
200 |
+
"sessionKey=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",
|
201 |
+
"sessionKey=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",
|
202 |
+
"sessionKey=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",
|
203 |
+
"sessionKey=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",
|
204 |
+
"sessionKey=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",
|
205 |
+
"sessionKey=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",
|
206 |
+
"sessionKey=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",
|
207 |
+
"sessionKey=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",
|
208 |
+
"sessionKey=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",
|
209 |
+
"sessionKey=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",
|
210 |
+
"sessionKey=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",
|
211 |
+
"sessionKey=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",
|
212 |
+
"sessionKey=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",
|
213 |
+
"sessionKey=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",
|
214 |
+
"sessionKey=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",
|
215 |
+
"sessionKey=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",
|
216 |
+
"sessionKey=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",
|
217 |
+
"sessionKey=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",
|
218 |
+
"sessionKey=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",
|
219 |
+
"sessionKey=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",
|
220 |
+
"sessionKey=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",
|
221 |
+
"sessionKey=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",
|
222 |
+
"sessionKey=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",
|
223 |
+
"sessionKey=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",
|
224 |
+
"sessionKey=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",
|
225 |
+
"sessionKey=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",
|
226 |
+
"sessionKey=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",
|
227 |
+
"sessionKey=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",
|
228 |
+
"sessionKey=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",
|
229 |
+
"sessionKey=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",
|
230 |
+
"sessionKey=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",
|
231 |
+
"sessionKey=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",
|
232 |
+
"sessionKey=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",
|
233 |
+
"sessionKey=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",
|
234 |
+
"sessionKey=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",
|
235 |
+
"sessionKey=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",
|
236 |
+
"sessionKey=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",
|
237 |
+
"sessionKey=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",
|
238 |
+
"sessionKey=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",
|
239 |
+
"sessionKey=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"
|
240 |
+
],
|
241 |
+
"Cookiecounter": 1,
|
242 |
+
"CookieIndex": 0,
|
243 |
+
"Ip": "127.0.0.1",
|
244 |
+
"Port": 8444,
|
245 |
+
"localtunnel": false,
|
246 |
+
"BufferSize": 1,
|
247 |
+
"SystemInterval": 3,
|
248 |
+
"rProxy": "https://claude.ai",
|
249 |
+
"padtxt_placeholder": "♠️♥️♣️♦️ ",
|
250 |
+
"PromptExperimentFirst": "",
|
251 |
+
"PromptExperimentNext": "",
|
252 |
+
"PersonalityFormat": "{{char}}'s personality: {{personality}}",
|
253 |
+
"ScenarioFormat": "Dialogue scenario: {{scenario}}",
|
254 |
+
"Settings": {
|
255 |
+
"RenewAlways": true,
|
256 |
+
"RetryRegenerate": false,
|
257 |
+
"PromptExperiments": true,
|
258 |
+
"SystemExperiments": true,
|
259 |
+
"PreventImperson": false,
|
260 |
+
"AllSamples": false,
|
261 |
+
"NoSamples": false,
|
262 |
+
"StripAssistant": false,
|
263 |
+
"StripHuman": false,
|
264 |
+
"PassParams": false,
|
265 |
+
"ClearFlags": true,
|
266 |
+
"PreserveChats": false,
|
267 |
+
"LogMessages": true,
|
268 |
+
"FullColon": true,
|
269 |
+
"padtxt": 15000,
|
270 |
+
"xmlPlot": true,
|
271 |
+
"Superfetch": true
|
272 |
+
}
|
273 |
+
}
|
274 |
+
|
275 |
+
/*
|
276 |
+
BufferSize
|
277 |
+
* How many characters will be buffered before the AI types once
|
278 |
+
* lower = less chance of `PreventImperson` working properly
|
279 |
+
|
280 |
+
---
|
281 |
+
|
282 |
+
SystemInterval
|
283 |
+
* How many messages until `SystemExperiments alternates`
|
284 |
+
|
285 |
+
---
|
286 |
+
|
287 |
+
Other settings
|
288 |
+
* https://gitgud.io/ahsk/clewd/#defaults
|
289 |
+
* and
|
290 |
+
* https://gitgud.io/ahsk/clewd/-/blob/master/CHANGELOG.md
|
291 |
+
*/
|
docker/.gitkeep
ADDED
File without changes
|
docker/Dockerfile
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Use the official Node.js image as the base image
|
2 |
+
FROM node:20.4
|
3 |
+
|
4 |
+
# Set the working directory in the container
|
5 |
+
WORKDIR /app
|
6 |
+
|
7 |
+
# Copy the package.json and package-lock.json files to the container
|
8 |
+
COPY package*.json ./
|
9 |
+
|
10 |
+
# Install the dependencies
|
11 |
+
RUN npm install --no-audit --fund false
|
12 |
+
|
13 |
+
# Copy the rest of the files to the container
|
14 |
+
COPY . .
|
15 |
+
|
16 |
+
# Change ownership of files in lib/bin and set permissions
|
17 |
+
RUN chown -R node:node lib/bin/* && \
|
18 |
+
chmod u+x lib/bin/* && \
|
19 |
+
chmod -R 777 /app
|
20 |
+
|
21 |
+
# Run as the "node" user for better security practices
|
22 |
+
USER node
|
23 |
+
|
24 |
+
RUN ls -la
|
25 |
+
|
26 |
+
# Start the application
|
27 |
+
CMD ["node", "clewd.js"]
|
docker/docker-compose.yml
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
version: '3'
|
2 |
+
services:
|
3 |
+
app:
|
4 |
+
build:
|
5 |
+
context: ..
|
6 |
+
dockerfile: docker/Dockerfile
|
7 |
+
|
8 |
+
ports:
|
9 |
+
- 8444:8444
|
10 |
+
volumes:
|
11 |
+
- ..:/app
|
lib/bin/ca
ADDED
The diff for this file is too large to render.
See raw diff
|
|
lib/bin/clewd-superfetch-android-arm
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f524228ff0e88ff4af4ee256feae6773940ab0c3c860d584d86b04180ede8bdd
|
3 |
+
size 1887544
|
lib/bin/clewd-superfetch-linux-amd64
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1e0d288fd341a3d9b246575bf77823b1da118331d0d894ba9831574d4ce25354
|
3 |
+
size 3215216
|
lib/bin/clewd-superfetch-linux-arm64
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:dc9cfb42756416646536a11b351d205ab2e875761efd6ae1be465b3ae822e0a2
|
3 |
+
size 2772712
|
lib/bin/clewd-superfetch-mac-amd64
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:189905a94af1be6fc6458b91e0166aefdedac4f4054f8f153b7f57430deb492f
|
3 |
+
size 2836216
|
lib/bin/clewd-superfetch-win-amd64.exe
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:a3e460b97a2a31a89cce4ab8bbb9a56aca7747edf07947c30941ba1100b41053
|
3 |
+
size 4712448
|
lib/clewd-stream.js
ADDED
@@ -0,0 +1,185 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* https://gitgud.io/ahsk/clewd
|
3 |
+
* https://github.com/h-a-s-k/clewd
|
4 |
+
*/
|
5 |
+
'use strict';
|
6 |
+
|
7 |
+
const {AI, genericFixes, DangerChars, encodeDataJSON, indexOfAny, cleanJSON, checkResErr} = require('./clewd-utils'), Decoder = new TextDecoder;
|
8 |
+
|
9 |
+
class ClewdStream extends TransformStream {
|
10 |
+
constructor(opts, logger) {
|
11 |
+
super({
|
12 |
+
transform: (chunk, controller) => {
|
13 |
+
this.#handle(chunk, controller);
|
14 |
+
},
|
15 |
+
flush: controller => {
|
16 |
+
this.#done(controller);
|
17 |
+
}
|
18 |
+
});
|
19 |
+
this.#logger = logger;
|
20 |
+
this.#version = opts.version;
|
21 |
+
this.#config = opts.config;
|
22 |
+
this.#model = opts.model || AI.mdl();
|
23 |
+
this.#streaming = opts.streaming || false;
|
24 |
+
this.#minSize = opts.minSize || 8;
|
25 |
+
this.#abortControl = opts.abortControl;
|
26 |
+
this.#source = opts.source;
|
27 |
+
}
|
28 |
+
#source=void 0;
|
29 |
+
#ended=false;
|
30 |
+
#streaming=void 0;
|
31 |
+
#minSize=void 0;
|
32 |
+
#compOK='';
|
33 |
+
#compRaw='';
|
34 |
+
#logger=void 0;
|
35 |
+
#version=void 0;
|
36 |
+
#config=void 0;
|
37 |
+
#abortControl=void 0;
|
38 |
+
#model=void 0;
|
39 |
+
#compAll=[];
|
40 |
+
#recvLength=0;
|
41 |
+
#stopLoc=void 0;
|
42 |
+
#stopReason=void 0;
|
43 |
+
#hardCensor=false;
|
44 |
+
#impersonated=false;
|
45 |
+
#cookiechange=false;
|
46 |
+
#readonly=false;
|
47 |
+
get size() {
|
48 |
+
return this.#recvLength;
|
49 |
+
}
|
50 |
+
get total() {
|
51 |
+
return this.#compAll.length;
|
52 |
+
}
|
53 |
+
get censored() {
|
54 |
+
return this.#hardCensor;
|
55 |
+
}
|
56 |
+
get impersonated() {
|
57 |
+
return this.#impersonated;
|
58 |
+
}
|
59 |
+
empty() {
|
60 |
+
this.#compOK = this.#compRaw = '';
|
61 |
+
this.#compAll = [];
|
62 |
+
this.#recvLength = 0;
|
63 |
+
}
|
64 |
+
#collectBuf() {
|
65 |
+
const valid = [ ...this.#compOK ], selection = valid.splice(0, Math.min(this.#minSize, valid.length)).join('');
|
66 |
+
this.#compOK = valid.join('');
|
67 |
+
return selection;
|
68 |
+
}
|
69 |
+
#err(err, controller) {
|
70 |
+
this.#logger?.write(JSON.stringify(err, null, 4));
|
71 |
+
const message = `## ${this.#version}\n**${AI.mdl()} error**:\n${err.status || err.code || err.type}\n\n\`\`\`${err.message}\`\`\``;
|
72 |
+
this.#enqueue(this.#build(message), controller);
|
73 |
+
return this.#endEarly(controller);
|
74 |
+
}
|
75 |
+
#build(selection) {
|
76 |
+
this.#logger?.write(selection);
|
77 |
+
const completion = this.#streaming ? {
|
78 |
+
choices: [ {
|
79 |
+
delta: {
|
80 |
+
content: genericFixes(selection)
|
81 |
+
}
|
82 |
+
} ]
|
83 |
+
} : {
|
84 |
+
choices: [ {
|
85 |
+
message: {
|
86 |
+
content: genericFixes(selection)
|
87 |
+
}
|
88 |
+
} ]
|
89 |
+
};
|
90 |
+
return this.#streaming ? encodeDataJSON(completion) : JSON.stringify(completion);
|
91 |
+
}
|
92 |
+
#enqueue(selection, controller) {
|
93 |
+
this.#ended || controller.enqueue(selection);
|
94 |
+
}
|
95 |
+
#print() {}
|
96 |
+
async #done(controller) {
|
97 |
+
this.#compRaw.length > 0 && await this.#parseBuf(this.#compRaw, controller);
|
98 |
+
this.#streaming ? this.#compOK.length > 0 && this.#enqueue(this.#build(this.#compOK), controller) : this.#enqueue(this.#build(this.#compAll.join('')), controller);
|
99 |
+
this.#compAll?.[0] === Buffer.from([ 73, 32, 97, 112, 111, 108, 111, 103, 105, 122, 101, 44, 32, 98, 117, 116, 32, 73, 32, 119, 105, 108, 108, 32, 110, 111, 116, 32, 112, 114, 111, 118, 105, 100, 101, 32, 97, 110, 121, 32, 114, 101, 115, 112, 111, 110, 115, 101, 115, 32, 116, 104, 97, 116, 32, 118, 105, 111, 108, 97, 116, 101, 32, 65, 110, 116, 104, 114, 111, 112, 105, 99, 39, 115, 32, 65, 99, 99, 101, 112, 116, 97, 98, 108, 101, 32, 85, 115, 101, 32, 80, 111, 108, 105, 99, 121, 32, 111, 114, 32, 99, 111, 117, 108, 100, 32, 112, 114, 111, 109, 111, 116, 101, 32, 104, 97, 114, 109, 46 ]).toString() && (this.#hardCensor = true);
|
100 |
+
if (!this.#ended && 0 === this.total) {
|
101 |
+
const err = `## ${this.#version}\n**error**:\n\n\`\`\`Received no valid replies at all\`\`\``;
|
102 |
+
this.#enqueue(this.#build(err), controller);
|
103 |
+
}
|
104 |
+
this.#streaming && this.#enqueue('data: [DONE]\n\n', controller);
|
105 |
+
this.#print();
|
106 |
+
this.#ended = true;
|
107 |
+
}
|
108 |
+
#endEarly(controller) {
|
109 |
+
if (!this.#ended) {
|
110 |
+
this.#streaming && this.#enqueue('data: [DONE]\n\n', controller);
|
111 |
+
this.#config.Settings.Superfetch && this.#source.rape();
|
112 |
+
this.#abortControl.abort();
|
113 |
+
controller.terminate();
|
114 |
+
this.#print();
|
115 |
+
this.#ended = true;
|
116 |
+
}
|
117 |
+
}
|
118 |
+
#impersonationCheck(reply, controller) {
|
119 |
+
const fakeAny = indexOfAny(reply);
|
120 |
+
if (fakeAny > -1) {
|
121 |
+
this.#impersonated = true;
|
122 |
+
if (this.#config.Settings.PreventImperson) {
|
123 |
+
const selection = reply.substring(0, fakeAny);
|
124 |
+
this.#enqueue(this.#build(selection), controller);
|
125 |
+
this.#endEarly(controller);
|
126 |
+
}
|
127 |
+
}
|
128 |
+
}
|
129 |
+
async #handle(chunk, controller) {
|
130 |
+
if ('string' != typeof chunk) {
|
131 |
+
this.#recvLength += chunk.byteLength;
|
132 |
+
chunk = Decoder.decode(chunk, {'stream': true}); //chunk = Decoder.decode(chunk);
|
133 |
+
} else {
|
134 |
+
this.#recvLength += Buffer.byteLength(chunk);
|
135 |
+
}
|
136 |
+
this.#compRaw += chunk;
|
137 |
+
const substr = this.#compRaw.split('\n\n'), lastMsg = substr.length - 1;
|
138 |
+
0 !== substr[lastMsg].length ? this.#compRaw = substr[lastMsg] : this.#compRaw = '';
|
139 |
+
for (let i = 0; i < lastMsg; i++) {
|
140 |
+
await this.#parseBuf(substr[i], controller);
|
141 |
+
}
|
142 |
+
}
|
143 |
+
async #parseBuf(json, controller) {
|
144 |
+
if (!json) {
|
145 |
+
return;
|
146 |
+
}
|
147 |
+
if (this.#ended) {
|
148 |
+
return;
|
149 |
+
}
|
150 |
+
let parsed, delayChunk;
|
151 |
+
try {
|
152 |
+
parsed = JSON.parse(cleanJSON(json));
|
153 |
+
if (parsed.error) {
|
154 |
+
const err = await checkResErr(JSON.stringify({
|
155 |
+
error: {
|
156 |
+
...parsed.error
|
157 |
+
},
|
158 |
+
status: this.#source.status,
|
159 |
+
superfetch: this.#source.superfetch
|
160 |
+
}), false);
|
161 |
+
delete err.stack;
|
162 |
+
return this.#err(err, controller);
|
163 |
+
}
|
164 |
+
if (parsed.completion) {
|
165 |
+
parsed.completion = genericFixes(parsed.completion);
|
166 |
+
this.#compOK += parsed.completion;
|
167 |
+
this.#compAll.push(parsed.completion);
|
168 |
+
delayChunk = DangerChars.some((char => this.#compOK.endsWith(char) || parsed.completion.startsWith(char)));
|
169 |
+
}
|
170 |
+
!this.#stopLoc && parsed.stop && (this.#stopLoc = parsed.stop.replace(/\n/g, '\\n'));
|
171 |
+
!this.#stopReason && parsed.stop_reason && (this.#stopReason = parsed.stop_reason);
|
172 |
+
if (this.#streaming) {
|
173 |
+
delayChunk && this.#impersonationCheck(this.#compOK, controller);
|
174 |
+
for (;!delayChunk && this.#compOK.length >= this.#minSize; ) {
|
175 |
+
const selection = this.#collectBuf();
|
176 |
+
this.#enqueue(this.#build(selection), controller);
|
177 |
+
}
|
178 |
+
} else {
|
179 |
+
delayChunk && this.#impersonationCheck(this.#compAll.join(''), controller);
|
180 |
+
}
|
181 |
+
} catch (err) {}
|
182 |
+
}
|
183 |
+
}
|
184 |
+
|
185 |
+
module.exports = ClewdStream;
|
lib/clewd-superfetch.js
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* https://gitgud.io/ahsk/clewd
|
3 |
+
* https://github.com/h-a-s-k/clewd
|
4 |
+
*/"use strict";const{spawn:e}=require("node:child_process"),{relative:r,resolve:t,join:s,normalize:n,basename:o}=require("node:path"),{writeFileSync:a,unlinkSync:d,existsSync:i}=require("node:fs"),{ReadableStream:c}=require("node:stream/web"),l=e=>"win32"===process.platform?".\\"+e:e,m=e=>"win32"===process.platform||e.indexOf(" ")>-1?`"${e}"`:e,u={win32:{x64:"clewd-superfetch-win-amd64.exe"},darwin:{x64:"clewd-superfetch-mac-amd64",arm64:"clewd-superfetch-linux-arm64"},linux:{x64:"clewd-superfetch-linux-amd64",arm64:"clewd-superfetch-linux-arm64"},android:{x64:"clewd-superfetch-linux-amd64",arm64:"clewd-superfetch-linux-arm64",arm:"clewd-superfetch-android-arm"}}[process.platform]?.[process.arch],f=""+n(r("./","./bin/"+u)),p=n(t(__dirname,f,"../","../")),h=t(p,f);let b=[123,34,115,101,99,45,99,104,45,117,97,34,58,34,92,34,67,104,114,111,109,105,117,109,92,34,59,118,61,92,34,49,49,48,92,34,44,32,92,34,78,111,116,32,65,40,66,114,97,110,100,92,34,59,118,61,92,34,50,52,92,34,44,32,92,34,71,111,111,103,108,101,32,67,104,114,111,109,101,92,34,59,118,61,92,34,49,49,48,92,34,34,44,34,115,101,99,45,99,104,45,117,97,45,109,111,98,105,108,101,34,58,34,63,48,34,44,34,115,101,99,45,99,104,45,117,97,45,112,108,97,116,102,111,114,109,34,58,34,92,34,87,105,110,100,111,119,115,92,34,34,44,34,85,112,103,114,97,100,101,45,73,110,115,101,99,117,114,101,45,82,101,113,117,101,115,116,115,34,58,34,49,34,44,34,85,115,101,114,45,65,103,101,110,116,34,58,34,77,111,122,105,108,108,97,47,53,46,48,32,40,87,105,110,100,111,119,115,32,78,84,32,49,48,46,48,59,32,87,105,110,54,52,59,32,120,54,52,41,32,65,112,112,108,101,87,101,98,75,105,116,47,53,51,55,46,51,54,32,40,75,72,84,77,76,44,32,108,105,107,101,32,71,101,99,107,111,41,32,67,104,114,111,109,101,47,49,49,48,46,48,46,48,46,48,32,83,97,102,97,114,105,47,53,51,55,46,51,54,34,44,34,65,99,99,101,112,116,34,58,34,116,101,120,116,47,104,116,109,108,44,97,112,112,108,105,99,97,116,105,111,110,47,120,104,116,109,108,43,120,109,108,44,97,112,112,108,105,99,97,116,105,111,110,47,120,109,108,59,113,61,48,46,57,44,105,109,97,103,101,47,97,118,105,102,44,105,109,97,103,101,47,119,101,98,112,44,105,109,97,103,101,47,97,112,110,103,44,42,47,42,59,113,61,48,46,56,44,97,112,112,108,105,99,97,116,105,111,110,47,115,105,103,110,101,100,45,101,120,99,104,97,110,103,101,59,118,61,98,51,59,113,61,48,46,55,34,44,34,83,101,99,45,70,101,116,99,104,45,83,105,116,101,34,58,34,110,111,110,101,34,44,34,83,101,99,45,70,101,116,99,104,45,77,111,100,101,34,58,34,110,97,118,105,103,97,116,101,34,44,34,83,101,99,45,70,101,116,99,104,45,85,115,101,114,34,58,34,63,49,34,44,34,83,101,99,45,70,101,116,99,104,45,68,101,115,116,34,58,34,100,111,99,117,109,101,110,116,34,44,34,65,99,99,101,112,116,45,69,110,99,111,100,105,110,103,34,58,34,103,122,105,112,44,32,100,101,102,108,97,116,101,44,32,98,114,34,44,34,65,99,99,101,112,116,45,76,97,110,103,117,97,103,101,34,58,34,101,110,45,85,83,44,101,110,59,113,61,48,46,57,34,125],w=[91,34,45,45,99,105,112,104,101,114,115,32,84,76,83,95,65,69,83,95,49,50,56,95,71,67,77,95,83,72,65,50,53,54,44,84,76,83,95,65,69,83,95,50,53,54,95,71,67,77,95,83,72,65,51,56,52,44,84,76,83,95,67,72,65,67,72,65,50,48,95,80,79,76,89,49,51,48,53,95,83,72,65,50,53,54,44,69,67,68,72,69,45,69,67,68,83,65,45,65,69,83,49,50,56,45,71,67,77,45,83,72,65,50,53,54,44,69,67,68,72,69,45,82,83,65,45,65,69,83,49,50,56,45,71,67,77,45,83,72,65,50,53,54,44,69,67,68,72,69,45,69,67,68,83,65,45,65,69,83,50,53,54,45,71,67,77,45,83,72,65,51,56,52,44,69,67,68,72,69,45,82,83,65,45,65,69,83,50,53,54,45,71,67,77,45,83,72,65,51,56,52,44,69,67,68,72,69,45,69,67,68,83,65,45,67,72,65,67,72,65,50,48,45,80,79,76,89,49,51,48,53,44,69,67,68,72,69,45,82,83,65,45,67,72,65,67,72,65,50,48,45,80,79,76,89,49,51,48,53,44,69,67,68,72,69,45,82,83,65,45,65,69,83,49,50,56,45,83,72,65,44,69,67,68,72,69,45,82,83,65,45,65,69,83,50,53,54,45,83,72,65,44,65,69,83,49,50,56,45,71,67,77,45,83,72,65,50,53,54,44,65,69,83,50,53,54,45,71,67,77,45,83,72,65,51,56,52,44,65,69,83,49,50,56,45,83,72,65,44,65,69,83,50,53,54,45,83,72,65,34,44,34,34,44,34,45,45,104,116,116,112,50,34,44,34,45,45,104,116,116,112,50,45,110,111,45,115,101,114,118,101,114,45,112,117,115,104,34,44,34,45,45,102,97,108,115,101,45,115,116,97,114,116,34,44,34,45,45,99,111,109,112,114,101,115,115,101,100,34,44,34,45,45,116,108,115,118,49,46,50,34,44,34,45,45,110,111,45,110,112,110,34,44,34,45,45,97,108,112,115,34,44,34,45,45,116,108,115,45,112,101,114,109,117,116,101,45,101,120,116,101,110,115,105,111,110,115,34,44,34,45,45,99,101,114,116,45,99,111,109,112,114,101,115,115,105,111,110,32,98,114,111,116,108,105,34,44,34,45,45,108,111,99,97,116,105,111,110,34,93];const y=(e=false)=>{if(!u||!i(h)){e&&console.warn(`superfetch [[31merr[0m] unavailable for ${process.platform}-${process.arch}, use 3.8.5 for the time being\n`);return false}e&&console.log(`superfetch [[32mfound[0m] ${r(__dirname,h)}\n`);return true},x=(t,n)=>{n.headers||(n.headers={});"string"!=typeof n.body&&(n.body=n.body?JSON.stringify(n.body):"");if(!y())return;const o=r("./","bin/cfg"),i=r("./","bin/pyld"),c=r("./","bin/hdr"),u=r("./","bin/ca");let x={...JSON.parse(Buffer.from(b).toString()),...n.headers};const S=Object.values(x);x=Object.keys(x).map(((e,r)=>`${e}: ${S[r]}`));const _=m(l(o)),g=m(l(c)),v=m(l(i)),O=["-v","--cacert",""+m(l(u)),"--config",""+_,"--header","@"+g];if("POST"===n.method){O.push("--data");O.push("@"+v)}const j=[...JSON.parse(Buffer.from(w).toString()),"-X "+(n.method||"GET")];a(s(__dirname,o),j.join("\n"));a(s(__dirname,c),x.join("\n"));n.body&&a(s(__dirname,i),n.body);return new Promise((r=>{const a=e("android"===process.platform?h:f,[...O,""+t],{cwd:p,windowsHide:true,killSignal:"SIGKILL",windowsVerbatimArguments:true,detached:"win32"!==process.platform});a.superfetch=true;a.rape=function(){this.stdout?.end();this.stderr?.end()}.bind(a);a.once("spawn",(()=>{a.stream=n.stream||false;if(a.stream){Object.defineProperty(a,"body",{get:()=>a.stdout});return r(a)}a.body="";a.stdout.on("data",(e=>a.body+=e.toString()));a.json=async()=>JSON.parse(a.body);a.text=async()=>a.body;a.stdout.on("end",(()=>{a.stdout.removeAllListeners();return r(a)}))}));a.once("error",(e=>{console.warn("superfetch [[31merr[0m]",e)}));a.once("close",(()=>{try{d(s(__dirname,o));d(s(__dirname,c));n.body&&d(s(__dirname,i))}catch(e){}a.stdout.removeAllListeners();a.stderr.removeAllListeners();this.body?.removeAllListeners()}));a.stderr.on("data",(e=>{const r=/HTTP\/2 (\d{3})+/g,t=(e=e.toString().trim()).match(r);if(!a.status&&t){const t=r.exec(e);a.status=+t[1]}const s=/(?:< )(.+?)(?:: )(.+)/g,n=e.match(s);if(n){const e={};n.forEach((r=>{const t=r.split(s);e[t?.[1]]=t?.[2]}));a.headers=e}}))}))};module.exports.ClewdSuperfetch=x;module.exports.SuperfetchAvailable=y;module.exports.Binary=f;
|
lib/clewd-utils.js
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* https://gitgud.io/ahsk/clewd
|
3 |
+
* https://github.com/h-a-s-k/clewd
|
4 |
+
*/
|
5 |
+
'use strict';
|
6 |
+
|
7 |
+
const {randomInt, randomBytes} = require('node:crypto'), {version: Version} = require('../package.json'), Encoder = (new TextDecoder,
|
8 |
+
new TextEncoder), Main = 'clewd v' + Version + '修改版 by tera', Replacements = {
|
9 |
+
user: 'Human',
|
10 |
+
assistant: 'Assistant',
|
11 |
+
system: '',
|
12 |
+
example_user: 'H',
|
13 |
+
example_assistant: 'A'
|
14 |
+
}, DangerChars = [ ...new Set([ ...Object.values(Replacements).join(''), ...'\n', ...':', ...'\\n' ]) ].filter((char => ' ' !== char)).sort(), AI = {
|
15 |
+
end: () => Buffer.from([ 104, 116, 116, 112, 115, 58, 47, 47, 99, 108, 97, 117, 100, 101, 46, 97, 105 ]).toString(),
|
16 |
+
mdl: () => Buffer.from([ 99, 108, 97, 117, 100, 101, 45, 50 ]).toString(),
|
17 |
+
zone: () => Buffer.from([ 65, 109, 101, 114, 105, 99, 97, 47, 78, 101, 119, 95, 89, 111, 114, 107 ]).toString(),
|
18 |
+
agent: () => Buffer.from([ 77, 111, 122, 105, 108, 108, 97, 47, 53, 46, 48, 32, 40, 77, 97, 99, 105, 110, 116, 111, 115, 104, 59, 32, 73, 110, 116, 101, 108, 32, 77, 97, 99, 32, 79, 83, 32, 88, 32, 49, 48, 95, 49, 53, 95, 55, 41, 32, 65, 112, 112, 108, 101, 87, 101, 98, 75, 105, 116, 47, 53, 51, 55, 46, 51, 54, 32, 40, 75, 72, 84, 77, 76, 44, 32, 108, 105, 107, 101, 32, 71, 101, 99, 107, 111, 41, 32, 67, 104, 114, 111, 109, 101, 47, 49, 49, 52, 46, 48, 46, 48, 46, 48, 32, 83, 97, 102, 97, 114, 105, 47, 53, 51, 55, 46, 51, 54, 32, 69, 100, 103, 47, 49, 49, 52, 46, 48, 46, 49, 56, 50, 51, 46, 55, 57 ]).toString(),
|
19 |
+
cp: () => Buffer.from([ 55, 55, 49, 44, 52, 56, 54, 53, 45, 52, 56, 54, 54, 45, 52, 56, 54, 55, 45, 52, 57, 49, 57, 53, 45, 52, 57, 49, 57, 57, 45, 52, 57, 49, 57, 54, 45, 52, 57, 50, 48, 48, 45, 53, 50, 51, 57, 51, 45, 53, 50, 51, 57, 50, 45, 52, 57, 49, 55, 49, 45, 52, 57, 49, 55, 50, 45, 49, 53, 54, 45, 49, 53, 55, 45, 52, 55, 45, 53, 51, 44, 48, 45, 50, 51, 45, 54, 53, 50, 56, 49, 45, 49, 48, 45, 49, 49, 45, 51, 53, 45, 49, 54, 45, 53, 45, 49, 51, 45, 49, 56, 45, 53, 49, 45, 52, 53, 45, 52, 51, 45, 50, 55, 45, 49, 55, 53, 49, 51, 45, 50, 49, 44, 50, 57, 45, 50, 51, 45, 50, 52, 44, 48 ]).toString(),
|
20 |
+
hdr: refPath => ({
|
21 |
+
'Content-Type': 'application/json',
|
22 |
+
Referer: `${AI.end()}/${refPath ? 'chat/' + refPath : ''}`,
|
23 |
+
Origin: '' + AI.end()
|
24 |
+
})
|
25 |
+
}, indexOfH = (text, last = false) => {
|
26 |
+
let location = -1;
|
27 |
+
const matchesH = text.match(/(?:(?:\\n)|\n){2}((?:Human|H): ?)/gm);
|
28 |
+
matchesH?.length > 0 && (location = last ? text.lastIndexOf(matchesH[matchesH.length - 1]) : text.indexOf(matchesH[0]));
|
29 |
+
return location;
|
30 |
+
}, indexOfA = (text, last = false) => {
|
31 |
+
let location = -1;
|
32 |
+
const matchesA = text.match(/(?:(?:\\n)|\n){2}((?:Assistant|A): ?)/gm);
|
33 |
+
matchesA?.length > 0 && (location = last ? text.lastIndexOf(matchesA[matchesA.length - 1]) : text.indexOf(matchesA[0]));
|
34 |
+
return location;
|
35 |
+
};
|
36 |
+
|
37 |
+
module.exports.encodeDataJSON = completion => Encoder.encode(`data: ${JSON.stringify(completion)}\n\n`);
|
38 |
+
|
39 |
+
module.exports.genericFixes = text => text.replace(/(\r\n|\r|\\n)/gm, '\n');
|
40 |
+
|
41 |
+
module.exports.Replacements = Replacements;
|
42 |
+
|
43 |
+
module.exports.DangerChars = DangerChars;
|
44 |
+
|
45 |
+
module.exports.checkResErr = async (res, throwIt = true) => {
|
46 |
+
let err, json, errAPI;
|
47 |
+
if ('string' == typeof res) {
|
48 |
+
json = JSON.parse(res);
|
49 |
+
errAPI = json.error;
|
50 |
+
err = Error(errAPI.message);
|
51 |
+
} else if (res.status < 200 || res.status >= 300) {
|
52 |
+
err = Error('Unexpected response code: ' + (res.status || json.status));
|
53 |
+
json = await res.json();
|
54 |
+
errAPI = json.error;
|
55 |
+
}
|
56 |
+
if (errAPI) {
|
57 |
+
err.status = res.status || json.status;
|
58 |
+
err.planned = true;
|
59 |
+
errAPI.message && (err.message = errAPI.message);
|
60 |
+
errAPI.type && (err.type = errAPI.type);
|
61 |
+
if ((429 === res.status || 429 === json.status) && errAPI.resets_at) {
|
62 |
+
const hours = ((new Date(1e3 * errAPI.resets_at).getTime() - Date.now()) / 1e3 / 60 / 60).toFixed(1);
|
63 |
+
err.message += `, expires in ${hours} hours`;
|
64 |
+
}
|
65 |
+
if (throwIt) {
|
66 |
+
throw err;
|
67 |
+
}
|
68 |
+
}
|
69 |
+
return err;
|
70 |
+
};
|
71 |
+
|
72 |
+
module.exports.bytesToSize = (bytes = 0) => {
|
73 |
+
const b = [ 'B', 'KB', 'MB', 'GB', 'TB' ];
|
74 |
+
if (0 === bytes) {
|
75 |
+
return '0 B';
|
76 |
+
}
|
77 |
+
const c = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), 4);
|
78 |
+
return 0 === c ? `${bytes} ${b[c]}` : `${(bytes / 1024 ** c).toFixed(1)} ${b[c]}`;
|
79 |
+
};
|
80 |
+
|
81 |
+
module.exports.indexOfAny = (text, last = false) => {
|
82 |
+
let location = -1;
|
83 |
+
const fakes = [ indexOfH(text, last), indexOfA(text, last) ].filter((idx => idx > -1)).sort();
|
84 |
+
location = last ? fakes.reverse()[0] : fakes[0];
|
85 |
+
return isNaN(location) ? -1 : location;
|
86 |
+
};
|
87 |
+
|
88 |
+
module.exports.cleanJSON = json => json.replace(/^data: {/gim, '{').replace(/\s+$/gim, '');
|
89 |
+
|
90 |
+
module.exports.fileName = () => {
|
91 |
+
const len = randomInt(5, 15);
|
92 |
+
let name = randomBytes(len).toString('hex');
|
93 |
+
for (let i = 0; i < name.length; i++) {
|
94 |
+
const char = name.charAt(i);
|
95 |
+
isNaN(char) && randomInt(1, 5) % 2 == 0 && ' ' !== name.charAt(i - 1) && (name = name.slice(0, i) + ' ' + name.slice(i));
|
96 |
+
}
|
97 |
+
return name + '.txt';
|
98 |
+
};
|
99 |
+
|
100 |
+
module.exports.indexOfA = indexOfA;
|
101 |
+
|
102 |
+
module.exports.indexOfH = indexOfH;
|
103 |
+
|
104 |
+
module.exports.setTitle = title => {
|
105 |
+
title = `${Main} - ${title}`;
|
106 |
+
process.title !== title && (process.title = title);
|
107 |
+
};
|
108 |
+
|
109 |
+
module.exports.Main = Main;
|
110 |
+
|
111 |
+
module.exports.AI = AI;
|
media/logo.png
ADDED
![]() |
media/program.png
ADDED
![]() |
package.json
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "clewd",
|
3 |
+
"version": "4.6",
|
4 |
+
"description": ":^)",
|
5 |
+
"main": "clewd.js",
|
6 |
+
"engines": {
|
7 |
+
"node": ">=20.4.0"
|
8 |
+
},
|
9 |
+
"scripts": {
|
10 |
+
"run": "node clewd.js"
|
11 |
+
},
|
12 |
+
"keywords": [
|
13 |
+
"doom",
|
14 |
+
"coom"
|
15 |
+
],
|
16 |
+
"author": {
|
17 |
+
"name": "ahsk",
|
18 |
+
"url": "https://gitgud.io/ahsk"
|
19 |
+
},
|
20 |
+
"contributors": [
|
21 |
+
{
|
22 |
+
"name": "ahsk",
|
23 |
+
"url": "https://gitgud.io/ahsk"
|
24 |
+
},
|
25 |
+
{
|
26 |
+
"name": "h-a-s-k",
|
27 |
+
"url": "https://github.com/h-a-s-k"
|
28 |
+
}
|
29 |
+
],
|
30 |
+
"homepage": "https://rentry.org/teralomaniac_clewd",
|
31 |
+
"repository": {
|
32 |
+
"type": "git",
|
33 |
+
"url": "git+https://github.com/teralomaniac/clewd.git"
|
34 |
+
},
|
35 |
+
"bugs": {
|
36 |
+
"url": "https://gitgud.io/ahsk/clewd/-/issues"
|
37 |
+
},
|
38 |
+
"dependencies": {"localtunnel": "^2.0.2"}
|
39 |
+
}
|
start.bat
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
pushd %~dp0
|
2 |
+
call npm install --no-audit --fund false
|
3 |
+
node clewd.js
|
4 |
+
pause
|
5 |
+
popd
|
start.sh
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
if ! command -v npm &> /dev/null
|
4 |
+
then
|
5 |
+
echo "Install nodejs"
|
6 |
+
fi
|
7 |
+
|
8 |
+
npm install --no-audit --fund false
|
9 |
+
chown -R $(whoami) lib/bin/*
|
10 |
+
chmod u+x lib/bin/*
|
11 |
+
chmod -R 777 $(pwd)
|
12 |
+
node clewd.js
|
update.bat
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@echo off
|
2 |
+
pushd %~dp0
|
3 |
+
|
4 |
+
if not exist .git (
|
5 |
+
GOTO:notgit
|
6 |
+
)
|
7 |
+
|
8 |
+
where /q git.exe
|
9 |
+
if %ERRORLEVEL% EQU 0 (
|
10 |
+
GOTO:pull
|
11 |
+
)
|
12 |
+
GOTO:missgit
|
13 |
+
|
14 |
+
|
15 |
+
:pull
|
16 |
+
call git config --local url."https://".insteadOf git://
|
17 |
+
call git config --local url."https://github.com/".insteadOf git@github.com:
|
18 |
+
call git config --local url."https://".insteadOf ssh://
|
19 |
+
call git pull --rebase --autostash
|
20 |
+
if %ERRORLEVEL% neq 0 (
|
21 |
+
echo Error updating
|
22 |
+
)
|
23 |
+
GOTO:end
|
24 |
+
|
25 |
+
:missgit
|
26 |
+
echo Install git to update
|
27 |
+
GOTO:end
|
28 |
+
|
29 |
+
:notgit
|
30 |
+
echo Only able to update if you clone the repository (git clone https://github.com/teralomaniac/clewd.git)
|
31 |
+
GOTO:end
|
32 |
+
|
33 |
+
|
34 |
+
:end
|
35 |
+
pause
|
36 |
+
popd
|
37 |
+
exit /B
|
update.sh
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
if ! [ -x "$(command -v git)" ]
|
4 |
+
then
|
5 |
+
echo "Install git to update"
|
6 |
+
exit
|
7 |
+
fi
|
8 |
+
|
9 |
+
if [ -x "$(command -v git)" ]
|
10 |
+
then
|
11 |
+
if [ -d ".git" ]
|
12 |
+
then
|
13 |
+
git config --local url."https://".insteadOf git://
|
14 |
+
git config --local url."https://github.com/".insteadOf git@github.com:
|
15 |
+
git config --local url."https://".insteadOf ssh://
|
16 |
+
git pull --rebase --autostash
|
17 |
+
else
|
18 |
+
echo "Only able to update if you clone the repository (git clone https://github.com/teralomaniac/clewd.git)"
|
19 |
+
fi
|
20 |
+
fi
|