Compare commits

..

494 Commits

Author SHA1 Message Date
Cohee
b4c7bb1f7b Merge pull request #1290 from SillyTavern/staging
Staging
2023-10-26 18:44:18 +03:00
Cohee
edbde2be37 Make comment macro multiline 2023-10-26 18:41:35 +03:00
Cohee
1798959ddc Update readme-zh_cn.md 2023-10-26 18:25:51 +03:00
Cohee
d249000b52 Update readme.md 2023-10-26 18:25:10 +03:00
Cohee
58ada40586 Merge pull request #1289 from deffcolony/release
Added new banner for readme.md
2023-10-26 18:18:08 +03:00
deffcolony
f1a13f3093 updated banner 2023-10-26 16:45:03 +02:00
deffcolony
aa3574f15f Added new banner 2023-10-26 15:05:27 +02:00
Cohee
03e513a3e4 Fix slider formatting 2023-10-26 15:17:16 +03:00
Cohee
beca613745 Revert Top P granularity 2023-10-26 15:11:38 +03:00
Cohee
dcca49e848 Revert TFS granularity 2023-10-26 15:09:34 +03:00
Cohee
22cebe3176 Fix settings loading 2023-10-26 15:01:31 +03:00
RossAscends
dd2d292a56 clean up NAI slider decimals 2023-10-26 20:46:09 +09:00
RossAscends
c79bf951b7 minor skill issue with slider overhaul 2023-10-26 20:41:12 +09:00
RossAscends
e9107870c0 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-26 13:20:49 +09:00
RossAscends
d50124e937 appwide slider overhaul 2023-10-26 13:20:47 +09:00
Cohee
339dcaf506 Fix message trigger on disabled character in amalgamate group mode 2023-10-26 02:10:14 +03:00
Cohee
5cdc3d1d18 Smudge groups depth prompts in Join mode. 2023-10-26 00:39:11 +03:00
Cohee
8dcfe57888 #1268 Add group card amalgamation mode 2023-10-26 00:09:22 +03:00
Cohee
2e35cd76ec Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-25 22:39:34 +03:00
Cohee
51d2c9feba Add UI option for group gen strategy 2023-10-25 22:39:31 +03:00
Cohee
864ac3927f Merge pull request #1285 from bdashore3/staging
Add freq pen and presence pen for ooba
2023-10-25 22:38:52 +03:00
Cohee
cb9e334a75 Fix localization strings 2023-10-25 22:36:14 +03:00
kingbri
4f67e9f38b Ooba: Add frequency and presence penalty sliders
These options essentially supersede repetition penalty, but since
ooba also gives the option, add these new sliders in conjunction
with the repetition penalty ones.

More testing is needed to find good default values.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-25 15:22:47 -04:00
Cohee
b4a401805f Add explainer for SD prompt expansion 2023-10-25 21:49:32 +03:00
Cohee
f2d5196890 Change scenario override setup method 2023-10-25 19:44:46 +03:00
Cohee
c2ba3a773a Delayed tokenizers initialization 2023-10-25 00:32:49 +03:00
Cohee
3edc456fe7 Extend extensions interop API 2023-10-25 00:28:58 +03:00
Cohee
5dbe2ebf29 Add chat file backups 2023-10-24 22:09:55 +03:00
Cohee
6369ca6483 Merge pull request #1281 from Tony-sama/staging
Live2d assets management
2023-10-24 17:01:17 +03:00
Tony Ribeiro
2b40fc7e76 Use proper path function for live2d asset of character folder 2023-10-24 15:44:40 +02:00
Cohee
52537904f7 Add stopping strings to Horde 2023-10-24 16:23:32 +03:00
Cohee
1bf6d6d9f2 Don't trim the end of instruct last prompt line if newline wrap mode is disabled 2023-10-24 16:02:24 +03:00
Tony Ribeiro
43dae79018 add placeholder in live2d asset folder to have the folder created for users. 2023-10-24 14:47:29 +02:00
Tony Ribeiro
141850eda5 Merge branch 'SillyTavern:staging' into staging 2023-10-24 14:23:45 +02:00
Cohee
affdbb561f Update GPU.ipynb 2023-10-24 13:37:50 +03:00
Cohee
8f118f140f Save settings after selecting persona 2023-10-23 23:22:25 +03:00
Cohee
5b68a438f3 Fix immediate switching between persona namesakes 2023-10-23 23:20:49 +03:00
Cohee
3f9cb7d575 Reduce hr margin 2023-10-23 22:25:17 +03:00
Cohee
85d1a008dd Fix Extras input placeholders 2023-10-23 16:57:40 +03:00
Cohee
f0b20b67de Rearrange ext.panel. Add ext.update notifications. Improve performance on large number of extensions 2023-10-23 16:53:31 +03:00
Cohee
e082138c18 Do shallow clone to speed-up extension installs 2023-10-23 13:27:04 +03:00
Cohee
9a647b96df Add error logging to SD generate endpoint 2023-10-23 13:03:01 +03:00
Cohee
3995238d77 Adjust Anlas guard for NAI Opus 2023-10-23 10:41:39 +03:00
RossAscends
bd9c4d28ca change non-CC API context slider steps to 512 2023-10-23 13:07:04 +09:00
RossAscends
6f79f75f71 remove extra quote mark form bulkdelete html tag 2023-10-23 10:56:46 +09:00
RossAscends
731ebc2eda add toggle for mobile gestures 2023-10-23 10:54:17 +09:00
Cohee
635df947c5 Increase classify sampling window; 300=>500 chars 2023-10-23 02:14:29 +03:00
Cohee
63b34d9851 Call expression module worker when switching chats 2023-10-23 01:56:27 +03:00
Cohee
f9ae7ea949 Add NAI Diffusion v2 model 2023-10-23 01:06:49 +03:00
Cohee
df85218fa7 Merge branch 'release' into staging 2023-10-23 00:27:15 +03:00
Cohee
a4fe78f8ba Merge pull request #1277 from CoryG89/bug-race-condition-tts-autoload-chat
Fix duplicate TTS voicemap UI when autoload last chat is enabled
2023-10-23 00:25:30 +03:00
Tony Ribeiro
4bc2d7f6ac Add management of live2d model in assets folder. 2023-10-22 19:21:10 +02:00
Cory Gross
5b2fff07b8 Fix race condition duplicates TTS UI if autoload chat enabled 2023-10-22 08:54:25 -07:00
Cohee
0517f1bbbc Fix elevenlabs multi-model 2023-10-22 14:46:54 +03:00
Cohee
f49f9c1f96 Merge branch 'release' into staging 2023-10-22 14:01:33 +03:00
Cohee
f9cb6d783e Merge pull request #1263 from bdashore3/preset-expansion
Preset setting expansion
2023-10-22 14:01:06 +03:00
Cohee
600c9c6251 Merge pull request #1274 from CoryG89/bug-tts-autogen-elevenlabs-multilingual 2023-10-22 12:28:35 +03:00
Cory Gross
348805af74 Fix TTS autogen chkbox set by elevenlabs multilingual setting 2023-10-21 22:33:28 -07:00
kingbri
57b299a9cd Presets: Update adventure
Add some default settings and stopping strings.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-21 21:58:35 -04:00
Cohee
a662677f06 Add prompt copy button 2023-10-22 00:51:35 +03:00
Cohee
5fa158a37f Add border to enlarged img 2023-10-22 00:43:21 +03:00
Cohee
c49f898886 Display prompts for enlarged images 2023-10-22 00:39:11 +03:00
Cohee
81921bcd77 Saveable SD prefix/negatives 2023-10-22 00:10:48 +03:00
Cohee
18fa925855 Use named constant 2023-10-21 23:33:17 +03:00
Cohee
04a5d9694e Unify preset button styles 2023-10-21 23:32:53 +03:00
Cohee
6296cb8218 Align display name of Summary plugin 2023-10-21 22:20:21 +03:00
Cohee
a4ab898933 Move CFG scale to built-in functionality 2023-10-21 22:19:49 +03:00
Cohee
ed8f5ddc33 Fix BG drawer title position 2023-10-21 21:10:08 +03:00
Cohee
65402eaa23 Move bulk edit to built-in functionality 2023-10-21 21:02:06 +03:00
Cohee
7e116f8b1f Move setting search to built-in functionality 2023-10-21 20:55:51 +03:00
Cohee
999c1b1105 Hide chat BG titles 2023-10-21 20:41:19 +03:00
Cohee
0b535e98b8 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-21 20:32:39 +03:00
Cohee
4ecf2b9f2d Fix stats init error 2023-10-21 20:32:36 +03:00
Cohee
5012237eb3 Display generated bg in the bg block. Add ability to copy chat bg to system list. 2023-10-21 17:43:25 +03:00
Cohee
8d121bf38f QR menu restyle 2023-10-21 16:17:17 +03:00
Cohee
d0650e6910 Clean-up QR code 2023-10-21 16:09:25 +03:00
IkariDevGIT
1e251c09e3 Better input inject Quick Reply (#1255)
* Force open Char WI with Shift

QoL - Force open character WI selector menu if icon clicked with Shift.

* Update world-info.js (revert personal new WI pos preference)

* Fix element widths

* Fix event typing

* Update index.js

* Update index.js

* change Prompt to Input

this makes it more clear what it does(i think)

---------

Co-authored-by: valden80 <111227649+valden80@users.noreply.github.com>
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-10-21 16:02:29 +03:00
Cohee
08a1eaad62 Less obnoxious alt.greetings button 2023-10-21 15:54:05 +03:00
Cohee
b4e29bf157 #1272 Optimize performance of context buttons visibility switch 2023-10-21 15:41:27 +03:00
Cohee
97d75aef73 #1272 Fix control buttons when expand actions is used 2023-10-21 15:17:18 +03:00
Cohee
25c461bd3f Add text to open alternate greetings 2023-10-21 15:10:48 +03:00
Cohee
ca73a3a7b7 Merge branch 'release' into staging 2023-10-21 15:06:19 +03:00
Cohee
3816d7b202 Merge pull request #1271 from Xrystallized/faster-load
Faster past chats load
2023-10-21 15:05:53 +03:00
Cohee
008fcece04 Rewrite to sync readdir, add try-catch, filter out invalid files 2023-10-21 15:04:36 +03:00
Cohee
70fa93f0c9 Clarify note macro docs 2023-10-21 14:42:53 +03:00
Cohee
703965aec8 Substitute macro in character editor token counter 2023-10-21 14:39:01 +03:00
IkariDevGIT
6fe4232f75 Add {{// (note)}} macro (#1265)
* add {{# (note)}} macro

* change from # to // for future updates

* fix docs
2023-10-21 14:28:02 +03:00
Cohee
51e0c9130a Merge pull request #1269 from city-unit/feature/slash
Add token counting slash command.
2023-10-21 14:26:45 +03:00
Cohee
85de505553 Move counter to plugin. Use chat context to get messages 2023-10-21 14:23:56 +03:00
Xrystal
1d38109dcf Use JSON instead of json5 2023-10-21 18:56:51 +08:00
Xrystal
6f0f420063 Promisify getallchatsofcharacter 2023-10-21 18:55:52 +08:00
city-unit
63ecca1fe2 Add token counting slash command. 2023-10-21 01:04:16 -04:00
RossAscends
b41bf7cf4e Merge pull request #1267 from city-unit/feature/ui
Minor Fix: Hide extra buttons when you click away
2023-10-21 11:36:40 +09:00
city-unit
95a3021e53 Smooth transition 2023-10-20 22:31:57 -04:00
city-unit
b8939b8ccb Hide extra buttons when you click away 2023-10-20 22:14:36 -04:00
kingbri
8d6eaf3da4 Power User: Fix preset error
The checkbox wasn't being looked up correctly, causing issues when
setting some properties.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-20 22:05:03 -04:00
kingbri
18c74ecf09 Power User: Reduce preset settings
Make presets affect less settings that are commonly manually changed
by people after setting one.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-20 21:18:48 -04:00
Cohee
f285110773 Merge chat backgrounds plugin with main backgrounds menu 2023-10-21 01:40:58 +03:00
Cohee
7f8df9533b Auto-complete code blocks during streaming 2023-10-20 23:52:23 +03:00
Cohee
e4cb916dff Example messages behavior to 3-state selector 2023-10-20 20:09:31 +03:00
Cohee
0b0b125bca Don't double-expand prompts if reusing 2023-10-20 15:43:55 +03:00
Cohee
c4e6b565a5 Add SD prompt expansion 2023-10-20 15:03:26 +03:00
kingbri
6e4236d5ee Presets: Add power user setting support
Settings such as adding character name, stopping strings, etc can be
preset specific. This change is mainly inspired because people (like myself)
often forget to change these settings after switching a preset, which
can cause weird responses from the model.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-20 02:07:45 -04:00
Cohee
5c6343e85e #1259 Add more weight to char.name in fuzzy search 2023-10-19 14:03:38 +03:00
Cohee
50924a0672 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-19 13:37:38 +03:00
Cohee
b167eb9e22 Add raw token ids support to OAI logit bias. Fix token counting for turbo models 2023-10-19 13:37:08 +03:00
Tony Ribeiro
fae364f079 Merge branch 'staging' of https://github.com/Tony-sama/SillyTavern into staging 2023-10-19 00:36:24 +02:00
Tony Ribeiro
2149bee87f Add handling of multiple live2d asset per character 2023-10-19 00:36:19 +02:00
Tony Ribeiro
08bee074ac Merge branch 'SillyTavern:staging' into staging 2023-10-19 00:35:12 +02:00
Cohee
ec8d30a19d Remember confirm for assets list 2023-10-19 00:26:00 +03:00
Cohee
31242e23eb Merge pull request #1249 from bdashore3/staging
Add ask command
2023-10-18 21:28:20 +03:00
Cohee
9611e31481 Respect trusted worker flag if auto-adjust is enabled 2023-10-18 14:25:05 +03:00
Cohee
5d1fff3df6 Don't add a newline at the end of empty story string 2023-10-18 11:44:45 +03:00
Tony Ribeiro
1dd747a24d Merge branch 'SillyTavern:staging' into staging 2023-10-17 20:18:29 +02:00
Cohee
cc3e27eca1 Merge pull request #1253 from valden80/shift-open-char_wi
Force open char WI selector with Shift-click
2023-10-17 13:56:39 +03:00
Cohee
77f0fe5b80 Fix event typing 2023-10-17 13:55:02 +03:00
Cohee
5c316b50fa Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-17 13:09:53 +03:00
Cohee
e8dd2e2b4d Fix element widths 2023-10-17 13:09:46 +03:00
valden80
81f1bfd23f Update world-info.js (revert personal new WI pos preference) 2023-10-17 03:15:18 +03:00
valden80
819b92a1d5 Force open Char WI with Shift
QoL - Force open character WI selector menu if icon clicked with Shift.
2023-10-17 03:10:57 +03:00
Cohee
eaadb1c5c2 Prevent double insert of chat lore 2023-10-16 23:13:32 +03:00
Cohee
6a1b230c7e #1226 Add chat-bound lorebooks 2023-10-16 23:03:42 +03:00
Cohee
8a3547ecd0 #1248 Fix a server crash on unexpected models response 2023-10-16 20:25:51 +03:00
Cohee
4f458ce93a Fix import of presets with spaces 2023-10-16 20:01:45 +03:00
Cohee
59af85ce1c #1250 Fix multiple card import tags 2023-10-16 11:37:04 +03:00
kingbri
dfa25a1796 Commands: Add ask command
The ask command aims to ask another character about a question or
topic from the current chat. Essentially, the current chat is taken
out and prompted to another character.

This command also requires a few fixes to sprites and prompt creation.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-16 02:12:12 -04:00
Cohee
2a16d24760 Increase 0301 padding 2023-10-16 02:21:27 +03:00
Cohee
4657aef306 Improve inline preview of audio assets 2023-10-16 02:09:43 +03:00
Cohee
9ee2c2e9c1 Add asset preview links 2023-10-16 01:39:08 +03:00
Cohee
02dca52948 Add extra padding for 0301 turbo model. 2023-10-16 01:21:14 +03:00
Cohee
5b954a3584 Rename URL validation util function 2023-10-16 00:50:29 +03:00
Cohee
0f15d2d45b Move Idle extension to external repo. 2023-10-16 00:02:37 +03:00
Cohee
6a9f4a57b9 Move dynamic audio to external repository 2023-10-15 23:03:53 +03:00
Cohee
c8dace09b7 Add failsafe condition preventing gens when cfg settings are not found 2023-10-15 22:21:19 +03:00
Cohee
92ddb2b791 Move HypeBot to external repo 2023-10-15 20:03:52 +03:00
Cohee
30c76eb420 Move dice extension to external repository 2023-10-15 19:56:07 +03:00
Cohee
579f43ed1c Move objective extension to external repo 2023-10-15 19:48:12 +03:00
Cohee
6e6e5f4747 Group popout "improvements" 2023-10-15 19:42:23 +03:00
Cohee
421cda2ef0 Move RVC plugin to external repository 2023-10-15 17:27:11 +03:00
Cohee
0a742b867f Move chromadb plugin to external repository 2023-10-15 16:57:37 +03:00
Cohee
82032133f1 Move randomizer plugin files to external repository 2023-10-15 16:23:32 +03:00
Cohee
b4c3985b61 Disable cache of assets loader 2023-10-15 16:16:35 +03:00
Cohee
19363f6cb9 Move variables extension to external repo 2023-10-15 16:08:19 +03:00
Cohee
d1d14bca13 Merge pull request #1245 from majick/tag-field-wtf-logspam
Make v2 spec read logspam at least slightly actionable.  Slightly.
2023-10-15 15:34:14 +03:00
majick
89d7a05ea7 Missed a spot 2023-10-14 20:08:45 -10:00
majick
a9ebd2f80e Make v2 spec read logspam slightly actionable
The existing logspam doesn't even tell the user what char is failing, which means it's
just going to emit every startup, forever, grinding at the poor user's soul, never
letting them know *which* of their 352 cards is causing the spam... day after day after
day.  Until one day, the poor beleaguered user will emit the world's ugliest PR to at
least find the broken card in an attempt kill it.

Ask me how I know.
2023-10-14 17:41:23 -10:00
Cohee
d0637750e7 Add system message collapse for chat comps 2023-10-14 22:05:09 +03:00
Tony Ribeiro
29f045636a Merge branch 'SillyTavern:staging' into staging 2023-10-14 04:35:42 +02:00
Tony Ribeiro
2f3ded734f Added live2d asset category to allowed character assets. 2023-10-14 04:35:09 +02:00
Cohee
658701a943 Merge branches 'staging' and 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-13 21:58:33 +03:00
Cohee
61f164b5ff Remove ChromaDB from readmes 2023-10-13 21:58:28 +03:00
RossAscends
7f50d84953 put headers on a diet 2023-10-14 01:09:53 +09:00
RossAscends
19ff0fd618 clean up draggables, gallery, and close buttons 2023-10-14 00:29:41 +09:00
Cohee
d82eb373a6 Less obnoxious hr style 2023-10-13 13:11:21 +03:00
Cohee
edb46f480f Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-13 11:42:45 +03:00
Cohee
a1f6220f33 Nicer display of 3rd-party extension assets 2023-10-13 11:42:38 +03:00
Cohee
410f08a317 Merge pull request #1240 from Tony-sama/staging
Removed speech recognition extension (now third party)
2023-10-13 11:42:07 +03:00
Cohee
e9a12b2f4e Merge pull request #1236 from 50h100a/webui_streaming_errmsg
Check for errors on the `stream_end` event
2023-10-13 11:35:56 +03:00
Tony Ribeiro
2997522c52 Removed speech recognition extension (now third party extension download from assets menu). 2023-10-13 01:34:00 +02:00
RossAscends
a87580663e HR divorces theme border color 2023-10-12 21:13:57 +09:00
Cohee
b5d93f477a Merge pull request #1239 from bdashore3/staging
Include AN into WI scanning
2023-10-12 14:19:37 +03:00
kingbri
2c1a6ca67c World Info: Add scanning with AN
Add support for adding extension prompts into WI scanning. Doing this
required adding a method to get extension prompts by name. Now, AN
and depth prompts can be added to world info scanning.

However, since scanning just looks for keys in the chatlog, append
the extension prompts on the top of scanned text.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-11 23:50:58 -04:00
Cohee
84098ae933 Fix injection order (again) 2023-10-11 22:56:17 +03:00
Cohee
e2f0162e5a Fix injection order 2023-10-11 22:42:25 +03:00
Cohee
59ae661f62 Fix itemization viewer 2023-10-11 22:09:24 +03:00
Cohee
c4fbc8373d Add raw generate function 2023-10-11 17:56:52 +03:00
Cohee
abb78d1d6b Add at-depth position for custom Prompt Manager prompts 2023-10-11 16:03:36 +03:00
RossAscends
6b5aa9d06e toggle to skip WI&AN insertion in Summary's prompt 2023-10-11 19:44:22 +09:00
50h100a
6e78ec11fb Check for errors on the stream_end event 2023-10-10 18:04:28 -04:00
Cohee
7be3718a36 Fix first.mes continue for Chat Comps 2023-10-10 20:54:09 +03:00
Cohee
2c54627926 Format code 2023-10-10 20:48:21 +03:00
Cohee
9d710801d8 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-10 20:48:10 +03:00
Cohee
3fceee8f2b Merge pull request #1230 from ThisIsPIRI/worldimport
Add option to use the old embedded WI toast
2023-10-10 20:45:36 +03:00
ThisIsPIRI
3eb8f56b00 Add option to use the old embedded WI toast 2023-10-11 00:08:08 +09:00
kingbri
dbf964e430 Script: Fix greeting message with continue
Add author's note when continuing the first message of a conversation.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-10-10 14:26:41 +03:00
Cohee
3f406dcdf0 Merge pull request #1228 from Tony-sama/staging 2023-10-10 09:41:02 +03:00
Tony Ribeiro
12a37e5342 correct placeholder text. 2023-10-10 01:52:09 +02:00
Tony Ribeiro
47d4561bf8 Merge branch 'SillyTavern:staging' into staging 2023-10-10 01:51:30 +02:00
Tony Ribeiro
93d1a264da Add official blip asset management. 2023-10-10 01:51:09 +02:00
RossAscends
f88f360404 add padding back to summary popout 2023-10-10 05:53:55 +09:00
RossAscends
83f689d9eb Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-10 05:52:08 +09:00
RossAscends
b1769153c7 add background coloring to popped out Summary 2023-10-10 05:52:06 +09:00
Cohee
1239026a8f Auto-update extensions on version change 2023-10-09 23:45:09 +03:00
RossAscends
575e21a1f5 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-10 04:49:37 +09:00
RossAscends
96ddd5f4e5 draggable popout for Summary 2023-10-10 04:49:35 +09:00
Cohee
15c81749b8 Filter out invalid/broken characters 2023-10-09 19:17:49 +03:00
Cohee
0873d3eaf9 Filter out invalid/broken characters 2023-10-09 19:09:33 +03:00
Cohee
d81151efa2 Fix first message duplication 2023-10-09 18:22:50 +03:00
Cohee
b84e6e07d1 Assets extensions visual touch-up 2023-10-09 17:21:12 +03:00
Cohee
c9f9bcfc86 Merge pull request #1224 from Tony-sama/staging
Minor safety changes to handle blip extension
2023-10-09 12:08:42 +03:00
Tony Ribeiro
6c1ba0aa13 Merge branch 'SillyTavern:staging' into staging 2023-10-09 01:44:16 +02:00
Tony Ribeiro
df4ca46c02 Save chat id between received and rendered event for safety (blip extension allow multiple message received before one is rendered). Added export in translate extension for usage in blip extension. 2023-10-09 01:26:57 +02:00
RossAscends
dac9c091b2 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-09 08:22:02 +09:00
RossAscends
e29902ed66 '/help slash' hint for how to batch slash commands 2023-10-09 08:22:00 +09:00
Cohee
b3cdfe4fdf Adjust min value of NAI rep.pen.slope 2023-10-08 23:57:49 +03:00
Cohee
d265179f46 Don't crash ST server on invalid streaming URL 2023-10-08 23:42:28 +03:00
Cohee
54d52a2986 Manage extensions via the assets plugin 2023-10-08 23:20:01 +03:00
Cohee
4f80085fa3 Add sanitation of Stable Horde prompts 2023-10-08 22:29:33 +03:00
Cohee
c9c4f30637 Merge pull request #1223 from SillyTavern/staging
Staging
2023-10-08 21:08:26 +03:00
RossAscends
1c095415a4 fix WI panel display on autoimport char lorebooks. 2023-10-08 23:04:53 +09:00
RossAscends
19acc05516 subsort WI Depth sort by Order to match prompt loc 2023-10-08 20:12:14 +09:00
Cohee
2cbde8b55c #1221 Button to refresh WI sorts 2023-10-08 12:30:12 +03:00
Cohee
15cf87ef01 Fix new group avatar upload 2023-10-08 11:34:39 +03:00
Cohee
57bf499ce9 Fix group expressions 2023-10-08 11:22:48 +03:00
Cohee
4fbbd34db9 Add presets for Story and Adventure 2023-10-07 23:18:00 +03:00
Cohee
9b04e43b4c Remove examples separator from ChatML 2023-10-07 22:36:53 +03:00
SDS
5848ec498b Assorted fixes and improvements (#1208)
* Kobold Presets fixed

* Help texts fixed

* Scale API for connectAPISlash

* Quick Reply checkboxes fixed

* New Instruct Mode Presets

* More date/time macros

* ChatML context template and instruct prompt format

* Mistral context template and instruct prompt format

* Removed use_default_badwordsids from kobold presets

* Renamed ChatML to Mistral-OpenOrca (ChatML)

* Renamed Mistral-OpenOrca (removed ChatML)

* Removed single_line from kobold presets

* Removed obsolete use_stop_sequence setting

* Ban EOS Token off by default

* Split AI Resp. Conf. in global and preset-specific settings

* Resolve conflicts

* Fix title

* Add translations for new help texts

* Fix i18n.json whitespace

* Make Mistral-OpenOrca system prompt more generic

* Renamed "Mistral-OpenOrca" to "ChatML" again

* More (UI) fixes and improvements

* Sendas hint fixed

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-10-07 19:25:36 +03:00
Cohee
5a570ff283 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-07 18:30:19 +03:00
Cohee
1dd6fa4b6a Add Sd.next source 2023-10-07 18:30:06 +03:00
Cohee
32377fd131 Unhide constant WI probability 2023-10-06 18:47:03 +03:00
Cohee
2f294b9f2b [chore] Reformat code 2023-10-06 15:55:11 +03:00
yuxiang
0b8295926e add bing translate 2023-10-06 15:51:04 +03:00
Cohee
27ce0b5eb7 Stabilize WI sorting order 2023-10-06 01:18:50 +03:00
RossAscends
2797b4bd89 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-06 06:27:54 +09:00
RossAscends
e9ba20f13c WI Entry transitions: all >>> opacity 2023-10-06 06:27:49 +09:00
Cohee
1ef68a34fe Fix bamboozling UI hint 2023-10-06 00:13:16 +03:00
RossAscends
4189da19b1 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-06 05:56:47 +09:00
RossAscends
ad3f8e7bf4 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-06 05:56:45 +09:00
Cohee
0dfe46a162 Add WI title backfill button 2023-10-05 23:56:31 +03:00
RossAscends
edeb804128 fix WI Entry control titles for mobile 2023-10-06 05:55:39 +09:00
Cohee
b49f234185 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-05 23:30:23 +03:00
Cohee
85a63b3bb3 Add WI entry sorting. Add new entry flash 2023-10-05 23:30:18 +03:00
RossAscends
04a0d012fc WI: quick cope for mobile entry display 2023-10-06 05:27:36 +09:00
RossAscends
eaa33f2544 WI Entry titles on left, controls on right. 2023-10-06 03:40:39 +09:00
RossAscends
d5004d79bd remove double WI Entry header padding 2023-10-06 03:34:34 +09:00
Cohee
96be2ebf35 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-10-05 21:13:23 +03:00
Cohee
fc90843207 Add WI sort dropdown 2023-10-05 21:13:18 +03:00
RossAscends
679d40b3ce Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-06 03:02:45 +09:00
RossAscends
5307ee5d17 WI: Prob%, Memo to header, Keywords to main 2023-10-06 03:02:43 +09:00
Cohee
dd753498fa Unscrew zoomed mobile avatars width 2023-10-05 18:01:11 +03:00
RossAscends
30e5a31591 Position, Depth, Order Inputs to WI Entry header 2023-10-05 23:40:48 +09:00
RossAscends
2befd69c31 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-05 20:10:19 +09:00
RossAscends
995b4d07ff WI: 🔵>🟢 & 🟡>🟢 2023-10-05 20:10:16 +09:00
valden80
788bbe969f Feature, ability to add banned words sequences from anywhere through {{banned "..."}} macro. (#1202)
* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Fix constant assignment, reformat code

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-10-05 13:10:41 +03:00
Cohee
99a89a7329 Less discrete embedded lorebook prompt 2023-10-04 22:41:10 +03:00
Cohee
f8b5fe8b1e Add Character note to char.card embeds 2023-10-04 22:13:56 +03:00
majick
368cba1149 Add Lightning 1.1 Context and Instruct templates (#1214)
* Add Lightning 1.1 Context and Instruct templates

* Remove double white space

* Fix fancy apostrophe

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-10-03 20:05:15 +03:00
RossAscends
dac6639cc1 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-02 09:29:18 +09:00
RossAscends
345a0e04fc Add '/nar' as alias for /sys 2023-10-02 09:28:25 +09:00
Cohee
82182015e2 Allow group nudge in chat completions. 2023-10-02 00:24:16 +03:00
RossAscends
384e8d43a6 further improve WI entry state display 2023-10-02 02:43:23 +09:00
Cohee
b203b22d4d Remove commented-out code 2023-10-01 19:36:53 +03:00
AlexVeeBee
b9ea0061d5 Fix Dynamic Audio player looks
- Removed unnecessary text for audio player
- Fixed styling for audio player
2023-10-01 15:49:53 +00:00
Cohee
e9afb39a4a Merge branch 'release' into staging 2023-10-01 16:37:18 +03:00
Xrystal
df55a66153 Add preset settings to Docker public (#1204) 2023-10-01 16:36:52 +03:00
valden80
6df0c2acf3 Better wi 2 (#1203)
* Update world-info.css

* Update index.html

* V-center Wi delete

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-10-01 15:46:06 +03:00
Cohee
046bf20592 Update default objective prompts 2023-10-01 15:39:31 +03:00
RossAscends
2879e2701f Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-10-01 10:23:39 +09:00
RossAscends
7771ecb0d0 WI disable/constant checkboxes to tristate select 2023-10-01 10:21:19 +09:00
valden80
cc9f452699 Better wi cards (#1200) 2023-09-30 23:19:49 +03:00
yukikun-dev
a8fb2d9bee Fix GPT4-32k model (#1198) 2023-09-30 23:18:31 +03:00
Cohee
165997c791 #1199 I'm not even sure anymore 2023-09-30 15:42:37 +03:00
Cohee
22e3c25e12 Doc string for bias 2023-09-29 15:06:19 +03:00
AlpinDale
495b7eebbf chore: fix href for aphrodite (#1196)
The current href leads to text-generation-webui, this PR changes that to the correct URL.
2023-09-28 22:44:19 +03:00
Cohee
4c39a32be1 Don't reset instruct preset when toggling instruct mode 2023-09-28 21:59:03 +03:00
Cohee
584d7961eb Close message editor before regenerating. #1195 2023-09-28 21:47:55 +03:00
Cohee
977421edb7 Add comment 2023-09-28 21:33:03 +03:00
Cohee
f0b48aabff #1194 Fix chat width misbehaving in Firefox 2023-09-28 21:30:41 +03:00
Cohee
191c180946 Fix streaming url validation 2023-09-28 20:47:33 +03:00
Cohee
03fe8f88f9 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-09-28 19:10:04 +03:00
Cohee
bb47712696 Split oobabooga/mancer sources. Add aphrodite support 2023-09-28 19:10:00 +03:00
RossAscends
f466ff3243 update WI Pos/Depth/Order hint on value change 2023-09-29 00:27:12 +09:00
Cohee
306cf51da4 #1180 Add custom token bans. Return grammar strings 2023-09-27 22:09:09 +03:00
Cohee
5857823c3b Revert "More Mexican Spanish Translation (#1184)" (#1190)
This reverts commit 02418d2d97.
2023-09-27 09:53:56 +03:00
Call me Jim
02418d2d97 More Mexican Spanish Translation (#1184)
* More spanish translation, fixed typo on index

Praying that typo fix won't mess with the other translations. Changed "idel" for "idle".

* Changed "es-spa" to "es-mx"

For Mexican Spanish. Spanish has a ridiculous amount of variants and the wording that might seem fine to me might be weird or maybe offensive in other variants.

* Trying to translate the View API key pop up

I'm also failing badly

* "Mirostat Mode" was repeated twice. Not anymore.

Also more Mexican Spanish translation.

* Mirostat Tau and Mirostat Era aren't repeated anymore.

* Partially translated AI Response Formatting to es-MX
2023-09-27 09:52:49 +03:00
Cohee
0569b706dc Add Palm model icon 2023-09-26 19:17:50 +03:00
Brian Dashore
bfda5a5492 Extra fixes (#1185) 2023-09-26 09:53:04 +03:00
Cohee
03e5ca054d Limit number of custom stop strings for Palm API 2023-09-25 23:12:14 +03:00
Cohee
3e29d39f05 Fix Palm when streaming is enabled 2023-09-25 20:24:56 +03:00
Cohee
01f14b461f Fix embedded lorebook depths 2023-09-25 20:11:16 +03:00
Cohee
edb79d8c53 Synchronize max depths for plugins 2023-09-25 19:29:24 +03:00
kalomaze
db71b87309 Basic Mirostat option descriptions (#1155)
* Basic miro desc

* Fix formatting

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-25 15:32:53 +03:00
theunstableman
8f426a0184 [FIXED] Add PaLM vectorization source (#1182)
* Add PaLM vectorization source

* FIX

* Add API key check. Fix comment

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-25 15:29:28 +03:00
Cohee
773d42b886 Suspend ooba grammar 2023-09-25 14:07:13 +03:00
RossAscends
1b7c51ebde Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-09-25 18:03:18 +09:00
RossAscends
e2d4f9dc8c streamline WI display 2023-09-25 18:03:10 +09:00
qHiyokop
0a9b595f80 Italian Translation Update #2 (#1177)
Co-authored-by: qHiyokop <caroligattini@gmail.com>
2023-09-25 11:26:46 +03:00
Cohee
86e9974410 Add grammar for ooba llama.cpp 2023-09-24 17:57:00 +03:00
Cohee
423f88a458 Skill issue 2023-09-24 15:04:02 +03:00
Cohee
9bc3e4e47c #1175 Substitute macro params in KCPP grammar 2023-09-24 14:58:35 +03:00
Cohee
1838ca1994 Replace magic numbers with named constants 2023-09-24 14:45:04 +03:00
Brian Dashore
2411006fdb World Info: Add insertion order at depth (#1174)
Depth previously injected entries randomly. This is not ideal for
world info architectures that rely on insertion order to function
properly.

Redo depth injection to have its own parameter and redo how it's
handled in generate.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-09-24 14:41:56 +03:00
Brian Dashore
5421925d6c Add character specific locks for WI and LB (#1170)
* World Info: Add character locking for entries

With the addition of depth, world info has become more important than
ever. However, there is a conflict that can occur when using multiple
world info or lorebooks on a character. Add the ability to lock
entries to a specific character (or characters) if needed.

This allows for adequate separation especially when there are character
cards each with their separate lorebooks that build off of a core lorebook.

Signed-off-by: kingbri <bdashore3@proton.me>

* World Info: Add entry-specific character exclusions

This is the opposite of locking an entry to a specific character.
Exclusions allows the entry to get included for everyone except the
specified characters in the list.

Signed-off-by: kingbri <bdashore3@proton.me>

---------

Signed-off-by: kingbri <bdashore3@proton.me>
2023-09-23 22:35:51 +03:00
Cohee
d9b2b9f753 Bump package version 2023-09-23 20:51:55 +03:00
Cohee
a081f78bd8 (WIP) PaLM API 2023-09-23 20:48:56 +03:00
Cohee
5275e0c904 Full granularity of font scale slider 2023-09-23 12:09:34 +03:00
Cohee
2903167fad Remove unnecessary font-weight definitons in message text styles 2023-09-23 11:51:15 +03:00
RossAscends
a25cb024fe allow blur/shadow sliders to re-enable. 2023-09-23 11:56:24 +09:00
Cohee
6203d82f48 Update docker-publish.yml 2023-09-23 01:12:47 +03:00
Cohee
21ebe0c148 Update docker-publish.yml 2023-09-23 01:09:51 +03:00
Cohee
43510d5626 Update feature-request.yml 2023-09-23 00:38:59 +03:00
Cohee
3cd97b0772 Update bug-report.yml 2023-09-23 00:37:30 +03:00
Cohee
bd72f0eeb0 Update bug-report.yml 2023-09-23 00:37:11 +03:00
Cohee
565327fe1e Merge pull request #1168 from SillyTavern/staging
Staging
2023-09-22 23:07:52 +03:00
Cohee
2e5bbf0445 Fix server crash on local captioning 2023-09-22 23:04:26 +03:00
Cohee
ec6b6ab8d4 Restyle custom CSS input 2023-09-22 21:49:30 +03:00
Randall Fitzgerald
654a34f932 Added custom CSS box to UI Theme settings (#1166)
* Added custom CSS box to UI Theme settings

* Update index.html

Merged against release instead of staging. Whoops.

* Added an import stripper regex so that imports will be removed and show a toastr to inform the user.

* Moved import remove code to applyCustomCSS. Updated localStorage. Not re-running saveSettingsDebounced()
2023-09-22 21:13:58 +03:00
Cohee
3d1312c13a Restyle chat width slider 2023-09-22 16:56:01 +03:00
RossAscends
52cf684444 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-09-22 22:27:08 +09:00
RossAscends
54c37e945b fix themes application, refactor user settings 2023-09-22 22:16:24 +09:00
Cohee
ecab8a6cb4 Fix mes.id and mes.tokens theme checkboxes not saving 2023-09-22 12:44:36 +03:00
RossAscends
b1ab1451ec separate chat and menu background color selection 2023-09-22 16:54:51 +09:00
RossAscends
b84fbed800 Merge pull request #1165 from city-unit/patch-2
Update readme.md
2023-09-22 14:16:40 +09:00
RossAscends
ccf66e6343 Merge pull request #1164 from city-unit/staging
Quick and dirty stat re-creator button
2023-09-22 14:16:29 +09:00
city-unit
5e8fc39735 Update readme.md
add city_unit
2023-09-21 19:59:01 -04:00
city-unit
cd1a8c9224 Quick and dirty stat re-creator button 2023-09-21 17:34:09 -04:00
Cohee
ae4a9a7b14 Remove legacy chat lazy load 2023-09-21 22:07:56 +03:00
Cohee
6ae1b7a72b Filter out "undefined" stopping strings 2023-09-21 22:02:51 +03:00
Cohee
d8380a390a Set numeric limits on WI order/depth 2023-09-21 21:26:30 +03:00
Cohee
5fbb232d69 Fix sprites plugin console spam 2023-09-21 21:15:05 +03:00
Cohee
25d818ecbd Reinsert summary extension prompt instantly when changing position 2023-09-21 21:13:24 +03:00
Cohee
5dd9a87dc9 Add position prop to prompt object 2023-09-21 20:57:28 +03:00
Cohee
857ce2c577 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-09-21 20:46:11 +03:00
Cohee
902acc44a2 Support "before main prompt" extension position in prompt manager 2023-09-21 20:46:08 +03:00
RossAscends
22a0bf9451 fix extension update endpoint 2023-09-22 02:42:06 +09:00
Cohee
ad95be2500 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-09-21 19:30:23 +03:00
Cohee
071b901f87 Add before story position for A/N and summary 2023-09-21 19:30:20 +03:00
kalomaze
ad9382a98c Custom --grammar support [for koboldcpp] (#1161)
* Basic kobold grammar implementation

This is probably jank as all hell, I don't write js, but I think I got it to work.

* No value by default

* Visual cleanup

+ reworded it a bit

* Conditionally enable Grammar based on version flag. Fix layout

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-21 15:21:59 +03:00
RossAscends
49c26f3810 keep input focus while adding tags 2023-09-21 17:17:15 +09:00
RossAscends
86c7a7a058 @Depth insertion for WI Entries 2023-09-21 16:04:34 +09:00
RossAscends
0178c95f6f Merge pull request #1162 from city-unit/feature/branch
Add branching as distinct from bookmarking
2023-09-21 13:57:25 +09:00
city-unit
440ecfc991 Fix toasts 2023-09-21 00:40:38 -04:00
city-unit
e0b5df97c4 Add branching as distinct from bookmarking 2023-09-20 22:48:05 -04:00
Cohee
e3f760a9dd Add assistant postfix to converted ChatML => text completion prompts. 2023-09-20 21:50:14 +03:00
Tony Ribeiro
c9783640c0 Dynamic Audio UI: more controls (#1127)
* Added control to audio ui to select bgm/ambient and lock selection to overide dynamic audio update. Load both assets and char specific audio assets

* correct ambient label and default value when no assets available.

* add padding in audio select

* Correct audio change of background ambient when locked. Updated CSS of audio ui for mobile friendly.

* add space between mixer

* Add checkbox to enable dynamic bgm/ambient switch

* correct background ambient fadout

* continue debuging ambient audio update

* finish debuging

* Fix BGM console error on first run. Reformat plugin code

* Changed audio bgm lock into loop on/off. Added random pick button for bgm. Moved ambient lock button to right.

* Add mouse wheel event handler on volume controls

* Change bgm select to only contain current chat character bgm (solo/group). When enable expression bgm is off, any of the char+asset bgm can play next if not looping.

* Corrected bgm looping at start. Force random to play another song if there is any.

* Format code

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-20 21:36:50 +03:00
RossAscends
f4d1e2a46e Merge pull request #1158 from bdashore3/staging
Add before story string/prompt option
2023-09-20 14:27:27 +09:00
kingbri
b52f71dcce Vectors: Add before story string/prompt option
This makes the most sense for placement of memories. Add the functionality
for other extension prompt placements as well.

Signed-off-by: kingbri <bdashore3@proton.me>
2023-09-20 00:06:43 -04:00
Maks
158aa79aed add model gpt-3.5-turbo-instruct and 0914 variant (#1154) 2023-09-19 23:50:27 +03:00
Daleth Darko
3fe2b21686 Update docker-compose.yml to keep images (#1153) 2023-09-19 21:36:47 +03:00
Cohee
dfbeb41afa #1152 Filter repeating message hashes when inserting vectors 2023-09-19 17:12:22 +03:00
Cohee
3d4054f10e Merge branch 'release' of https://github.com/SillyTavern/SillyTavern into release 2023-09-19 14:08:57 +03:00
Cohee
6c6f914655 Update colab 2023-09-19 14:08:53 +03:00
Cohee
3de5cdd7e8 Apply UI bg color to dialogue popup 2023-09-19 12:21:32 +03:00
RossAscends
eb6e987f55 search bar for user settings panel 2023-09-19 14:19:22 +09:00
Cohee
10f27f41d1 Better Horde error reporting 2023-09-18 18:00:11 +03:00
Cohee
3d83d1d5b7 Add a note that idle timer is in seconds 2023-09-18 17:49:23 +03:00
RossAscends
cfd6a26881 Merge pull request #1150 from city-unit/patch-1
Add idle slash command toggle
2023-09-18 13:59:01 +09:00
city-unit
e92d4a3dbf Add idle slash command toggle 2023-09-18 00:53:23 -04:00
RossAscends
1189734c62 Merge pull request #1148 from city-unit/patch/collab
Fix collab to generate an api key
2023-09-18 13:23:48 +09:00
city-unit
a78bb82b44 Fix collab to generate an api key 2023-09-17 23:53:11 -04:00
Cohee
3a8383ab79 Append continue message timer instead of rewriting 2023-09-18 02:12:06 +03:00
Cohee
dc1c477d62 Uncomment page size selector in WI editor 2023-09-18 01:52:41 +03:00
Cohee
e9c459690f Don't classify when no sprites/default. H-center sprite in non-waifu mode 2023-09-18 01:49:00 +03:00
Cohee
43de36b331 Properly center send buttons 2023-09-18 01:24:29 +03:00
Cohee
39567cf278 Slash command to summarize chat 2023-09-18 01:02:02 +03:00
city-unit
0033090a93 Idle Response / Continuous Generation (#1132)
* Initial idle stuff

* Much closer, can now quietly send as user to get a char response.

* Tweaks

* Better, reset the count of getting a message back, don't send while prompt is waiting.

* Allow selecting who is being prompted

* Comments and cleaup

* Remove char name for the moment (needs something here probably)

* Add random time period and "Always add character's name to prompt" respect

* Tooltips

* Load/unload listeners

* Reduce log spam

* Add inline prompt inclusion

* Add full loud prompting

* Comments

* Fix instruct newline (I think)

* Don't reset count on continue

* add quietToLoud for script.js

* add quietToLoud for slashcommands.js

* Keep instruct directives

* Removed some logging, don't do the Novel formatting if Q2L

* Logspam begone.

* Removed a bit more logging

* Add alignment style

* Reformat files. Add comments

* Reorder extensions

* Fix repeat logic to prompt once then only repeat the number specified

* Make repeat count more clear

---------

Co-authored-by: RossAscends <124905043+RossAscends@users.noreply.github.com>
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-17 22:00:10 +03:00
RossAscends
ef8c347a95 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-09-17 23:00:25 +09:00
RossAscends
535ec8c42d horde model selection QoL 2023-09-17 23:00:23 +09:00
majick
66911160c0 The popular mirostat "Gold/Silver/Bronze" community settings (#1146)
* The popular mirostat "Gold/Silver/Bronze" community settings

These settings have been popular in the community and are good
candidates for defaults.

* Update Miro Bronze.json

* Update Miro Gold.json

* Update Miro Bronze.json

* Update Miro Silver.json

* Rename Kobold presets

* Update textgen presets

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-17 16:39:02 +03:00
Cohee
d861c59f27 Merge branch 'release' into staging 2023-09-17 16:11:27 +03:00
Cohee
938f89cd1a Merge pull request #1143 from Xrystallized/async-getchat
Asynchronously fetch chats
2023-09-17 16:10:59 +03:00
RossAscends
acbd01407d Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-09-17 21:25:20 +09:00
RossAscends
254339af34 justify center default expressions in normal mode 2023-09-17 21:25:19 +09:00
Cohee
6c9cabfb57 Merge pull request #1145 from SillyTavern/release
Remove header #1144
2023-09-17 15:23:25 +03:00
Cohee
359277deb5 Remove header #1144 2023-09-17 15:21:26 +03:00
Cohee
11e7ca76e1 Use simpleGit to get app version 2023-09-17 14:27:41 +03:00
Cohee
dc1121b72a Remove tensorflow vector source. 2023-09-17 14:09:24 +03:00
RossAscends
323493962a fix oversized zoomed avatars again 2023-09-17 19:55:33 +09:00
RossAscends
751c0723dc skill issue: dont hide draggables on every keydown 2023-09-17 19:41:17 +09:00
Xrystal
23b08173ff Asynchronously fetch chats 2023-09-17 13:41:36 +08:00
RossAscends
9f15e67856 make zoomed avatars detectable by Escape hotkey 2023-09-17 05:17:02 +09:00
Cohee
2c84c93f3d Add thumbnails quality config 2023-09-16 21:53:30 +03:00
Cohee
bfdd071001 Move tokenizer endpoint and functions to separate file 2023-09-16 18:48:06 +03:00
Cohee
ab9aa28fe4 Move missed endpoints 2023-09-16 18:03:31 +03:00
Cohee
61995bb33f Move preset management into a separate file 2023-09-16 17:36:54 +03:00
Cohee
38b63b07f5 Extract sprite and custom content endpoints to a separate files. Update constants references 2023-09-16 17:28:28 +03:00
Cohee
d185e143a8 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-09-16 16:39:16 +03:00
Cohee
4e1630c17d Extract endpoints for secrets and assets to separate files 2023-09-16 16:39:07 +03:00
RossAscends
2214f284fa free coloring even Blur turned off 2023-09-16 22:36:05 +09:00
Cohee
6e562bd1ff Extract server endpoints for thumbnails and extensions into separate files 2023-09-16 16:16:48 +03:00
RossAscends
2d774f32b2 custom colors for tag text 2023-09-16 18:37:19 +09:00
RossAscends
5ab449d8a1 missed one. 2023-09-16 15:48:28 +09:00
RossAscends
124658a006 Add Border Color Control 2023-09-16 15:42:26 +09:00
RossAscends
57de6229f9 Merge branch 'staging' of https://github.com/Cohee1207/SillyTavern into staging 2023-09-16 12:50:11 +09:00
RossAscends
e162df67fa partially fix quietPrompts (/sysgen) for Instruct 2023-09-16 12:48:14 +09:00
Cohee
dae09d58d7 Fix scroll top offset for new import flashing 2023-09-16 00:46:27 +03:00
Cohee
6dd09858d4 Don't remove names from the past chat. Fix non-streaming auto-continue.
We took fair criticism from the NovelAI dev.
2023-09-15 23:32:01 +03:00
Cohee
985c2bcfb1 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-09-15 22:26:56 +03:00
Cohee
fc7a4538e9 Cancel auto-continue if user input is not empty 2023-09-15 22:26:53 +03:00
Cohee
72c672c2c2 Merge pull request #1136 from duncannah/fix-docker-post-install
Fix Docker by copying post-install.js into image
2023-09-15 21:59:27 +03:00
Cohee
77c8bc8eb5 Don't trigger auto-continue after quiet gens 2023-09-15 21:49:52 +03:00
duncannah
1edc2b08f2 Fix Docker by copying post-install.js into image 2023-09-15 20:44:48 +02:00
Cohee
d34f7d3e1a Replace multigen with auto-continue 2023-09-15 21:34:41 +03:00
Cohee
eaca6ddaf0 Don't try to resolve unknown tiktoken models 2023-09-15 19:31:17 +03:00
Cohee
aa89a74901 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-09-15 17:59:42 +03:00
Cohee
599904d589 Move NovelAI endpoints to separate file 2023-09-15 17:54:13 +03:00
Chris Kaiser
ba302e4aa0 Added publishing of docker images on release (#1135)
* Added publishing of docker images on release

* Use proper project name

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-15 16:27:42 +03:00
Cohee
0f1a0963fd Merge branch 'release' into staging 2023-09-15 15:06:13 +03:00
RossAscends
1fed8ba4f7 hotswap: instructions if no faves; no placeholders 2023-09-15 17:55:16 +09:00
Cohee
5827f9638f Fix /emote in groups 2023-09-15 01:17:24 +03:00
Cohee
6ad786f348 Add alternative local vectors source.
x5 speed boost!!
2023-09-14 23:40:13 +03:00
Cohee
0cc048cb64 Refactor transformers.js usage 2023-09-14 23:12:33 +03:00
Cohee
cb8d9ac71b Unset SD gen timeout 2023-09-14 21:49:29 +03:00
Cohee
b24509ef43 Visual touchup of custom expressions 2023-09-14 21:41:30 +03:00
Cohee
7553efc308 Custom char expressions 2023-09-14 21:30:02 +03:00
Cohee
9fb4b3425e Costume subfolders 2023-09-14 19:12:54 +03:00
Cohee
182216e711 /costume slash command 2023-09-14 18:37:13 +03:00
Cohee
52891898d2 Pass max length to Kobold GUI settings 2023-09-14 18:20:12 +03:00
Cohee
f6c29c61df Adjust Horde timeout to exactly 20 minutes (Horde's own limit). 2023-09-14 18:10:01 +03:00
Cohee
17a5d629ea Auto-set hotswap slot number based on the screen width. 2023-09-14 15:56:01 +03:00
Cohee
688551ffa6 #1128 Auto-Expand Message Actions 2023-09-14 15:23:51 +03:00
Cohee
ece34dc337 Move default files creation to post-install 2023-09-14 14:21:38 +03:00
Cohee
179de92231 Use transformers WASM binaries from a local folder 2023-09-14 14:11:37 +03:00
deffcolony
c4c962aeb9 issue template (#1126)
* seperated languages into structured folders

i18n.js needs to be connected to index.json so it fetches the common json files

* Update index.json

* New Launcher + security file

* cancel locales feature temporary

* added secrets to backup

* replaced download with winget

* fixed restoring backup bug

fixed bug that creates sillytavern\public folder inside sillytavern\public

* fixes date format

* launcher update + icon

* issue template

* old template no longer needed

* Delete .github/CODE_OF_CONDUCT.md

* Update bug-report.yml

* Update feature-request.yml

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-14 01:35:29 +03:00
Cohee
d0182c47de Fix expression BGM switch 2023-09-14 01:28:44 +03:00
Cohee
0d30d8244f Fix not applying ooba streaming url from server history 2023-09-13 18:07:06 +03:00
Cohee
2e67ebd881 Fix top bar gap (again) 2023-09-13 15:24:55 +03:00
Cohee
d62cdffcc0 Unblock amount_gen in Kobold GUI preset 2023-09-13 15:19:44 +03:00
Cohee
77a28c7131 Don't hide expressions menu if no chat open 2023-09-13 15:19:10 +03:00
Cohee
c60d4e5bb9 Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2023-09-13 13:21:47 +03:00
Cohee
990e08ba2d Fix top bar gap in mobile view 2023-09-13 13:21:42 +03:00
Cohee
bf0cf10403 Update hotswap state on fav 2023-09-13 13:12:19 +03:00
Jason Wu
7a3869c476 Enable Smart Context (ChromaDB) support within OpenAI API (#1125)
* Add JetBrains IDE .idea folder to .gitignore

* Enable Smart Context (ChromaDB) support within OpenAI API
2023-09-13 13:01:56 +03:00
mweldon
e74090139c Add copy to clipboard button on prompt itemization popup (#1124)
* Add copy to clipboard button on prompt itemization popup

* Minor fix for NovelAI Summarize and new bad words
2023-09-13 11:52:37 +03:00
Cohee
09fc42a787 Lock extensions display order in top and context menus 2023-09-13 01:40:01 +03:00
Cohee
c0e5d7efae Save chat scroll position when user input overflows the line 2023-09-13 00:51:21 +03:00
Cohee
66ec17620f Move Horde and SD endpoints into separate files 2023-09-12 20:45:36 +03:00
Cohee
51e2a3afcf Fix not being able to close the gallery on SD gens. 2023-09-12 19:23:33 +03:00
Cohee
abc1555c19 Merge branch 'vectors' into staging 2023-09-12 18:10:47 +03:00
Cohee
6c29879f12 Filter out undefined messages for past chats search 2023-09-12 18:05:37 +03:00
Cohee
2f8f6844fe Merge branch 'vectors' into staging 2023-09-12 15:49:47 +03:00
Cohee
dc4a6e862b Add local caption pipeline to UI plugin 2023-09-12 00:15:21 +03:00
RossAscends
4bf91c7772 clamp zoomed avatar widths to 400px as base 2023-09-12 02:09:18 +09:00
Cohee
004baf7b87 Reserve 3 extra tokens for each chat completion 2023-09-11 17:24:54 +03:00
Cohee
65b4551864 Reserve 3 extra tokens for each chat completion 2023-09-11 17:22:31 +03:00
Cohee
7f55d108cf Don't use talkinghead with local classification model 2023-09-11 13:01:45 +03:00
Cohee
c9a9dab523 Don't synchronize vectors when opening chat 2023-09-11 12:35:34 +03:00
Cohee
f149fc9aaa Endpoint for local captioning pipeline 2023-09-11 04:47:14 +03:00
Cohee
7aeb098212 Fix config access. Add Top K to classification results 2023-09-11 01:49:47 +03:00
Cohee
c76c76410c Add ability to override local classification model 2023-09-11 01:25:22 +03:00
Cohee
5cc6a2dca6 (WIP) Lazier chat loading 2023-09-11 01:07:45 +03:00
Cohee
0bdd350b8d Don't synchronize vectors while streaming 2023-09-10 20:21:23 +03:00
Cohee
9a5e667674 Throttle classification requests during streaming 2023-09-10 20:14:57 +03:00
Cohee
c9d8d7ba64 Fix vectorize all with no chat selected 2023-09-10 19:47:41 +03:00
Cohee
17367f2b17 Bump package version 2023-09-10 19:06:36 +03:00
Cohee
6362f76812 Set default DNS resolution order to IPv4 first 2023-09-10 19:04:11 +03:00
Cohee
599261dc31 Set default DNS resolution order to IPv4 first 2023-09-10 19:02:58 +03:00
Cohee
d19c151669 Add DeepLX translation provider #1111 2023-09-10 18:53:52 +03:00
Cohee
b30d7ad51c Change net workaround for node 20 2023-09-10 18:24:32 +03:00
Cohee
d17ac770e6 Change net workaround for node 20 2023-09-10 18:22:39 +03:00
Cohee
70071312d3 Add OneRingTranslator #521 2023-09-10 17:27:50 +03:00
Cohee
ec23356c99 Move translation endpoints into a separate file 2023-09-10 16:41:36 +03:00
Cohee
98cc969d18 Merge branch 'staging' into vectors 2023-09-10 16:06:15 +03:00
Cohee
dc5deaf47c Mobile doesn't like select2 2023-09-10 14:39:49 +03:00
Cohee
d81c94de0b Fix sort by date 2023-09-10 14:30:29 +03:00
Cohee
e2e32da4e6 Unrestrict console logs display limit 2023-09-10 04:12:14 +03:00
Cohee
0480acebcd #1059 Mancer model selector 2023-09-10 04:08:32 +03:00
Cohee
dbac2704f3 Rename control 2023-09-10 02:44:20 +03:00
Cohee
f8d90c1933 Merge branch 'staging' into vectors 2023-09-10 02:42:42 +03:00
Cohee
3dbdd1258e Don't close the panels when dismissing toasts 2023-09-10 02:30:23 +03:00
Cohee
f92249790f The return of permanent tokens display 2023-09-10 00:58:37 +03:00
Cohee
23951b8c8a Prevent sync and generation at the same time 2023-09-10 00:15:02 +03:00
Cohee
af38971a01 Delete vectors on deleting chats 2023-09-09 22:15:47 +03:00
Cohee
ed6417ebcd Display vectorization error in toast 2023-09-09 21:36:04 +03:00
Cohee
2fa038f91d Add advanced vector controls 2023-09-09 21:26:04 +03:00
Cohee
31beb05aa1 Substitute macro in Novel preamble 2023-09-09 18:19:01 +03:00
Cohee
4cf6a1f7da Cache and sample classification results 2023-09-09 17:31:27 +03:00
Cohee
180dcefe40 Patch onnx to always use wasm 2023-09-09 16:55:54 +03:00
Cohee
307e666c27 onnx runtime to web 2023-09-09 16:42:16 +03:00
Cohee
b605b940eb Replace transformers.js with patched version 2023-09-09 16:29:11 +03:00
Cohee
967a084aad (WIP) Local emotion classification pipeline 2023-09-09 15:14:16 +03:00
Cohee
4d08e3e9be Decrease batch size. Add browser console log 2023-09-09 15:12:54 +03:00
Cohee
da34517943 Merge branch 'staging' into vectors 2023-09-09 01:21:03 +03:00
kalomaze
7ffe3d21f8 Old Default context template (#1121)
Mirrors the old prompting style to a T. Can only be merged after the PR to add macros to the Example Separator + Chat Start is merged.
2023-09-08 23:04:51 +03:00
Cohee
ea01247bcf #1090 Save Kobold/ooba servers history 2023-09-08 22:44:06 +03:00
IkariDevGIT
786b87952e Quick-reply enhancements +fix (#1118)
* Update index.js

* change manual replace to substituteParams

* Update index.js
2023-09-08 21:38:31 +03:00
Cohee
26ddfd1a08 Continue with AltGr+Enter 2023-09-08 21:27:33 +03:00
Cohee
6f3947226f Merge pull request #1116 from ThisIsPIRI/macro
Replace macros in example separator and chat start
2023-09-08 21:10:20 +03:00
Cohee
42fd317188 Merge branch 'staging' into vectors 2023-09-08 16:41:26 +03:00
Cohee
2411b17279 Merge branch 'release' into staging 2023-09-08 16:40:45 +03:00
Cohee
3a3ff89047 Add button to vectorize all chat 2023-09-08 15:25:10 +03:00
Cohee
a5acc7872d Add OpenAI vector source. 2023-09-08 13:57:27 +03:00
ThisIsPIRI
2688d980c1 Replace macros in example separator and chat start 2023-09-08 19:25:17 +09:00
Cohee
3abee9e37a Merge pull request #1115 from SillyTavern/release
Release
2023-09-08 12:48:37 +03:00
Cohee
02bdd56e20 Make printMessages async 2023-09-08 12:10:41 +03:00
Cohee
b5a6257352 Forgot that groups exist 2023-09-08 10:51:59 +03:00
Cohee
408a1fe846 Merge pull request #1112 from IkariDevGIT/gallerycommand
Add command for opening the gallery
2023-09-08 10:44:57 +03:00
RossAscends
44ba1cba59 Merge pull request #1113 from Hakirus/staging
Quick Reply Mod
2023-09-08 09:30:19 +09:00
Cohee
96df705409 Change insertion strategy to an extension block 2023-09-08 01:26:26 +03:00
Cohee
40f95bf842 Fix HypeBot plugin settings not saving 2023-09-08 00:30:31 +03:00
Cohee
9d45c0a018 Add UI plugin for vectors 2023-09-08 00:28:06 +03:00
EvilFear
470da71b3b Update index.js 2023-09-07 17:08:21 -04:00
Cohee
92ab17b58b Fix HypeBot plugin settings not saving 2023-09-07 22:28:53 +03:00
Cohee
8c00f38a1f Add local vectors storage 2023-09-07 21:53:47 +03:00
Cohee
89705391d1 Fix getSpriteFolderName function call 2023-09-07 17:52:37 +03:00
Cohee
bbe52886da Slash command to set sprite / emote. Also allow to do it per click even in online mode 2023-09-07 17:48:12 +03:00
IkariDevGIT
ef68dd07ac Add command for opening the gallery 2023-09-07 16:02:34 +02:00
anmelus
f2cae64b0d Added loop-around for swipe-left when multiple swipes exist (#1104)
* Added loop-around for swipe-left when multiple swipes exist

* Added loop around for alternate greetings in swipe_right(),
Disabled toast for add more alternate greetings

* Debounce saving swipes

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-07 16:45:19 +03:00
EvilFear
868778b079 Update index.js
Quick Reply Mod
2023-09-06 22:27:03 -04:00
Cohee
e681f1f36f #1069 Fix sort by date for v2 cards 2023-09-06 20:59:59 +03:00
Memerlin
1832145645 More spanish translation, fixed typo on index (#1103)
* More spanish translation, fixed typo on index

Praying that typo fix won't mess with the other translations. Changed "idel" for "idle".

* Update index.html

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2023-09-06 18:10:00 +03:00
Cohee
af4f60a4af Update Pygmalion context template. Add Pygmalion instruct template 2023-09-06 17:56:49 +03:00
Cohee
fa147f71a3 Merge branch 'release' into staging 2023-09-06 16:07:04 +03:00
Cohee
902676262a Delete Launcher.bat 2023-09-06 16:02:52 +03:00
208 changed files with 14671 additions and 11303 deletions

90
.github/ISSUE_TEMPLATE/bug-report.yml vendored Normal file
View File

@@ -0,0 +1,90 @@
name: Bug Report 🐛
description: Report something that's not working the intended way. Support requests for external programs (reverse proxies, 3rd party servers, other peoples' forks) will be refused!
title: '[BUG] <title>'
labels: ['bug']
body:
- type: dropdown
id: environment
attributes:
label: Environment
description: Where are you running SillyTavern?
options:
- Self-Hosted (Bare Metal)
- Self-Hosted (Docker)
- Android (Termux)
- Cloud Service (Static)
- Other (Specify below)
validations:
required: true
- type: input
id: system
attributes:
label: System
description: >-
For deployment issues, specify your [distro or OS](https://whatsmyos.com/) and/ or Docker version.
For client-side issues, include your [browser version](https://www.whatsmybrowser.org/)
placeholder: e.g. Firefox 101, Manjaro Linux 21.3.0, Docker 20.10.16
validations:
required: true
- type: input
id: version
attributes:
label: Version
description: What version of SillyTavern are you running?
placeholder: (check User Settings to see the version)
validations:
required: true
- type: textarea
id: desktop
attributes:
label: Desktop Information
description: Please provide details about your desktop environment.
placeholder: |
- Node.js version (if applicable): [run `node --version` in cmd]
- Generation API [e.g. KoboldAI, OpenAI]
- Branch [staging, release]
- Model [e.g. Pygmalion 6b, LLaMa 13b]
validations:
required: false
- type: textarea
id: repro
attributes:
label: Describe the problem
description: Please describe exactly what is not working, include the steps to reproduce, actual result and expected result
placeholder: When doing ABC then DEF, I expect to see XYZ, but I actually see ZYX
validations:
required: true
- type: textarea
id: logs
attributes:
label: Additional info
description: Logs? Screenshots? Yes, please.
placeholder: If the issue happens during build-time, include terminal logs. For run-time errors, include browser logs which you can view in the Dev Tools (F12), under the Console tab. Take care to blank out any personal info.
validations:
required: false
- type: checkboxes
id: idiot-check
attributes:
label: Please tick the boxes
description: Before submitting, please ensure that
options:
- label: You have explained the issue clearly, and included all relevant info
required: true
- label: You've checked that this [issue hasn't already been raised](https://github.com/SillyTavern/SillyTavern/issues?q=is%3Aissue)
required: true
- label: You've checked the [docs](https://docs.sillytavern.app/) ![important](https://img.shields.io/badge/Important!-F6094E)
required: true
- type: markdown
attributes:
value: |-
## Thanks 🙏
Thank you for raising this ticket - in doing so you are helping to make SillyTavern better for everyone.
validations:
required: false

View File

@@ -1,45 +0,0 @@
---
name: Bug report
about: "Create a report to help us improve. PAY ATTENTION: Support requests for external programs (reverse proxies, 3rd party servers, other peoples' forks) will be refused!"
title: "[BUG]"
labels: ''
assignees: ''
---
> **Warning**. Complete **all** the fields below. Otherwise, your bug report will be **ignored**!
**Have you searched for similar [bugs](https://github.com/SillyTavern/SillyTavern/issues?q=)?**
Yes/No
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Logs**
Providing the logs from the browser DevTools console (opened by pressing the F12 key) or SillyTavern command line window will be highly appreciated.
**Desktop (please complete the following information):**
- OS/Device: [e.g. Windows 11]
- Environment: [cloud, local]
- Node.js version (if applicable): [run `node --version` in cmd]
- Browser [e.g. chrome, safari]
- Generation API [e.g. KoboldAI, OpenAI]
- Branch [staging, release]
- Model [e.g. Pygmalion 6b, LLaMa 13b]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,91 @@
name: Feature Request ✨
description: Suggest an idea for future development of this project
title: '[FEATURE_REQUEST] <title>'
labels: ['enhancement']
body:
# Field 1 - Did the user searched for similar requests
- type: dropdown
id: similarRequest
attributes:
label: Have you searched for similar requests?
description:
options:
- 'No'
- 'Yes'
validations:
required: false
# Field 2 - Is it bug-related
- type: textarea
id: issue
attributes:
label: Is your feature request related to a problem? If so, please describe.
description:
placeholder: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
validations:
required: false
# Field 3 - Describe feature
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like
placeholder: An outline of how you would like this to be implemented, include as much details as possible
validations:
required: true
# Field 4 - Describe alternatives
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered
placeholder: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: false
# Field 5 - Additional context
- type: textarea
id: addcontext
attributes:
label: Additional context
placeholder: Add any other context or screenshots about the feature request here.
validations:
required: false
# Field 6 - Priority
- type: dropdown
id: priority
attributes:
label: Priority
description: How urgent is the development of this feature
options:
- Low (Nice-to-have)
- Medium (Would be very useful)
- High (The app does not function without it)
validations:
required: true
# Field 7 - Can the user implement
- type: dropdown
id: canImplement
attributes:
label: Is this something you would be keen to implement?
description: Are you raising this ticket in order to get an issue number for your PR?
options:
- 'No'
- 'Maybe'
- 'Yes!'
validations:
required: false
# Final text
- type: markdown
attributes:
value: |-
## Thanks 🙏
Thank you for your feature suggestion.
Please note that there is no guarantee that your idea will be implemented.
validations:
required: false

View File

@@ -1,23 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[Feature Request] "
labels: ''
assignees: ''
---
**Have you searched for similar [requests](https://github.com/SillyTavern/SillyTavern/issues?q=)?**
Yes/No
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -1,8 +1,8 @@
[English](readme.md) | 中文
![image](https://github.com/SillyTavern/SillyTavern/assets/18619528/8c41a061-7f72-4d2b-9d54-e6d058209e7b)
![image](https://github.com/SillyTavern/SillyTavern/assets/18619528/c2be4c3f-aada-4f64-87a3-ae35a68b61a4)
移动设备界面友好多种人工智能服务或模型支持KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale类似 Galgame 的 老 婆 模 式Horde SD文本系统语音生成世界信息Lorebooks可定制的界面自动翻译和比你所需要的更多的 Prompt。附带扩展服务支持文本绘画生成与语音生成和基于向量数据库 ChromaDB 的聊天信息总结。
移动设备界面友好多种人工智能服务或模型支持KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale类似 Galgame 的 老 婆 模 式Horde SD文本系统语音生成世界信息Lorebooks可定制的界面自动翻译和比你所需要的更多的 Prompt。附带扩展服务支持文本绘画生成与语音生成和基于向量数据库 的聊天信息总结。
基于 TavernAI 1.2.8 的分叉版本
@@ -81,7 +81,6 @@ SillyTavern 支持扩展服务,一些额外的人工智能模块可通过 [Sil
* 在聊天窗口发送图片,并由人工智能解释图片内容
* 文本图像生成5 预设,以及 "自由模式"
* 聊天信息的文字转语音(通过 ElevenLabs、Silero 或操作系统的语音生成)
* ChromaDB 向量数据库,用于更智能的聊天 Prompt
扩展服务的完整功能介绍和使用教程,请参阅 [Docs](https://docs.sillytavern.app/extras/extensions/)。

16
.github/readme.md vendored
View File

@@ -1,15 +1,19 @@
English | [中文](readme-zh_cn.md)
![image](https://github.com/SillyTavern/SillyTavern/assets/18619528/8c41a061-7f72-4d2b-9d54-e6d058209e7b)
![SillyTavern-Banner](https://github.com/SillyTavern/SillyTavern/assets/18619528/c2be4c3f-aada-4f64-87a3-ae35a68b61a4)
Mobile-friendly, Multi-API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale), VN-like Waifu Mode, Horde SD, System TTS, WorldInfo (lorebooks), customizable UI, auto-translate, and more prompt options than you'd ever want or need. Optional Extras server for more SD/TTS options + ChromaDB/Summarize.
Mobile-friendly layout, Multi-API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale), VN-like Waifu Mode, Stable Diffusion, TTS, WorldInfo (lorebooks), customizable UI, auto-translate, and more prompt options than you'd ever want or need + ability to install third-party extensions.
Based on a fork of TavernAI 1.2.8
Based on a fork of [TavernAI](https://github.com/TavernAI/TavernAI) 1.2.8
## Important news!
1. We have created a [Documentation website](https://docs.sillytavern.app/) to answer most of your questions and help you get started.
2. Missing extensions after the update? Since the 1.10.6 release version, most of the previously built-in extensions have been converted to downloadable add-ons. You can download them via the built-in "Download Extensions and Assets" menu in the extensions panel (stacked blocks icon in the top bar).
### Brought to you by Cohee, RossAscends, and the SillyTavern community
NOTE: We have created a [Documentation website](https://docs.sillytavern.app/) to answer most of your questions and help you get started.
### What is SillyTavern or TavernAI?
SillyTavern is a user interface you can install on your computer (and Android phones) that allows you to interact with text generation AIs and chat/roleplay with characters you or the community create.
@@ -80,7 +84,6 @@ SillyTavern has extensibility support, with some additional AI modules hosted vi
* Sending images to chat, and the AI interpreting the content
* Stable Diffusion image generation (5 chat-related presets plus 'free mode')
* Text-to-speech for AI response messages (via ElevenLabs, Silero, or the OS's System TTS)
* ChromaDB vector storage for smarter chat prompt formatting
A full list of included extensions and tutorials on how to use them can be found in the [Docs](https://docs.sillytavern.app/extras/extensions/).
@@ -292,6 +295,7 @@ GNU Affero General Public License for more details.**
* RossAscends' additions: AGPL v3
* Portions of CncAnon's TavernAITurbo mod: Unknown license
* kingbri's various commits and suggestions (<https://github.com/bdashore3>)
* city_unit's extensions and various QoL features (<https://github.com/city-unit>)
* StefanDanielSchwarz's various commits and bug reports (<https://github.com/StefanDanielSchwarz>)
* Waifu mode inspired by the work of PepperTaco (<https://github.com/peppertaco/Tavern/>)
* Thanks Pygmalion University for being awesome testers and suggesting cool features!

45
.github/workflows/docker-publish.yml vendored Normal file
View File

@@ -0,0 +1,45 @@
# This workflow will publish a docker image for every full release to the GitHub package repository
name: Create Docker Image on Release
on:
release:
# Only runs on full releases not pre releases
types: [released]
env:
# This should allow creation of docker images even in forked repositories
# Image name may not contain uppercase characters, so we can not use the repository name
# Creates a string like: ghcr.io/SillyTavern/sillytavern
image_name: ghcr.io/sillytavern/sillytavern
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
# Build docker image using dockerfile and tag it with branch name
# Assumes branch name is the version number
- name: Build the Docker image
run: |
docker build . --file Dockerfile --tag $image_name:${{ github.ref_name }}
# Login into package repository as the person who created the release
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Assumes release is the latest and marks image as such
- name: Docker Tag and Push
run: |
docker tag $image_name:${{ github.ref_name }} $image_name:latest
docker push $image_name:${{ github.ref_name }}
docker push $image_name:latest

3
.gitignore vendored
View File

@@ -26,6 +26,7 @@ public/settings.json
/thumbnails
whitelist.txt
.vscode
.idea/
secrets.json
/dist
/backups/
@@ -35,3 +36,5 @@ content.log
cloudflared.exe
public/assets/
access.log
/vectors/
/cache/

View File

@@ -13,7 +13,7 @@ ENTRYPOINT [ "tini", "--" ]
WORKDIR ${APP_HOME}
# Install app dependencies
COPY package*.json ./
COPY package*.json post-install.js ./
RUN \
echo "*** Install npm packages ***" && \
npm install && npm cache clean --force
@@ -23,7 +23,7 @@ COPY . ./
# Copy default chats, characters and user avatars to <folder>.default folder
RUN \
IFS="," RESOURCES="characters,chats,groups,group chats,User Avatars,worlds" && \
IFS="," RESOURCES="characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings" && \
\
echo "*** Store default $RESOURCES in <folder>.default ***" && \
for R in $RESOURCES; do mv "public/$R" "public/$R.default"; done && \

View File

@@ -70,9 +70,10 @@
"#@markdown * ckpt/sd15 - base SD 1.5\n",
"#@markdown * stabilityai/stable-diffusion-2-1-base - base SD 2.1\n",
"extras_enable_chromadb = True #@param {type:\"boolean\"}\n",
"#@markdown Enables ChromaDB for Infinity Context plugin\n",
"#@markdown Enables ChromaDB module\n",
"\n",
"import subprocess\n",
"import secrets\n",
"\n",
"# ---\n",
"# SillyTavern extras\n",
@@ -115,7 +116,8 @@
"!git clone https://github.com/Cohee1207/tts_samples\n",
"!npm install -g localtunnel\n",
"!pip install -r requirements-complete.txt\n",
"!pip install tensorflow==2.12\n",
"!pip install tensorflow==2.14\n",
"!pip install colorama\n",
"!pip install Flask-Cors\n",
"!pip install Flask-Compress\n",
"!pip install transformers\n",
@@ -130,6 +132,13 @@
"!wget https://github.com/cloudflare/cloudflared/releases/download/2023.5.0/cloudflared-linux-amd64 -O /tmp/cloudflared-linux-amd64\n",
"!chmod +x /tmp/cloudflared-linux-amd64\n",
"\n",
"# Generate a random API key\n",
"api_key = secrets.token_hex(5)\n",
"\n",
"# Write the API key to api_key.txt\n",
"with open('./api_key.txt', 'w') as f:\n",
" f.write(api_key)\n",
"print(f\"API Key generated: {api_key}\")\n",
"\n",
"cmd = f\"python server.py {' '.join(params)}\"\n",
"print(cmd)\n",

View File

@@ -9,13 +9,31 @@ const enableExtensions = true; //Enables support for TavernAI-extras project
const listen = true; // If true, Can be access from other device or PC. otherwise can be access only from hosting machine.
const allowKeysExposure = false; // If true, private API keys could be fetched to the frontend.
const skipContentCheck = false; // If true, no new default content will be delivered to you.
const thumbnailsQuality = 95; // Quality of thumbnails. 0-100
const disableChatBackup = false; // Disables the backup of chat logs to the /backups folder
// If true, Allows insecure settings for listen, whitelist, and authentication.
// Change this setting only on "trusted networks". Do not change this value unless you are aware of the issues that can arise from changing this setting and configuring a insecure setting.
const securityOverride = false;
// Additional settings for extra modules / extensions
const extras = {
// Disables auto-download of models from the HuggingFace Hub.
// You will need to manually download the models and put them into the /cache folder.
disableAutoDownload: false,
// Text classification model for sentiment analysis. HuggingFace ID of a model in ONNX format.
classificationModel: 'Cohee/distilbert-base-uncased-go-emotions-onnx',
// Image captioning model. HuggingFace ID of a model in ONNX format.
captioningModel: 'Xenova/vit-gpt2-image-captioning',
// Feature extraction model. HuggingFace ID of a model in ONNX format.
embeddingModel: 'Xenova/all-mpnet-base-v2',
// GPT-2 text generation model. HuggingFace ID of a model in ONNX format.
promptExpansionModel: 'Cohee/fooocus_expansion-onnx',
};
// Request overrides for additional headers
// Format is an array of objects:
// { hosts: [ "<url>" ], headers: { <header>: "<value>" } }
const requestOverrides = [];
module.exports = {
@@ -32,4 +50,7 @@ module.exports = {
securityOverride,
skipContentCheck,
requestOverrides,
thumbnailsQuality,
extras,
disableChatBackup,
};

View File

@@ -75,9 +75,6 @@
"always_force_name2": true,
"user_prompt_bias": "",
"show_user_prompt_bias": true,
"multigen": false,
"multigen_first_chunk": 50,
"multigen_next_chunks": 30,
"markdown_escape_strings": "",
"fast_ui_mode": false,
"avatar_style": 0,
@@ -167,7 +164,6 @@
"custom_stopping_strings_macro": true,
"fuzzy_search": true,
"encode_tags": false,
"lazy_load": 100,
"ui_mode": 1
},
"extension_settings": {
@@ -410,7 +406,6 @@
"tfs": 1,
"rep_pen_slope": 0,
"single_line": false,
"use_stop_sequence": false,
"streaming_kobold": false,
"sampler_order": [
6,
@@ -420,7 +415,12 @@
3,
4,
5
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"use_default_badwordsids": false,
"grammar": ""
},
"oai_settings": {
"preset_settings_openai": "Default",

View File

@@ -9,4 +9,5 @@ services:
- "8000:8000"
volumes:
- "./config:/home/node/app/config"
- "./user:/home/node/app/public/user"
restart: unless-stopped

View File

@@ -1,7 +1,7 @@
#!/bin/sh
# Initialize missing user files
IFS="," RESOURCES="characters,groups,group chats,chats,User Avatars,worlds"
IFS="," RESOURCES="characters,chats,groups,group chats,User Avatars,worlds,OpenAI Settings,NovelAI Settings,KoboldAI Settings,TextGen Settings"
for R in $RESOURCES; do
if [ ! -e "config/$R" ]; then
echo "Resource not found, copying from defaults: $R"

1170
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -11,11 +11,11 @@
"device-detector-js": "^3.0.3",
"express": "^4.18.2",
"google-translate-api-browser": "^3.0.1",
"bing-translate-api": "^2.9.1",
"gpt3-tokenizer": "^1.1.5",
"ip-matching": "^2.1.2",
"ipaddr.js": "^2.0.1",
"jimp": "^0.22.7",
"jquery": "^3.6.4",
"jimp": "^0.22.10",
"json5": "^2.2.3",
"lodash": "^4.17.21",
"mime-types": "^2.1.35",
@@ -27,8 +27,9 @@
"png-chunks-extract": "^1.0.0",
"response-time": "^2.3.2",
"sanitize-filename": "^1.6.3",
"sillytavern-transformers": "^2.7.3",
"simple-git": "^3.19.1",
"uniqolor": "^1.1.0",
"vectra": "^0.2.2",
"write-file-atomic": "^5.0.1",
"ws": "^8.13.0",
"yargs": "^17.7.1",
@@ -46,11 +47,12 @@
"type": "git",
"url": "https://github.com/SillyTavern/SillyTavern.git"
},
"version": "1.10.3",
"version": "1.10.6",
"scripts": {
"start": "node server.js",
"start-multi": "node server.js --disableCsrf",
"pkg": "pkg --compress Gzip --no-bytecode --public ."
"pkg": "pkg --compress Gzip --no-bytecode --public .",
"postinstall": "node post-install.js"
},
"bin": {
"sillytavern": "./server.js"
@@ -75,6 +77,7 @@
]
},
"devDependencies": {
"jquery": "^3.6.4",
"pkg": "^5.8.1",
"pkg-fetch": "^3.5.2"
}

81
post-install.js Normal file
View File

@@ -0,0 +1,81 @@
/**
* Scripts to be done before starting the server for the first time.
*/
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
/**
* Creates the default config files if they don't exist yet.
*/
function createDefaultFiles() {
const files = {
settings: './public/settings.json',
bg_load: './public/css/bg_load.css',
config: './config.conf',
};
for (const file of Object.values(files)) {
try {
if (!fs.existsSync(file)) {
const defaultFilePath = path.join('./default', path.parse(file).base);
fs.copyFileSync(defaultFilePath, file);
console.log(`Created default file: ${file}`);
}
} catch (error) {
console.error(`FATAL: Could not write default file: ${file}`, error);
}
}
}
/**
* Returns the MD5 hash of the given data.
* @param {Buffer} data Input data
* @returns {string} MD5 hash of the input data
*/
function getMd5Hash(data) {
return crypto
.createHash('md5')
.update(data)
.digest('hex');
}
/**
* Copies the WASM binaries from the sillytavern-transformers package to the dist folder.
*/
function copyWasmFiles() {
if (!fs.existsSync('./dist')) {
fs.mkdirSync('./dist');
}
const listDir = fs.readdirSync('./node_modules/sillytavern-transformers/dist');
for (const file of listDir) {
if (file.endsWith('.wasm')) {
const sourcePath = `./node_modules/sillytavern-transformers/dist/${file}`;
const targetPath = `./dist/${file}`;
// Don't copy if the file already exists and is the same checksum
if (fs.existsSync(targetPath)) {
const sourceChecksum = getMd5Hash(fs.readFileSync(sourcePath));
const targetChecksum = getMd5Hash(fs.readFileSync(targetPath));
if (sourceChecksum === targetChecksum) {
continue;
}
}
fs.copyFileSync(sourcePath, targetPath);
console.log(`${file} successfully copied to ./dist/${file}`);
}
}
}
try {
// 1. Create default config files
createDefaultFiles();
// 2. Copy transformers WASM binaries from node_modules
copyWasmFiles();
} catch (error) {
console.error(error);
}

View File

@@ -1,12 +1,12 @@
{
"temp": 1.15,
"top_k": 0,
"top_p": 0.95,
"top_a": 0,
"typical": 1,
"tfs": 0.8,
"rep_pen": 1.05,
"rep_pen_range": 2048,
"top_p": 0.95,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 0.8,
"rep_pen_slope": 7,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
5,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.59,
"top_k": 0,
"top_p": 1,
"top_a": 0,
"typical": 1,
"tfs": 0.87,
"rep_pen": 1.1,
"rep_pen_range": 2048,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 0.87,
"rep_pen_slope": 0.3,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.8,
"top_k": 100,
"top_p": 0.9,
"top_a": 0,
"typical": 1,
"tfs": 1,
"rep_pen": 1.15,
"rep_pen_range": 2048,
"top_p": 0.9,
"top_a": 0,
"top_k": 100,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 3.4,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.51,
"top_p": 1,
"top_k": 0,
"tfs": 0.99,
"top_a": 0,
"typical": 1,
"rep_pen": 1.2,
"rep_pen_range": 2048,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 0.99,
"rep_pen_slope": 0,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -8,7 +8,6 @@
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0,
"single_line": false,
"sampler_order": [
6,
0,
@@ -17,5 +16,9 @@
4,
2,
5
]
}
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.63,
"top_k": 0,
"top_p": 0.98,
"top_a": 0,
"typical": 1,
"tfs": 0.98,
"rep_pen": 1.05,
"rep_pen_range": 2048,
"top_p": 0.98,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 0.98,
"rep_pen_slope": 0.1,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
5,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.7,
"top_k": 0,
"top_p": 0.5,
"top_a": 0.75,
"typical": 0.19,
"tfs": 0.97,
"rep_pen": 1.1,
"rep_pen_range": 1024,
"top_p": 0.5,
"top_a": 0.75,
"top_k": 0,
"typical": 0.19,
"tfs": 0.97,
"rep_pen_slope": 0.7,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
2,
1,
0
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.7,
"top_k": 0,
"top_p": 1,
"top_a": 0,
"typical": 1,
"tfs": 0.9,
"rep_pen": 1.1,
"rep_pen_range": 1024,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 0.9,
"rep_pen_slope": 0.7,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
4,
5
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.66,
"top_k": 0,
"top_p": 1,
"top_a": 0.96,
"typical": 0.6,
"tfs": 1,
"rep_pen": 1.1,
"rep_pen_range": 1024,
"top_p": 1,
"top_a": 0.96,
"top_k": 0,
"typical": 0.6,
"tfs": 1,
"rep_pen_slope": 0.7,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
0,
2,
3
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.94,
"top_k": 12,
"top_p": 1,
"top_a": 0,
"typical": 1,
"tfs": 0.94,
"rep_pen": 1.05,
"rep_pen_range": 2048,
"top_p": 1,
"top_a": 0,
"top_k": 12,
"typical": 1,
"tfs": 0.94,
"rep_pen_slope": 0.2,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 1.5,
"top_k": 85,
"top_p": 0.24,
"top_a": 0,
"typical": 1,
"tfs": 1,
"rep_pen": 1.1,
"rep_pen_range": 2048,
"top_p": 0.24,
"top_a": 0,
"top_k": 85,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 1.05,
"top_k": 0,
"top_p": 0.95,
"top_a": 0,
"typical": 1,
"tfs": 1,
"rep_pen": 1.1,
"rep_pen_range": 1024,
"top_p": 0.95,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0.7,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
4,
5
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -0,0 +1,24 @@
{
"temp": 1.06,
"rep_pen": 1,
"rep_pen_range": 0,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0.9,
"sampler_order": [
6,
0,
1,
3,
4,
2,
5
],
"mirostat": 2,
"mirostat_tau": 9.61,
"mirostat_eta": 1,
"grammar": ""
}

View File

@@ -0,0 +1,24 @@
{
"temp": 1.17,
"rep_pen": 1,
"rep_pen_range": 0,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0.9,
"sampler_order": [
6,
0,
1,
3,
4,
2,
5
],
"mirostat": 2,
"mirostat_tau": 9.91,
"mirostat_eta": 1,
"grammar": ""
}

View File

@@ -0,0 +1,24 @@
{
"temp": 1.17,
"rep_pen": 1,
"rep_pen_range": 0,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0.9,
"sampler_order": [
6,
0,
1,
3,
4,
2,
5
],
"mirostat": 2,
"mirostat_tau": 9.62,
"mirostat_eta": 1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 1.07,
"top_k": 100,
"top_p": 1,
"top_a": 0,
"typical": 1,
"tfs": 0.93,
"rep_pen": 1.05,
"rep_pen_range": 404,
"top_p": 1,
"top_a": 0,
"top_k": 100,
"typical": 1,
"tfs": 0.93,
"rep_pen_slope": 0.8,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
2,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.44,
"top_k": 0,
"top_p": 1,
"top_a": 0,
"typical": 1,
"tfs": 0.9,
"rep_pen": 1.15,
"rep_pen_range": 2048,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 0.9,
"rep_pen_slope": 6.8,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 1.35,
"top_k": 0,
"top_p": 1,
"top_a": 0,
"typical": 1,
"tfs": 0.69,
"rep_pen": 1.15,
"rep_pen_range": 2048,
"top_p": 1,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 0.69,
"rep_pen_slope": 0.1,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
0,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 1,
"top_k": 0,
"top_p": 0.95,
"top_a": 0,
"typical": 1,
"tfs": 1,
"rep_pen": 1.1,
"rep_pen_range": 600,
"top_p": 0.95,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
4,
5
]
}
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -8,7 +8,6 @@
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0,
"single_line": false,
"sampler_order": [
6,
0,
@@ -17,5 +16,9 @@
4,
2,
5
]
}
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -1,12 +1,12 @@
{
"temp": 0.72,
"tfs": 1,
"top_a": 0,
"top_k": 0,
"top_p": 0.73,
"typical": 1,
"rep_pen": 1.1,
"rep_pen_range": 2048,
"top_p": 0.73,
"top_a": 0,
"top_k": 0,
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0.2,
"sampler_order": [
6,
@@ -16,5 +16,9 @@
3,
1,
4
]
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -8,7 +8,6 @@
"typical": 1,
"tfs": 0.95,
"rep_pen_slope": 0,
"single_line": false,
"sampler_order": [
6,
0,
@@ -17,5 +16,9 @@
4,
2,
5
]
}
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -8,7 +8,6 @@
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0,
"single_line": false,
"sampler_order": [
6,
0,
@@ -17,5 +16,9 @@
4,
2,
5
]
}
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -8,7 +8,6 @@
"typical": 1,
"tfs": 1,
"rep_pen_slope": 0,
"single_line": false,
"sampler_order": [
6,
0,
@@ -17,5 +16,9 @@
4,
2,
5
]
}
],
"mirostat": 0,
"mirostat_tau": 5,
"mirostat_eta": 0.1,
"grammar": ""
}

View File

@@ -0,0 +1,24 @@
{
"temp": 1.06,
"top_p": 1,
"top_k": 0,
"typical_p": 1,
"top_a": 0,
"tfs": 1,
"epsilon_cutoff": 0,
"eta_cutoff": 0,
"rep_pen": 1,
"rep_pen_range": 0,
"no_repeat_ngram_size": 0,
"penalty_alpha": 0,
"num_beams": 1,
"length_penalty": 1,
"min_length": 0,
"encoder_rep_pen": 1,
"do_sample": true,
"early_stopping": false,
"mirostat_mode": 2,
"mirostat_tau": 9.61,
"mirostat_eta": 1,
"rep_pen_size": 0
}

View File

@@ -0,0 +1,24 @@
{
"temp": 1.17,
"top_p": 1,
"top_k": 0,
"typical_p": 1,
"top_a": 0,
"tfs": 1,
"epsilon_cutoff": 0,
"eta_cutoff": 0,
"rep_pen": 1,
"rep_pen_range": 0,
"no_repeat_ngram_size": 0,
"penalty_alpha": 0,
"num_beams": 1,
"length_penalty": 1,
"min_length": 0,
"encoder_rep_pen": 1,
"do_sample": true,
"early_stopping": false,
"mirostat_mode": 2,
"mirostat_tau": 9.91,
"mirostat_eta": 1,
"rep_pen_size": 0
}

View File

@@ -0,0 +1,24 @@
{
"temp": 1.17,
"top_p": 1,
"top_k": 0,
"typical_p": 1,
"top_a": 0,
"tfs": 1,
"epsilon_cutoff": 0,
"eta_cutoff": 0,
"rep_pen": 1,
"rep_pen_range": 0,
"no_repeat_ngram_size": 0,
"penalty_alpha": 0,
"num_beams": 1,
"length_penalty": 1,
"min_length": 0,
"encoder_rep_pen": 1,
"do_sample": true,
"early_stopping": false,
"mirostat_mode": 2,
"mirostat_tau": 9.62,
"mirostat_eta": 1,
"rep_pen_size": 0
}

View File

@@ -0,0 +1 @@
Put blip audio files here

View File

@@ -0,0 +1 @@
Put live2d model folders here

View File

@@ -0,0 +1,11 @@
{
"story_string": "{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{personality}}\n{{/if}}{{#if scenario}}{{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
"example_separator": "",
"chat_start": "",
"always_force_name2": false,
"trim_sentences": false,
"include_newline": false,
"custom_stopping_strings": "[\"\\n\"]",
"custom_stopping_strings_macro": true,
"name": "Adventure"
}

View File

@@ -0,0 +1,6 @@
{
"story_string": "<|im_start|>system\n{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}<|im_end|>",
"chat_start": "",
"example_separator": "",
"name": "ChatML"
}

View File

@@ -0,0 +1,6 @@
{
"story_string": "### Instruction:\nWrite {{char}}'s next reply in this roleplay with {{user}}. Use the provided character sheet and example dialogue for formatting direction and character speech patterns.\n\n{{#if system}}{{system}}\n\n{{/if}}### Character Sheet:\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
"chat_start": "### START ROLEPLAY:",
"example_separator": "### Example:",
"name": "Libra-32B"
}

View File

@@ -0,0 +1,6 @@
{
"story_string": "{{system}}\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{char}}'s description:{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality:{{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{user}}'s persona: {{persona}}\n{{/if}}",
"chat_start": "This is the history of the roleplay:",
"example_separator": "Example of an interaction:",
"name": "Lightning 1.1"
}

View File

@@ -0,0 +1,6 @@
{
"story_string": "[INST] {{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}[/INST]",
"chat_start": "",
"example_separator": "Examples:",
"name": "Mistral"
}

View File

@@ -0,0 +1,6 @@
{
"story_string": "{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Circumstances and context of the dialogue: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
"chat_start": "\nThen the roleplay chat between {{user}} and {{char}} begins.\n",
"example_separator": "This is how {{char}} should talk",
"name": "OldDefault"
}

View File

@@ -1,6 +1,6 @@
{
"name": "Pygmalion",
"story_string": "{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{{char}}}'s Persona: {{description}}\n{{/if}}{{#if personality}}Personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
"chat_start": "<START>",
"example_separator": "<START>"
"story_string": "{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
"chat_start": "",
"example_separator": ""
}

View File

@@ -0,0 +1,6 @@
{
"story_string": "{{#if system}}{{system}}\n{{/if}}{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{personality}}\n{{/if}}{{#if scenario}}{{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}",
"chat_start": "",
"example_separator": "",
"name": "Story"
}

View File

@@ -93,4 +93,118 @@ input.extension_missing[type="checkbox"] {
.update-button {
margin-right: 10px;
display: inline-flex;
}
}
/* Fixes order of settings for extensions */
#extensions_settings,
#extensions_settings2 {
display: flex;
flex-direction: column;
}
/** LEFT COLUMN **/
#extensions_settings>#assets_ui {
order: 1;
}
#extensions_settings>.expression_settings {
order: 2;
}
#extensions_settings>.background_settings {
order: 3;
}
#extensions_settings>.sd_settings {
order: 4;
}
#extensions_settings>#tts_settings {
order: 5;
}
#extensions_settings>#rvc_settings {
order: 6;
}
#extensions_settings>.objective-settings {
order: 7;
}
#extensions_settings>#speech_recognition_settings {
order: 8;
}
#extensions_settings>#audio_settings {
order: 9;
}
/** RIGHT COLUMN **/
#extensions_settings2>.translation_settings {
order: 1;
}
#extensions_settings2>.caption_settings {
order: 2;
}
#extensions_settings2>.quickReplySettings {
order: 3;
}
#extensions_settings2>.idle-settings {
order: 4;
}
#extensions_settings2>#memory_settings {
order: 5;
}
#extensions_settings2>.hypebot_settings {
order: 6;
}
#extensions_settings2>.regex_settings {
order: 7;
}
#extensions_settings2>.vectors_settings {
order: 8;
}
#extensions_settings2>.chromadb_settings {
order: 9;
}
#extensions_settings2>.randomizer_settings {
order: 10;
}
/** WAND MENU **/
#extensionsMenu>#ttsExtensionMenuItem {
order: 1;
}
#extensionsMenu>#sd_gen {
order: 2;
}
#extensionsMenu>#send_picture {
order: 3;
}
#extensionsMenu>#token_counter {
order: 4;
}
#extensionsMenu>#objective-task-manual-check-menu-item {
order: 5;
}
#extensionsMenu>#roll_dice {
order: 6;
}
#extensionsMenu>#translate_chat {
order: 7;
}

View File

@@ -35,7 +35,7 @@
max-width: 90svw;
}
.world_entry_thin_controls,
/* .world_entry_thin_controls, */
#persona-management-block,
#character_popup .flex-container {
flex-direction: column;
@@ -63,6 +63,15 @@
display: none;
}
.world_entry .inline-drawer-toggle {
padding-bottom: 5px;
}
#worldInfoScanningCheckboxes {
flex-flow: row;
flex-wrap: wrap;
}
body {
touch-action: none;
overflow: hidden;
@@ -70,6 +79,10 @@
}
.world_entry_form_control {
/* width: 100%; */
}
.drawer-content {
min-width: unset;
width: 100%;
@@ -78,7 +91,7 @@
position: fixed;
left: 0;
top: 5px;
border: 1px solid var(--grey30);
border: 1px solid var(--SmartThemeBorderColor);
}
#select_chat_popup {
@@ -91,7 +104,6 @@
#top-settings-holder,
#top-bar {
position: fixed;
padding-top: 3px;
width: 100vw;
width: 100svw;
}
@@ -114,18 +126,32 @@
/* ,
#world_popup */
{
max-height: calc(100vh - 36px);
max-height: calc(100svh - 36px);
/*max-height: calc(100vh - 36px);
max-height: calc(100svh - 36px);*/
width: 100% !important;
margin: 0 auto;
max-width: 100%;
left: 0 !important;
resize: none !important;
top: 36px;
top: var(--topBarBlockSize);
}
.wi-settings {
flex-direction: column;
gap: 5px !important;
}
.WIEntryTitleAndStatus,
.WIEntryHeaderControls {
width: 100%;
}
#WIEntryHeaderTitlesPC {
display: none;
}
.WIEntryHeaderTitleMobile {
display: block !important;
}
#character_popup,
@@ -135,15 +161,15 @@
#character_popup,
#send_form {
border: 1px solid var(--grey30);
border: 1px solid var(--SmartThemeBorderColor);
backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2));
max-width: 100dvw;
}
#chat {
border-left: 1px solid var(--grey30);
border-right: 1px solid var(--grey30);
border-bottom: 1px solid var(--grey30);
border-left: 1px solid var(--SmartThemeBorderColor);
border-right: 1px solid var(--SmartThemeBorderColor);
border-bottom: 1px solid var(--SmartThemeBorderColor);
align-items: start;
align-content: start;
overflow-y: auto;
@@ -161,7 +187,9 @@
}
#showRawPrompt,
#groupCurrentMemberPopoutButton {
#copyPromptToClipboard,
#groupCurrentMemberPopoutButton,
#summaryExtensionPopoutButton {
display: none;
}
@@ -175,11 +203,11 @@
width: 100% !important;
max-width: 100% !important;
overflow-y: hidden;
border-left: 1px solid var(--grey30);
border-right: 1px solid var(--grey30);
border-bottom: 1px solid var(--grey30);
border-left: 1px solid var(--SmartThemeBorderColor);
border-right: 1px solid var(--SmartThemeBorderColor);
border-bottom: 1px solid var(--SmartThemeBorderColor);
border-radius: 0 0 20px 20px;
top: 36px !important;
top: var(--topBarBlockSize) !important;
left: 0 !important;
backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2));
}
@@ -265,12 +293,13 @@
display: none;
}
#bg_menu_content {
.bg_list {
width: unset;
}
}
@media screen and (min-width: 1001px) {
#PygOverrides,
#ContextFormatting,
#UI-Theme-Block,
@@ -310,8 +339,7 @@
min-width: 100px;
min-height: 100px;
max-height: 50vh;
max-width: 50vh;
width: 50vw;
max-width: 90vw;
position: absolute;
padding: 0;
filter: drop-shadow(2px 2px 2px #51515199);

View File

@@ -13,7 +13,7 @@
grid-column-end: 4;
width: 100%;
margin: 0.5em 0;
background-image: linear-gradient(90deg, var(--transparent), var(--white30a), var(--transparent));
background-image: linear-gradient(90deg, var(--transparent), var(--SmartThemeBorderColor), var(--transparent));
min-height: 1px;
}
@@ -54,7 +54,7 @@
#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt {
align-items: center;
padding: 0.5em;
border: 1px solid var(--white30a);
border: 1px solid var(--SmartThemeBorderColor);
}
#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt .prompt_manager_prompt_controls {
@@ -109,7 +109,7 @@
#completion_prompt_manager_popup .completion_prompt_manager_prompt {
margin: 1em 0;
padding: 0.5em;
border: 1px solid var(--white30a);
border: 1px solid var(--SmartThemeBorderColor);
}
#completion_prompt_manager_popup .completion_prompt_manager_popup_header {
@@ -265,7 +265,7 @@
top: var(--topBarBlockSize);
box-shadow: 0 0 2px rgba(0, 0, 0, 0.5);
padding: 1em;
border: 1px solid #333333;
border: 1px solid var(--SmartThemeBorderColor);
flex-direction: column;
z-index: 3010 !important;
border-radius: 0 0 20px 20px;

View File

@@ -14,7 +14,8 @@
margin-top: auto;
margin-bottom: auto;
color: rgb(188, 193, 200, 1);
border: 1px solid #333;
border: 1px solid var(--SmartThemeBorderColor);
;
background-color: rgba(0, 0, 0, 0.3);
padding: 6px;
border-radius: 10px;
@@ -61,7 +62,8 @@
#rm_group_add_members {
margin-top: 0.25rem;
margin-bottom: 0.5rem;
border: 1px solid grey;
border: 1px solid var(--SmartThemeBorderColor);
;
border-radius: 10px;
background-color: var(--black30a);
}
@@ -76,6 +78,7 @@
#rm_group_members:empty {
width: 100%;
padding: 0.5em 0;
}
#rm_group_members:empty::before {
@@ -224,4 +227,5 @@
.group_member .avatar {
flex-shrink: 0;
}
flex-basis: auto;
}

View File

@@ -6,7 +6,7 @@
/* Customize the dropdown */
.select2-dropdown {
background-color: var(--SmartThemeBlurTintColor);
border: 1px solid var(--white30a) !important;
border: 1px solid var(--SmartThemeBorderColor) !important;
border-radius: 10px;
box-shadow: 0 0 5px black;
text-shadow: 0px 0px calc(var(--shadowWidth) * 1px) var(--SmartThemeShadowColor);
@@ -19,11 +19,24 @@
color: var(--SmartThemeBodyColor);
}
.select2-container .select2-search__field {
opacity: 0.8;
}
.select2-container .select2-selection--single .select2-selection__rendered {
color: var(--SmartThemeBodyColor);
line-height: revert;
padding-left: unset;
}
.select2-container .select2-results>.select2-results__options {
max-height: 300px;
}
.select2-container .select2-selection--multiple .select2-selection__choice__remove {
padding: revert;
border-right: 1px solid var(--white30a);
border-right: 1px solid var(--SmartThemeBorderColor);
font-size: 1.1em;
}
.select2-container .select2-selection--multiple .select2-selection__choice__display {
@@ -34,7 +47,7 @@
.select2-search__field {
background-color: var(--black30a);
color: var(--SmartThemeBodyColor);
border: 1px solid var(--white30a);
border: 1px solid var(--SmartThemeBorderColor);
border-radius: 7px;
font-family: "Noto Sans", "Noto Color Emoji", sans-serif;
padding: 3px 5px;
@@ -58,27 +71,30 @@
background-color: var(--SmartThemeBodyColor);
}
.select2-container .select2-selection--multiple {
.select2-container .select2-selection--multiple,
.select2-container .select2-selection--single {
background-color: var(--black30a);
color: var(--SmartThemeBodyColor);
border: 1px solid var(--white30a);
border: 1px solid var(--SmartThemeBorderColor);
border-radius: 7px;
font-family: "Noto Sans", "Noto Color Emoji", sans-serif;
padding: 3px 5px;
}
.select2-container.select2-container--focus .select2-selection--multiple {
border: 1px solid var(--white30a);
.select2-container.select2-container--focus .select2-selection--multiple,
.select2-container.select2-container--focus .select2-selection--single {
border: 1px solid var(--SmartThemeBorderColor);
}
.select2-container .select2-selection--multiple .select2-selection__choice {
.select2-container .select2-selection--multiple .select2-selection__choice,
.select2-container .select2-selection--single .select2-selection__choice {
border-radius: 5px;
border-style: solid;
border-width: 1px;
box-sizing: border-box;
color: var(--SmartThemeBodyColor);
background-color: var(--black30a);
border-color: var(--white30a);
border-color: var(--SmartThemeBorderColor);
font-size: calc(var(--mainFontSize) - 5%);
text-shadow: none !important;
}
@@ -114,12 +130,13 @@
margin-top: -7px;
width: 14px;
height: 14px;
border: 1px solid var(--white30a);
border: 1px solid var(--SmartThemeBorderColor);
background-color: var(--SmartThemeBlurTintColor);
border-radius: 2px;
}
.select2-container .select2-selection--multiple .select2-selection__choice__remove {
.select2-container .select2-selection--multiple .select2-selection__choice__remove,
.select2-container .select2-selection--single .select2-selection__choice__remove {
color: var(--SmartThemeBodyColor);
}

View File

@@ -6,6 +6,16 @@
color: var(--fullred);
}
.highlighted {
color: black;
background-color: yellow;
text-shadow: none !important;
}
.m-t-0 {
margin-top: 0;
}
.m-t-1 {
margin-top: 1em;
}
@@ -99,6 +109,10 @@
align-self: start;
}
.gap3px {
gap: 3px !important;
}
.gap5px {
gap: 5px !important;
}
@@ -120,6 +134,10 @@
max-width: 100px;
}
.width100px {
width: 100px;
}
.widthUnset {
width: unset;
}
@@ -147,6 +165,10 @@
font-weight: 600;
}
.textAlignCenter {
text-align: center;
}
.margin-right-10px {
margin-right: 10px;
}
@@ -230,6 +252,10 @@
overflow: hidden;
}
.padding0 {
padding: 0;
}
.padding5 {
padding: 5px;
}
@@ -262,6 +288,10 @@
flex-flow: column;
}
.flexFlowRow {
flex-flow: row;
}
.wideMinContent {
width: min-content;
}
@@ -362,6 +392,11 @@
cursor: pointer;
}
input:disabled,
textarea:disabled {
cursor: not-allowed;
}
.debug-red {
border: 1px solid red !important;
}
@@ -390,6 +425,11 @@
font-size: calc(var(--mainFontSize) * 0.6) !important;
}
.paddingBottom5px {
padding: unset;
padding-bottom: 5px;
}
.paddingTopBot5 {
padding: 5px 0;
}
@@ -417,4 +457,4 @@
.opacity1 {
opacity: 1 !important;
}
}

View File

@@ -109,6 +109,7 @@
overflow: hidden;
text-align: left;
white-space: nowrap;
text-shadow: none !important;
}
.tags_inline .tag {
@@ -128,10 +129,16 @@
cursor: pointer;
opacity: 0.6;
filter: brightness(0.8);
transition: opacity 200ms;
}
.tags_view,
.open_alternate_greetings {
.rm_tag_filter .tag:hover {
opacity: 1;
filter: brightness(1);
}
.tags_view {
margin: 0;
aspect-ratio: 1 / 1;
}

View File

@@ -117,7 +117,7 @@ body.big-avatars .avatar img {
height: 90px;
object-fit: cover;
object-position: center;
border: 1px solid var(--black30a);
border: 1px solid var(--SmartThemeBorderColor);
border-radius: 10px;
}
@@ -191,7 +191,7 @@ body.bubblechat .mes {
border-radius: 10px;
background-color: var(--SmartThemeBotMesBlurTintColor);
margin-bottom: 5px;
border: 1px solid var(--white30a);
border: 1px solid var(--SmartThemeBorderColor);
}
body.bubblechat .mes[is_user="true"] {
@@ -257,31 +257,16 @@ body.no-blur #bg_custom {
}
body:not(.bubblechat).no-blur #chat,
body.no-blur #top-bar,
body.no-blur #send_form {
background-color: var(--SmartThemeBlurTintColor) !important;
}
body.no-blur #options,
body.no-blur .ui-widget-content,
body.no-blur #floatingPrompt,
body.no-blur #extensionsMenu,
body.no-blur .list-group,
body.no-blur #character_popup,
body.no-blur #world_popup,
body.no-blur #dialogue_popup,
body.no-blur #select_chat_popup,
body.no-blur .drawer-content,
body.no-blur .select2-results__options {
background-color: black !important;
}
/* wAIfu mode*/
body.waifuMode #top-bar {
border-radius: 0 0 20px 20px;
border: 1px solid var(--grey30a);
border: 1px solid var(--SmartThemeBorderColor);
}
body.waifuMode #sheld {
@@ -292,7 +277,7 @@ body.waifuMode #sheld {
}
body.waifuMode #chat {
border-top: 1px solid var(--grey30a);
border-top: 1px solid var(--SmartThemeBorderColor);
border-radius: 20px 20px 0 0;
}
@@ -343,8 +328,7 @@ body.movingUI .drawer-content,
body.movingUI #expression-holder,
body.movingUI .zoomed_avatar,
body.movingUI .draggable,
body.movingUI #floatingPrompt,
body.movingUI #groupMemberListPopout {
body.movingUI #floatingPrompt {
resize: both;
}
@@ -353,6 +337,7 @@ body.movingUI #groupMemberListPopout {
height: 120px;
margin-top: 0;
top: 50px;
justify-content: center;
}
/*No Text Shadows Mode*/
@@ -360,3 +345,11 @@ body.movingUI #groupMemberListPopout {
body.noShadows * {
text-shadow: none !important;
}
body.expandMessageActions .mes .mes_buttons .extraMesButtons {
display: inherit !important;
}
body.expandMessageActions .mes .mes_buttons .extraMesButtonsHint {
display: none !important;
}

View File

@@ -101,7 +101,7 @@
height: auto;
margin-top: 0;
margin-bottom: 0;
min-height: 32px;
min-height: calc(var(--mainFontSize) + 13px);
}
.delete_entry_button {
@@ -157,6 +157,37 @@
width: 10em;
}
#world_info_search {
width: 10em;
#world_info_search,
#world_info_sort_order {
width: 7em;
}
.wi-card-entry {
border: 1px solid;
border-color: var(--SmartThemeBorderColor);
border-radius: 10px;
padding: 0 5px;
margin-bottom: 1px;
}
.world_entry {
transition: opacity 500ms;
}
.disabledWIEntry {
opacity: 0.4;
filter: grayscale(1);
}
.disabledWIEntry:not(input):hover {
opacity: 1;
filter: grayscale(0.5);
}
.height32px {
height: 32px;
}
.WIEntryHeaderTitleMobile {
display: none;
}

View File

@@ -20,7 +20,7 @@
"select": "选择 ",
"context size(tokens)": "上下文大小 (Toekns)",
"unlocked": "解锁",
"only select modls support context sizes greater than 2048 tokens. proceed only is you know you're doing": "只有在选定的模型支持大于 2048 个Toekn 时可以选择启用,在启用该选项时,你应该知道自己在做什么。",
"Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "只有在选定的模型支持大于 4096 个Toekn 时可以选择启用,在启用该选项时,你应该知道自己在做什么。",
"rep.pen": "频率惩罚",
"rep.pen range": "存在惩罚",
"temperature": "温度设置",
@@ -70,6 +70,9 @@
"Streaming": "流式响应",
"Display the response bit by bit as it is generated.": "在生成响应时逐位显示响应。",
"When this is off, responses will be displayed all at once when they are complete.": "关闭此选项后,响应将在完成后立即显示所有响应。",
"Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "每个请求仅生成一行(仅限 KoboldAI被 KoboldCpp 忽略)。",
"Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "禁止序列结束 (EOS) 代币(使用 KoboldCpp也可能使用 KoboldAI 禁止其他代币)。",
"Good for story writing, but should not be used for chat and instruct mode.": "适合故事写作,但不应用于聊天和指导模式。",
"Enhance Definitions": "增强定义",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "使用 OpenAI 知识库增强公众人物和已知虚构人物的定义",
"Wrap in Quotes": "用引号包裹",
@@ -158,9 +161,6 @@
"Disabled for all models": "对所有模型禁用",
"Automatic (based on model name)": "自动(基于型号名称)",
"Enabled for all models": "所有模型启用",
"Multigen": "Multigen",
"First chunk (tokens)": "第一个区块Tokens",
"Next chunks (tokens)": "接下来的区块Tokens",
"Anchors Order": "锚点顺序",
"Character then Style": "字符然后样式",
"Style then Character": "样式然后字符",
@@ -574,7 +574,7 @@
"select": "選択 ",
"context size(tokens)": "コンテキストサイズ(トークン数)",
"unlocked": "解除",
"only select modls support context sizes greater than 2048 tokens. proceed only is you know you're doing": "2048トークンより大きいコンテキストサイズをサポートするのは、一部のモデルのみです。このオプションを変更する前に、自分が何をしているかを理解してください。",
"Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "4096トークンより大きいコンテキストサイズをサポートするのは、一部のモデルのみです。このオプションを変更する前に、自分が何をしているかを理解してください。",
"rep.pen": "Rep. Pen.",
"rep.pen range": "Rep. Pen. 範囲",
"temperature": "温度",
@@ -623,6 +623,9 @@
"Streaming": "ストリーミング",
"Display the response bit by bit as it is generated.": "生成されると、レスポンスをビットごとに表示します。",
"When this is off, responses will be displayed all at once when they are complete.": "これをオフにすると、レスポンスは完了時に一度にすべて表示されます。",
"Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "リクエストごとに 1 行のみ生成します (KoboldAI のみ、KoboldCpp では無視されます)。",
"Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "End-of-Sequence (EOS) トークンを禁止します (KoboldCpp を使用し、場合によっては KoboldAI を使用する他のトークンも禁止します)。",
"Good for story writing, but should not be used for chat and instruct mode.": "ストーリーを書くのには適していますが、チャットや指示モードには使用しないでください。",
"Enhance Definitions": "定義を強化",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "公共人物および既知の架空のキャラクターの定義を強化するためにOAIの知識ベースを使用する",
"Wrap in Quotes": "引用符で囲む",
@@ -710,9 +713,6 @@
"Disabled for all models": "すべてのモデルで無効",
"Automatic (based on model name)": "自動(モデル名に基づく)",
"Enabled for all models": "すべてのモデルで有効",
"Multigen": "マルチジェン",
"First chunk (tokens)": "最初のチャンク(トークン)",
"Next chunks (tokens)": "次のチャンク(トークン)",
"Anchors Order": "アンカーオーダー",
"Character then Style": "キャラクター、次にスタイル",
"Style then Character": "スタイル、次にキャラクター",
@@ -1128,7 +1128,7 @@
"select": "선택",
"context size(tokens)": "맥락 크기(토큰수)",
"Unlocked Context Size": "한도 해제",
"only select modls support context sizes greater than 2048 tokens. proceed only is you know you're doing": "토큰 2049개 이상의 맥락을 사용할 수 있는 모델에서만 사용하세요. 파워유저 옵션이에요.",
"Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "토큰 4096개 이상의 맥락을 사용할 수 있는 모델에서만 사용하세요. 파워유저 옵션이에요.",
"rep.pen": "반복 페널티",
"rep.pen range": "반복 페널티 범위",
"temperature": "온도",
@@ -1178,6 +1178,9 @@
"Streaming": "스트리밍",
"Display the response bit by bit as it is generated.": "답변이 생성되는 도중 실시간으로 출력합니다.",
"When this is off, responses will be displayed all at once when they are complete.": "이 옵션을 해지하면 답변이 완성된 다음 한 번에 출력합니다.",
"Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "요청당 한 줄만 생성합니다(KoboldAI만 해당, KoboldCpp에서는 무시됨).",
"Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "EOS(End-of-Sequence) 토큰(KoboldCpp 및 KoboldAI의 다른 토큰 포함)을 금지합니다.",
"Good for story writing, but should not be used for chat and instruct mode.": "스토리 작성에 적합하지만 채팅 및 교육 모드에는 사용하면 안 됩니다.",
"Enhance Definitions": "똑똑해지기",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "OpenAI 지식 데이터베이스를 활용하여 공공인물, 유명한 캐릭터 등 이미 알려진 정보를 사용합니다.",
"Wrap in Quotes": "자동 따옴표",
@@ -1264,9 +1267,6 @@
"Disabled for all models": "모든 모델에 비활성화",
"Automatic (based on model name)": "모델 서식 자동탐지",
"Enabled for all models": "모든 모델에 활성화",
"Multigen": "다수답변 생성",
"First chunk (tokens)": "첫 말뭉치(토큰수)",
"Next chunks (tokens)": "다음 말뭉치(토큰수)",
"Anchors Order": "Anchors Order",
"Character then Style": "캐릭터 다음 스타일",
"Style then Character": "스타일 다음 캐릭터",
@@ -1686,7 +1686,7 @@
"select": "Выбрать",
"context size(tokens)": "Размер контекста (в токенах)",
"unlocked": "Неограниченный",
"only select modls support context sizes greater than 2048 tokens. proceed only is you know you're doing": "Только отдельные модели поддерживают контекст, превышающий 2048 токенов. Используйте только если понимаете, что делаете.",
"Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "Только отдельные модели поддерживают контекст, превышающий 4096 токенов. Используйте только если понимаете, что делаете.",
"rep.pen": "Rep. Pen.",
"rep.pen range": "Диапазон Rep. Pen.",
"temperature": "Температура",
@@ -1748,6 +1748,9 @@
"Streaming": "Потоковый вывод текста",
"Display the response bit by bit as it is generated.": "Отображать ответ по кускам в процессе генерации.",
"When this is off, responses will be displayed all at once when they are complete.": "Если данная функция отключена, ответ будет отображен полностью после генерации.",
"Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Генерируйте только одну строку для каждого запроса (только KoboldAI, игнорируется KoboldCpp).",
"Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Запретите токен конца последовательности (EOS) (с помощью KoboldCpp и, возможно, также других токенов с помощью KoboldAI).",
"Good for story writing, but should not be used for chat and instruct mode.": "Подходит для написания историй, но не должен использоваться в режиме чата и инструктирования.",
"Enhance Definitions": "Улучшенная узнаваемость",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Позволяет использовать базу знаний, улучшающую узнаваемость ИИ публичных лиц и вымышленных персонажей",
"Wrap in Quotes": "Заключать в кавычки",
@@ -1873,9 +1876,6 @@
"Disabled for all models": "Выключено для всех моделей",
"Automatic (based on model name)": "Автоматически (выбор по названию модели)",
"Enabled for all models": "Включить для всех моделей",
"Multigen": "Мултиген",
"First chunk (tokens)": "Первый отрезок (в токенах)",
"Next chunks (tokens)": "Следующий отрезок (в токенах)",
"Anchors Order": "Порядок Anchors",
"Character then Style": "Персонаж после Стиля",
"Style then Character": "Стиль после Персонажа",
@@ -1910,7 +1910,6 @@
"Waifu Mode": "!!!РЕЖИМ ВАЙФУ!!!",
"Message Timer": "Таймер сообщений",
"Model Icon": "Показать значки модели",
"Lazy Chat Loading": "Ленивая загрузка чата",
"# of messages (0 = disabled)": "# сообщений (0 = отключено)",
"Advanced Character Search": "Расширенный поиск персонажей",
"Allow {{char}}: in bot messages": "Показывать {{char}}: в ответах",
@@ -2312,8 +2311,8 @@
"response legth(tokens)": "lunghezza risposta (in Token)",
"select": "seleziona",
"context size(tokens)": "dimensione contesto (in Token)",
"unlocked": "sbloccato",
"only select modls support context sizes greater than 2048 tokens. proceed only is you know you're doing": "Seleziona il supporto ai modls soltanto se le dimenzioni contesto sono più grandi di 2048 token. Procedi soltanto se sai cosa stai facendo.",
"unlocked": "Sblocca",
"Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "Seleziona il supporto ai modls soltanto se le dimenzioni contesto sono più grandi di 4096 token. Procedi soltanto se sai cosa stai facendo.",
"rep.pen": "rep.pen",
"rep.pen range": "rep.pen range",
"temperature": "temperature",
@@ -2343,7 +2342,7 @@
"Typical P": "Typical P",
"Do Sample": "Do Sample",
"Add BOS Token": "Aggiungi BOS Token",
"Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative.": "Aggiungi bos_token all'inizio di un prompt. Disabilitarlo potrebbe rendere le risposte più creative.",
"Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative.": "Aggiungi bos_token all'inizio di un prompt. Disattivarlo potrebbe rendere le risposte più creative.",
"Ban EOS Token": "Blocca EOS Token",
"Ban the eos_token. This forces the model to never end the generation prematurely": "Blocca eos_token. Questo costringe il modello a non concludere prematuramente la generazione del testo.",
"Skip Special Tokens": "Salta Token speciali",
@@ -2363,6 +2362,9 @@
"Streaming": "Streaming",
"Display the response bit by bit as it is generated.": "Mostra la risposta mano a mano che viene generata.",
"When this is off, responses will be displayed all at once when they are complete.": "Quando questa casella è disattivata, le risposte vengono mostrate soltanto una volta che il testo è stato ultimato.",
"Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Genera solo una riga per richiesta (solo KoboldAI, ignorata da KoboldCpp).",
"Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Bandire il token End-of-Sequence (EOS) (con KoboldCpp, ed eventualmente anche altri token con KoboldAI).",
"Good for story writing, but should not be used for chat and instruct mode.": "Buono per scrivere storie, ma non dovrebbe essere usato per la modalità chat e istruzioni.",
"Enhance Definitions": "Migliora le definizioni",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Usa la conoscenza di OpenAI per migliorare le definizioni di personaggi pubblici e personaggi immaginari famosi.",
"Wrap in Quotes": "Invia i messaggi tra virgolette",
@@ -2377,7 +2379,7 @@
"Impersonation prompt": "Prompt per l'impersonificazione dell'utente",
"Prompt that is used for Impersonation function": "Prompt utilizzato per la funzione di impersonificazione dell'utente",
"Logit Bias": "Logit Bias",
"Helps to ban or reenforce the usage of certain words": "Aiuta a bloccare o rinforzare l'utilizzo di alcuni tipi di parole.",
"Helps to ban or reenforce the usage of certain words": "Aiuta a disincentivare o rinforzare l'utilizzo di alcuni tipi di parole.",
"View / Edit bias preset": "Mostra / Modifica bias preset",
"Add bias entry": "Aggiungi voce bias",
"Jailbreak activation message": "Messaggio d'attivazione del Jailbreak",
@@ -2391,7 +2393,7 @@
"Use Horde": "Usa Horde",
"API url": "Url API",
"Register a Horde account for faster queue times": "Crea un account Horde per tempi di attesa più brevi",
"Learn how to contribute your idle GPU cycles to the Hord": "Impara come fare in modo di usare i tuoi cicli GPU in idle per contribuire a Horde",
"Learn how to contribute your idle GPU cycles to the Hord": "Impara come utilizzare i tuoi cicli GPU in idle per contribuire a Horde",
"Adjust context size to worker capabilities": "Sistema la grandezza del contesto alle sue capacità operazionali",
"Adjust response length to worker capabilities": "Sistema la lunghezza della risposta alle sue capacità operazionali",
"API key": "Chiave API",
@@ -2404,15 +2406,17 @@
"Novel API key": "NovelAI API key",
"Follow": "Segui",
"these directions": "questi suggerimenti",
"to get your NovelAI API key.": "per acquisire la chiave API di NovelAI.",
"to get your NovelAI API key.": "per ottenere la chiave API di NovelAI.",
"Enter it in the box below": "Inserisci la chiave all'interno della casella qui sotto",
"Novel AI Model": "Modello di NovelAI",
"Euterpe": "Euterpe",
"Krake": "Krake",
"No connection": "Nessuna connessione",
"oobabooga/text-generation-webui": "oobabooga/text-generation-webui",
"Make sure you run it with": "assicurati di farlo partire con",
"Blocking API url": "Bloccare l'indirizzo API",
"Blocking API url": "Blocca l'indirizzo API",
"Streaming API url": "Streaming dell'indirizzo API",
"to get your OpenAI API key.": "per acquisire la tua chiave API di OpenAI.",
"to get your OpenAI API key.": "per ottenere la tua chiave API di OpenAI.",
"OpenAI Model": "Modello di OpenAI",
"View API Usage Metrics": "Mostra le metriche di utilizzo delle API",
"Bot": "Bot",
@@ -2421,14 +2425,14 @@
"View hidden API keys": "Mostra le chiavi API nascoste",
"Advanced Formatting": "Formattazione avanzata",
"AutoFormat Overrides": "Sovrascrittura AutoFormat",
"Disable description formatting": "Disabilita la formattazione della descrizione",
"Disable personality formatting": "Disabilita la formattazione della personalità",
"Disable scenario formatting": "Disabilita la formattazione dello scenario",
"Disable example chats formatting": "Disabilita la formattazione degli esempi di chat",
"Disable chat start formatting": "Disabilita la formattazione della chat iniziale",
"Disable description formatting": "Disattiva la formattazione della descrizione",
"Disable personality formatting": "Disattiva la formattazione della personalità",
"Disable scenario formatting": "Disattiva la formattazione dello scenario",
"Disable example chats formatting": "Disattiva la formattazione degli esempi di chat",
"Disable chat start formatting": "Disattiva la formattazione della chat iniziale",
"Custom Chat Separator": "Separatore di chat personalizzato",
"Instruct mode": "Modalità istruzione",
"Enabled": "Abilita",
"Enabled": "Attiva",
"Wrap Sequences with Newline": "Ogni sequenza viene rimandata a capo",
"Include Names": "Includi i nomi",
"System Prompt": "Prompt di sistema",
@@ -2445,11 +2449,12 @@
"Sentencepiece (LLaMA)": "Sentencepiece (LLaMA)",
"Token Padding": "Token Padding",
"Always add character's name to prompt": "Aggiungi sempre il nome del personaggio al prompt",
"Keep Example Messages in Prompt": "Mantieni i messaggi d'esempio nel Prompt",
"Keep Example Messages in Prompt": "Mantieni i messaggi d'esempio dal prompt",
"Remove Empty New Lines from Output": "Rimuovi le linee di testo vuote dall'output",
"Disabled for all models": "Disabilita per tutti i modelli",
"Pygmalion Formatting": "Formattazione Pygmalion",
"Disabled for all models": "Disattiva per tutti i modelli",
"Automatic (based on model name)": "Automatico (basato sul nome del modello)",
"Enabled for all models": "Abilita per tutti i modelli",
"Enabled for all models": "Attiva per tutti i modelli",
"Multigen": "Multigen",
"First chunk (tokens)": "Primo pacchetto in Token",
"Next chunks (tokens)": "Pacchetto successivo in Token",
@@ -2468,35 +2473,35 @@
"About soft prompts": "Riguardo i prompt leggeri",
"None": "None",
"User Settings": "Settaggi utente",
"UI Customization": "Personalizzazione dell'interfaccia grafica",
"Avatar Style": "Stile dell'avatar",
"UI Customization": "Personalizzazione UI",
"Avatar Style": "Stile avatar",
"Circle": "Cerchio",
"Rectangle": "Rettangolo",
"Chat Style": "Stile della Chat",
"Default": "Predefinito",
"Bubbles": "Bolle",
"Chat Width (PC)": "Lunghezza della chat (PC)",
"No Blur Effect": "Nessun effetto di sfocatura",
"No Text Shadows": "Nessuna ombreggiatura del testo",
"No Blur Effect": "Nessun effetto sfocatura",
"No Text Shadows": "Nessuna ombreggiatura testo",
"Waifu Mode": "♡ Modalità Waifu ♡",
"Message Timer": "Timer del messaggio",
"Characters Hotswap": "Hotswap dei personaggi",
"Movable UI Panels": "Pannelli dell'interfaccia grafica movibili",
"Message Timer": "Timer messaggio",
"Characters Hotswap": "Hotswap personaggi",
"Movable UI Panels": "Pannelli UI movibili",
"Reset Panels": "Ripristina i pannelli",
"UI Colors": "Colori UI",
"Main Text": "Testo principale",
"Italics Text": "Testo in Italic",
"Quote Text": "Testo citato",
"Shadow Color": "Colore dell'ombreggiatura",
"Shadow Color": "Colore ombreggiatura",
"FastUI BG": "FastUI BG",
"Blur Tint": "Tinta della sfocatura",
"Font Scale": "Grandezza del font",
"Blur Strength": "Intensità della sfocatura",
"Text Shadow Width": "Larghezza dell'ombreggiatura del testo",
"UI Theme Preset": "Tema dell'interfaccia grafica",
"Power User Options": "Opzioni Power User",
"Blur Tint": "Tinta sfocatura",
"Font Scale": "Grandezza font",
"Blur Strength": "Intensità sfocatura",
"Text Shadow Width": "Larghezza ombreggiatura testo",
"UI Theme Preset": "Tema UI",
"Power User Options": "Opzioni utente avanzate",
"Swipes": "Swipes",
"Background Sound Only": "Soltanto il suono di background",
"Background Sound Only": "Soltanto suono di background",
"Auto-load Last Chat": "Carica automaticamente l'ultima chat",
"Auto-save Message Edits": "Salva automaticamente i messaggi editati",
"Auto-fix Markdown": "Correggi automaticamente il testo per la formattazione in Markdown",
@@ -2504,13 +2509,13 @@
"Allow {{user}}: in bot messages": "Permetti {{user}} nei messaggi del bot",
"Auto-scroll Chat": "scorrimento automatico della chat",
"Render Formulas": "Renderizza le formule",
"Send on Enter": "Inviare premendo Invio",
"Always disabled": "Sempre disabilitato",
"Send on Enter": "Inoltrare premendo Invio",
"Always disabled": "Sempre disattivato",
"Automatic (desktop)": "Automatico (desktop)",
"Always enabled": "Sempre abilitato",
"Always enabled": "Sempre attivato",
"Name": "Nome",
"Your Avatar": "Il tuo avatar",
"Extensions API:": "Estensioni delle API:",
"Extensions API:": "Estensioni API aggiuntive:",
"SillyTavern-extras": "SillyTavern-extras",
"Auto-connect": "Connessione automatica",
"Active extensions": "Estensione attiva",
@@ -2520,8 +2525,8 @@
"Group Controls": "Controlli del gruppo",
"Group reply strategy": "Organizzazione per le risposte del gruppo",
"Natural order": "Ordine naturale",
"List order": "Lista dell'ordine",
"Allow self responses": "Permetti la risposta automatica",
"List order": "Ordine lista",
"Allow self responses": "Permetti risposta automatica",
"Auto Mode": "Modalità automatica",
"Add Members": "Aggiungi membri",
"Current Members": "Membri correnti",
@@ -2562,7 +2567,7 @@
"After Char": "Dopo Char",
"Insertion Order": "Ordine di inserimento",
"Tokens:": "Token",
"Disable": "Disabilita",
"Disable": "Disattiva",
"${characterName}": "${nomePersonaggio}",
"CHAR": "CHAR",
"is typing": "sta scrivendo...",
@@ -2576,6 +2581,7 @@
"Regenerate": "Rigenera",
"PNG": "PNG",
"JSON": "JSON",
"WEBP": "WEBP",
"presets": "preset",
"Message Sound": "Suono del messaggio",
"Author's Note": "Note d'autore",
@@ -2583,21 +2589,21 @@
"Replace empty message": "Sostituisci i messaggi vuoti",
"Send this text instead of nothing when the text box is empty.": "Quando il campo di testo è vuoto, invia invece questo messaggio.",
"NSFW avoidance prompt": "NSFW avoidance prompt",
"Prompt that is used when the NSFW toggle is off": "Prompt utilizzato quando la casella NSFW è disabilitata.",
"Prompt that is used when the NSFW toggle is off": "Prompt utilizzato quando la casella NSFW è disattivata.",
"Advanced prompt bits": "Advanced prompt bits",
"World Info format template": "Formattazione del modello 'Info Mondo'",
"World Info format template": "Formato template 'Info Mondo'",
"Wraps activated World Info entries before inserting into the prompt. Use {0} to mark a place where the content is inserted.": "Seleziona le informazioni del mondo attualmente attive prima di inserirle nel prompt. Usa {0} per segnalare dove vuoi che il contenuto venga inserito all'interno del prompt.",
"Unrestricted maximum value for the context slider": "Valore massimo illimitato per la grandezza del contesto.",
"Chat Completion Source": "Sorgente IA per la Chat",
"Avoid sending sensitive information to the Horde.": "Evita di inviare informazioni sensibili e personali a Horde",
"Review the Privacy statement": "Leggi l'informativa sulla privacy",
"Learn how to contribute your idel GPU cycles to the Horde": "Impara come fare in modo di usare i tuoi cicli GPU in idle per contribuire a Horde",
"Learn how to contribute your idel GPU cycles to the Horde": "Impara come utilizzare i tuoi cicli GPU in idle per contribuire a Horde",
"Trusted workers only": "Utilizza solo utenti di fiducia",
"For privacy reasons, your API key will be hidden after you reload the page.": "Per motivi di sicurezza la tua chiave API verrà oscurata dopo aver ricaricato la pagina.",
"-- Horde models not loaded --": "-- Modelli Horde non caricati --",
"Example: http://127.0.0.1:5000/api ": "Esempio: http://127.0.0.1:5000/api",
"No connection...": "Nessuna connessione",
"Get your NovelAI API Key": "Acquisici la chiave API per NovelAI",
"Get your NovelAI API Key": "Ottieni la chiave API per NovelAI",
"KoboldAI Horde": "KoboldAI Horde",
"Text Gen WebUI (ooba)": "Text Gen WebUI (ooba)",
"NovelAI": "NovelAI",
@@ -2611,7 +2617,7 @@
"Presets": "Preset",
"Separator": "Separatore",
"Start Reply With": "Inizia la risposta con",
"Show reply prefix in chat": "Mostra il prefix di risposta nella chat",
"Show reply prefix in chat": "Mostra il prefisso della risposta nella chat",
"Worlds/Lorebooks": "Mondi/Lorebook",
"Active World(s)": "Mondi Attivi",
"Character Lore Insertion Strategy": "Strategia per l'inserimento della lore all'interno del contesto dell'IA",
@@ -2635,40 +2641,40 @@
"Order:": "Ordine",
"Probability:": "Probabilità:",
"Delete Entry": "Elimina Voce",
"User Message Blur Tint": "Sfocatura tinta per i messaggi dell'utente",
"AI Message Blur Tint": "Sfocatura tinta per i messaggi dell'IA",
"User Message Blur Tint": "Sfocatura sfondo utente",
"AI Message Blur Tint": "Sfocatura sfondo IA",
"Chat Style:": "Stile Chat",
"Chat Width (PC):": "Larghezza riquadro chat (PC)",
"Chat Timestamps": "Timestamp della chat",
"Message IDs": "ID del Messaggio",
"Prefer Character Card Prompt": "Prompt preferito per la 'Carta Personaggio'",
"Prefer Character Card Jailbreak": "Jailbreak preferito per la 'Carta Personaggio'",
"Prefer Character Card Prompt": "Priorità prompt 'Carta Personaggio'",
"Prefer Character Card Jailbreak": "Priorità jailbreak 'Carta Personaggio'",
"Press Send to continue": "Premi Invio per continuare",
"Log prompts to console": "Registro prompt a console",
"Never resize avatars": "Non ridimensionare mai l'avatar",
"Show avatar filenames": "Mostra il nome del file dell'avatar",
"Import Card Tags": "Importa i tag della carta",
"Confirm message deletion": "Conferma l'eliminazione del messaggio",
"Spoiler Free Mode": "Modalità Spoiler Free",
"Spoiler Free Mode": "Modalità spoiler free",
"Auto-swipe": "Auto-swipe",
"Minimum generated message length": "Lunghezza minima per i messaggi generati",
"Blacklisted words": "Parole nella lista nera",
"Blacklisted word count to swipe": "Numero delle parole nella lista nera",
"Reload Chat": "Ricarica la chat",
"Not Connected": "Non connesso",
"Persona Management": "Gestione della proprio alterego",
"Persona Description": "Descrizione dell'alterego",
"Persona Management": "Gestione del proprio alter ego",
"Persona Description": "Descrizione alter ego",
"Before Character Card": "Prima della 'Carta Personaggio'",
"After Character Card": "Dopo la 'Carta Personaggio'",
"Top of Author's Note": "Inizio delle note d'autore",
"Bottom of Author's Note": "Fine delle note d'autore",
"Top of Author's Note": "All'inizio delle note d'autore",
"Bottom of Author's Note": "Alla fine delle note d'autore",
"How do I use this?": "Cos'è e cosa posso farci?",
"More...": "Mostra di più...",
"Link to World Info": "Collegamento alle 'Info Mondo'",
"Link to World Info": "Collegamento 'Info Mondo'",
"Import Card Lore": "Importa la storia dell carta",
"Scenario Override": "Sovrascrizione dello scenario",
"Scenario Override": "Sovrascrittura dello scenario",
"Rename": "Rinomina",
"Character Description": "Descrizione del personaggio",
"Character Description": "Descrizione personaggio",
"Creator's Notes": "Note del Creatore",
"A-Z": "A-Z",
"Z-A": "Z-A",
@@ -2683,13 +2689,13 @@
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Inserisci {{original}} all'intero della casella per includere i rispettivi prompt predefiniti dai settaggi di sistema.",
"Main Prompt": "Prompt Principale",
"Jailbreak": "Jailbreak",
"Creator's Metadata (Not sent with the AI prompt)": "Metadata del creatore (Non viene inviata all'IA)",
"Creator's Metadata (Not sent with the AI prompt)": "Metadata del creatore (Non viene inviato all'IA)",
"Everything here is optional": "Tutto ciò che si trova qui è opzionale",
"Created by": "Creato da",
"Character Version": "Versione del personaggio",
"Tags to Embed": "Tag da incorporare",
"How often the character speaks in group chats!": "La frequenza con la quale il personaggio parla all'interno delle chat di gruppo!",
"Important to set the character's writing style.": "Esso è importante per impostare lo stile di scrittura del personaggio",
"Important to set the character's writing style.": "È importante per impostare lo stile di scrittura del personaggio",
"ATTENTION!": "ATTENZIONE!",
"Samplers Order": "Ordine dei campionatori",
"Samplers will be applied in a top-down order. Use with caution.": "L'ordine dei campioni va dall'alto verso il basso. Usalo con cautela.",
@@ -2713,9 +2719,9 @@
"Enter your name": "Inserisci il tuo nome",
"Name this character": "Dai un nome a questo personaggio",
"Search / Create Tags": "Cerca / Crea tag",
"Describe your character's physical and mental traits here.": "Descrivi qui le caratteristiche fisiche e psicologiche del tuo personaggio.",
"Describe your character's physical and mental traits here.": "Descrivi le caratteristiche fisiche e psicologiche del tuo personaggio.",
"This will be the first message from the character that starts every chat.": "Questo sarà il primo messaggio che il personaggio utilizzerà all'inizio di ogni chat.",
"Chat Name (Optional)": "Nome della chat(Opzionale)",
"Chat Name (Optional)": "Nome della chat (opzionale)",
"Filter...": "Filtro...",
"Search...": "Cerca...",
"Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "Ogni elemento racchiuso qui dentro sostituirà il prompt principale predefinito usato da questo personaggio. (v2 spec: system_prompt)",
@@ -2725,7 +2731,7 @@
"(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(Descrivi il bot, scrivi dei suggerimenti o informa riguardo i modelli IA su cui è stato testato. Questo verrà mostrato nella lista personaggio)",
"(Write a comma-separated list of tags)": "(Scrivi una lista di tag separati dalle virgole)",
"(A brief description of the personality)": "(Scrivi una breve descrizione della sua personalità)",
"(Circumstances and context of the interaction)": "(Scrivi le circostanze e il contesto della scena)",
"(Circumstances and context of the interaction)": "(Scrivi le circostanze e il contesto dello scenario)",
"(Examples of chat dialog. Begin each example with START on a new line.)": "(Esempi di dialogo. Inizia ogni esempio con START quando vai a capo.)",
"Injection text (supports parameters)": "Injection text (supporta i parametri)",
"Injection depth": "Profondità dell'Injection",
@@ -2738,14 +2744,14 @@
"Not connected to API!": "Non connesso a nessuna API!",
"AI Response Configuration": "Configurazione della risposta dell'IA",
"AI Configuration panel will stay open": "Se clicchi il lucchetto, il pannello di configurazione dell'IA rimarrà aperto",
"Update current preset": "Aggiorna il preset corrente",
"Update current preset": "Aggiorna preset corrente",
"Create new preset": "Crea un nuovo preset",
"Import preset": "Importa preset",
"Export preset": "Esporta preset",
"Delete the preset": "Cancella il preset",
"Delete the preset": "Cancella preset",
"Inserts jailbreak as a last system message": "Inserisci il Jailbreak come ultimo messaggio del sistema",
"NSFW block goes first in the resulting prompt": "Il blocco al contenuto NSFW spunterà per primo nel prompt corrente",
"Enables OpenAI completion streaming": "Abilita 'streaming completion' per OpenAI",
"Enables OpenAI completion streaming": "Attiva 'streaming completion' per OpenAI",
"Wrap user messages in quotes before sending": "Mette tra il messaggio dell'utente in virgolette prima di inviare il messaggio",
"Restore default prompt": "Ripristina il prompt predefinito",
"New preset": "Nuovo preset",
@@ -2781,18 +2787,18 @@
"Change Background Image": "Cambia l'immagine dello sfondo",
"Extensions": "Estensioni",
"Click to set a new User Name": "Clicca qui per impostare un nuovo nome utente",
"Click to lock your selected persona to the current chat. Click again to remove the lock.": "Clicca qui per bloccare l'alterego selezionato alla chat corrente. Clicca di nuovo per rimuovere il blocco.",
"Click to lock your selected persona to the current chat. Click again to remove the lock.": "Clicca qui per bloccare l'alter ego selezionato alla chat corrente. Clicca di nuovo per rimuovere il blocco.",
"Click to set user name for all messages": "Clicca qui per impostare il nome utente per tutti i messaggi",
"Create a dummy persona": "Crea una tuo alterego fittizio",
"Create a dummy persona": "Crea una tuo alter ego fittizio",
"Character Management": "Gestione personaggio",
"Locked = Character Management panel will stay open": "Se clicchi il lucchetto, il pannello della Gestione personaggio rimarrà aperto",
"Locked = Character Management panel will stay open": "Se clicchi il lucchetto, il pannello di gestione del personaggio rimarrà aperto",
"Select/Create Characters": "Seleziona/Crea Personaggi",
"Token counts may be inaccurate and provided just for reference.": "Il conteggio dei Token potrebbe risultare inaccurato, perciò è da utilizzarsi solo come una approssimazione.",
"Click to select a new avatar for this character": "Clicca qui per selezionare un nuovo avatar per questo personaggio",
"Add to Favorites": "Aggiungi ai Favoriti",
"Advanced Definition": "Definizioni Avanzate",
"Add to Favorites": "Aggiungi ai favoriti",
"Advanced Definition": "Definizioni avanzate",
"Character Lore": "Storia del personaggio",
"Export and Download": "Esporta e Scarica",
"Export and Download": "Esporta e scarica",
"Duplicate Character": "Duplica il personaggio",
"Create Character": "Crea un personaggio",
"Delete Character": "Elimina un personaggio",
@@ -2836,8 +2842,8 @@
"Move message up": "Muovi il messaggio in alto",
"Move message down": "Muovi il messaggio in basso",
"Enlarge": "Ingrandisci",
"Temporarily disable automatic replies from this character": "Disabilita temporaneamente le risposte in automatico da parte di questo personaggio",
"Enable automatic replies from this character": "Abilita le risposte in automatico da parte di questo personaggio",
"Temporarily disable automatic replies from this character": "Disattiva temporaneamente le risposte in automatico da parte di questo personaggio",
"Enable automatic replies from this character": "Attiva le risposte in automatico da parte di questo personaggio",
"Trigger a message from this character": "Innesca un messaggio di risposta da parte di questo personaggio",
"Move up": "Muovi sopra",
"Move down": "Muovi sotto",
@@ -2850,13 +2856,13 @@
"Ask AI to write your message for you": "Chiedi all'IA di scrivere un messaggio al posto tuo",
"Continue the last message": "Continua l'ultimo messaggio in chat",
"Bind user name to that avatar": "Lega il nome utente a questo avatar",
"Select this as default persona for the new chats.": "Seleziona questo alterego come predefinito per tutte le nuove chat",
"Change persona image": "Cambia l'immagine del tuo alterego",
"Delete persona": "Elimina il tuo alterego",
"--- Pick to Edit ---": "--- Scegli per modificare ---",
"Add text here that would make the AI generate things you don't want in your outputs.": "Scrivi qui ciò che non vuoi l'IA generi nel suo output.",
"Select this as default persona for the new chats.": "Seleziona questo alter ego come predefinito per tutte le nuove chat",
"Change persona image": "Cambia l'immagine del tuo alter ego",
"Delete persona": "Elimina il tuo alter ego",
"--- Pick to Edit ---": "--- Seleziona per modificare ---",
"Add text here that would make the AI generate things you don't want in your outputs.": "Scrivi ciò che non vuoi l'IA generi nel suo output.",
"write short replies, write replies using past tense": "Scrivi risposte brevi, scrivi risposte usando il passato",
"Alert if your world info is greater than the allocated budget.": "Questo avvisa nel momento in cui le 'Info Mondo' consumano più di quanto allocato nel budget.",
"Alert if your world info is greater than the allocated budget.": "Ti avvisa nel momento in cui 'Info Mondo' consuma più di quanto allocato nel budget.",
"Clear your cookie": "Cancella i cookie",
"Restore new group chat prompt": "Ripristina il prompt della nuova chat di gruppo",
"Save movingUI changes to a new file": "Salva i cambiamenti apportati alla posizione dei pannelli dell'UI (MovingUI) in un nuovo file",
@@ -2867,25 +2873,25 @@
"Prompts": "Prompt",
"Tokens": "Token",
"Reset current character": "Ripristina il personaggio attuale",
"(0 = disabled)": "(0 = disabilitato)",
"1 = disabled": "1 = disabilitato",
"(0 = disabled)": "(0 = disattivato)",
"1 = disabled": "1 = disattivato",
"Activation Regex": "Attivazione Regex",
"Active World(s) for all chats": "Attiva i Mondi per tutte le chat",
"Add character names": "Aggiungi i nomi dei personaggi",
"Add Memo": "Aggiungi note",
"Advanced Character Search": "Ricerca dei personaggi avanzata",
"Advanced Character Search": "Ricerca personaggi avanzata",
"Aggressive": "Aggressivo",
"AI21 Model": "Modello AI21",
"Alert On Overflow": "Avviso in caso di Overflow",
"Allow fallback routes": "Permetti fallback routes",
"Allow fallback routes Description": "Permetti la descrizione di fallback routes",
"Allow fallback routes Description": "Permetti descrizione fallback routes",
"Alt Method": "Metodo Alt",
"Alternate Greetings": "Alterna i saluti",
"Alternate Greetings Hint": "Suggerimenti per i saluti alternati",
"Alternate Greetings Subtitle": "Sottotitoli per i saluti alternati",
"Alternate Greetings Hint": "Premi la croce in alto a destra per generare una nuova casella di testo",
"Alternate Greetings Subtitle": "Qui saranno presenti i saluti alternativi",
"Assistant Prefill": "Assistant Prefill",
"Banned Tokens": "Token banditi",
"Blank": "In bianco",
"Blank": "Nuovo",
"Browser default": "Predefinito del browser",
"Budget Cap": "Limite budget",
"CFG": "CFG",
@@ -2903,7 +2909,7 @@
"Example Separator": "Separatore d'esempio",
"Exclude Assistant suffix": "Escludi il suffisso assistente",
"Exclude the assistant suffix from being added to the end of prompt.": "Esclude il suffisso assistente dall'essere aggiunto alla fine del prompt.",
"Force for Groups and Personas": "Forzalo per gruppi e alterego",
"Force for Groups and Personas": "Forzalo per gruppi e alter ego",
"Global Negatives": "Global Negatives",
"In Story String / Chat Completion: After Character Card": "Nella stringa narrativa / Chat Completion: Dopo la 'Carta Personaggio'",
"In Story String / Chat Completion: Before Character Card": "Nella stringa narrativa / Chat Completion: Prima della 'Carta Personaggio",
@@ -2925,7 +2931,7 @@
"Mirostat LR": "Mirostat LR",
"Mirostat Mode": "Mirostat Mode",
"Mirostat Tau": "Mirostat Tau",
"Model Icon": "Icona del modello",
"Model Icon": "Icona modello",
"Most tokens": "Token massimi",
"MovingUI Preset": "Preset MovingUI",
"Negative Prompt": "Prompt negativo",
@@ -2953,7 +2959,7 @@
"Set at the beginning of the chat history to indicate that a new chat is about to start.": "Impostato all'inizio della cronologia chat per indicare che una nuova chat sta per iniziare.",
"Set at the beginning of the chat history to indicate that a new group chat is about to start.": "Impostato all'inizio della cronologia chat per indicare che un nuova chat di gruppo sta per iniziare.",
"Show External models (provided by API)": "Mostra modelli esterni (Forniti dall'API)",
"Show Notifications Show notifications on switching personas": "Mostra una notifica quando l'alterego viene cambiato",
"Show Notifications Show notifications on switching personas": "Mostra una notifica quando l'alter ego viene cambiato",
"Show tags in responses": "Mostra i tag nelle risposte",
"Story String": "Stringa narrativa",
"Text Adventure": "Avventura testuale",
@@ -2961,23 +2967,101 @@
"Toggle Panels": "Interruttore pannelli",
"Top A Sampling": "Top A Sampling",
"Top K Sampling": "Top K Sampling",
"UI Language": "Linguaggio interfaccia grafica",
"UI Language": "Linguaggio UI",
"Unlocked Context Size": "Sblocca dimensione contesto",
"Usage Stats": "Statistiche di utilizzo",
"Use AI21 Tokenizer": "Utilizza il Tokenizer di AI21",
"Use API key (Only required for Mancer)": "Utilizza la chiave API (Necessario soltanto per Mancer)",
"Use character author's note": "Utilizza le note d'autore del personaggio",
"Use character CFG scales": "Utilizza CFG scales del personaggio",
"Use Proxy password field instead. This input will be ignored.": "Utilizza il campo del password proxy al suo posto. Questo input verrà ignorato.",
"Use Proxy password field instead. This input will be ignored.": "Utilizza il campo della password proxy al suo posto. Questo input verrà ignorato.",
"Use style tags to modify the writing style of the output": "Utilizza lo stile delle tag per modificare lo stile di scrittura in output",
"Use the appropriate tokenizer for Jurassic models, which is more efficient than GPT's.": "Utilizza il tokenizer appropiato per i modelli giurassici, visto che è più efficente di quello di GPT.",
"Used if CFG Scale is unset globally, per chat or character": "Usato se CFG Scale non è settato globalmente, per le chat o per i personaggi",
"Used if CFG Scale is unset globally, per chat or character": "È utilizzato soltanto se CFG Scale non è settato globalmente, per le chat o per i personaggi",
"Very aggressive": "Esageratamente aggressivo",
"Very light": "Esageratamente leggero",
"Welcome to SillyTavern!": "Benvenuto in SillyTavern!",
"Will be used as a password for the proxy instead of API key.": "Verrà usato come password per il proxy invece che la chiave API.",
"Window AI Model": "Modello Window AI",
"Your Persona": "Il tuo alterego"
"Your Persona": "Il tuo alter ego",
"Start Claude's answer with...": "Inizia la risposta di Claude con...",
"# of messages (0 = disabled)": "'# dei messaggi (0 = disattivato)'",
"Advanced": "Avanzata",
"AI Module": "Modulo IA",
"AI21 API Key": "Chiave API AI21",
"Allow NSFW images from Horde": "Permetti immagini NSFW da Horde",
"Anthropic's developer console": "Console di sviluppo per Anthropic",
"Avoid spending Anlas": "Evita di spendere Anlas",
"Click Authorize below or get the key from": "Clicca Autorizza qui sotto oppure ottieni la chiave da",
"Connect": "Connettiti",
"Context Order": "Ordine del contesto",
"Continue nudge": "Continua nudge (spinta)",
"Convert to Persona": "Converti in alter ego",
"Debug Menu": "Menu Debug",
"Debug Warning": "Avviso Debug",
"Enable simple UI mode": "Avvia la modalità UI semplice",
"Enter": "Invio",
"Example Dialogues": "Dialoghi d'esempio",
"Example: https://neuro.mancer.tech/webui/MODEL/api": "Esempio: https://neuro.mancer.tech/webui/MODEL/api",
"Example: ws://127.0.0.1:5005/api/v1/stream": "Esempio: ws://127.0.0.1:5005/api/v1/stream",
"Execute": "Esegui",
"Get it here:": "Ottienila qui:",
"Get your key from": "Ottieni la tua chiave da",
"Hint": "Suggerimento",
"If you are using:": "Se stai usando:",
"In Story String / Prompt Manager": "Stringa narrativa / Gestione prompt",
"In-Chat Position not affected": "La posizione in-chat non è influenzata",
"Karras (not all samplers supported)": "Karras (Non tutti i sampler sono supportati)",
"Learn how to contribute your idle GPU cycles to the Horde": "Impara come utilizzare i tuoi cicli GPU in idle per contribuire a Horde",
"Models": "Modelli",
"New Chat": "Nuova chat",
"New Example Chat": "Esempio nuova chat",
"New Group Chat": "Nuova chat di gruppo",
"Not connected...": "Non connesso...",
"Not connected...": "Non connesso...",
"Opus tier": "Opus tier",
"Output Sequence": "Sequenza Output",
"Permanent": "Permanente",
"Scale API Key": "Chiave API Scale",
"Send names in the ChatML objects.": "Condividi a ChatML i nomi dei partecipanti.",
"Show impersonated replies in groups": "Mostra risposte impersonate nelle chat di gruppo",
"Show Message Token Count": "Mostra costo in Token per messaggio",
"Show notifications on switching personas": "Mostra notifiche quando l'alter ego cambia",
"Simple": "Semplice",
"Slack and Poe cookies will not work here, do not bother trying.": "I cookie di Slack e Poe non funzioneranno qui, non perdere tempo provandoci.",
"Strip Example Messages from Prompt": "Rimuovi i messaggi d'esempio dal prompt",
"Summary": "Riassunto",
"to use anonymous mode.": "per utilizzare la modalità in anonimo.",
"UI Mode": "Modalità UI",
"Use style tags to modify the writing style of the output.": "Utilizza i tag di stile per modificare la forma di scrittura in uscita.",
"Utility Prompts": "Utility Prompt",
"View my Kudos": "Mostra i miei Kudos",
"View Remaining Credits": "Mostra crediti rimanenti",
"World Info Format Template": "Formato template 'Info Mondo'",
"Wraps activated World Info entries before inserting into the prompt.": "Seleziona le informazioni del mondo attualmente attive prima di inserirle nel prompt.",
"Local server classification": "Classificazione server locale",
"Create Branch": "Crea nuovo ramo",
"removes blur from window backgrounds": "Elimina la sfocatura dagli sfondi delle finestre",
"Allow for Chat Completion APIs": "Permetti per le 'Chat Completion API'",
"at Depth": "a profondità",
"Auto-Continue": "Risposta continua",
"Auto-Expand Message Actions": "Espansione automatica dei messaggi d'azione",
"Automatic (PC)": "Automatico (PC)",
"Character Exclusion": "Estromissione del personaggio",
"Chat Background": "Sfondo chat",
"Custom CSS": "CSS personalizzato",
"Depth:": "Profondità:",
"Disabled": "Disattivato",
"Filter to Character(s)": "Filtra per personaggio",
"Grammar": "Grammatica",
"Miscellaneous": "Varie",
"PaLM API Key": "Chiave API PaLM",
"Relax message trim in Groups": "Troncatura leggera dei messaggi nelle chat di gruppo",
"Target length (tokens)": "Lunghezza target (in token)",
"Theme Toggles": "Interruttore tema",
"Type in the desired custom grammar (GBNF).": "Scrivi la tua grammatica personalizzata (GBNF).",
"UI Background": "Sfondo UI",
"UI Border": "Bordo UI"
},
"nl-nl": {
"clickslidertips": "klikregel tips",
@@ -2991,7 +3075,7 @@
"select": "selecteer",
"context size(tokens)": "contextgrootte (in tokens)",
"unlocked": "ontgrendeld",
"only select modls support context sizes greater than 2048 tokens. proceed only is you know you're doing": "Selecteer alleen modellen die contextgroottes groter dan 2048 tokens ondersteunen. Ga alleen verder als je weet wat je doet!",
"Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "Selecteer alleen modellen die contextgroottes groter dan 4096 tokens ondersteunen. Ga alleen verder als je weet wat je doet!",
"rep.pen": "rep.pen",
"rep.pen range": "rep.pen bereik",
"temperature": "temperatuur",
@@ -3041,6 +3125,9 @@
"Streaming": "Streaming",
"Display the response bit by bit as it is generated.": "Toon het antwoord stukje bij beetje terwijl het wordt gegenereerd.",
"When this is off, responses will be displayed all at once when they are complete.": "Wanneer dit is uitgeschakeld, worden antwoorden in één keer weergegeven wanneer ze compleet zijn.",
"Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Genereer slechts één regel per verzoek (alleen KoboldAI, genegeerd door KoboldCpp).",
"Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Verbied het End-of-Sequence (EOS) token (met KoboldCpp, en mogelijk ook andere tokens met KoboldAI).",
"Good for story writing, but should not be used for chat and instruct mode.": "Goed voor het schrijven van verhalen, maar mag niet worden gebruikt voor de chat- en instructiemodus.",
"Enhance Definitions": "Verbeter definities",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Gebruik de OAI-kennisbank om definities van publieke figuren en bekende fictieve personages te verbeteren.",
"Wrap in Quotes": "Wikkel in aanhalingstekens",
@@ -3128,9 +3215,6 @@
"Disabled for all models": "Uitgeschakeld voor alle modellen",
"Automatic (based on model name)": "Automatisch (op basis van modelnaam)",
"Enabled for all models": "Ingeschakeld voor alle modellen",
"Multigen": "Multigen",
"First chunk (tokens)": "Eerste stuk (tokens)",
"Next chunks (tokens)": "Volgende stukken (tokens)",
"Anchors Order": "Ankersvolgorde",
"Character then Style": "Personage dan Stijl",
"Style then Character": "Stijl dan Personage",
@@ -3531,133 +3615,168 @@
"Select this as default persona for the new chats.": "Selecteer dit als standaard persona voor de nieuwe chats.",
"Change persona image": "persona afbeelding wijzigen",
"Delete persona": "persona verwijderen"
},
},
"es-spa": {
"clickslidertips": "Haz click en el número al lado de la barra \npara seleccionar un número manualmente.",
"kobldpresets": "Configuraciones de KoboldAI",
"guikoboldaisettings": "Configuración actual de la interfaz de KoboldAI",
"novelaipreserts": "Configuraciones de NovelAI",
"default": "Predeterminado",
"openaipresets": "Configuraciones de OpenAI",
"text gen webio(ooba) presets": "Configuraciones de WebUI(ooba)",
"response legth(tokens)": "Largo de la respuesta de la IA (en Tokens)",
"select": "Seleccionar",
"context size(tokens)": "Tamaño del contexto (en Tokens)",
"unlocked": "Desbloqueado",
"only select modls support context sizes greater than 2048 tokens. proceed only is you know you're doing": "Solo algunos modelos tienen soporte para tamaños de más de 2048 tokens. Procede solo si sabes lo que estás haciendo.",
"rep.pen": "Rep. Pen.",
"rep.pen range": "Rango de Rep. Pen.",
"temperature": "Temperature",
"Encoder Rep. Pen.": "Encoder Rep. Pen.",
"No Repeat Ngram Size": "No Repeat Ngram Size",
"Min Length": "Largo mínimo",
"OpenAI Reverse Proxy": "Reverse Proxy de OpenAI",
"Alternative server URL (leave empty to use the default value).": "URL del server alternativo (deja vacío para usar el predeterminado)",
"Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Borra tu clave(API) real de OpenAI ANTES de escribir nada en este campo.",
"We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "SillyTaven no puede dar soporte por problemas encontrados durante el uso de un proxy no-oficial de OpenAI",
"Legacy Streaming Processing": "Processo Streaming Legacy",
"Enable this if the streaming doesn't work with your proxy": "Habilita esta opción si el \"streaming\" no está funcionando.",
"Context Size (tokens)": "Tamaño del contexto (en Tokens)",
"Max Response Length (tokens)": "Tamaño máximo (en Tokens)",
"Temperature": "Temperatura",
"Frequency Penalty": "Frequency Penalty",
"Presence Penalty": "Presence Penalty",
"Top-p": "Top-p",
"Display bot response text chunks as they are generated": "Muestra el texto poco a poco al mismo tiempo que es generado.",
"Top A": "Top-a",
"Typical Sampling": "Typical Sampling",
"Tail Free Sampling": "Tail Free Sampling",
"Rep. Pen. Slope": "Rep. Pen. Slope",
"Single-line mode": "Modo \"Solo una línea\"",
"Top K": "Top-k",
"Top P": "Top-p",
"Do Sample": "Do Sample",
"Add BOS Token": "Añadir BOS Token",
"Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative.": "Añade el \"bos_token\" al inicio del prompt. Desabilitar esto puede hacer las respuestas de la IA más creativas",
"Ban EOS Token": "Prohibir EOS Token",
"Ban the eos_token. This forces the model to never end the generation prematurely": "Prohibe el \"eos_token\". Esto obliga a la IA a no terminar su generación de forma prematura",
"Skip Special Tokens": "Saltarse Tokens Especiales",
"Beam search": "Beam Search",
"Number of Beams": "Number of Beams",
"Length Penalty": "Length Penalty",
"Early Stopping": "Early Stopping",
"Contrastive search": "Contrastive search",
"Penalty Alpha": "Penalty Alpha",
"Seed": "Seed",
"Inserts jailbreak as a last system message.": "Inserta el \"jailbreak\" como el último mensaje del Sistema",
"This tells the AI to ignore its usual content restrictions.": "Esto ayuda a la IA para ignorar sus restricciones de contenido",
"NSFW Encouraged": "Alentar \"NSFW\"",
"Tell the AI that NSFW is allowed.": "Le dice a la IA que el contenido NSFW (+18) está permitido",
"NSFW Prioritized": "Priorizar NSFW",
"NSFW prompt text goes first in the prompt to emphasize its effect.": "El \"prompt NSFW\" va antes para enfatizar su efecto",
"Streaming": "Streaming",
"Display the response bit by bit as it is generated.": "Enseña el texto poco a poco mientras es generado",
"When this is off, responses will be displayed all at once when they are complete.": "Cuando esto está deshabilitado, las respuestas se mostrarán de una vez cuando la generación se haya completado",
"Enhance Definitions": "Definiciones Mejoradas",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Usa el conocimiento de OpenAI (GPT 3.5, GPT 4, ChatGPT) para mejorar las definiciones de figuras públicas y personajes ficticios",
"Wrap in Quotes": "Envolver En Comillas",
"Wrap entire user message in quotes before sending.": "Envuelve todo el mensaje en comillas antes de enviar",
"Leave off if you use quotes manually for speech.": "Déjalo deshabilitado si usas comillas manualmente para denotar diálogo",
"Main prompt": "Prompt Principal",
"The main prompt used to set the model behavior": "El prompt principal usado para definir el comportamiento de la IA",
"NSFW prompt": "Prompt NSFW",
"Prompt that is used when the NSFW toggle is on": "Prompt que es utilizado cuando \"Alentar NSFW\" está activado",
"Jailbreak prompt": "Jailbreak prompt",
"Prompt that is used when the Jailbreak toggle is on": "Prompt que es utilizado cuando Jailbreak Prompt está activado",
"Impersonation prompt": "Prompt \"Impersonar\"",
"Prompt that is used for Impersonation function": "Prompt que es utilizado para la función \"Impersonar\"",
"Logit Bias": "Logit Bias",
"Helps to ban or reenforce the usage of certain words": "Ayuda a prohibir o alentar el uso de algunas palabras",
"View / Edit bias preset": "Ver/Editar configuración de \"Logit Bias\"",
"Add bias entry": "Añadir bias",
"Jailbreak activation message": "Mensaje de activación de Jailbrak",
"Message to send when auto-jailbreak is on.": "Mensaje enviado cuando auto-jailbreak está activado",
"Jailbreak confirmation reply": "Mensaje de confirmación de Jailbreak",
"Bot must send this back to confirm jailbreak": "La IA debe enviar un mensaje para confirmar el jailbreak",
"Character Note": "Nota del personaje",
"Influences bot behavior in its responses": "Influencia el comportamiento de la IA y sus respuestas",
"API": "API",
"KoboldAI": "KoboldAI",
"Use Horde": "Usar AI Horde de KoboldAI",
"API url": "URL de la API",
"Register a Horde account for faster queue times": "Regístrate en KoboldAI para conseguir respuestas más rápido",
"Learn how to contribute your idle GPU cycles to the Hord": "Aprende cómo contribuir a AI Horde con tu GPU",
"Adjust context size to worker capabilities": "Ajustar tamaño del contexto a las capacidades del trabajador",
"Adjust response length to worker capabilities": "Ajustar tamaño de la respuesta a las capacidades del trabajador",
"API key": "API key",
"Register": "Registrarse",
"For privacy reasons": "Por motivos de privacidad, tu API será ocultada cuando se vuelva a cargar la página",
"Model": "Modelo IA",
"Hold Control / Command key to select multiple models.": "Presiona Ctrl/Command Key para seleccionar multiples modelos",
"Horde models not loaded": "Modelos del Horde no cargados",
"Not connected": "Desconectado",
"Novel API key": "API key de NovelAI",
"Follow": "Sigue",
"these directions": "estas instrucciones",
"to get your NovelAI API key.": "para conseguir tu NovelAI API key",
"Enter it in the box below": "Introduce tu NovelAI API key en el siguiente campo",
"Novel AI Model": "Modelo IA de NovelAI",
"No connection": "Desconectado",
"oobabooga/text-generation-webui": "oobabooga/text-generation-webui",
"Make sure you run it with": "Asegúrate de usar el argumento --api cuando se ejecute",
"Blocking API url": "API URL",
"Streaming API url": "Streaming API URL",
"to get your OpenAI API key.": "para conseguir tu clave API de OpenAI",
"OpenAI Model": "Modelo AI de OpenAI",
"View API Usage Metrics": "Ver métricas de uso de la API",
"Bot": "Bot",
"Auto-connect to Last Server": "Auto-conectarse con el último servidor",
"View hidden API keys": "Ver claves API ocultas",
"Advanced Formatting": "Formateo avanzado",
"AutoFormat Overrides": "Autoformateo de overrides",
"Samplers Order": "Orden de Samplers",
"Samplers will be applied in a top-down order. Use with caution.": "Los Samplers serán aplicados de orden superior a inferior. \nUsa con precaución",
"Load koboldcpp order": "Cargar el orden de koboldcpp",
"Repetition Penalty": "Repetition Penalty",
"Epsilon Cutoff": "Epsilon Cutoff",
"Eta Cutoff": "Eta Cutoff",
"Rep. Pen. Range.": "Rep. Pen. Range.",
"Rep. Pen. Freq.": "Rep. Pen. Freq.",
"Rep. Pen. Presence": "Rep. Pen. Presence."
"clickslidertips": "Haz click en el número al lado de la barra \npara seleccionar un número manualmente.",
"kobldpresets": "Configuraciones de KoboldAI",
"guikoboldaisettings": "Configuración actual de la interfaz de KoboldAI",
"novelaipreserts": "Configuraciones de NovelAI",
"default": "Predeterminado",
"openaipresets": "Configuraciones de OpenAI",
"text gen webio(ooba) presets": "Configuraciones de WebUI(ooba)",
"response legth(tokens)": "Largo de la respuesta de la IA (en Tokens)",
"select": "Seleccionar",
"context size(tokens)": "Tamaño del contexto (en Tokens)",
"unlocked": "Desbloqueado",
"Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "Solo algunos modelos tienen soporte para tamaños de más de 4096 tokens. Procede solo si sabes lo que estás haciendo.",
"rep.pen": "Rep. Pen.",
"rep.pen range": "Rango de Rep. Pen.",
"temperature": "Temperature",
"Encoder Rep. Pen.": "Encoder Rep. Pen.",
"No Repeat Ngram Size": "No Repeat Ngram Size",
"Min Length": "Largo mínimo",
"OpenAI Reverse Proxy": "Reverse Proxy de OpenAI",
"Alternative server URL (leave empty to use the default value).": "URL del server alternativo (deja vacío para usar el predeterminado)",
"Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Borra tu clave(API) real de OpenAI ANTES de escribir nada en este campo.",
"We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "SillyTaven no puede dar soporte por problemas encontrados durante el uso de un proxy no-oficial de OpenAI",
"Legacy Streaming Processing": "Processo Streaming Legacy",
"Enable this if the streaming doesn't work with your proxy": "Habilita esta opción si el \"streaming\" no está funcionando.",
"Context Size (tokens)": "Tamaño del contexto (en Tokens)",
"Max Response Length (tokens)": "Tamaño máximo (en Tokens)",
"Temperature": "Temperatura",
"Frequency Penalty": "Frequency Penalty",
"Presence Penalty": "Presence Penalty",
"Top-p": "Top-p",
"Display bot response text chunks as they are generated": "Muestra el texto poco a poco al mismo tiempo que es generado.",
"Top A": "Top-a",
"Typical Sampling": "Typical Sampling",
"Tail Free Sampling": "Tail Free Sampling",
"Rep. Pen. Slope": "Rep. Pen. Slope",
"Single-line mode": "Modo \"Solo una línea\"",
"Top K": "Top-k",
"Top P": "Top-p",
"Do Sample": "Do Sample",
"Add BOS Token": "Añadir BOS Token",
"Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative.": "Añade el \"bos_token\" al inicio del prompt. Desabilitar esto puede hacer las respuestas de la IA más creativas",
"Ban EOS Token": "Prohibir EOS Token",
"Ban the eos_token. This forces the model to never end the generation prematurely": "Prohibe el \"eos_token\". Esto obliga a la IA a no terminar su generación de forma prematura",
"Skip Special Tokens": "Saltarse Tokens Especiales",
"Beam search": "Beam Search",
"Number of Beams": "Number of Beams",
"Length Penalty": "Length Penalty",
"Early Stopping": "Early Stopping",
"Contrastive search": "Contrastive search",
"Penalty Alpha": "Penalty Alpha",
"Seed": "Seed",
"Inserts jailbreak as a last system message.": "Inserta el \"jailbreak\" como el último mensaje del Sistema",
"This tells the AI to ignore its usual content restrictions.": "Esto ayuda a la IA para ignorar sus restricciones de contenido",
"NSFW Encouraged": "Alentar \"NSFW\"",
"Tell the AI that NSFW is allowed.": "Le dice a la IA que el contenido NSFW (+18) está permitido",
"NSFW Prioritized": "Priorizar NSFW",
"NSFW prompt text goes first in the prompt to emphasize its effect.": "El \"prompt NSFW\" va antes para enfatizar su efecto",
"Streaming": "Streaming",
"Display the response bit by bit as it is generated.": "Enseña el texto poco a poco mientras es generado",
"When this is off, responses will be displayed all at once when they are complete.": "Cuando esto está deshabilitado, las respuestas se mostrarán de una vez cuando la generación se haya completado",
"Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Genera solo una línea por solicitud (solo KoboldAI, ignorada por KoboldCpp).",
"Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Prohibir el token de fin de secuencia (EOS) (con KoboldCpp, y posiblemente también otros tokens con KoboldAI).",
"Good for story writing, but should not be used for chat and instruct mode.": "Bueno para escribir historias, pero no debe usarse para chatear ni para el modo de instrucción.",
"Enhance Definitions": "Definiciones Mejoradas",
"Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Usa el conocimiento de OpenAI (GPT 3.5, GPT 4, ChatGPT) para mejorar las definiciones de figuras públicas y personajes ficticios",
"Wrap in Quotes": "Envolver En Comillas",
"Wrap entire user message in quotes before sending.": "Envuelve todo el mensaje en comillas antes de enviar",
"Leave off if you use quotes manually for speech.": "Déjalo deshabilitado si usas comillas manualmente para denotar diálogo",
"Main prompt": "Prompt Principal",
"The main prompt used to set the model behavior": "El prompt principal usado para definir el comportamiento de la IA",
"NSFW prompt": "Prompt NSFW",
"Prompt that is used when the NSFW toggle is on": "Prompt que es utilizado cuando \"Alentar NSFW\" está activado",
"Jailbreak prompt": "Jailbreak prompt",
"Prompt that is used when the Jailbreak toggle is on": "Prompt que es utilizado cuando Jailbreak Prompt está activado",
"Impersonation prompt": "Prompt \"Impersonar\"",
"Prompt that is used for Impersonation function": "Prompt que es utilizado para la función \"Impersonar\"",
"Restore default prompt":"Restaurar el prompt por defecto",
"Logit Bias": "Logit Bias",
"Helps to ban or reenforce the usage of certain words": "Ayuda a prohibir o alentar el uso de algunas palabras",
"View / Edit bias preset": "Ver/Editar configuración de \"Logit Bias\"",
"Add bias entry": "Añadir bias",
"Jailbreak activation message": "Mensaje de activación de Jailbrak",
"Message to send when auto-jailbreak is on.": "Mensaje enviado cuando auto-jailbreak está activado",
"Jailbreak confirmation reply": "Mensaje de confirmación de Jailbreak",
"Bot must send this back to confirm jailbreak": "La IA debe enviar un mensaje para confirmar el jailbreak",
"Character Note": "Nota del personaje",
"Influences bot behavior in its responses": "Influencia el comportamiento de la IA y sus respuestas",
"API": "API",
"KoboldAI": "KoboldAI",
"Use Horde": "Usar AI Horde de KoboldAI",
"API url": "URL de la API",
"Register a Horde account for faster queue times": "Regístrate en KoboldAI para conseguir respuestas más rápido",
"Learn how to contribute your idle GPU cycles to the Hord": "Aprende cómo contribuir a AI Horde con tu GPU",
"Adjust context size to worker capabilities": "Ajustar tamaño del contexto a las capacidades del trabajador",
"Adjust response length to worker capabilities": "Ajustar tamaño de la respuesta a las capacidades del trabajador",
"API key": "API key",
"Register": "Registrarse",
"For privacy reasons": "Por motivos de privacidad, tu API será ocultada cuando se vuelva a cargar la página",
"Model": "Modelo IA",
"Hold Control / Command key to select multiple models.": "Presiona Ctrl/Command Key para seleccionar multiples modelos",
"Horde models not loaded": "Modelos del Horde no cargados",
"Not connected": "Desconectado",
"Novel API key": "API key de NovelAI",
"Follow": "Sigue",
"these directions": "estas instrucciones",
"to get your NovelAI API key.": "para conseguir tu NovelAI API key",
"Enter it in the box below": "Introduce tu clave API de OpenAI en el siguiente campo",
"Novel AI Model": "Modelo IA de NovelAI",
"No connection": "Desconectado",
"oobabooga/text-generation-webui": "oobabooga/text-generation-webui",
"Make sure you run it with": "Asegúrate de usar el argumento --api cuando se ejecute",
"Blocking API url": "API URL",
"Streaming API url": "Streaming API URL",
"to get your OpenAI API key.": "para conseguir tu clave API de OpenAI",
"OpenAI Model": "Modelo AI de OpenAI",
"View API Usage Metrics": "Ver métricas de uso de la API",
"Bot": "Bot",
"Auto-connect to Last Server": "Auto-conectarse con el último servidor",
"View hidden API keys": "Ver claves API ocultas",
"Advanced Formatting": "Formateo avanzado",
"AutoFormat Overrides": "Autoformateo de overrides",
"Samplers Order": "Orden de Samplers",
"Samplers will be applied in a top-down order. Use with caution.": "Los Samplers serán aplicados de orden superior a inferior. \nUsa con precaución",
"Load koboldcpp order": "Cargar el orden de koboldcpp",
"Unlocked Context Size": "Desbloquear Tamaño Del Contexto",
"Unrestricted maximum value for the context slider":"Desbloquea el Tamaño máximo del contexto. Solo habilita esto si sabes lo que estás haciendo.",
"Quick Edit": "Editor Rápido de Prompts",
"Main": "Principal",
"Assistant Prefill": "Prefijo del Asistente",
"Start Claude's answer with...": "Inicia la respuesta de Claude con...",
"Utility Prompts": "Indicaciones Útiles",
"World Info Format Template": "Plantilla para formato de World Info",
"NSFW avoidance prompt": "Prompt para evitar NSFW",
"Prompt that is used when the NSFW toggle is O": "Prompt utilizado para evitar NSFW cuando \"Alentar NSFW\" está deshabilitado",
"Wraps activated World Info entries before inserting into the prompt.": "Envuelve las entradas activadas de World Info antes de insertarlas en el prompt.",
"New Chat": "Chat Nuevo",
"Set at the beginning of the chat history to indicate that a new chat is about to start.": "Colocado al inicio del historial de chat para indicar que un nuevo chat va a comenzar.",
"New Group Chat": "Nuevo Chat Grupal",
"Set at the beginning of the chat history to indicate that a new group chat is about to start.":"Colocado al inicio del historial de chat para indicarle a la IA que un nuevo Chat Grupal va a comenzar",
"New Example Chat": "Nuevo Ejemplo De Chat",
"Add character names": "Incluír nombre del personaje",
"Send names in the ChatML objects.": "Envía los mensajes al objeto ChatML. Ayuda a la IA a asociar mensajes con nombres en un chat grupal.",
"Proxy Password": "Contraseña del Proxy",
"Will be used as a password for the proxy instead of API key.": "Será utilizado como contraseña del proxy en vez de la clave API.",
"Chat Completion Source": "Fuente de Chat",
"Use Proxy password field instead. This input will be ignored.": "Utiliza el campo de Contraseña del Proxy. Lo que pongas aquí será ignorado.",
"Show External models (provided by API)": "Mostrar modelos externos (Proveídos por la API)",
"Connect": "Conectarse",
"[title]Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "Verifica que tu conexión con la API enviando un mensaje corto. ¡Ten en cuenta que se te cobrará por ello!",
"Continue nudge": "Empujuón para continuar",
"Replace empty message": "Reemplazar mensaje vacío",
"Send this text instead of nothing when the text box is empty.": "Envía este mensaje en vez de nada cuando la barra de chat está vacía",
"No connection...": "Sin conexión...",
"Avoid sending sensitive information to the Horde.": "No envíes información personal a Horde.",
"Review the Privacy statement": "Revisa el aviso de privacidad",
"Learn how to contribute your idle GPU cycles to the Horde": "Aprende como contribuír a Horde con tu GPU.",
"Trusted workers only": "Solo trabajadores de confianza",
"API Key": "Clave API",
"Get it here:": "Consíguela aquí:",
"View my Kudos": "Ver mis Kudos",
"Models": "Modelos IA"
}
}

67
public/img/palm.svg Normal file
View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Standard_product_icon__x28_1:1_x29_"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="192px" height="192px" viewBox="0 0 192 192" enable-background="new 0 0 192 192" xml:space="preserve">
<symbol id="material_x5F_product_x5F_standard_x5F_icon_x5F_keylines_00000077318920148093339210000006245950728745084294_" viewBox="-96 -96 192 192">
<g opacity="0.4">
<defs>
<path id="SVGID_1_" opacity="0.4" d="M-96,96V-96H96V96H-96z"/>
</defs>
<clipPath id="SVGID_00000071517564283228984050000017848131202901217410_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_00000071517564283228984050000017848131202901217410_)">
<g>
<path d="M95.75,95.75v-191.5h-191.5v191.5H95.75 M96,96H-96V-96H96V96L96,96z"/>
</g>
<circle fill="none" stroke="#000000" stroke-width="0.25" stroke-miterlimit="10" cx="0" cy="0" r="64"/>
</g>
<circle clip-path="url(#SVGID_00000071517564283228984050000017848131202901217410_)" fill="none" stroke="#000000" stroke-width="0.25" stroke-miterlimit="10" cx="0" cy="0" r="88"/>
<path clip-path="url(#SVGID_00000071517564283228984050000017848131202901217410_)" fill="none" stroke="#000000" stroke-width="0.25" stroke-miterlimit="10" d="
M64,76H-64c-6.6,0-12-5.4-12-12V-64c0-6.6,5.4-12,12-12H64c6.6,0,12,5.4,12,12V64C76,70.6,70.6,76,64,76z"/>
<path clip-path="url(#SVGID_00000071517564283228984050000017848131202901217410_)" fill="none" stroke="#000000" stroke-width="0.25" stroke-miterlimit="10" d="
M52,88H-52c-6.6,0-12-5.4-12-12V-76c0-6.6,5.4-12,12-12H52c6.6,0,12,5.4,12,12V76C64,82.6,58.6,88,52,88z"/>
<path clip-path="url(#SVGID_00000071517564283228984050000017848131202901217410_)" fill="none" stroke="#000000" stroke-width="0.25" stroke-miterlimit="10" d="
M76,64H-76c-6.6,0-12-5.4-12-12V-52c0-6.6,5.4-12,12-12H76c6.6,0,12,5.4,12,12V52C88,58.6,82.6,64,76,64z"/>
</g>
</symbol>
<rect id="bounding_box_1_" display="none" fill="none" width="192" height="192"/>
<g id="art_layer">
<g>
<path d="M96,181.92L96,181.92c6.63,0,12-5.37,12-12v-104H84v104C84,176.55,89.37,181.92,96,181.92z"/>
<g>
<path d="M143.81,103.87C130.87,90.94,111.54,88.32,96,96l51.37,51.37c2.12,2.12,5.77,1.28,6.67-1.57
C158.56,131.49,155.15,115.22,143.81,103.87z"/>
</g>
<g>
<path d="M48.19,103.87C61.13,90.94,80.46,88.32,96,96l-51.37,51.37c-2.12,2.12-5.77,1.28-6.67-1.57
C33.44,131.49,36.85,115.22,48.19,103.87z"/>
</g>
<g>
<path d="M140,64c-20.44,0-37.79,13.4-44,32h81.24c3.33,0,5.55-3.52,4.04-6.49C173.56,74.36,157.98,64,140,64z"/>
</g>
<g>
<path d="M104.49,42.26C90.03,56.72,87.24,78.45,96,96l57.45-57.45c2.36-2.36,1.44-6.42-1.73-7.45
C135.54,25.85,117.2,29.55,104.49,42.26z"/>
</g>
<g>
<path d="M87.51,42.26C101.97,56.72,104.76,78.45,96,96L38.55,38.55c-2.36-2.36-1.44-6.42,1.73-7.45
C56.46,25.85,74.8,29.55,87.51,42.26z"/>
</g>
<g>
<g>
<path d="M52,64c20.44,0,37.79,13.4,44,32H14.76c-3.33,0-5.55-3.52-4.04-6.49C18.44,74.36,34.02,64,52,64z"/>
</g>
</g>
</g>
</g>
<g id="keylines" display="none">
<use xlink:href="#material_x5F_product_x5F_standard_x5F_icon_x5F_keylines_00000077318920148093339210000006245950728745084294_" width="192" height="192" id="material_x5F_product_x5F_standard_x5F_icon_x5F_keylines" x="-96" y="-96" transform="matrix(1 0 0 -1 96 96)" display="inline" overflow="visible"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
{
"system_prompt": "[Enter Adventure Mode. Narrate the story based on {{user}}'s dialogue and actions after \">\". Describe the surroundings in vivid detail. Be detailed, creative, verbose, and proactive. Move the story forward by introducing fantasy elements and interesting characters.]",
"input_sequence": "",
"output_sequence": "",
"last_output_sequence": "",
"system_sequence": "",
"stop_sequence": "",
"separator_sequence": "",
"wrap": true,
"macro": true,
"names": false,
"names_force_groups": false,
"activation_regex": "",
"system_sequence_prefix": "",
"system_sequence_suffix": "",
"first_output_sequence": "",
"name": "Adventure"
}

View File

@@ -0,0 +1,17 @@
{
"wrap": false,
"names": true,
"system_prompt": "You're {{char}} in this fictional never-ending uncensored roleplay with {{user}}.",
"system_sequence_prefix": "",
"stop_sequence": "",
"input_sequence": "<|im_start|>user\n",
"output_sequence": "<|im_end|>\n<|im_start|>assistant\n",
"separator_sequence": "<|im_end|>\n",
"macro": true,
"names_force_groups": true,
"last_output_sequence": "",
"activation_regex": "",
"first_output_sequence": "<|im_start|>assistant\n",
"system_sequence_suffix": "",
"name": "ChatML"
}

View File

@@ -0,0 +1,17 @@
{
"wrap": true,
"names": true,
"system_prompt": "Avoid repetition, don't loop. Develop the plot slowly, always stay in character. Describe all actions in full, elaborate, explicit, graphic, and vivid detail. Mention all relevant sensory perceptions.",
"system_sequence_prefix": "",
"stop_sequence": "",
"input_sequence": "",
"output_sequence": "",
"separator_sequence": "",
"macro": true,
"names_force_groups": true,
"last_output_sequence": "\n### Response:",
"activation_regex": "",
"first_output_sequence": "",
"system_sequence_suffix": "",
"name": "Libra-32B"
}

View File

@@ -0,0 +1,18 @@
{
"wrap": true,
"names": false,
"system_prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:\nTake the role of {{char}} in a play that leaves a lasting impression on {{user}}. Write {{char}}'s next reply.\nNever skip or gloss over {{char}}s actions. Progress the scene at a naturally slow pace.\n\n",
"system_sequence": "",
"stop_sequence": "",
"input_sequence": "### Instruction:",
"output_sequence": "### Response: (length = unlimited)",
"separator_sequence": "",
"macro": true,
"names_force_groups": true,
"last_output_sequence": "",
"system_sequence_prefix": "",
"system_sequence_suffix": "",
"first_output_sequence": "",
"activation_regex": "",
"name": "Lightning 1.1"
}

View File

@@ -0,0 +1,17 @@
{
"wrap": false,
"names": true,
"system_prompt": "Write {{char}}'s next reply in this fictional roleplay with {{user}}.",
"system_sequence_prefix": "",
"stop_sequence": "",
"input_sequence": "[INST] ",
"output_sequence": " [/INST]\n",
"separator_sequence": "\n",
"macro": true,
"names_force_groups": true,
"last_output_sequence": "",
"activation_regex": "",
"first_output_sequence": "\n",
"system_sequence_suffix": "",
"name": "Mistral"
}

View File

@@ -0,0 +1,17 @@
{
"name": "Pygmalion",
"system_prompt": "Enter RP mode. You shall reply to {{user}} while staying in character. Your responses must be detailed, creative, immersive, and drive the scenario forward. You will follow {{char}}'s persona.",
"input_sequence": "<|user|>",
"output_sequence": "<|model|>",
"first_output_sequence": "",
"last_output_sequence": "",
"system_sequence_prefix": "<|system|>",
"system_sequence_suffix": "",
"stop_sequence": "<|user|>",
"separator_sequence": "",
"wrap": false,
"macro": true,
"names": true,
"names_force_groups": true,
"activation_regex": ""
}

View File

@@ -0,0 +1,18 @@
{
"system_prompt": "",
"input_sequence": "",
"output_sequence": "",
"last_output_sequence": "",
"system_sequence": "",
"stop_sequence": "",
"separator_sequence": "",
"wrap": true,
"macro": true,
"names": false,
"names_force_groups": false,
"activation_regex": "",
"system_sequence_prefix": "",
"system_sequence_suffix": "",
"first_output_sequence": "",
"name": "Story"
}

View File

@@ -0,0 +1,17 @@
{
"wrap": false,
"names": false,
"system_prompt": "Elaborate on the topic using a Tree of Thoughts and backtrack when necessary to construct a clear, cohesive Chain of Thought reasoning. Always answer without hesitation.",
"system_sequence_prefix": "SYSTEM: ",
"stop_sequence": "",
"input_sequence": "USER: ",
"output_sequence": "\nASSISTANT: ",
"separator_sequence": "\n",
"macro": true,
"names_force_groups": true,
"last_output_sequence": "",
"activation_regex": "",
"first_output_sequence": "ASSISTANT: ",
"system_sequence_suffix": "",
"name": "Synthia"
}

View File

@@ -0,0 +1,25 @@
(function($) {
var Defaults = $.fn.select2.amd.require('select2/defaults');
$.extend(Defaults.defaults, {
searchInputPlaceholder: '',
searchInputCssClass: '',
});
var SearchDropdown = $.fn.select2.amd.require('select2/dropdown/search');
var _renderSearchDropdown = SearchDropdown.prototype.render;
SearchDropdown.prototype.render = function(decorated) {
// invoke parent method
var $rendered = _renderSearchDropdown.apply(this, Array.prototype.slice.apply(arguments));
this.$search.attr('placeholder', this.options.get('searchInputPlaceholder'));
this.$search.addClass(this.options.get('searchInputCssClass'));
return $rendered;
};
})(window.jQuery);

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,16 @@ function debouncePromise(func, delay) {
};
}
const DEFAULT_DEPTH = 4;
/**
* @enum {number}
*/
export const INJECTION_POSITION ={
RELATIVE: 0,
ABSOLUTE: 1,
}
/**
* Register migrations for the prompt manager when settings are loaded or an Open AI preset is loaded.
*/
@@ -60,7 +70,7 @@ const registerPromptManagerMigration = () => {
* Represents a prompt.
*/
class Prompt {
identifier; role; content; name; system_prompt;
identifier; role; content; name; system_prompt; position; injection_position; injection_depth;
/**
* Create a new Prompt instance.
@@ -71,13 +81,19 @@ class Prompt {
* @param {string} param0.content - The content of the prompt.
* @param {string} param0.name - The name of the prompt.
* @param {boolean} param0.system_prompt - Indicates if the prompt is a system prompt.
* @param {string} param0.position - The position of the prompt in the prompt list.
* @param {number} param0.injection_position - The insert position of the prompt.
* @param {number} param0.injection_depth - The depth of the prompt in the chat.
*/
constructor({ identifier, role, content, name, system_prompt } = {}) {
constructor({ identifier, role, content, name, system_prompt, position, injection_depth, injection_position } = {}) {
this.identifier = identifier;
this.role = role;
this.content = content;
this.name = name;
this.system_prompt = system_prompt;
this.position = position;
this.injection_depth = injection_depth;
this.injection_position = injection_position;
}
}
@@ -379,6 +395,8 @@ PromptManagerModule.prototype.init = function (moduleConfiguration, serviceSetti
document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_name').value = prompt.name;
document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_role').value = 'system';
document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_prompt').value = prompt.content;
document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_position').value = prompt.injection_position ?? 0;
document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_depth').value = prompt.injection_depth ?? DEFAULT_DEPTH;
}
// Append prompt to selected character
@@ -671,6 +689,8 @@ PromptManagerModule.prototype.updatePromptWithPromptEditForm = function (prompt)
prompt.name = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_name').value;
prompt.role = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_role').value;
prompt.content = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_prompt').value;
prompt.injection_position = Number(document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_position').value);
prompt.injection_depth = Number(document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_depth').value);
}
/**
@@ -1083,10 +1103,14 @@ PromptManagerModule.prototype.loadPromptIntoEditForm = function (prompt) {
const nameField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_name');
const roleField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_role');
const promptField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_prompt');
const injectionPositionField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_position');
const injectionDepthField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_depth');
nameField.value = prompt.name ?? '';
roleField.value = prompt.role ?? '';
promptField.value = prompt.content ?? '';
injectionPositionField.value = prompt.injection_position ?? INJECTION_POSITION.RELATIVE;
injectionDepthField.value = prompt.injection_depth ?? DEFAULT_DEPTH;
const resetPromptButton = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_reset');
if (true === prompt.system_prompt) {
@@ -1150,10 +1174,14 @@ PromptManagerModule.prototype.clearEditForm = function () {
const nameField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_name');
const roleField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_role');
const promptField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_prompt');
const injectionPositionField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_position');
const injectionDepthField = document.getElementById(this.configuration.prefix + 'prompt_manager_popup_entry_form_injection_depth');
nameField.value = '';
roleField.selectedIndex = 0;
promptField.value = '';
injectionPositionField.selectedIndex = 0;
injectionDepthField.value = DEFAULT_DEPTH;
roleField.disabled = false;
}
@@ -1433,13 +1461,18 @@ PromptManagerModule.prototype.renderPromptManagerListItems = function () {
}
const encodedName = escapeHtml(prompt.name);
const isSystemPrompt = !prompt.marker && prompt.system_prompt && prompt.injection_position !== INJECTION_POSITION.ABSOLUTE;
const isUserPrompt = !prompt.marker && !prompt.system_prompt && prompt.injection_position !== INJECTION_POSITION.ABSOLUTE;
const isInjectionPrompt = !prompt.marker && prompt.injection_position === INJECTION_POSITION.ABSOLUTE;
listItemHtml += `
<li class="${prefix}prompt_manager_prompt ${draggableClass} ${enabledClass} ${markerClass}" data-pm-identifier="${prompt.identifier}">
<span class="${prefix}prompt_manager_prompt_name" data-pm-name="${encodedName}">
${prompt.marker ? '<span class="fa-solid fa-thumb-tack" title="Marker"></span>' : ''}
${!prompt.marker && prompt.system_prompt ? '<span class="fa-solid fa-square-poll-horizontal" title="Global Prompt"></span>' : ''}
${!prompt.marker && !prompt.system_prompt ? '<span class="fa-solid fa-user" title="User Prompt"></span>' : ''}
${isSystemPrompt ? '<span class="fa-solid fa-square-poll-horizontal" title="Global Prompt"></span>' : ''}
${isUserPrompt ? '<span class="fa-solid fa-user" title="User Prompt"></span>' : ''}
${isInjectionPrompt ? `<span class="fa-solid fa-syringe" title="In-Chat Injection"></span>` : ''}
${this.isPromptInspectionAllowed(prompt) ? `<a class="prompt-manager-inspect-action">${encodedName}</a>` : encodedName}
${isInjectionPrompt ? `<small class="prompt-manager-injection-depth">@ ${prompt.injection_depth}</small>` : ''}
</span>
<span>
<span class="prompt_manager_prompt_controls">

View File

@@ -18,6 +18,8 @@ import {
getThumbnailUrl,
selectCharacterById,
eventSource,
menu_type,
substituteParams,
} from "../script.js";
import {
@@ -31,7 +33,7 @@ import {
SECRET_KEYS,
secret_state,
} from "./secrets.js";
import { debounce, delay, getStringHash, waitUntilCondition } from "./utils.js";
import { debounce, delay, getStringHash, isValidUrl, waitUntilCondition } from "./utils.js";
import { chat_completion_sources, oai_settings } from "./openai.js";
import { getTokenCount } from "./tokenizers.js";
@@ -210,10 +212,12 @@ $("#character_popup").on("input", function () { countTokensDebounced(); });
//function:
export function RA_CountCharTokens() {
let total_tokens = 0;
let permanent_tokens = 0;
$('[data-token-counter]').each(function () {
const counter = $(this);
const input = $(document.getElementById(counter.data('token-counter')));
const isPermanent = counter.data('token-permanent') === true;
const value = String(input.val());
if (input.length === 0) {
@@ -230,10 +234,14 @@ export function RA_CountCharTokens() {
if (input.data('last-value-hash') === valueHash) {
total_tokens += Number(counter.text());
permanent_tokens += isPermanent ? Number(counter.text()) : 0;
} else {
const tokens = getTokenCount(value);
// We substitute macro for existing characters, but not for the character being created
const valueToCount = menu_type === 'create' ? value : substituteParams(value);
const tokens = getTokenCount(valueToCount);
counter.text(tokens);
total_tokens += tokens;
permanent_tokens += isPermanent ? tokens : 0;
input.data('last-value-hash', valueHash);
}
});
@@ -242,6 +250,7 @@ export function RA_CountCharTokens() {
const tokenLimit = Math.max(((main_api !== 'openai' ? max_context : oai_settings.openai_max_context) / 2), 1024);
const showWarning = (total_tokens > tokenLimit);
$('#result_info_total_tokens').text(total_tokens);
$('#result_info_permanent_tokens').text(permanent_tokens);
$('#result_info_text').toggleClass('neutral_warning', showWarning);
$('#chartokenwarning').toggle(showWarning);
}
@@ -274,10 +283,16 @@ export async function favsToHotswap() {
const entities = getEntitiesList({ doFilter: false });
const container = $('#right-nav-panel .hotswap');
const template = $('#hotswap_template .hotswapAvatar');
container.empty();
const maxCount = 6;
const DEFAULT_COUNT = 6;
const WIDTH_PER_ITEM = 60; // 50px + 5px gap + 5px padding
const containerWidth = container.outerWidth();
const maxCount = containerWidth > 0 ? Math.floor(containerWidth / WIDTH_PER_ITEM) : DEFAULT_COUNT;
let count = 0;
const promises = [];
const newContainer = container.clone();
newContainer.empty();
for (const entity of entities) {
if (count >= maxCount) {
break;
@@ -310,23 +325,39 @@ export async function favsToHotswap() {
}
if (isCharacter) {
const avatarUrl = getThumbnailUrl('avatar', entity.item.avatar);
$(slot).find('img').attr('src', avatarUrl);
$(slot).attr('title', entity.item.avatar);
const imgLoadPromise = new Promise((resolve) => {
const avatarUrl = getThumbnailUrl('avatar', entity.item.avatar);
$(slot).find('img').attr('src', avatarUrl).on('load', resolve);
$(slot).attr('title', entity.item.avatar);
});
// if the image doesn't load in 500ms, resolve the promise anyway
promises.push(Promise.race([imgLoadPromise, delay(500)]));
}
$(slot).css('cursor', 'pointer');
container.append(slot);
newContainer.append(slot);
count++;
}
// there are 6 slots in total,
if (count < maxCount) { //if any are left over
// don't fill leftover spaces with avatar placeholders
// just evenly space the selected avatars instead
/*
if (count < maxCount) { //if any space is left over
let leftOverSlots = maxCount - count;
for (let i = 1; i <= leftOverSlots; i++) {
container.append(template.clone());
newContainer.append(template.clone());
}
}
*/
await Promise.allSettled(promises);
//helpful instruction message if no characters are favorited
if (count === 0) { container.html(`<small><span><i class="fa-solid fa-star"></i> Favorite characters to add them to HotSwaps</span></small>`) }
//otherwise replace with fav'd characters
if (count > 0) {
container.replaceWith(newContainer);
}
}
//changes input bar and send button display depending on connection status
@@ -367,7 +398,7 @@ function RA_autoconnect(PrevApi) {
if (online_status === "no_connection" && LoadLocalBool('AutoConnectEnabled')) {
switch (main_api) {
case 'kobold':
if (api_server && isUrlOrAPIKey(api_server)) {
if (api_server && isValidUrl(api_server)) {
$("#api_button").click();
}
break;
@@ -377,7 +408,7 @@ function RA_autoconnect(PrevApi) {
}
break;
case 'textgenerationwebui':
if (api_server_textgenerationwebui && isUrlOrAPIKey(api_server_textgenerationwebui)) {
if (api_server_textgenerationwebui && isValidUrl(api_server_textgenerationwebui)) {
$("#api_button_textgenerationwebui").click();
}
break;
@@ -388,6 +419,7 @@ function RA_autoconnect(PrevApi) {
|| (oai_settings.chat_completion_source == chat_completion_sources.WINDOWAI)
|| (secret_state[SECRET_KEYS.OPENROUTER] && oai_settings.chat_completion_source == chat_completion_sources.OPENROUTER)
|| (secret_state[SECRET_KEYS.AI21] && oai_settings.chat_completion_source == chat_completion_sources.AI21)
|| (secret_state[SECRET_KEYS.PALM] && oai_settings.chat_completion_source == chat_completion_sources.PALM)
) {
$("#api_button_openai").click();
}
@@ -403,15 +435,6 @@ function RA_autoconnect(PrevApi) {
}
}
function isUrlOrAPIKey(string) {
try {
new URL(string);
return true;
} catch (_) {
// return pattern.test(string);
}
}
function OpenNavPanels() {
const deviceInfo = getDeviceInfo();
if (deviceInfo && deviceInfo.device.type === 'desktop') {
@@ -867,13 +890,20 @@ export function initRossMods() {
//this makes the chat input text area resize vertically to match the text size (limited by CSS at 50% window height)
$('#send_textarea').on('input', function () {
const chatBlock = $('#chat');
const originalScrollBottom = chatBlock[0].scrollHeight - (chatBlock.scrollTop() + chatBlock.outerHeight());
this.style.height = window.getComputedStyle(this).getPropertyValue('min-height');
this.style.height = (this.scrollHeight) + 'px';
const newScrollTop = chatBlock[0].scrollHeight - (chatBlock.outerHeight() + originalScrollBottom);
chatBlock.scrollTop(newScrollTop);
});
//Regenerate if user swipes on the last mesage in chat
document.addEventListener('swiped-left', function (e) {
if (power_user.gestures === false) {
return
}
var SwipeButR = $('.swipe_right:last');
var SwipeTargetMesClassParent = $(e.target).closest('.last_mes');
if (SwipeTargetMesClassParent !== null) {
@@ -883,6 +913,9 @@ export function initRossMods() {
}
});
document.addEventListener('swiped-right', function (e) {
if (power_user.gestures === false) {
return
}
var SwipeButL = $('.swipe_left:last');
var SwipeTargetMesClassParent = $(e.target).closest('.last_mes');
if (SwipeTargetMesClassParent !== null) {
@@ -906,10 +939,13 @@ export function initRossMods() {
}
$(document).on('keydown', function (event) {
processHotkeys(event);
processHotkeys(event.originalEvent);
});
//Additional hotkeys CTRL+ENTER and CTRL+UPARROW
/**
* @param {KeyboardEvent} event
*/
function processHotkeys(event) {
//Enter to send when send_textarea in focus
if ($(':focus').attr('id') === 'send_textarea') {
@@ -943,6 +979,14 @@ export function initRossMods() {
}, 300);
}
// Alt+Enter or AltGr+Enter to Continue
if ((event.altKey || (event.altKey && event.ctrlKey)) && event.key == "Enter") {
if (is_send_press == false) {
console.debug("Continuing with Alt+Enter");
$('#option_continue').trigger('click');
}
}
// Ctrl+Enter for Regeneration Last Response. If editing, accept the edits instead
if (event.ctrlKey && event.key == "Enter") {
const editMesDone = $(".mes_edit_done:visible");
@@ -958,14 +1002,6 @@ export function initRossMods() {
}
}
// Alt+Enter to Continue
if (event.altKey && event.key == "Enter") {
if (is_send_press == false) {
console.debug("Continuing with Alt+Enter");
$('#option_continue').trigger('click');
}
}
// Helper function to check if nanogallery2's lightbox is active
function isNanogallery2LightboxActive() {
// Check if the body has the 'nGY2On' class, adjust this based on actual behavior
@@ -1097,13 +1133,14 @@ export function initRossMods() {
$("#rightNavDrawerIcon").trigger('click');
return
}
if ($(".draggable").is(":visible")) {
// Remove the first matched element
$('.draggable:first').remove();
return;
}
}
if ($(".draggable").is(":visible")) {
// Remove the first matched element
$('.draggable:first').remove();
return;
}
if (event.ctrlKey && /^[1-9]$/.test(event.key)) {

View File

@@ -235,6 +235,7 @@ function loadSettings() {
chat_metadata[metadata_keys.depth] = chat_metadata[metadata_keys.depth] ?? extension_settings.note.defaultDepth ?? DEFAULT_DEPTH;
$('#extension_floating_prompt').val(chat_metadata[metadata_keys.prompt]);
$('#extension_floating_interval').val(chat_metadata[metadata_keys.interval]);
$('#extension_floating_allow_wi_scan').prop('checked', extension_settings.note.allowWIScan ?? false);
$('#extension_floating_depth').val(chat_metadata[metadata_keys.depth]);
$(`input[name="extension_floating_position"][value="${chat_metadata[metadata_keys.position]}"]`).prop('checked', true);
@@ -389,6 +390,11 @@ function onChatChanged() {
$('#extension_floating_default_token_counter').text(tokenCounter3);
}
function onAllowWIScanCheckboxChanged() {
extension_settings.note.allowWIScan = !!$(this).prop('checked');
updateSettings();
}
/**
* Inject author's note options and setup event listeners.
*/
@@ -402,6 +408,7 @@ export function initAuthorsNote() {
$('#extension_floating_default').on('input', onExtensionFloatingDefaultInput);
$('#extension_default_depth').on('input', onDefaultDepthInput);
$('#extension_default_interval').on('input', onDefaultIntervalInput);
$('#extension_floating_allow_wi_scan').on('input', onAllowWIScanCheckboxChanged);
$('input[name="extension_floating_position"]').on('change', onExtensionFloatingPositionInput);
$('input[name="extension_default_position"]').on('change', onDefaultPositionInput);
$('input[name="extension_floating_char_position"]').on('change', onExtensionFloatingCharPositionInput);

View File

@@ -0,0 +1,488 @@
import { callPopup, chat_metadata, eventSource, event_types, generateQuietPrompt, getCurrentChatId, getRequestHeaders, getThumbnailUrl } from "../script.js";
import { saveMetadataDebounced } from "./extensions.js";
import { registerSlashCommand } from "./slash-commands.js";
import { stringFormat } from "./utils.js";
const BG_METADATA_KEY = 'custom_background';
const LIST_METADATA_KEY = 'chat_backgrounds';
/**
* Sets the background for the current chat and adds it to the list of custom backgrounds.
* @param {{url: string, path:string}} backgroundInfo
*/
function forceSetBackground(backgroundInfo) {
saveBackgroundMetadata(backgroundInfo.url);
setCustomBackground();
const list = chat_metadata[LIST_METADATA_KEY] || [];
const bg = backgroundInfo.path;
list.push(bg);
chat_metadata[LIST_METADATA_KEY] = list;
saveMetadataDebounced();
getChatBackgroundsList();
highlightNewBackground(bg);
highlightLockedBackground();
}
async function onChatChanged() {
if (hasCustomBackground()) {
setCustomBackground();
}
else {
unsetCustomBackground();
}
getChatBackgroundsList();
highlightLockedBackground();
}
function getChatBackgroundsList() {
const list = chat_metadata[LIST_METADATA_KEY];
const listEmpty = !Array.isArray(list) || list.length === 0;
$('#bg_custom_content').empty();
$('#bg_chat_hint').toggle(listEmpty);
if (listEmpty) {
return;
}
for (const bg of list) {
const template = getBackgroundFromTemplate(bg, true);
$('#bg_custom_content').append(template);
}
}
function getBackgroundPath(fileUrl) {
return `backgrounds/${fileUrl}`;
}
function highlightLockedBackground() {
$('.bg_example').removeClass('locked');
const lockedBackground = chat_metadata[BG_METADATA_KEY];
if (!lockedBackground) {
return;
}
$(`.bg_example`).each(function () {
const url = $(this).data('url');
if (url === lockedBackground) {
$(this).addClass('locked');
}
});
}
function onLockBackgroundClick(e) {
e.stopPropagation();
const chatName = getCurrentChatId();
if (!chatName) {
toastr.warning('Select a chat to lock the background for it');
return;
}
const relativeBgImage = getUrlParameter(this);
saveBackgroundMetadata(relativeBgImage);
setCustomBackground();
highlightLockedBackground();
}
function onUnlockBackgroundClick(e) {
e.stopPropagation();
removeBackgroundMetadata();
unsetCustomBackground();
highlightLockedBackground();
}
function hasCustomBackground() {
return chat_metadata[BG_METADATA_KEY];
}
function saveBackgroundMetadata(file) {
chat_metadata[BG_METADATA_KEY] = file;
saveMetadataDebounced();
}
function removeBackgroundMetadata() {
delete chat_metadata[BG_METADATA_KEY];
saveMetadataDebounced();
}
function setCustomBackground() {
const file = chat_metadata[BG_METADATA_KEY];
// bg already set
if (document.getElementById("bg_custom").style.backgroundImage == file) {
return;
}
$("#bg_custom").css("background-image", file);
}
function unsetCustomBackground() {
$("#bg_custom").css("background-image", 'none');
}
function onSelectBackgroundClick() {
const isCustom = $(this).attr('custom') === 'true';
const relativeBgImage = getUrlParameter(this);
// if clicked on upload button
if (!relativeBgImage) {
return;
}
// Automatically lock the background if it's custom or other background is locked
if (hasCustomBackground() || isCustom) {
saveBackgroundMetadata(relativeBgImage);
setCustomBackground();
highlightLockedBackground();
} else {
highlightLockedBackground();
}
const customBg = window.getComputedStyle(document.getElementById('bg_custom')).backgroundImage;
// Custom background is set. Do not override the layer below
if (customBg !== 'none') {
return;
}
const bgFile = $(this).attr("bgfile");
const backgroundUrl = getBackgroundPath(bgFile);
// Fetching to browser memory to reduce flicker
fetch(backgroundUrl).then(() => {
$("#bg1").css("background-image", relativeBgImage);
setBackground(bgFile);
}).catch(() => {
console.log('Background could not be set: ' + backgroundUrl);
});
}
async function onCopyToSystemBackgroundClick(e) {
e.stopPropagation();
const bgNames = await getNewBackgroundName(this);
if (!bgNames) {
return;
}
const bgFile = await fetch(bgNames.oldBg);
if (!bgFile.ok) {
toastr.warning('Failed to copy background');
return;
}
const blob = await bgFile.blob();
const file = new File([blob], bgNames.newBg);
const formData = new FormData();
formData.set('avatar', file);
uploadBackground(formData);
const list = chat_metadata[LIST_METADATA_KEY] || [];
const index = list.indexOf(bgNames.oldBg);
list.splice(index, 1);
saveMetadataDebounced();
getChatBackgroundsList();
}
/**
* Gets the new background name from the user.
* @param {Element} referenceElement
* @returns {Promise<{oldBg: string, newBg: string}>}
* */
async function getNewBackgroundName(referenceElement) {
const exampleBlock = $(referenceElement).closest('.bg_example');
const isCustom = exampleBlock.attr('custom') === 'true';
const oldBg = exampleBlock.attr('bgfile');
if (!oldBg) {
console.debug('no bgfile');
return;
}
const fileExtension = oldBg.split('.').pop();
const fileNameBase = isCustom ? oldBg.split('/').pop() : oldBg;
const oldBgExtensionless = fileNameBase.replace(`.${fileExtension}`, '');
const newBgExtensionless = await callPopup('<h3>Enter new background name:</h3>', 'input', oldBgExtensionless);
if (!newBgExtensionless) {
console.debug('no new_bg_extensionless');
return;
}
const newBg = `${newBgExtensionless}.${fileExtension}`;
if (oldBgExtensionless === newBgExtensionless) {
console.debug('new_bg === old_bg');
return;
}
return { oldBg, newBg };
}
async function onRenameBackgroundClick(e) {
e.stopPropagation();
const bgNames = await getNewBackgroundName(this);
if (!bgNames) {
return;
}
const data = { old_bg: bgNames.oldBg, new_bg: bgNames.newBg };
const response = await fetch('/renamebackground', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify(data),
cache: 'no-cache',
});
if (response.ok) {
await getBackgrounds();
highlightNewBackground(bgNames.newBg);
} else {
toastr.warning('Failed to rename background');
}
}
async function onDeleteBackgroundClick(e) {
e.stopPropagation();
const bgToDelete = $(this).closest('.bg_example');
const url = bgToDelete.data('url');
const isCustom = bgToDelete.attr('custom') === 'true';
const confirm = await callPopup("<h3>Delete the background?</h3>", 'confirm');
const bg = bgToDelete.attr('bgfile');
if (confirm) {
// If it's not custom, it's a built-in background. Delete it from the server
if (!isCustom) {
delBackground(bg);
} else {
const list = chat_metadata[LIST_METADATA_KEY] || [];
const index = list.indexOf(bg);
list.splice(index, 1);
}
const siblingSelector = '.bg_example:not(#form_bg_download)';
const nextBg = bgToDelete.next(siblingSelector);
const prevBg = bgToDelete.prev(siblingSelector);
const anyBg = $(siblingSelector);
if (nextBg.length > 0) {
nextBg.trigger('click');
} else if (prevBg.length > 0) {
prevBg.trigger('click');
} else {
$(anyBg[Math.floor(Math.random() * anyBg.length)]).trigger('click');
}
bgToDelete.remove();
if (url === chat_metadata[BG_METADATA_KEY]) {
removeBackgroundMetadata();
unsetCustomBackground();
highlightLockedBackground();
}
if (isCustom) {
getChatBackgroundsList();
saveMetadataDebounced();
}
}
}
const autoBgPrompt = `Pause your roleplay and choose a location ONLY from the provided list that is the most suitable for the current scene. Do not output any other text:\n{0}`;
async function autoBackgroundCommand() {
/** @type {HTMLElement[]} */
const bgTitles = Array.from(document.querySelectorAll('#bg_menu_content .BGSampleTitle'));
const options = bgTitles.map(x => ({ element: x, text: x.innerText.trim() })).filter(x => x.text.length > 0);
if (options.length == 0) {
toastr.warning('No backgrounds to choose from. Please upload some images to the "backgrounds" folder.');
return;
}
const list = options.map(option => `- ${option.text}`).join('\n');
const prompt = stringFormat(autoBgPrompt, list);
const reply = await generateQuietPrompt(prompt, false, false);
const fuse = new Fuse(options, { keys: ['text'] });
const bestMatch = fuse.search(reply, { limit: 1 });
if (bestMatch.length == 0) {
toastr.warning('No match found. Please try again.');
return;
}
console.debug('Automatically choosing background:', bestMatch);
bestMatch[0].item.element.click();
}
export async function getBackgrounds() {
const response = await fetch("/getbackgrounds", {
method: "POST",
headers: getRequestHeaders(),
body: JSON.stringify({
"": "",
}),
});
if (response.ok === true) {
const getData = await response.json();
//background = getData;
//console.log(getData.length);
$("#bg_menu_content").children('div').remove();
for (const bg of getData) {
const template = getBackgroundFromTemplate(bg, false);
$("#bg_menu_content").append(template);
}
}
}
/**
* Gets the URL of the background
* @param {Element} block
* @returns {string} URL of the background
*/
function getUrlParameter(block) {
return $(block).closest(".bg_example").data("url");
}
/**
* Instantiates a background template
* @param {string} bg Path to background
* @param {boolean} isCustom Whether the background is custom
* @returns {JQuery<HTMLElement>} Background template
*/
function getBackgroundFromTemplate(bg, isCustom) {
const template = $('#background_template .bg_example').clone();
const thumbPath = isCustom ? bg : getThumbnailUrl('bg', bg);
const url = isCustom ? `url("${encodeURI(bg)}")` : `url("${getBackgroundPath(bg)}")`;
const title = isCustom ? bg.split('/').pop() : bg;
const friendlyTitle = title.slice(0, title.lastIndexOf('.'));
template.attr('title', title);
template.attr('bgfile', bg);
template.attr('custom', String(isCustom));
template.data('url', url);
template.css('background-image', `url('${thumbPath}')`);
template.find('.BGSampleTitle').text(friendlyTitle);
return template;
}
async function setBackground(bg) {
jQuery.ajax({
type: "POST", //
url: "/setbackground", //
data: JSON.stringify({
bg: bg,
}),
beforeSend: function () {
},
cache: false,
dataType: "json",
contentType: "application/json",
//processData: false,
success: function (html) { },
error: function (jqXHR, exception) {
console.log(exception);
console.log(jqXHR);
},
});
}
async function delBackground(bg) {
const response = await fetch("/delbackground", {
method: "POST",
headers: getRequestHeaders(),
body: JSON.stringify({
bg: bg,
}),
});
}
function onBackgroundUploadSelected() {
const form = $("#form_bg_download").get(0);
if (!(form instanceof HTMLFormElement)) {
console.error('form_bg_download is not a form');
return;
}
const formData = new FormData(form);
uploadBackground(formData);
form.reset();
}
/**
* Uploads a background to the server
* @param {FormData} formData
*/
function uploadBackground(formData) {
jQuery.ajax({
type: "POST",
url: "/downloadbackground",
data: formData,
beforeSend: function () {
},
cache: false,
contentType: false,
processData: false,
success: async function (bg) {
setBackground(bg);
$("#bg1").css("background-image", `url("${getBackgroundPath(bg)}"`);
await getBackgrounds();
highlightNewBackground(bg);
},
error: function (jqXHR, exception) {
console.log(exception);
console.log(jqXHR);
},
});
}
/**
* @param {string} bg
*/
function highlightNewBackground(bg) {
const newBg = $(`.bg_example[bgfile="${bg}"]`);
const scrollOffset = newBg.offset().top - newBg.parent().offset().top;
$('#Backgrounds').scrollTop(scrollOffset);
newBg.addClass('flash animated');
setTimeout(() => newBg.removeClass('flash animated'), 2000);
}
function onBackgroundFilterInput() {
const filterValue = String($(this).val()).toLowerCase();
$("#bg_menu_content > div").each(function () {
const $bgContent = $(this);
if ($bgContent.attr("title").toLowerCase().includes(filterValue)) {
$bgContent.show();
} else {
$bgContent.hide();
}
});
}
export function initBackgrounds() {
eventSource.on(event_types.CHAT_CHANGED, onChatChanged);
eventSource.on(event_types.FORCE_SET_BACKGROUND, forceSetBackground);
$(document).on("click", '.bg_example', onSelectBackgroundClick);
$(document).on('click', '.bg_example_lock', onLockBackgroundClick);
$(document).on('click', '.bg_example_unlock', onUnlockBackgroundClick);
$(document).on('click', '.bg_example_edit', onRenameBackgroundClick);
$(document).on("click", '.bg_example_cross', onDeleteBackgroundClick);
$(document).on("click", '.bg_example_copy', onCopyToSystemBackgroundClick);
$('#auto_background').on("click", autoBackgroundCommand);
$("#add_bg_button").on('change', onBackgroundUploadSelected);
$("#bg-filter").on("input", onBackgroundFilterInput);
registerSlashCommand('lockbg', onLockBackgroundClick, ['bglock'], " locks a background for the currently selected chat", true, true);
registerSlashCommand('unlockbg', onUnlockBackgroundClick, ['bgunlock'], ' unlocks a background for the currently selected chat', true, true);
registerSlashCommand('autobg', autoBackgroundCommand, ['bgauto'], ' automatically changes the background based on the chat context using the AI request prompt', true, true);
}

View File

@@ -133,6 +133,39 @@ async function saveBookmarkMenu() {
return createNewBookmark(chat.length - 1);
}
export async function createBranch(mesId) {
if (!chat.length) {
toastr.warning('The chat is empty.', 'Branch creation failed');
return;
}
if (mesId < 0 || mesId >= chat.length) {
toastr.warning('Invalid message ID.', 'Branch creation failed');
return;
}
const lastMes = chat[mesId];
const mainChat = selected_group ? groups?.find(x => x.id == selected_group)?.chat_id : characters[this_chid].chat;
const newMetadata = { main_chat: mainChat };
let name = `Branch #${mesId} - ${humanizedDateTime()}`
if (selected_group) {
await saveGroupBookmarkChat(selected_group, name, newMetadata, mesId);
} else {
await saveChat(name, newMetadata, mesId);
}
// append to branches list if it exists
// otherwise create it
if (typeof lastMes.extra !== 'object') {
lastMes.extra = {};
}
if (typeof lastMes.extra['branches'] !== 'object') {
lastMes.extra['branches'] = [];
}
lastMes.extra['branches'].push(name);
return name;
}
async function createNewBookmark(mesId) {
if (!chat.length) {
toastr.warning('The chat is empty.', 'Bookmark creation failed');
@@ -280,7 +313,6 @@ async function convertSoloToGroupChat() {
message.name = character.name;
message.original_avatar = character.avatar;
message.force_avatar = getThumbnailUrl('avatar', character.avatar);
message.is_name = true;
// Allow regens of a single message in group
if (typeof message.extra !== 'object') {

View File

@@ -1,4 +1,4 @@
import { characters, getCharacters, handleDeleteCharacter, callPopup } from "../../../script.js";
import { characters, getCharacters, handleDeleteCharacter, callPopup } from "../script.js";
let is_bulk_edit = false;
@@ -64,23 +64,6 @@ async function onDeleteButtonClick() {
}
}
/**
* Adds the bulk edit and delete buttons to the UI.
*/
function addButtons() {
const editButton = $(
"<i id='bulkEditButton' class='fa-solid fa-edit menu_button bulkEditButton' title='Bulk edit characters'></i>"
);
const deleteButton = $(
"<i id='bulkDeleteButton' class='fa-solid fa-trash menu_button bulkDeleteButton' title='Bulk delete characters' style='display: none;'></i>"
);
$("#charListGridToggle").after(editButton, deleteButton);
$("#bulkEditButton").on("click", onEditButtonClick);
$("#bulkDeleteButton").on("click", onDeleteButtonClick);
}
/**
* Enables bulk selection by adding a checkbox next to each character.
*/
@@ -111,7 +94,7 @@ function disableBulkSelect() {
/**
* Entry point that runs on page load.
*/
jQuery(async () => {
addButtons();
// loadSettings();
jQuery(() => {
$("#bulkEditButton").on("click", onEditButtonClick);
$("#bulkDeleteButton").on("click", onDeleteButtonClick);
});

View File

@@ -1,19 +1,17 @@
import {
chat_metadata,
substituteParams,
this_chid,
eventSource,
event_types,
saveSettingsDebounced,
this_chid,
} from "../../../script.js";
import { selected_group } from "../../group-chats.js";
import { extension_settings, saveMetadataDebounced } from "../../extensions.js";
import { getCharaFilename, delay } from "../../utils.js";
import { power_user } from "../../power-user.js";
import { metadataKeys } from "./util.js";
} from "../script.js";
import { extension_settings, saveMetadataDebounced } from "./extensions.js"
import { selected_group } from "./group-chats.js";
import { getCharaFilename, delay } from "./utils.js";
import { power_user } from "./power-user.js";
// Keep track of where your extension is located, name should match repo name
const extensionName = "cfg";
const extensionFolderPath = `scripts/extensions/${extensionName}`;
const extensionName = 'cfg';
const defaultSettings = {
global: {
"guidance_scale": 1,
@@ -199,7 +197,7 @@ function loadSettings() {
if (!promptSeparator.startsWith(`"`)) {
promptSeparatorDisplay.unshift(`"`);
}
if (!promptSeparator.endsWith(`"`)) {
promptSeparatorDisplay.push(`"`);
}
@@ -279,14 +277,8 @@ function migrateSettings() {
}
// This function is called when the extension is loaded
jQuery(async () => {
// This is an example of loading HTML from a file
const windowHtml = $(await $.get(`${extensionFolderPath}/window.html`));
// Append settingsHtml to extensions_settings
// extension_settings and extensions_settings2 are the left and right columns of the settings menu
// Left should be extensions that deal with system functions and right should be visual/UI related
windowHtml.find('#CFGClose').on('click', function () {
export function initCfg() {
$('#CFGClose').on('click', function () {
$("#cfgConfig").transition({
opacity: 0,
duration: 200,
@@ -295,7 +287,7 @@ jQuery(async () => {
setTimeout(function () { $('#cfgConfig').hide() }, 200);
});
windowHtml.find('#chat_cfg_guidance_scale').on('input', function() {
$('#chat_cfg_guidance_scale').on('input', function() {
const numberValue = Number($(this).val());
const success = setChatCfg(numberValue, settingType.guidance_scale);
if (success) {
@@ -303,15 +295,15 @@ jQuery(async () => {
}
});
windowHtml.find('#chat_cfg_negative_prompt').on('input', function() {
$('#chat_cfg_negative_prompt').on('input', function() {
setChatCfg($(this).val(), settingType.negative_prompt);
});
windowHtml.find('#chat_cfg_positive_prompt').on('input', function() {
$('#chat_cfg_positive_prompt').on('input', function() {
setChatCfg($(this).val(), settingType.positive_prompt);
});
windowHtml.find('#chara_cfg_guidance_scale').on('input', function() {
$('#chara_cfg_guidance_scale').on('input', function() {
const value = $(this).val();
const success = setCharCfg(value, settingType.guidance_scale);
if (success) {
@@ -319,34 +311,34 @@ jQuery(async () => {
}
});
windowHtml.find('#chara_cfg_negative_prompt').on('input', function() {
$('#chara_cfg_negative_prompt').on('input', function() {
setCharCfg($(this).val(), settingType.negative_prompt);
});
windowHtml.find('#chara_cfg_positive_prompt').on('input', function() {
$('#chara_cfg_positive_prompt').on('input', function() {
setCharCfg($(this).val(), settingType.positive_prompt);
});
windowHtml.find('#global_cfg_guidance_scale').on('input', function() {
$('#global_cfg_guidance_scale').on('input', function() {
extension_settings.cfg.global.guidance_scale = Number($(this).val());
$('#global_cfg_guidance_scale_counter').text(extension_settings.cfg.global.guidance_scale.toFixed(2));
saveSettingsDebounced();
});
windowHtml.find('#global_cfg_negative_prompt').on('input', function() {
$('#global_cfg_negative_prompt').on('input', function() {
extension_settings.cfg.global.negative_prompt = $(this).val();
saveSettingsDebounced();
});
windowHtml.find('#global_cfg_positive_prompt').on('input', function() {
$('#global_cfg_positive_prompt').on('input', function() {
extension_settings.cfg.global.positive_prompt = $(this).val();
saveSettingsDebounced();
});
windowHtml.find(`input[name="cfg_prompt_combine"]`).on('input', function() {
const values = windowHtml.find(`input[name="cfg_prompt_combine"]`)
$(`input[name="cfg_prompt_combine"]`).on('input', function() {
const values = $('#cfgConfig').find(`input[name="cfg_prompt_combine"]`)
.filter(":checked")
.map(function() { return parseInt($(this).val()) })
.map(function() { return Number($(this).val()) })
.get()
.filter((e) => !Number.isNaN(e)) || [];
@@ -354,17 +346,17 @@ jQuery(async () => {
saveMetadataDebounced();
});
windowHtml.find(`#cfg_prompt_insertion_depth`).on('input', function() {
$(`#cfg_prompt_insertion_depth`).on('input', function() {
chat_metadata[metadataKeys.prompt_insertion_depth] = Number($(this).val());
saveMetadataDebounced();
});
windowHtml.find(`#cfg_prompt_separator`).on('input', function() {
$(`#cfg_prompt_separator`).on('input', function() {
chat_metadata[metadataKeys.prompt_separator] = $(this).val();
saveMetadataDebounced();
});
windowHtml.find('#groupchat_cfg_use_chara').on('input', function() {
$('#groupchat_cfg_use_chara').on('input', function() {
const checked = !!$(this).prop('checked');
chat_metadata[metadataKeys.groupchat_individual_chars] = checked
@@ -375,20 +367,126 @@ jQuery(async () => {
saveMetadataDebounced();
});
$("#movingDivs").append(windowHtml);
initialLoadSettings();
if (extension_settings.cfg) {
migrateSettings();
}
const buttonHtml = $(await $.get(`${extensionFolderPath}/menuButton.html`));
buttonHtml.on('click', onCfgMenuItemClick)
buttonHtml.appendTo("#options_advanced");
$('#option_toggle_CFG').on('click', onCfgMenuItemClick);
// Hook events
eventSource.on(event_types.CHAT_CHANGED, async () => {
await onChatChanged();
});
});
}
export const cfgType = {
chat: 0,
chara: 1,
global: 2
}
export const metadataKeys = {
guidance_scale: "cfg_guidance_scale",
negative_prompt: "cfg_negative_prompt",
positive_prompt: "cfg_positive_prompt",
prompt_combine: "cfg_prompt_combine",
groupchat_individual_chars: "cfg_groupchat_individual_chars",
prompt_insertion_depth: "cfg_prompt_insertion_depth",
prompt_separator: "cfg_prompt_separator"
}
// Gets the CFG guidance scale
// If the guidance scale is 1, ignore the CFG prompt(s) since it won't be used anyways
export function getGuidanceScale() {
if (!extension_settings.cfg) {
console.warn("CFG extension is not enabled. Skipping CFG guidance.");
return;
}
const charaCfg = extension_settings.cfg.chara?.find((e) => e.name === getCharaFilename(this_chid));
const chatGuidanceScale = chat_metadata[metadataKeys.guidance_scale];
const groupchatCharOverride = chat_metadata[metadataKeys.groupchat_individual_chars] ?? false;
if (chatGuidanceScale && chatGuidanceScale !== 1 && !groupchatCharOverride) {
return {
type: cfgType.chat,
value: chatGuidanceScale
};
}
if ((!selected_group && charaCfg || groupchatCharOverride) && charaCfg?.guidance_scale !== 1) {
return {
type: cfgType.chara,
value: charaCfg.guidance_scale
};
}
if (extension_settings.cfg.global && extension_settings.cfg.global?.guidance_scale !== 1) {
return {
type: cfgType.global,
value: extension_settings.cfg.global.guidance_scale
};
}
}
/**
* Gets the CFG prompt separator.
* @returns {string} The CFG prompt separator
*/
function getCustomSeparator() {
const defaultSeparator = "\n";
try {
if (chat_metadata[metadataKeys.prompt_separator]) {
return JSON.parse(chat_metadata[metadataKeys.prompt_separator]);
}
return defaultSeparator;
} catch {
console.warn("Invalid JSON detected for prompt separator. Using default separator.");
return defaultSeparator;
}
}
// Gets the CFG prompt
export function getCfgPrompt(guidanceScale, isNegative) {
let splitCfgPrompt = [];
const cfgPromptCombine = chat_metadata[metadataKeys.prompt_combine] ?? [];
if (guidanceScale.type === cfgType.chat || cfgPromptCombine.includes(cfgType.chat)) {
splitCfgPrompt.unshift(
substituteParams(
chat_metadata[isNegative ? metadataKeys.negative_prompt : metadataKeys.positive_prompt]
)
);
}
const charaCfg = extension_settings.cfg.chara?.find((e) => e.name === getCharaFilename(this_chid));
if (guidanceScale.type === cfgType.chara || cfgPromptCombine.includes(cfgType.chara)) {
splitCfgPrompt.unshift(
substituteParams(
isNegative ? charaCfg.negative_prompt : charaCfg.positive_prompt
)
);
}
if (guidanceScale.type === cfgType.global || cfgPromptCombine.includes(cfgType.global)) {
splitCfgPrompt.unshift(
substituteParams(
isNegative ? extension_settings.cfg.global.negative_prompt : extension_settings.cfg.global.positive_prompt
)
);
}
const customSeparator = getCustomSeparator();
const combinedCfgPrompt = splitCfgPrompt.filter((e) => e.length > 0).join(customSeparator);
const insertionDepth = chat_metadata[metadataKeys.prompt_insertion_depth] ?? 1;
console.log(`Setting CFG with guidance scale: ${guidanceScale.value}, negatives: ${combinedCfgPrompt}`);
return {
value: combinedCfgPrompt,
depth: insertionDepth
};
}

View File

@@ -11,7 +11,7 @@ export {
ModuleWorkerWrapper,
};
let extensionNames = [];
export let extensionNames = [];
let manifests = {};
const defaultUrl = "http://localhost:5100";
@@ -123,6 +123,7 @@ const extension_settings = {
apiUrl: defaultUrl,
apiKey: '',
autoConnect: false,
notifyUpdates: false,
disabledExtensions: [],
expressionOverrides: [],
memory: {},
@@ -134,7 +135,10 @@ const extension_settings = {
caption: {
refine_mode: false,
},
expressions: {},
expressions: {
/** @type {string[]} */
custom: [],
},
dice: {},
regex: [],
tts: {},
@@ -153,6 +157,8 @@ const extension_settings = {
},
speech_recognition: {},
rvc: {},
hypebot: {},
vectors: {},
};
let modules = [];
@@ -192,7 +198,6 @@ async function doExtrasFetch(endpoint, args) {
}
Object.assign(args.headers, {
'Authorization': `Bearer ${extension_settings.apiKey}`,
'Bypass-Tunnel-Reminder': 'bypass'
});
const response = await fetch(endpoint, args);
@@ -201,7 +206,7 @@ async function doExtrasFetch(endpoint, args) {
async function discoverExtensions() {
try {
const response = await fetch('/discover_extensions');
const response = await fetch('/api/extensions/discover');
if (response.ok) {
const extensions = await response.json();
@@ -363,6 +368,15 @@ function addExtensionsButtonAndMenu() {
});
}
function notifyUpdatesInputHandler() {
extension_settings.notifyUpdates = !!$('#extensions_notify_updates').prop('checked');
saveSettingsDebounced();
if (extension_settings.notifyUpdates) {
checkForExtensionUpdates(true);
}
}
/* $(document).on('click', function (e) {
const target = $(e.target);
if (target.is(dropdown)) return;
@@ -578,16 +592,25 @@ async function showExtensionsDetails() {
let htmlExternal = '<h3>External Extensions:</h3>';
const extensions = Object.entries(manifests).sort((a, b) => a[1].loading_order - b[1].loading_order);
const promises = [];
for (const extension of extensions) {
const { isExternal, extensionHtml } = await getExtensionData(extension);
if (isExternal) {
htmlExternal += extensionHtml;
} else {
htmlDefault += extensionHtml;
}
promises.push(getExtensionData(extension));
}
const settledPromises = await Promise.allSettled(promises);
settledPromises.forEach(promise => {
if (promise.status === 'fulfilled') {
const { isExternal, extensionHtml } = promise.value;
if (isExternal) {
htmlExternal += extensionHtml;
} else {
htmlDefault += extensionHtml;
}
}
});
const html = `
${getModuleInformation()}
${htmlDefault}
@@ -605,8 +628,17 @@ async function showExtensionsDetails() {
*/
async function onUpdateClick() {
const extensionName = $(this).data('name');
await updateExtension(extensionName, false);
}
/**
* Updates a third-party extension via the API.
* @param {string} extensionName Extension folder name
* @param {boolean} quiet If true, don't show a success message
*/
async function updateExtension(extensionName, quiet) {
try {
const response = await fetch('/update_extension', {
const response = await fetch('/api/extensions/update', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify({ extensionName })
@@ -614,19 +646,24 @@ async function onUpdateClick() {
const data = await response.json();
if (data.isUpToDate) {
toastr.success('Extension is already up to date');
if (!quiet) {
toastr.success('Extension is already up to date');
}
} else {
toastr.success(`Extension updated to ${data.shortCommitHash}`);
toastr.success(`Extension ${extensionName} updated to ${data.shortCommitHash}`);
}
if (!quiet) {
showExtensionsDetails();
}
showExtensionsDetails();
} catch (error) {
console.error('Error:', error);
}
};
}
/**
* Handles the click event for the delete button of an extension.
* This function makes a POST request to '/delete_extension' with the extension's name.
* This function makes a POST request to '/api/extensions/delete' with the extension's name.
* If the extension is deleted, it displays a success message.
* Creates a popup for the user to confirm before delete.
*/
@@ -635,23 +672,26 @@ async function onDeleteClick() {
// use callPopup to create a popup for the user to confirm before delete
const confirmation = await callPopup(`Are you sure you want to delete ${extensionName}?`, 'delete_extension');
if (confirmation) {
try {
const response = await fetch('/delete_extension', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify({ extensionName })
});
} catch (error) {
console.error('Error:', error);
}
toastr.success(`Extension ${extensionName} deleted`);
showExtensionsDetails();
// reload the page to remove the extension from the list
location.reload();
await deleteExtension(extensionName);
}
};
export async function deleteExtension(extensionName) {
try {
const response = await fetch('/api/extensions/delete', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify({ extensionName })
});
} catch (error) {
console.error('Error:', error);
}
toastr.success(`Extension ${extensionName} deleted`);
showExtensionsDetails();
// reload the page to remove the extension from the list
location.reload();
}
/**
* Fetches the version details of a specific extension.
@@ -663,7 +703,7 @@ async function onDeleteClick() {
*/
async function getExtensionVersion(extensionName) {
try {
const response = await fetch('/get_extension_version', {
const response = await fetch('/api/extensions/version', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify({ extensionName })
@@ -676,9 +716,41 @@ async function getExtensionVersion(extensionName) {
}
}
/**
* Installs a third-party extension via the API.
* @param {string} url Extension repository URL
* @returns {Promise<void>}
*/
export async function installExtension(url) {
console.debug('Extension installation started', url);
toastr.info('Please wait...', 'Installing extension');
async function loadExtensionSettings(settings) {
const request = await fetch('/api/extensions/install', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify({ url }),
});
if (!request.ok) {
toastr.info(request.statusText, 'Extension installation failed');
console.error('Extension installation failed', request.status, request.statusText);
return;
}
const response = await request.json();
toastr.success(`Extension "${response.display_name}" by ${response.author} (version ${response.version}) has been installed successfully!`, 'Extension installation successful');
console.debug(`Extension "${response.display_name}" has been installed successfully at ${response.extensionPath}`);
await loadExtensionSettings({}, false);
eventSource.emit(event_types.EXTENSION_SETTINGS_LOADED);
}
/**
* Loads extension settings from the app settings.
* @param {object} settings App Settings
* @param {boolean} versionChanged Is this a version change?
*/
async function loadExtensionSettings(settings, versionChanged) {
if (settings.extension_settings) {
Object.assign(extension_settings, settings.extension_settings);
}
@@ -686,15 +758,80 @@ async function loadExtensionSettings(settings) {
$("#extensions_url").val(extension_settings.apiUrl);
$("#extensions_api_key").val(extension_settings.apiKey);
$("#extensions_autoconnect").prop('checked', extension_settings.autoConnect);
$("#extensions_notify_updates").prop('checked', extension_settings.notifyUpdates);
// Activate offline extensions
eventSource.emit(event_types.EXTENSIONS_FIRST_LOAD);
extensionNames = await discoverExtensions();
manifests = await getManifests(extensionNames)
if (versionChanged) {
await autoUpdateExtensions();
}
await activateExtensions();
if (extension_settings.autoConnect && extension_settings.apiUrl) {
connectToApi(extension_settings.apiUrl);
}
if (extension_settings.notifyUpdates) {
checkForExtensionUpdates(false);
}
}
/**
* Checks if there are updates available for 3rd-party extensions.
* @param {boolean} force Skip nag check
* @returns {Promise<any>}
*/
async function checkForExtensionUpdates(force) {
if (!force) {
const STORAGE_NAG_KEY = 'extension_update_nag';
const currentDate = new Date().toDateString();
// Don't nag more than once a day
if (localStorage.getItem(STORAGE_NAG_KEY) === currentDate) {
return;
}
localStorage.setItem(STORAGE_NAG_KEY, currentDate);
}
const updatesAvailable = [];
const promises = [];
for (const [id, manifest] of Object.entries(manifests)) {
if (manifest.auto_update && id.startsWith('third-party')) {
const promise = new Promise(async (resolve, reject) => {
try {
const data = await getExtensionVersion(id.replace('third-party', ''));
if (data.isUpToDate === false) {
updatesAvailable.push(manifest.display_name);
}
resolve();
} catch (error) {
console.error('Error checking for extension updates', error);
reject();
}
});
promises.push(promise);
}
}
await Promise.allSettled(promises);
if (updatesAvailable.length > 0) {
toastr.info(`${updatesAvailable.map(x => `${x}`).join('\n')}`, 'Extension updates available');
}
}
async function autoUpdateExtensions() {
for (const [id, manifest] of Object.entries(manifests)) {
if (manifest.auto_update && id.startsWith('third-party')) {
console.debug(`Auto-updating 3rd-party extension: ${manifest.display_name} (${id})`);
await updateExtension(id.replace('third-party', ''), true);
}
}
}
async function runGenerationInterceptors(chat, contextSize) {
@@ -717,8 +854,36 @@ jQuery(function () {
$("#extensions_connect").on('click', connectClickHandler);
$("#extensions_autoconnect").on('input', autoConnectInputHandler);
$("#extensions_details").on('click', showExtensionsDetails);
$("#extensions_notify_updates").on('input', notifyUpdatesInputHandler);
$(document).on('click', '.toggle_disable', onDisableExtensionClick);
$(document).on('click', '.toggle_enable', onEnableExtensionClick);
$(document).on('click', '.btn_update', onUpdateClick);
$(document).on('click', '.btn_delete', onDeleteClick);
/**
* Handles the click event for the third-party extension import button.
* Prompts the user to enter the Git URL of the extension to import.
* After obtaining the Git URL, makes a POST request to '/api/extensions/install' to import the extension.
* If the extension is imported successfully, a success message is displayed.
* If the extension import fails, an error message is displayed and the error is logged to the console.
* After successfully importing the extension, the extension settings are reloaded and a 'EXTENSION_SETTINGS_LOADED' event is emitted.
*
* @listens #third_party_extension_button#click - The click event of the '#third_party_extension_button' element.
*/
$('#third_party_extension_button').on('click', async () => {
const html = `<h3>Enter the Git URL of the extension to install</h3>
<br>
<p><b>Disclaimer:</b> Please be aware that using external extensions can have unintended side effects and may pose security risks. Always make sure you trust the source before importing an extension. We are not responsible for any damage caused by third-party extensions.</p>
<br>
<p>Example: <tt> https://github.com/author/extension-name </tt></p>`
const input = await callPopup(html, 'input');
if (!input) {
console.debug('Extension install cancelled');
return;
}
const url = input.trim();
await installExtension(url);
});
});

View File

@@ -0,0 +1,9 @@
<div class="m-b-1">
Are you sure you want to connect to '{{url}}'?
</div>
<div class="flex-container justifyCenter">
<label class="checkbox_label" for="assets-remember">
<input type="checkbox" id="assets-remember">
Don't ask again for this URL
</label>
</div>

View File

@@ -1,14 +1,16 @@
/*
TODO:
- Check failed install file (0kb size ?)
*/
//const DEBUG_TONY_SAMA_FORK_MODE = false
//const DEBUG_TONY_SAMA_FORK_MODE = true
import { getRequestHeaders, callPopup } from "../../../script.js";
import { deleteExtension, extensionNames, installExtension, renderExtensionTemplate } from "../../extensions.js";
import { getStringHash, isValidUrl } from "../../utils.js";
export { MODULE_NAME };
const MODULE_NAME = 'Assets';
const MODULE_NAME = 'assets';
const DEBUG_PREFIX = "<Assets module> ";
let previewAudio = null;
let ASSETS_JSON_URL = "https://raw.githubusercontent.com/SillyTavern/SillyTavern-Content/main/index.json"
const extensionName = "assets";
@@ -29,7 +31,7 @@ const defaultSettings = {
function downloadAssetsList(url) {
updateCurrentAssets().then(function () {
fetch(url)
fetch(url, { cache: "no-cache" })
.then(response => response.json())
.then(json => {
@@ -47,8 +49,10 @@ function downloadAssetsList(url) {
}
console.debug(DEBUG_PREFIX, "Updated available assets to", availableAssets);
// First extensions, then everything else
const assetTypes = Object.keys(availableAssets).sort((a, b) => (a === 'extension') ? -1 : (b === 'extension') ? 1 : 0);
for (const assetType in availableAssets) {
for (const assetType of assetTypes) {
let assetTypeMenu = $('<div />', { id: "assets_audio_ambient_div", class: "assets-list-div" });
assetTypeMenu.append(`<h3>${assetType}</h3>`)
for (const i in availableAssets[assetType]) {
@@ -59,7 +63,7 @@ function downloadAssetsList(url) {
element.append(label);
//if (DEBUG_TONY_SAMA_FORK_MODE)
// assetUrl = assetUrl.replace("https://github.com/SillyTavern/","https://github.com/Tony-sama/"); // DBG
// asset["url"] = asset["url"].replace("https://github.com/SillyTavern/","https://github.com/Tony-sama/"); // DBG
console.debug(DEBUG_PREFIX, "Checking asset", asset["id"], asset["url"]);
@@ -71,18 +75,18 @@ function downloadAssetsList(url) {
label.addClass("fa-check");
this.classList.remove('asset-download-button-loading');
element.on("click", assetDelete);
element.on("mouseenter", function(){
element.on("mouseenter", function () {
label.removeClass("fa-check");
label.addClass("fa-trash");
label.addClass("redOverlayGlow");
}).on("mouseleave", function(){
}).on("mouseleave", function () {
label.addClass("fa-check");
label.removeClass("fa-trash");
label.removeClass("redOverlayGlow");
});
};
const assetDelete = async function() {
const assetDelete = async function () {
element.off("click");
await deleteAsset(assetType, asset["id"]);
label.removeClass("fa-check");
@@ -98,11 +102,11 @@ function downloadAssetsList(url) {
label.toggleClass("fa-download");
label.toggleClass("fa-check");
element.on("click", assetDelete);
element.on("mouseenter", function(){
element.on("mouseenter", function () {
label.removeClass("fa-check");
label.addClass("fa-trash");
label.addClass("redOverlayGlow");
}).on("mouseleave", function(){
}).on("mouseleave", function () {
label.addClass("fa-check");
label.removeClass("fa-trash");
label.removeClass("redOverlayGlow");
@@ -114,14 +118,28 @@ function downloadAssetsList(url) {
element.on("click", assetInstall);
}
console.debug(DEBUG_PREFIX, "Created element for BGM", asset["id"])
console.debug(DEBUG_PREFIX, "Created element for ", asset["id"])
const displayName = DOMPurify.sanitize(asset["name"] || asset["id"]);
const description = DOMPurify.sanitize(asset["description"] || "");
const url = isValidUrl(asset["url"]) ? asset["url"] : "";
const previewIcon = assetType == 'extension' ? 'fa-arrow-up-right-from-square' : 'fa-headphones-simple';
$(`<i></i>`)
.append(element)
.append(`<span>${asset["id"]}</span>`)
.append(`<div class="flex-container flexFlowColumn">
<span class="flex-container alignitemscenter">
<b>${displayName}</b>
<a class="asset_preview" href="${url}" target="_blank" title="Preview in browser">
<i class="fa-solid fa-sm ${previewIcon}"></i>
</a>
</span>
<span>${description}</span>
</div>`)
.appendTo(assetTypeMenu);
}
assetTypeMenu.appendTo("#assets_menu");
assetTypeMenu.on('click', 'a.asset_preview', previewAsset);
}
$("#assets_menu").show();
@@ -135,8 +153,37 @@ function downloadAssetsList(url) {
});
}
function previewAsset(e) {
const href = $(this).attr('href');
const audioExtensions = ['.mp3', '.ogg', '.wav'];
if (audioExtensions.some(ext => href.endsWith(ext))) {
e.preventDefault();
if (previewAudio) {
previewAudio.pause();
if (previewAudio.src === href) {
previewAudio = null;
return;
}
}
previewAudio = new Audio(href);
previewAudio.play();
return;
}
}
function isAssetInstalled(assetType, filename) {
for (const i of currentAssets[assetType]) {
let assetList = currentAssets[assetType];
if (assetType == 'extension') {
const thirdPartyMarker = "third-party/";
assetList = extensionNames.filter(x => x.startsWith(thirdPartyMarker)).map(x => x.replace(thirdPartyMarker, ''));
}
for (const i of assetList) {
//console.debug(DEBUG_PREFIX,i,filename)
if (i.includes(filename))
return true;
@@ -149,8 +196,15 @@ async function installAsset(url, assetType, filename) {
console.debug(DEBUG_PREFIX, "Downloading ", url);
const category = assetType;
try {
if (category === 'extension') {
console.debug(DEBUG_PREFIX, "Installing extension ", url)
await installExtension(url);
console.debug(DEBUG_PREFIX, "Extension installed.")
return;
}
const body = { url, category, filename };
const result = await fetch('/asset_download', {
const result = await fetch('/api/assets/download', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify(body),
@@ -170,8 +224,14 @@ async function deleteAsset(assetType, filename) {
console.debug(DEBUG_PREFIX, "Deleting ", assetType, filename);
const category = assetType;
try {
if (category === 'extension') {
console.debug(DEBUG_PREFIX, "Deleting extension ", filename)
await deleteExtension(filename);
console.debug(DEBUG_PREFIX, "Extension deleted.")
}
const body = { category, filename };
const result = await fetch('/asset_delete', {
const result = await fetch('/api/assets/delete', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify(body),
@@ -194,7 +254,7 @@ async function deleteAsset(assetType, filename) {
async function updateCurrentAssets() {
console.debug(DEBUG_PREFIX, "Checking installed assets...")
try {
const result = await fetch(`/get_assets`, {
const result = await fetch(`/api/assets/get`, {
method: 'POST',
headers: getRequestHeaders(),
});
@@ -214,24 +274,35 @@ async function updateCurrentAssets() {
// This function is called when the extension is loaded
jQuery(async () => {
// This is an example of loading HTML from a file
const windowHtml = $(await $.get(`${extensionFolderPath}/window.html`));
const windowHtml = $(renderExtensionTemplate(MODULE_NAME, 'window', {}));
const assetsJsonUrl = windowHtml.find('#assets-json-url-field');
assetsJsonUrl.val(ASSETS_JSON_URL);
const connectButton = windowHtml.find('#assets-connect-button');
connectButton.on("click", async function () {
const confirmation = await callPopup(`Are you sure you want to connect to '${assetsJsonUrl.val()}'?`, 'confirm')
const url = String(assetsJsonUrl.val());
const rememberKey = `Assets_SkipConfirm_${getStringHash(url)}`;
const skipConfirm = localStorage.getItem(rememberKey) === 'true';
const template = renderExtensionTemplate(MODULE_NAME, 'confirm', { url });
const confirmation = skipConfirm || await callPopup(template, 'confirm');
if (confirmation) {
try {
if (!skipConfirm) {
const rememberValue = Boolean($('#assets-remember').prop('checked'));
localStorage.setItem(rememberKey, String(rememberValue));
}
console.debug(DEBUG_PREFIX, "Confimation, loading assets...");
downloadAssetsList(assetsJsonUrl.val());
downloadAssetsList(url);
connectButton.removeClass("fa-plug-circle-exclamation");
connectButton.removeClass("redOverlayGlow");
connectButton.addClass("fa-plug-circle-check");
} catch (error) {
console.error('Error:', error);
toastr.error(`Cannot get assets list from ${assetsJsonUrl.val()}`);
toastr.error(`Cannot get assets list from ${url}`);
connectButton.removeClass("fa-plug-circle-check");
connectButton.addClass("fa-plug-circle-exclamation");
connectButton.removeClass("redOverlayGlow");

View File

@@ -13,18 +13,31 @@
padding: 5px;
}
.assets-list-div h3 {
text-transform: capitalize;
}
.assets-list-div a {
color: inherit;
}
.assets-list-div i {
display: flex;
flex-direction: row;
align-items: center;
justify-content: left;
padding: 5px;
font-style: normal;
}
.assets-list-div i span{
.assets-list-div i span {
margin-left: 10px;
}
.assets-list-div i span:first-of-type {
font-weight: bold;
}
.asset-download-button {
position: relative;
width: 50px;
@@ -33,8 +46,8 @@
outline: none;
border-radius: 2px;
cursor: pointer;
}
}
.asset-download-button:active {
background: #007a63;
}
@@ -67,13 +80,11 @@
}
@keyframes asset-download-button-loading-spinner {
from {
transform: rotate(0turn);
}
from {
transform: rotate(0turn);
}
to {
transform: rotate(1turn);
to {
transform: rotate(1turn);
}
}
}

View File

@@ -1,7 +1,7 @@
<div id="assets_ui">
<div class="inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<b>Assets</b>
<b>Download Extensions & Assets</b>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">

View File

@@ -1,593 +0,0 @@
/*
Ideas:
- cross fading between bgm / start a different time
- Background based ambient sounds
- import option on background UI ?
- Allow background music edition using background menu
- https://fontawesome.com/icons/music?f=classic&s=solid
- https://codepen.io/noirsociety/pen/rNQxQwm
- https://codepen.io/xrocker/pen/abdKVGy
*/
import { saveSettingsDebounced, getRequestHeaders } from "../../../script.js";
import { getContext, extension_settings, ModuleWorkerWrapper } from "../../extensions.js";
import { isDataURL } from "../../utils.js";
export { MODULE_NAME };
const extensionName = "audio";
const extensionFolderPath = `scripts/extensions/${extensionName}`;
const MODULE_NAME = 'Audio';
const DEBUG_PREFIX = "<Audio module> ";
const UPDATE_INTERVAL = 1000;
const ASSETS_BGM_FOLDER = "bgm";
const ASSETS_AMBIENT_FOLDER = "ambient";
const CHARACTER_BGM_FOLDER = "bgm"
const FALLBACK_EXPRESSION = "neutral";
const DEFAULT_EXPRESSIONS = [
//"talkinghead",
"admiration",
"amusement",
"anger",
"annoyance",
"approval",
"caring",
"confusion",
"curiosity",
"desire",
"disappointment",
"disapproval",
"disgust",
"embarrassment",
"excitement",
"fear",
"gratitude",
"grief",
"joy",
"love",
"nervousness",
"optimism",
"pride",
"realization",
"relief",
"remorse",
"sadness",
"surprise",
"neutral"
];
const SPRITE_DOM_ID = "#expression-image";
let fallback_BGMS = null; // Initialized only once with module workers
let ambients = null; // Initialized only once with module workers
let characterMusics = {}; // Updated with module workers
let currentCharacterBGM = null;
let currentExpressionBGM = null;
let currentBackground = null;
let cooldownBGM = 0;
//#############################//
// Extension UI and Settings //
//#############################//
const defaultSettings = {
enabled: false,
bgm_muted: true,
ambient_muted: true,
bgm_volume: 50,
ambient_volume: 50,
bgm_cooldown: 30
}
function loadSettings() {
if (extension_settings.audio === undefined)
extension_settings.audio = {};
if (Object.keys(extension_settings.audio).length === 0) {
Object.assign(extension_settings.audio, defaultSettings)
}
$("#audio_enabled").prop('checked', extension_settings.audio.enabled);
$("#audio_bgm_volume").text(extension_settings.audio.bgm_volume);
$("#audio_ambient_volume").text(extension_settings.audio.ambient_volume);
$("#audio_bgm_volume_slider").val(extension_settings.audio.bgm_volume);
$("#audio_ambient_volume_slider").val(extension_settings.audio.ambient_volume);
if (extension_settings.audio.bgm_muted) {
$("#audio_bgm_mute_icon").removeClass("fa-volume-high");
$("#audio_bgm_mute_icon").addClass("fa-volume-mute");
$("#audio_bgm_mute").addClass("redOverlayGlow");
$("#audio_bgm").prop("muted", true);
}
else{
$("#audio_bgm_mute_icon").addClass("fa-volume-high");
$("#audio_bgm_mute_icon").removeClass("fa-volume-mute");
$("#audio_bgm_mute").removeClass("redOverlayGlow");
$("#audio_bgm").prop("muted", false);
}
if (extension_settings.audio.ambient_muted) {
$("#audio_ambient_mute_icon").removeClass("fa-volume-high");
$("#audio_ambient_mute_icon").addClass("fa-volume-mute");
$("#audio_ambient_mute").addClass("redOverlayGlow");
$("#audio_ambient").prop("muted", true);
}
else{
$("#audio_ambient_mute_icon").addClass("fa-volume-high");
$("#audio_ambient_mute_icon").removeClass("fa-volume-mute");
$("#audio_ambient_mute").removeClass("redOverlayGlow");
$("#audio_ambient").prop("muted", false);
}
$("#audio_bgm_cooldown").val(extension_settings.audio.bgm_cooldown);
$("#audio_debug_div").hide(); // DBG
}
async function onEnabledClick() {
extension_settings.audio.enabled = $('#audio_enabled').is(':checked');
if (extension_settings.audio.enabled) {
if ($("#audio_bgm").attr("src") != "")
$("#audio_bgm")[0].play();
if ($("#audio_ambient").attr("src") != "")
$("#audio_ambient")[0].play();
} else {
$("#audio_bgm")[0].pause();
$("#audio_ambient")[0].pause();
}
saveSettingsDebounced();
}
async function onBGMMuteClick() {
extension_settings.audio.bgm_muted = !extension_settings.audio.bgm_muted;
$("#audio_bgm_mute_icon").toggleClass("fa-volume-high");
$("#audio_bgm_mute_icon").toggleClass("fa-volume-mute");
$("#audio_bgm").prop("muted", !$("#audio_bgm").prop("muted"));
$("#audio_bgm_mute").toggleClass("redOverlayGlow");
saveSettingsDebounced();
}
async function onAmbientMuteClick() {
extension_settings.audio.ambient_muted = !extension_settings.audio.ambient_muted;
$("#audio_ambient_mute_icon").toggleClass("fa-volume-high");
$("#audio_ambient_mute_icon").toggleClass("fa-volume-mute");
$("#audio_ambient").prop("muted", !$("#audio_ambient").prop("muted"));
$("#audio_ambient_mute").toggleClass("redOverlayGlow");
saveSettingsDebounced();
}
async function onBGMVolumeChange() {
extension_settings.audio.bgm_volume = ~~($("#audio_bgm_volume_slider").val());
$("#audio_bgm").prop("volume", extension_settings.audio.bgm_volume * 0.01);
$("#audio_bgm_volume").text(extension_settings.audio.bgm_volume);
saveSettingsDebounced();
//console.debug(DEBUG_PREFIX,"UPDATED BGM MAX TO",extension_settings.audio.bgm_volume);
}
async function onAmbientVolumeChange() {
extension_settings.audio.ambient_volume = ~~($("#audio_ambient_volume_slider").val());
$("#audio_ambient").prop("volume", extension_settings.audio.ambient_volume * 0.01);
$("#audio_ambient_volume").text(extension_settings.audio.ambient_volume);
saveSettingsDebounced();
//console.debug(DEBUG_PREFIX,"UPDATED Ambient MAX TO",extension_settings.audio.ambient_volume);
}
async function onBGMCooldownInput() {
extension_settings.audio.bgm_cooldown = ~~($("#audio_bgm_cooldown").val());
cooldownBGM = extension_settings.audio.bgm_cooldown * 1000;
saveSettingsDebounced();
console.debug(DEBUG_PREFIX, "UPDATED BGM cooldown to", extension_settings.audio.bgm_cooldown);
}
//#############################//
// API Calls //
//#############################//
async function getAssetsList(type) {
console.debug(DEBUG_PREFIX, "getting assets of type", type);
try {
const result = await fetch(`/get_assets`, {
method: 'POST',
headers: getRequestHeaders(),
});
const assets = result.ok ? (await result.json()) : { type: [] };
console.debug(DEBUG_PREFIX, "Found assets:", assets);
return assets[type];
}
catch (err) {
console.log(err);
return [];
}
}
async function getCharacterBgmList(name) {
console.debug(DEBUG_PREFIX, "getting bgm list for", name);
try {
const result = await fetch(`/get_character_assets_list?name=${encodeURIComponent(name)}&category=${CHARACTER_BGM_FOLDER}`, {
method: 'POST',
headers: getRequestHeaders(),
});
let musics = result.ok ? (await result.json()) : [];
return musics;
}
catch (err) {
console.log(err);
return [];
}
}
//#############################//
// Module Worker //
//#############################//
/*
- Update ambient sound
- Update character BGM
- Solo dynamique expression
- Group only neutral bgm
*/
async function moduleWorker() {
const moduleEnabled = extension_settings.audio.enabled;
if (moduleEnabled) {
if (cooldownBGM > 0)
cooldownBGM -= UPDATE_INTERVAL;
if (fallback_BGMS == null) {
console.debug(DEBUG_PREFIX, "Updating audio bgm assets...");
fallback_BGMS = await getAssetsList(ASSETS_BGM_FOLDER);
fallback_BGMS = fallback_BGMS.filter((filename) => filename != ".placeholder")
console.debug(DEBUG_PREFIX, "Detected assets:", fallback_BGMS);
}
if (ambients == null) {
console.debug(DEBUG_PREFIX, "Updating audio ambient assets...");
ambients = await getAssetsList(ASSETS_AMBIENT_FOLDER);
ambients = ambients.filter((filename) => filename != ".placeholder")
console.debug(DEBUG_PREFIX, "Detected assets:", ambients);
}
// 1) Update ambient audio
// ---------------------------
let newBackground = $("#bg1").css("background-image");
const custom_background = getContext()["chatMetadata"]["custom_background"];
if (custom_background !== undefined)
newBackground = custom_background
if (!isDataURL(newBackground)) {
newBackground = newBackground.substring(newBackground.lastIndexOf("/") + 1).replace(/\.[^/.]+$/, "").replaceAll("%20", "-").replaceAll(" ", "-"); // remove path and spaces
//console.debug(DEBUG_PREFIX,"Current backgroung:",newBackground);
if (currentBackground !== newBackground) {
currentBackground = newBackground;
console.debug(DEBUG_PREFIX, "Changing ambient audio for", currentBackground);
updateAmbient();
}
}
const context = getContext();
//console.debug(DEBUG_PREFIX,context);
if (context.chat.length == 0)
return;
let chatIsGroup = context.chat[0].is_group;
let newCharacter = null;
// 1) Update BGM (single chat)
// -----------------------------
if (!chatIsGroup) {
newCharacter = context.name2;
//console.log(DEBUG_PREFIX,"SOLO CHAT MODE"); // DBG
// 1.1) First time loading chat
if (characterMusics[newCharacter] === undefined) {
await loadCharacterBGM(newCharacter);
currentExpressionBGM = FALLBACK_EXPRESSION;
//currentCharacterBGM = newCharacter;
//updateBGM();
//cooldownBGM = BGM_UPDATE_COOLDOWN;
return;
}
// 1.2) Switched chat
if (currentCharacterBGM !== newCharacter) {
currentCharacterBGM = newCharacter;
try {
await updateBGM();
cooldownBGM = extension_settings.audio.bgm_cooldown * 1000;
}
catch (error) {
console.debug(DEBUG_PREFIX, "Error while trying to update BGM character, will try again");
currentCharacterBGM = null
}
return;
}
const newExpression = getNewExpression();
// 1.3) Same character but different expression
if (currentExpressionBGM !== newExpression) {
// Check cooldown
if (cooldownBGM > 0) {
//console.debug(DEBUG_PREFIX,"(SOLO) BGM switch on cooldown:",cooldownBGM);
return;
}
try {
await updateBGM();
cooldownBGM = extension_settings.audio.bgm_cooldown * 1000;
currentExpressionBGM = newExpression;
console.debug(DEBUG_PREFIX, "(SOLO) Updated current character expression to", currentExpressionBGM, "cooldown", cooldownBGM);
}
catch (error) {
console.debug(DEBUG_PREFIX, "Error while trying to update BGM expression, will try again");
currentCharacterBGM = null
}
return;
}
return;
}
// 2) Update BGM (group chat)
// -----------------------------
newCharacter = context.chat[context.chat.length - 1].name;
const userName = context.name1;
if (newCharacter !== undefined && newCharacter != userName) {
//console.log(DEBUG_PREFIX,"GROUP CHAT MODE"); // DBG
// 2.1) First time character appear
if (characterMusics[newCharacter] === undefined) {
await loadCharacterBGM(newCharacter);
return;
}
// 2.2) Switched chat
if (currentCharacterBGM !== newCharacter) {
// Check cooldown
if (cooldownBGM > 0) {
//console.debug(DEBUG_PREFIX,"(GROUP) BGM switch on cooldown:",cooldownBGM);
return;
}
try {
currentCharacterBGM = newCharacter;
await updateBGM();
cooldownBGM = extension_settings.audio.bgm_cooldown * 1000;
currentCharacterBGM = newCharacter;
currentExpressionBGM = FALLBACK_EXPRESSION;
console.debug(DEBUG_PREFIX, "(GROUP) Updated current character BGM to", currentExpressionBGM, "cooldown", cooldownBGM);
}
catch (error) {
console.debug(DEBUG_PREFIX, "Error while trying to update BGM group, will try again");
currentCharacterBGM = null
}
return;
}
/*
const newExpression = getNewExpression();
// 1.3) Same character but different expression
if (currentExpressionBGM !== newExpression) {
// Check cooldown
if (cooldownBGM > 0) {
console.debug(DEBUG_PREFIX,"BGM switch on cooldown:",cooldownBGM);
return;
}
cooldownBGM = BGM_UPDATE_COOLDOWN;
currentExpressionBGM = newExpression;
console.debug(DEBUG_PREFIX,"Updated current character expression to",currentExpressionBGM);
updateBGM();
return;
}
return;*/
}
// Case 3: Same character/expression or BGM switch on cooldown keep playing same BGM
//console.debug(DEBUG_PREFIX,"Nothing to do for",currentCharacterBGM, newCharacter, currentExpressionBGM, cooldownBGM);
}
}
async function loadCharacterBGM(newCharacter) {
console.debug(DEBUG_PREFIX, "New character detected, loading BGM folder of", newCharacter);
// 1.1) First time character appear, load its music folder
const audio_file_paths = await getCharacterBgmList(newCharacter);
//console.debug(DEBUG_PREFIX, "Recieved", audio_file_paths);
// Initialise expression/files mapping
characterMusics[newCharacter] = {};
for (const e of DEFAULT_EXPRESSIONS)
characterMusics[newCharacter][e] = [];
for (const i of audio_file_paths) {
//console.debug(DEBUG_PREFIX,"File found:",i);
for (const e of DEFAULT_EXPRESSIONS)
if (i.includes(e))
characterMusics[newCharacter][e].push(i);
}
console.debug(DEBUG_PREFIX, "Updated BGM map of", newCharacter, "to", characterMusics[newCharacter]);
}
function getNewExpression() {
let newExpression;
// HACK: use sprite file name as expression detection
if (!$(SPRITE_DOM_ID).length) {
console.error(DEBUG_PREFIX, "ERROR: expression sprite does not exist, cannot extract expression from ", SPRITE_DOM_ID)
return FALLBACK_EXPRESSION;
}
const spriteFile = $("#expression-image").attr("src");
newExpression = spriteFile.substring(spriteFile.lastIndexOf("/") + 1).replace(/\.[^/.]+$/, "");
//
// No sprite to detect expression
if (newExpression == "") {
//console.info(DEBUG_PREFIX,"Warning: no expression extracted from sprite, switch to",FALLBACK_EXPRESSION);
newExpression = FALLBACK_EXPRESSION;
}
if (!DEFAULT_EXPRESSIONS.includes(newExpression)) {
console.info(DEBUG_PREFIX, "Warning:", newExpression, " is not a handled expression, expected one of", FALLBACK_EXPRESSION);
return FALLBACK_EXPRESSION;
}
return newExpression;
}
async function updateBGM() {
let audio_files = characterMusics[currentCharacterBGM][currentExpressionBGM];// Try char expression BGM
if (audio_files === undefined || audio_files.length == 0) {
console.debug(DEBUG_PREFIX, "No BGM for", currentCharacterBGM, currentExpressionBGM);
audio_files = characterMusics[currentCharacterBGM][FALLBACK_EXPRESSION]; // Try char FALLBACK BGM
if (audio_files === undefined || audio_files.length == 0) {
console.debug(DEBUG_PREFIX, "No default BGM for", currentCharacterBGM, FALLBACK_EXPRESSION, "switch to ST BGM");
audio_files = fallback_BGMS; // ST FALLBACK BGM
if (audio_files.length == 0) {
console.debug(DEBUG_PREFIX, "No default BGM file found, bgm folder may be empty.");
return;
}
}
}
const audio_file_path = audio_files[Math.floor(Math.random() * audio_files.length)];
console.log(DEBUG_PREFIX, "Updating BGM");
console.log(DEBUG_PREFIX, "Checking file", audio_file_path);
try {
const response = await fetch(audio_file_path);
if (!response.ok) {
console.log(DEBUG_PREFIX, "File not found!")
}
else {
console.log(DEBUG_PREFIX, "Switching BGM to", currentExpressionBGM)
const audio = $("#audio_bgm");
if (audio.attr("src") == audio_file_path) {
console.log(DEBUG_PREFIX, "Already playing, ignored");
return;
}
audio.animate({ volume: 0.0 }, 2000, function () {
audio.attr("src", audio_file_path);
audio[0].play();
audio.volume = extension_settings.audio.bgm_volume * 0.01;
audio.animate({ volume: extension_settings.audio.bgm_volume * 0.01 }, 2000);
})
}
} catch (error) {
console.log(DEBUG_PREFIX, "Error while trying to fetch", audio_file_path, ":", error);
}
}
async function updateAmbient() {
let audio_file_path = null;
for (const i of ambients) {
console.debug(i)
if (i.includes(currentBackground)) {
audio_file_path = i;
break;
}
}
if (audio_file_path === null) {
console.debug(DEBUG_PREFIX, "No ambient file found for background", currentBackground);
const audio = $("#audio_ambient");
audio.attr("src", "");
audio[0].pause();
return;
}
//const audio_file_path = AMBIENT_FOLDER+currentBackground+".mp3";
console.log(DEBUG_PREFIX, "Updating ambient");
console.log(DEBUG_PREFIX, "Checking file", audio_file_path);
const audio = $("#audio_ambient");
audio.animate({ volume: 0.0 }, 2000, function () {
audio.attr("src", audio_file_path);
audio[0].play();
audio.volume = extension_settings.audio.ambient_volume * 0.01;
audio.animate({ volume: extension_settings.audio.ambient_volume * 0.01 }, 2000);
});
}
//#############################//
// Extension load //
//#############################//
// This function is called when the extension is loaded
jQuery(async () => {
// This is an example of loading HTML from a file
const windowHtml = $(await $.get(`${extensionFolderPath}/window.html`));
$('#extensions_settings').append(windowHtml);
loadSettings();
$("#audio_bgm").attr("loop", true);
$("#audio_ambient").attr("loop", true);
$("#audio_bgm").hide();
$("#audio_ambient").hide();
$("#audio_bgm_mute").on("click", onBGMMuteClick);
$("#audio_ambient_mute").on("click", onAmbientMuteClick);
$("#audio_enabled").on("click", onEnabledClick);
$("#audio_bgm_volume_slider").on("input", onBGMVolumeChange);
$("#audio_ambient_volume_slider").on("input", onAmbientVolumeChange);
$("#audio_bgm_cooldown").on("input", onBGMCooldownInput);
// Reset assets container, will be redected like if ST restarted
$("#audio_refresh_assets").on("click", function(){
console.debug(DEBUG_PREFIX,"Refreshing audio assets");
fallback_BGMS = null;
ambients = null;
characterMusics = {};
currentCharacterBGM = null;
currentExpressionBGM = null;
currentBackground = null;
})
// DBG
$("#audio_debug").on("click", function () {
if ($("#audio_debug").is(':checked')) {
$("#audio_bgm").show();
$("#audio_ambient").show();
}
else {
$("#audio_bgm").hide();
$("#audio_ambient").hide();
}
});
//
const wrapper = new ModuleWorkerWrapper(moduleWorker);
setInterval(wrapper.update.bind(wrapper), UPDATE_INTERVAL);
moduleWorker();
});

View File

@@ -1,11 +0,0 @@
{
"display_name": "Dynamic Audio",
"loading_order": 14,
"requires": [],
"optional": ["classify"],
"js": "index.js",
"css": "style.css",
"author": "Keij#6799 and Deffcolony",
"version": "0.1.0",
"homePage": "https://github.com/SillyTavern/SillyTavern"
}

View File

@@ -1,22 +0,0 @@
.mixer-div {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 5px;
}
.audio-mute-button {
padding: 5px;
width: 50px;
height: 30px;
}
.audio-mute-button-muted {
color: red;
}
#audio_refresh_assets {
width: 50px;
height: 30px;
}

View File

@@ -1,66 +0,0 @@
<div id="audio_settings">
<div class="inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<b>Dynamic Audio</b>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">
<div>
<label class="checkbox_label" for="audio_enabled">
<input type="checkbox" id="audio_enabled" name="audio_enabled">
<small>Enabled</small>
</label>
<div id="audio_debug_div">
<label class="checkbox_label" for="audio_debug">
<input type="checkbox" id="audio_debug" name="audio_debug">
<small>Debug</small>
</label>
</div>
<div>
<label for="audio_refresh_assets">Refresh assets</label>
<div id="audio_refresh_assets" class="menu_button">
<i class="fa-solid fa-refresh fa-lg"></i>
</div>
</div>
</div>
<div>
<div>
<label for="audio_bgm_volume_slider">Music <span id="audio_bgm_volume"></span></label>
<div class="mixer-div">
<div id="audio_bgm_mute" class="menu_button audio-mute-button">
<i class="fa-solid fa-volume-high fa-lg" id="audio_bgm_mute_icon"></i>
</div>
<input type="range" class ="slider" id ="audio_bgm_volume_slider" value = "0" maxlength ="100">
</div>
<audio id="audio_bgm" controls src="">
</div>
<div>
<label for="audio_ambient_volume_slider">Ambient <span id="audio_ambient_volume"></span></label>
<div class="mixer-div">
<div id="audio_ambient_mute" class="menu_button audio-mute-button">
<i class="fa-solid fa-volume-high fa-lg" id="audio_ambient_mute_icon"></i>
</div>
<input type="range" class ="slider" id ="audio_ambient_volume_slider" value = "0" maxlength ="100">
</div>
<audio id="audio_ambient" controls src="">
</div>
<div>
<label for="audio_bgm_cooldown">Music update cooldown (in seconds)</label>
<input id="audio_bgm_cooldown" class="text_pole wide30p">
</div>
</div>
<div>
<b>Hint:</b>
<i>
Create new folder in the
<b>public/characters/</b>
folder and name it as the name of the character.
Create a folder name <b>bgm</b> inside of it.
Put bgm music with expressions there. File names should follow the pattern:
<it>[expression_label]_[number].mp3</it>
By default one of the <it>neutral_[number].mp3</it> will play if classify module is not active.
</i>
</div>
</div>
</div>
</div>

View File

@@ -1,178 +0,0 @@
import { eventSource, event_types, generateQuietPrompt } from "../../../script.js";
import { getContext, saveMetadataDebounced } from "../../extensions.js";
import { registerSlashCommand } from "../../slash-commands.js";
import { stringFormat } from "../../utils.js";
export { MODULE_NAME };
const MODULE_NAME = 'backgrounds';
const METADATA_KEY = 'custom_background';
/**
* @param {string} background
*/
function forceSetBackground(background) {
saveBackgroundMetadata(background);
setCustomBackground();
}
async function moduleWorker() {
if (hasCustomBackground()) {
$('#unlock_background').show();
$('#lock_background').hide();
setCustomBackground();
}
else {
$('#unlock_background').hide();
$('#lock_background').show();
unsetCustomBackground();
}
}
function onLockBackgroundClick() {
const bgImage = window.getComputedStyle(document.getElementById('bg1')).backgroundImage;
// Extract the URL from the CSS string
const urlRegex = /url\((['"])?(.*?)\1\)/;
const matches = bgImage.match(urlRegex);
const url = matches[2];
// Remove the protocol and host, leaving the relative URL
const relativeUrl = new URL(url).pathname;
const relativeBgImage = `url("${relativeUrl}")`
saveBackgroundMetadata(relativeBgImage);
setCustomBackground();
$('#unlock_background').show();
$('#lock_background').hide();
}
function onUnlockBackgroundClick() {
removeBackgroundMetadata();
unsetCustomBackground();
$('#unlock_background').hide();
$('#lock_background').show();
}
function hasCustomBackground() {
const context = getContext();
return !!context.chatMetadata[METADATA_KEY];
}
function saveBackgroundMetadata(file) {
const context = getContext();
context.chatMetadata[METADATA_KEY] = file;
saveMetadataDebounced();
}
function removeBackgroundMetadata() {
const context = getContext();
delete context.chatMetadata[METADATA_KEY];
saveMetadataDebounced();
}
function setCustomBackground() {
const context = getContext();
const file = context.chatMetadata[METADATA_KEY];
// bg already set
if (document.getElementById("bg_custom").style.backgroundImage == file) {
return;
}
$("#bg_custom").css("background-image", file);
$("#custom_bg_preview").css("background-image", file);
}
function unsetCustomBackground() {
$("#bg_custom").css("background-image", 'none');
$("#custom_bg_preview").css("background-image", 'none');
}
function onSelectBackgroundClick() {
const bgfile = $(this).attr("bgfile");
if (hasCustomBackground()) {
saveBackgroundMetadata(`url("backgrounds/${bgfile}")`);
setCustomBackground();
}
}
const autoBgPrompt = `Pause your roleplay and choose a location ONLY from the provided list that is the most suitable for the current scene. Do not output any other text:\n{0}`;
async function autoBackgroundCommand() {
const options = Array.from(document.querySelectorAll('.BGSampleTitle')).map(x => ({ element: x, text: x.innerText.trim() })).filter(x => x.text.length > 0);
if (options.length == 0) {
toastr.warning('No backgrounds to choose from. Please upload some images to the "backgrounds" folder.');
return;
}
const list = options.map(option => `- ${option.text}`).join('\n');
const prompt = stringFormat(autoBgPrompt, list);
const reply = await generateQuietPrompt(prompt);
const fuse = new Fuse(options, { keys: ['text'] });
const bestMatch = fuse.search(reply, { limit: 1 });
if (bestMatch.length == 0) {
toastr.warning('No match found. Please try again.');
return;
}
console.debug('Automatically choosing background:', bestMatch);
bestMatch[0].item.element.click();
}
$(document).ready(function () {
function addSettings() {
const html = `
<div class="background_settings">
<div class="inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<b>Chat Backgrounds</b>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">
<div class="background_controls">
<div id="lock_background" class="menu_button">
<i class="fa-solid fa-lock"></i>
Lock
</div>
<div id="unlock_background" class="menu_button">
<i class="fa-solid fa-unlock"></i>
Unlock
</div>
<small>
Press "Lock" to assign a currently selected background to a character or group chat.<br>
Any background image selected while lock is engaged will be saved automatically.
</small>
</div>
<div class="background_controls">
<div id="auto_background" class="menu_button">
<i class="fa-solid fa-wand-magic"></i>
Auto
</div>
<small>
Automatically select a background based on the chat context.<br>
Respects the "Lock" setting state.
</small>
</div>
<div>Preview</div>
<div id="custom_bg_preview">
</div>
</div>
</div>
</div>
`;
$('#extensions_settings').append(html);
$('#lock_background').on('click', onLockBackgroundClick);
$('#unlock_background').on('click', onUnlockBackgroundClick);
$(document).on("click", ".bg_example", onSelectBackgroundClick);
$('#auto_background').on("click", autoBackgroundCommand);
}
addSettings();
registerSlashCommand('lockbg', onLockBackgroundClick, ['bglock'], " locks a background for the currently selected chat", true, true);
registerSlashCommand('unlockbg', onUnlockBackgroundClick, ['bgunlock'], ' unlocks a background for the currently selected chat', true, true);
registerSlashCommand('autobg', autoBackgroundCommand, ['bgauto'], ' automatically changes the background based on the chat context using the AI request prompt', true, true);
eventSource.on(event_types.FORCE_SET_BACKGROUND, forceSetBackground);
eventSource.on(event_types.CHAT_CHANGED, moduleWorker);
});

View File

@@ -1,11 +0,0 @@
{
"display_name": "Chat Backgrounds",
"loading_order": 7,
"requires": [],
"optional": [],
"js": "index.js",
"css": "style.css",
"author": "Cohee#1207",
"version": "1.0.0",
"homePage": "https://github.com/SillyTavern/SillyTavern"
}

View File

@@ -1,45 +0,0 @@
#custom_bg_preview {
width: 160px;
height: 90px;
background-color: var(--grey30a);
background-repeat: no-repeat;
background-attachment: fixed;
background-size: cover;
border-radius: 20px;
border: 1px solid var(--black50a);
box-shadow: 0 0 7px var(--black50a);
margin: 5px;
}
#custom_bg_preview::before {
content: 'No Background';
color: white;
position: relative;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#custom_bg_preview:not([style*="background-image: none"])::before {
display: none;
}
.background_controls .menu_button {
display: flex;
flex-direction: row;
align-items: center;
column-gap: 10px;
}
.background_controls {
display: flex;
flex-direction: row;
align-items: center;
column-gap: 10px;
}
.background_controls small {
flex-grow: 1;
}

View File

@@ -1,11 +0,0 @@
{
"display_name": "Bulk Card Editor",
"loading_order": 9,
"requires": [],
"optional": [],
"js": "index.js",
"css": "style.css",
"author": "city-unit",
"version": "1.0.0",
"homePage": "https://github.com/city-unit"
}

View File

@@ -1,7 +0,0 @@
.bulk_select_checkbox {
align-self: center;
}
#rm_print_characters_block.bulk_select .wide100pLess70px {
width: calc(100% - 85px);
}

View File

@@ -1,6 +1,6 @@
import { getBase64Async } from "../../utils.js";
import { getContext, getApiUrl, doExtrasFetch, extension_settings } from "../../extensions.js";
import { callPopup, saveSettingsDebounced } from "../../../script.js";
import { getBase64Async, saveBase64AsFile } from "../../utils.js";
import { getContext, getApiUrl, doExtrasFetch, extension_settings, modules } from "../../extensions.js";
import { callPopup, getRequestHeaders, saveSettingsDebounced } from "../../../script.js";
import { getMessageTimeStamp } from "../../RossAscends-mods.js";
export { MODULE_NAME };
@@ -8,7 +8,8 @@ const MODULE_NAME = 'caption';
const UPDATE_INTERVAL = 1000;
async function moduleWorker() {
$('#send_picture').toggle(getContext().onlineStatus !== 'no_connection');
const hasConnection = getContext().onlineStatus !== 'no_connection';
$('#send_picture').toggle(hasConnection);
}
async function setImageIcon() {
@@ -52,7 +53,6 @@ async function sendCaptionedMessage(caption, image) {
const message = {
name: context.name1,
is_user: true,
is_name: true,
send_date: getMessageTimeStamp(),
mes: messageText,
extra: {
@@ -65,16 +65,21 @@ async function sendCaptionedMessage(caption, image) {
await context.generate('caption');
}
async function onSelectImage(e) {
setSpinnerIcon();
const file = e.target.files[0];
async function doCaptionRequest(base64Img) {
if (extension_settings.caption.local) {
const apiResult = await fetch('/api/extra/caption', {
method: 'POST',
headers: getRequestHeaders(),
body: JSON.stringify({ image: base64Img })
});
if (!file) {
return;
}
if (!apiResult.ok) {
throw new Error('Failed to caption image via local pipeline.');
}
try {
const base64Img = await getBase64Async(file);
const data = await apiResult.json();
return data;
} else if (modules.includes('caption')) {
const url = new URL(getApiUrl());
url.pathname = '/api/caption';
@@ -84,17 +89,42 @@ async function onSelectImage(e) {
'Content-Type': 'application/json',
'Bypass-Tunnel-Reminder': 'bypass',
},
body: JSON.stringify({ image: base64Img.split(',')[1] })
body: JSON.stringify({ image: base64Img })
});
if (apiResult.ok) {
const data = await apiResult.json();
const caption = data.caption;
const imageToSave = data.thumbnail ? `data:image/jpeg;base64,${data.thumbnail}` : base64Img;
await sendCaptionedMessage(caption, imageToSave);
if (!apiResult.ok) {
throw new Error('Failed to caption image via Extras.');
}
const data = await apiResult.json();
return data;
} else {
throw new Error('No captioning module is available.');
}
}
async function onSelectImage(e) {
setSpinnerIcon();
const file = e.target.files[0];
if (!file || !(file instanceof File)) {
return;
}
try {
const context = getContext();
const fileData = await getBase64Async(file);
const base64Format = fileData.split(',')[0].split(';')[0].split('/')[1];
const base64Data = fileData.split(',')[1];
const data = await doCaptionRequest(base64Data);
const caption = data.caption;
const imageToSave = data.thumbnail ? data.thumbnail : base64Data;
const format = data.thumbnail ? 'jpeg' : base64Format;
const imagePath = await saveBase64AsFile(imageToSave, context.name2, '', format);
await sendCaptionedMessage(caption, imagePath);
}
catch (error) {
toastr.error('Failed to caption image.');
console.log(error);
}
finally {
@@ -113,12 +143,21 @@ jQuery(function () {
const sendButton = $(`
<div id="send_picture" class="list-group-item flex-container flexGap5">
<div class="fa-solid fa-image extensionsMenuExtensionButton"></div>
Send a picture
Send a Picture
</div>`);
$('#extensionsMenu').prepend(sendButton);
$(sendButton).hide();
$(sendButton).on('click', () => $('#img_file').trigger('click'));
$(sendButton).on('click', () => {
const hasCaptionModule = modules.includes('caption') || extension_settings.caption.local;
if (!hasCaptionModule) {
toastr.error('No captioning module is available. Either enable the local captioning pipeline or connect to Extras.');
return;
}
$('#img_file').trigger('click');
});
}
function addPictureSendForm() {
const inputHtml = `<input id="img_file" type="file" accept="image/*">`;
@@ -131,13 +170,17 @@ jQuery(function () {
}
function addSettings() {
const html = `
<div class="background_settings">
<div class="caption_settings">
<div class="inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<b>Image Captioning</b>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">
<label class="checkbox_label" for="caption_local">
<input id="caption_local" type="checkbox" class="checkbox">
Use local captioning pipeline
</label>
<label class="checkbox_label" for="caption_refine_mode">
<input id="caption_refine_mode" type="checkbox" class="checkbox">
Edit captions before generation
@@ -155,6 +198,11 @@ jQuery(function () {
setImageIcon();
moduleWorker();
$('#caption_refine_mode').prop('checked', !!(extension_settings.caption.refine_mode));
$('#caption_local').prop('checked', !!(extension_settings.caption.local));
$('#caption_refine_mode').on('input', onRefineModeInput);
$('#caption_local').on('input', () => {
extension_settings.caption.local = !!$('#caption_local').prop('checked');
saveSettingsDebounced();
});
setInterval(moduleWorker, UPDATE_INTERVAL);
});

View File

@@ -1,10 +1,10 @@
{
"display_name": "Image Captioning",
"loading_order": 4,
"requires": [
"requires": [],
"optional": [
"caption"
],
"optional": [],
"js": "index.js",
"css": "style.css",
"author": "Cohee#1207",

View File

@@ -1,3 +1,3 @@
#img_form {
display: none;
}
#img_form {
display: none;
}

Some files were not shown because too many files have changed in this diff Show More