Compare commits

...

1541 Commits

Author SHA1 Message Date
Cohee
20ab6193ab Send multiple image swipes per prompt
#3635
2025-03-16 21:17:53 +02:00
bmen25124
d42a81f97c New connection manager events, ConnectionManagerRequestService (#3603) 2025-03-16 16:58:34 +02:00
Cohee
46b9bb7854 Merge pull request #3695 from Succubyss/gpt_tokenizer_tweak
gpt-4.5 detection tweak
2025-03-16 02:42:55 +02:00
Succubyss
fff1dd59c3 minor 4.5 detection tweak 2025-03-15 19:27:42 -05:00
Cohee
f88e95d9be Merge branch 'release' into staging 2025-03-16 02:25:20 +02:00
Cohee
248132dd89 Set debug level to unshallow warnings 2025-03-16 02:25:07 +02:00
Cohee
ead37defeb Merge pull request #3694 from SillyTavern/workflow-hotfixes
Workflow hotfixes
2025-03-16 01:06:19 +02:00
Wolfsblvt
f18cb91ef9 on push, check all pushed commits - duh 2025-03-16 00:02:24 +01:00
Wolfsblvt
892fe7bd34 Workflows ensure explicit versions of actions 2025-03-16 00:02:24 +01:00
Wolfsblvt
0126e5e5a3 Add explicit workflow permissions 2025-03-16 00:02:24 +01:00
Cohee
b8afa96de5 Replace link to docs about regex flags 2025-03-15 23:07:58 +02:00
Cohee
9c42391706 Uncomment cookieSecret config removal 2025-03-15 23:04:02 +02:00
Cohee
d8c8bfa8a4 Merge pull request #3690 from SillyTavern/staging
Staging
2025-03-15 22:47:35 +02:00
Cohee
1041d2ae9d Update README 2025-03-15 19:52:57 +02:00
Cohee
a1586694b6 Fix start script for electron 2025-03-15 15:41:03 +02:00
Cohee
a7aa1ff79d Bump release version 2025-03-15 15:37:01 +02:00
Cohee
0c7d5c76e2 gemini-2.0-flash-exp-image-generation 2025-03-15 14:58:06 +02:00
Cohee
aa94774963 Add command-a tokenizer to manual selection list 2025-03-15 13:46:13 +02:00
Cohee
628fc810c7 Add docker-compose install guide 2025-03-15 13:13:33 +02:00
Cohee
fb9b0569b6 The numbers must go up 2025-03-15 12:58:36 +02:00
Cohee
dc4612a0e2 Merge pull request #3688 from Erquint/staging
No swiping hotkeys when modifiers are held.
2025-03-15 01:08:34 +02:00
Gness Erquint
e57396040d No swiping hotkeys when modifiers are held. 2025-03-15 00:43:37 +03:00
Wolfsblvt
bafb2cba95 Happy little icons for workflows 2025-03-14 21:34:48 +01:00
Cohee
f607c3bc0d Gemma 3 (#3686)
* Gemma 3

* Adjust safetySettings

* Disable sysprompt

* Add isGemma check to tool processing logic

* Disable a google search tool for gemma
2025-03-14 21:41:28 +02:00
Cohee
0017358f8b Gemini inline images (#3681)
* Gemini images for non-streaming

* Parse images on stream

* Add toggle for image request

* Add extraction params to extractImageFromData

* Add explicit break and return

* Add more JSdoc to processImageAttachment

* Add file name prefix

* Add object argument for saveReply

* Add defaults to saveReply params

* Use type for saveReply result

* Change type check in saveReply backward compat
2025-03-14 20:15:04 +02:00
Cohee
0d2bf00810 Decrease checks interval 2025-03-14 10:44:48 +02:00
Cohee
f362f94c2d Decrease connection timeout, set 'valid' status on 'invalid URL', don't wait if not needed
Fixes #3683
2025-03-14 10:43:00 +02:00
Cohee
c9e716d42f Merge pull request #3682 from SillyTavern/feat-add-regex-toggle-command
Add `/regex-toggle` slash command
2025-03-14 10:15:00 +02:00
Cohee
bef466a5a1 Merge pull request #3685 from kallewoof/202503-gemma-3
chat-template: gemma 3
2025-03-14 10:13:49 +02:00
Karl-Johan Alm
f180d22680 chat-template: gemma 3 2025-03-14 13:57:48 +09:00
Wolfsblvt
18fa33d816 On review feedback of /regex-toggle
- Add quiet arg to suppress success toast
- Fix return values
- Switch-case instead of nested ternaries
- state uses onOfToggle
2025-03-14 01:03:08 +01:00
Cohee
e60796548b Skip status check of invalid custom endpoint URLs
Fixes #3683
2025-03-14 01:40:38 +02:00
Wolfsblvt
0f5f8e163d Merge branch 'staging' into feat-add-regex-toggle-command 2025-03-14 00:26:33 +01:00
Wolfsblvt
95e60b0f79 Switch to action to label maintainers, duh 2025-03-14 00:24:11 +01:00
Wolfsblvt
669cd49574 god give me hope this is right? 2025-03-14 00:11:28 +01:00
Wolfsblvt
9917be0233 Another attempt at fixing maintainer labeleng 2025-03-14 00:09:57 +01:00
Wolfsblvt
7537192c9a Add /regex-toggle slash command
- Add /regex-toggle command, similarly to /extension-toggle
- toggles the state of both global and character-bound scripts
- Update jsdoc being inconsistent

Closes #3613
2025-03-13 23:55:08 +01:00
Wolfsblvt
eaa7b91f1d Workflows use checkout step for label apply
- Checkout might be needed/useful, otherwise config files are not present
- Do not remove labels from PR updates anymore. Has to be done manually. Otherwise manual labelling really isn't possible.
2025-03-13 23:47:11 +01:00
Wolfsblvt
ea989df6a1 Hard-code maintainer list for maintainer label 2025-03-13 23:08:29 +01:00
Wolfsblvt
166b404ea7 Remove PR auto-labels when not relevant anymore 2025-03-13 22:37:58 +01:00
Wolfsblvt
25792b53f2 Improve logging and workflow names 2025-03-13 22:28:32 +01:00
Wolfsblvt
aad4b449ee Merge pull request #3678 from SillyTavern/update-git-workflows
Update github workflows for better issue & PR management, automating chores
2025-03-13 22:14:56 +01:00
Wolfsblvt
5743972a26 Extract workflows for merge conflicts + issue done
- Extract merge conflicts check to its own workflow, plus make it run on push
- Add issues update as Done or Done staging based on extracted commit messages
2025-03-13 22:13:00 +01:00
Cohee
be37b6ff8f Merge pull request #3679 from bmen25124/command_a
Added command-a-03-2025 and command-a tokenizer
2025-03-13 22:14:03 +02:00
Wolfsblvt
cd0ca0363e Fix /inject id not being required, cause undefined 2025-03-13 20:35:39 +01:00
bmen25124
fdcff7a7f0 Fixd "model.id" check 2025-03-13 22:25:20 +03:00
Wolfsblvt
d9c868b2fe Move PR size message to auto label replies 2025-03-13 20:12:55 +01:00
Wolfsblvt
15dbadbfe0 Move unstale to the issue/pr manager
Doesn't make sense to run the scheduled workflow and then skip most of it's jobs.
And it looks weird in the PR boxy thingy
2025-03-13 19:57:30 +01:00
Wolfsblvt
707efac5b9 Fix PR labeling failing 2025-03-13 19:40:41 +01:00
Wolfsblvt
972eea1efd Rename some labels, add config label
- Rename PR size labels
- Add config.yaml label on config changes
- Add config.yaml to the backened changes label
- Awaiting User Response will not be blocked by Keep Open
2025-03-13 19:28:23 +01:00
bmen25124
a77f4045f8 Added command-a-03-2025 and command-a tokenizer 2025-03-13 21:16:08 +03:00
Wolfsblvt
cc3e08ddaa Merge branch 'staging' into update-git-workflows 2025-03-13 16:43:23 +01:00
Wolfsblvt
eb17e37002 Fix maintainer label, minor docs 2025-03-13 16:42:49 +01:00
Wolfsblvt
ecaee2dbbf Directly remove stale labels on comments 2025-03-13 16:35:15 +01:00
Wolfsblvt
84e7ddbf74 PR workflow, add labels based on files/branch name
- Add PR labels based on changed files
- Add PR labels based on branch names
2025-03-13 16:33:47 +01:00
Wolfsblvt
4f7695b0ce Update auto comments to make them more uniform 2025-03-13 16:28:28 +01:00
Wolfsblvt
5f726d2b25 A bit more auto-labeling on issue open 2025-03-13 12:08:49 +01:00
Wolfsblvt
e43b9a3d2c Rework auto labels based on labels a bit 2025-03-13 12:08:17 +01:00
Wolfsblvt
34363e6875 Add issue types to issue templates 2025-03-13 11:38:40 +01:00
Cohee
79a8080b7d Merge pull request #3671 from bmen25124/events_type_param
New context methods, added type parameter to message events
2025-03-13 01:50:59 +02:00
bmen25124
92dacdb386 better type name, simplified context 2025-03-13 02:27:03 +03:00
Cohee
4fdc28afbc Merge pull request #3673 from qvink/export_parse_reasoning
exporting parseReasoningFromString()
2025-03-13 01:20:53 +02:00
qvink
874affb2f2 exporting parseReasoningFromString() 2025-03-12 17:01:03 -06:00
Cohee
37819df542 Move reasoning continue regex depth adjustment 2025-03-12 23:59:53 +02:00
Cohee
160f7431d6 Fix isPrefix for continue on reasoning 2025-03-12 23:55:16 +02:00
Cohee
12824bb680 Clear cached WI on deletion
Fixes #3672
2025-03-12 23:38:10 +02:00
Cohee
6af3f2ee7e Remove unused splitSentences function from utils.js 2025-03-12 23:29:55 +02:00
Cohee
d7085b119d Fix npm audit in tests 2025-03-12 22:09:50 +02:00
Cohee
1b817cd897 Kokoro: chunk generation, add pre-process func
#3412
2025-03-12 21:35:09 +02:00
Cohee
e65b72ea41 Fix global.d.ts var declarations 2025-03-12 20:54:07 +02:00
Cohee
c9c5dfa8c0 Bump external packages 2025-03-12 20:53:35 +02:00
Cohee
f11ebb032b Merge branch 'release' into staging 2025-03-12 20:43:47 +02:00
Cohee
58e714fce4 Fix npm audit 2025-03-12 20:43:38 +02:00
bmen25124
ddb77732f2 New context methods, added type parameters to message events 2025-03-12 21:25:16 +03:00
Reithan
01ef823da9 Dont count Continue as message 0 (#3594)
* continue works same as swipe continued message isn't depth counted

* correct early-out check

* update regex depth setting tooltips for accuracy

* update max tooltip

* remove redundant check

* Allow -1 as a min depth value

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2025-03-12 19:59:15 +02:00
Cohee
1b02426df1 Unshallow current character on selectCharacterById 2025-03-12 11:13:48 +02:00
Cohee
c4021525ac Merge pull request #3664 from SillyTavern/hide-name
Add "name" argument to /hide and /unhide
2025-03-12 10:48:19 +02:00
Cohee
e7189a1260 Refactor hideMessageCallback and unhideMessageCallback to remove unnecessary console logs. Introduce onlyUniqueJson and sortIgnoreCaseAndAccents utility functions 2025-03-12 10:18:02 +02:00
Wolfsblvt
843bd1cf3c Add check for PRs with merge-blocking labels 2025-03-12 04:02:14 +01:00
Wolfsblvt
fc151284e4 update labels based on other labels 2025-03-12 03:21:23 +01:00
Wolfsblvt
f6f87f6d5b unstale issues/prs on comments right away 2025-03-12 02:56:38 +01:00
Wolfsblvt
7543a24ca7 Rewrite and expand auto comments 2025-03-12 02:44:24 +01:00
Wolfsblvt
89ab138882 Auto-label PRs based on files + targeting release 2025-03-12 01:55:37 +01:00
Wolfsblvt
0237b6a872 Auto-comment/label issues once on staging 2025-03-12 00:59:23 +01:00
Wolfsblvt
c22ad7c2e8 auto ask for feedback on "Alternative Exists" 2025-03-12 00:06:33 +01:00
Wolfsblvt
26c4d231a8 "add Maintainer label" job via on open workflow 2025-03-11 23:43:35 +01:00
Cohee
1026e1f8e9 Add "name" argument to /hide and /unhide. Add default value for unnamed argument 2025-03-11 23:14:31 +02:00
Wolfsblvt
d6dcededc9 Refactor workflows into more structured files 2025-03-11 21:43:27 +01:00
Cohee
ebe30dceac Merge pull request #3660 from SillyTavern/group-pooled-order
Add group pooled order
2025-03-11 22:17:31 +02:00
Cohee
370bd9a3a8 Refactor to not use array 2025-03-11 22:16:26 +02:00
Cohee
137927bb43 Merge pull request #3662 from SillyTavern/enable-md-hotkeys-in-expando
Add markdown hotkeys support for expando editor on textareas that support markdown
2025-03-11 13:03:23 +02:00
Wolfsblvt
90cfdebff8 Remove unnecessary markdown icon 2025-03-11 10:39:14 +01:00
Wolfsblvt
0cde7e7a7f Add md hotkey support for expando editor
- When original textarea supports markdown, the textarea of the expanded popup will also have markdown support
- Also add the small markdown icon at the top
2025-03-11 04:42:03 +01:00
Cohee
cf63b70997 Fix instruct macro checkbox missing control bindings
Fixes #3643
2025-03-11 01:31:28 +02:00
Cohee
ad225138b4 Add group pooled order
Closes #3650
2025-03-11 01:24:46 +02:00
Cohee
68b5be063f TC: Increased unlocked response to 32k 2025-03-11 00:24:28 +02:00
Cohee
bdbe043259 Fix "Response Length" slider showing wrong value (#3659)
- "Mad Lab Mode" was falsely "resetting" the slider control, for no obvious reason besides weird implementation.
2025-03-11 00:21:59 +02:00
Wolfsblvt
57a229d5fd Fix "Response Length" slider showing wrong value
- "Mad Lab Mode" was falsely "resetting" the slider control, for no obvious reason besides weird implementation.
2025-03-10 22:21:36 +01:00
felger
e23f3a6314 feature: 'kokoro-js' supports TTS #3412 (#3656)
* feature: 'kokoro-js' supports TTS #3412

* Linting, add credits for kokoro library

* Fix voice preview

* Fix display languages on previews

* Fix settings restoration. Debounce model init on settings change

* Fix engine sorting

* Move TTS processing to a web worker. Remove unused gain setting

* Speaking rate fix

* Update status when recreating a worker

* Pass voices list from TTS engine

* Call dispose function on provider change

* Extend worker init timeout to 10 minutes

---------

Co-authored-by: ryan <1014670860@qq.com>
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2025-03-10 22:54:54 +02:00
Wolfsblvt
c722d251ff Update merge conflicts workflow
- Change the action being used
- Add comment to notify PR author on merge conflicts
2025-03-10 20:33:09 +01:00
Wolfsblvt
a104de38b6 Remove unused maintainers response workflow 2025-03-10 20:11:24 +01:00
Wolfsblvt
26093c1ae4 Update remove labels on close workflow
- Added more labels that should be removed
- Included PRs and their labels to be auto-removed
2025-03-10 20:11:05 +01:00
Wolfsblvt
c8fbd51554 Update stale workflow
- Remove not needed "Maintainer Response" labeling
- Update to latest version
- Add link to source
2025-03-10 19:53:50 +01:00
Wolfsblvt
bf75e88931 Update PR size workflow 2025-03-10 19:40:02 +01:00
Cohee
13a3f4772e Merge pull request #3653 from SillyTavern/fix-group-create-tags
Fix group creation inheriting tags from characters[0]
2025-03-10 20:30:23 +02:00
Cohee
a3b2cc456f Clear group tags list on create click 2025-03-10 20:30:03 +02:00
Wolfsblvt
1e6f8c6637 Better wording for /input arg descriptions 2025-03-10 17:41:18 +01:00
Cohee
594cba30ca Merge pull request #3657 from SillyTavern/fix-buttons-popup-display
Fix `/buttons` buttons not being displayed on log popup texts
2025-03-10 17:41:16 +02:00
Wolfsblvt
e3bcc79bb7 Fix /buttons buttons not being displayed
- On long popup texts, the buttons of the `/popup` slash command will not be displayed, cause by an unneeded overflow CSS property

Fixes #3654
2025-03-10 15:35:01 +01:00
Cohee
73230272f3 Apply regex to multiswipe reasoning, set reasoning_type to Parsed 2025-03-10 10:48:31 +00:00
Cohee
71a3aefe86 Replace link to regex editor docs 2025-03-10 10:40:25 +00:00
Cohee
6024b29ea7 Merge pull request #3652 from SillyTavern/default-middleware
Use default middleware for parsing request body
2025-03-10 12:34:01 +02:00
Cohee
ee13cef37f Fix group creation inheriting tags from characters[0] 2025-03-10 01:37:25 +02:00
Cohee
67d013e40a Use default middleware for parsing request body 2025-03-10 00:48:58 +02:00
Cohee
64206d6f47 Merge pull request #3651 from SillyTavern/input-handling-args
Add `/input` arguments to execute closures on success and on cancel
2025-03-10 00:45:47 +02:00
Wolfsblvt
fc1c767280 onCancel and onSuccess handlers for /input command 2025-03-09 23:10:56 +01:00
Cohee
d4f6373bbc Merge pull request #3648 from SillyTavern/regex-info-block
Add info block for find regex flags
2025-03-09 23:30:38 +02:00
Wolfsblvt
fa03443fe7 Switch /input command definition to fromProps 2025-03-09 22:29:40 +01:00
Cohee
0f8a17b652 Refactor regex info block to use a shared function 2025-03-09 23:29:00 +02:00
Cohee
070de9df2d (CC) Move continue nudge at the end of completion (#3611)
* Move continue nudge at the end of completion
Closes #3607

* Move continue message together with nudge
2025-03-09 18:17:02 +02:00
Cohee
34b2ef0fd7 Clean-up code 2025-03-09 17:47:23 +02:00
Cohee
eef9c3ef62 Add info block for find regex flags
#3647
2025-03-09 17:41:38 +02:00
Cohee
6f0f32d83d Add a second row to profile editing name 2025-03-09 16:59:58 +02:00
Cohee
7845994315 Add 'start-reply-with' to Connection Profiles (#3632)
* Connection Profiles: Add support for 'start-reply-with' command and allow empty values for 'stop-strings' command

* Add handling for empty profile values in makeFancyProfile function

* Fix application of empty values

* Handle undefined values

* Improve argument validation

* Replace || with &&

* I got it right this time, swear

* Who wrote this?
2025-03-09 16:55:49 +02:00
Cohee
d94c301b10 Merge pull request #3646 from SillyTavern/fix-persona-auto-lock
Fix persona auto-lock to chat not working when the persona was already selected
2025-03-09 16:48:21 +02:00
Wolfsblvt
67699d9cfa Fix persona auto-lock to chat not working
- When auto lock was enabled, it didn't auto-lock to chat when the persona was already selected (like choosing the same persona you have used before)
2025-03-09 15:27:48 +01:00
Cohee
a392593e53 Merge pull request #3634 from SillyTavern/continue-from-reasoning
Fix auto-parsing of continue from reasoning
2025-03-09 16:22:02 +02:00
Cohee
cabd6de85b Prevent rollover on keyboard left swipe if repeating (#3644)
* Prevent rollover on keyboard left swipe if repeating
Closes #3636

* Ditto for right swipe

* Remove goofy comment leftover
2025-03-09 16:12:24 +02:00
Cohee
c03da65821 Run parsing at least once before rendering reasoning DOM on continue 2025-03-09 16:08:29 +02:00
Cohee
5d74507e50 Remove goofy comment leftover 2025-03-09 14:09:39 +02:00
Cohee
19b7deaed0 Ditto for right swipe 2025-03-09 14:08:24 +02:00
Cohee
6aaa533410 Prevent rollover on keyboard left swipe if repeating
Closes #3636
2025-03-09 13:42:30 +02:00
Cohee
96d79ac4e9 Merge branch 'staging' into continue-from-reasoning 2025-03-09 01:19:25 +02:00
Cohee
b52b11d7bb Force settings content check on user creation
Closes #3641
2025-03-09 00:56:23 +02:00
Cohee
1cb9287684 Vectors WebLLM (#3631)
* Add WebLLM support for vectorization

* Load models when WebLLM extension installed

* Consistency updated

* Move checkWebLlm to initEngine

* Refactor vector request handling to use getAdditionalArgs

* Add error handling for unsupported WebLLM extension

* Add prefix to error causes
2025-03-09 00:51:44 +02:00
Cohee
0ea64050ff Parse reasoning in multi-swipe swipes 2025-03-08 23:06:56 +02:00
Cohee
d0068ecbab Clean-up swipe_info of multi-swipes 2025-03-08 22:48:42 +02:00
Cohee
ca14352972 Fix syncMesToSwipe checks
Ported from #3634
2025-03-08 22:33:26 +02:00
Cohee
50a0f41736 Sync mes to swipe on stream finished 2025-03-08 22:29:18 +02:00
Cohee
7e3946c152 Add tools parameter to AI21 request 2025-03-08 22:26:32 +02:00
Cohee
edabd1128b Add tags in toShallow
Closes #3638
2025-03-08 22:04:49 +02:00
Cohee
f38898e03f Merge pull request #3640 from Succubyss/patch-7
Re-enable logit bias and stop strings for 4.5
2025-03-08 21:56:11 +02:00
Cohee
98f92f6270 Fix syntax of model name check 2025-03-08 21:50:39 +02:00
Cohee
5d275998ed Merge branch 'staging' into patch-7 2025-03-08 21:46:38 +02:00
Succubyss
c3b5382882 Re-enable logit bias and stop strings for 4.5 2025-03-08 12:57:11 -06:00
Cohee
de0e65fe13 Enable tool calling for ai21 2025-03-08 17:25:37 +02:00
Cohee
ff5835278b Add Jamba 1.6 models
Closes #3633
2025-03-08 15:16:49 +02:00
Cohee
980ed76cc3 Fix auto-parsing of continue from reasoning
Continues #3606
2025-03-08 12:58:26 +02:00
Wolfsblvt
91fe2841e3 Fix reasoning rendering on auto-save message 2025-03-08 05:52:11 +01:00
Cohee
b813bcad8a Merge pull request #3629 from kingbri1/staging
Make mesExamples macros consistent
2025-03-07 22:55:31 +02:00
Cohee
0423cb7ad3 Do not apply instruct formatting if on CC 2025-03-07 22:53:30 +02:00
Cohee
5ff4c457c0 Merge pull request #3630 from cloak1505/staging
Update OpenRouter providers
2025-03-07 22:15:39 +02:00
cloak1505
c593c9fe2a Update OpenRouter providers 2025-03-07 13:47:12 -06:00
kingbri
e476063f32 Macros: Update mesExamplesRaw documentation
Works as a normal macro and not just with story string.

Signed-off-by: kingbri <8082010+kingbri1@users.noreply.github.com>
2025-03-07 13:08:30 -05:00
kingbri
95e0be7e9e MesExamples: Make macros consistent with story string
mesExamples in the story string is formatted while mesExamplesRaw
is unformatted. However mesExamples when used as a normal macro
is unformatted. This causes an inconsistency in usage which is now
corrected.

Signed-off-by: kingbri <8082010+kingbri1@users.noreply.github.com>
2025-03-07 13:03:44 -05:00
Cohee
a9c2af19e3 Add null checks for querySelector stscript_autocomplete_width
Closes #3582
2025-03-07 11:32:58 +00:00
Cohee
1a52314812 MistalAI: Add custom stop strings
Closes #3627
2025-03-07 11:29:14 +00:00
Cohee
7de516e5e7 Merge pull request #3621 from Sorro123/staging
Add gemini tools support.
2025-03-07 00:23:17 +02:00
Cohee
381956652b Remove tools assignment 2025-03-07 00:22:45 +02:00
Cohee
7fd0f3e2bf Merge branch 'staging' into geminiStructured 2025-03-07 00:22:18 +02:00
Cohee
bcb2096020 Merge pull request #3625 from SillyTavern/gemini-search
Add backend-provided websearch connectors for OpenRouter and Gemini
2025-03-07 00:18:15 +02:00
Cohee
fa699956e6 Fix functionResponse part merging 2025-03-07 00:09:11 +02:00
Cohee
c9277cec28 Gemini: Add tool calling 2025-03-06 23:52:35 +02:00
Cohee
e9cf606c70 Add backend-provided websearch connectors for OpenRouter and Gemini 2025-03-06 22:23:35 +02:00
bmen25124
50f1e3f0f2 Added translation to reasoning block (#3617)
* Added translate to reasoning block

* Added mising reset value

* Shortcut nullable type

* Added reasoning edited/deleted events, better naming

* Fixed async call

* Added await to saveChat calls

* Exported updateReasoningUI

* Removed translated reasoning on edit if auto mode is none

* Added new value check before updating reasoning block, fixed an issue that display value stays same when we edit the message.

* Translate reasoning before the main message

* Fixed auto mode translate for reasoning message

* Translate reasoning first. Prevent out of bounds access

* Fix translating reasoning on swipe generation

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2025-03-06 21:30:17 +02:00
Cohee
4d81dfb085 Merge pull request #3614 from SillyTavern/char-shallow
Lazy load characters
2025-03-06 20:57:24 +02:00
Cohee
8161690ce6 Merge branch 'staging' into char-shallow 2025-03-06 20:55:22 +02:00
Cohee
02a8c8c460 Fix server crash if request was aborted during out of quota retry 2025-03-06 20:54:10 +02:00
Seth Hoong
8565df13e4 Merge pull request #3618 from annoawesome/electron
Add support for Electron
2025-03-06 19:43:06 +02:00
Cohee
35b72cc6e6 Merge pull request #3624 from SillyTavern/server-events
Add server events emitter
2025-03-06 19:21:36 +02:00
Cohee
6b821409e0 Add server events emitter 2025-03-06 14:55:50 +00:00
Sorro
fc94ed64c1 Same changes but on staging 2025-03-06 01:22:45 +01:00
Cohee
c36607be6f Merge pull request #3610 from bmen25124/time_to_first_token
Added time to first token
2025-03-05 21:55:36 +02:00
Cohee
3b9fcfae60 Console log Ollama model pulls 2025-03-05 21:42:56 +02:00
Cohee
2d2bf48d3d Make Groq happier 2025-03-05 21:38:38 +02:00
Cohee
c167890d26 Add multimodal captioning for Cohere 2025-03-05 21:36:43 +02:00
Cohee
a09b9fa746 Added Aya Vision support (#3615) 2025-03-05 21:17:33 +02:00
bmen25124
fb5f3e0f97 Changed param order, saved a tree 2025-03-05 18:39:19 +03:00
bmen25124
3cb24507a7 Shortcut nullable type 2025-03-05 17:53:44 +03:00
bmen25124
5398684ea2 Token rate round from 1 to 3 2025-03-05 17:28:15 +03:00
bmen25124
d3263b0e0f Removed rounding from time to first token display 2025-03-05 17:16:53 +03:00
bmen25124
06beaccdae Formatting 2025-03-05 14:44:07 +03:00
bmen25124
17d2771a75 time_to_first_token moved to extras 2025-03-05 14:42:29 +03:00
Cohee
858b750346 Document the magic number for future generations 2025-03-05 09:26:16 +00:00
Cohee
f1b50caf1a Move types/bytes to devDependencies 2025-03-05 09:09:33 +00:00
equal-l2
782d866fcf Added Aya Vision support 2025-03-05 13:39:16 +09:00
Cohee
49db89fef0 package.json: Fix debug script 2025-03-05 00:57:57 +02:00
Cohee
507ce78c27 Fix crash on undefined url in /chats 2025-03-05 00:51:54 +02:00
Cohee
28bad6479c Use human-readable memory cache capacity in config 2025-03-05 00:45:34 +02:00
Cohee
13cfe1650f Add bytes parser lib 2025-03-05 00:40:20 +02:00
Cohee
5d69189f8f Hard limit hotswaps to 25 entries 2025-03-04 23:49:32 +02:00
Cohee
c48ecc67b2 Merge branch 'staging' into char-shallow 2025-03-04 23:32:47 +02:00
Cohee
3d813e4ef6 Move shallow toggle to config.yaml 2025-03-04 23:32:42 +02:00
Cohee
8d608bcd72 Add gallery folder and sort order controls (#3605)
* Add gallery folder and sort order controls
Closes #3601

* Refactor sort constants to use Object.freeze for immutability

* Add comment

* Remove excessive null propagation

* Update type hint for gallery.folders

* Use defaultSettings.sort as a fallback

* Throw in groups

* Handle rename/deletion events

* Merge init functions

* Fix multiple gallery file uplods

* Add min-height for gallery element

* Fix gallery endpoint not parsing body

* translatable toasts

* Pass folder path in request body

* Change restore pictogram

* Add title to gallery thumbnail images

* Allow optional folder parameter in image list endpoint and handle deprecated usage warning

* Add validation for folder parameter in image list endpoint

* Add border to gallery sort selection

* Remove override if default folder is set to input

* Use server-side path sanitation

* Sanitize gallery folder input before updating

---------

Co-authored-by: Wolfsblvt <wolfsblvt@gmail.com>
2025-03-04 23:16:56 +02:00
bmen25124
73d4922d70 Iinitial value from -1 to null, better calculation 2025-03-04 13:46:57 +03:00
Cohee
383806325a Add shallow character load mode 2025-03-04 10:00:12 +00:00
Cohee
70f762c006 Merge pull request #3609 from bmen25124/error_field_check_custom_request
Added error field check
2025-03-04 08:51:55 +02:00
bmen25124
bdbddd4ed3 Added time to first token for swipe 2025-03-04 05:50:02 +03:00
bmen25124
d14b5e51a9 Added time to first token 2025-03-04 05:19:38 +03:00
bmen25124
28fc498ee6 Added error field check 2025-03-04 03:39:00 +03:00
Cohee
5d255d758e Merge pull request #3606 from SillyTavern/reasoning-continue-fix
Fix continue duplicating reasoning block
2025-03-04 00:56:07 +02:00
Cohee
7be6e0d5af Fix continue duplicating reasoning block 2025-03-04 00:42:50 +02:00
bmen25124
7d568dd4e0 Generic generate methods (#3566)
* sendOpenAIRequest/getTextGenGenerationData methods are improved, now it can use custom API, instead of active ones

* Added missing model param

* Removed unnecessary variable

* active_oai_settings -> settings

* settings -> textgenerationwebui_settings

* Better presetToSettings names, simpler settings name in getTextGenGenerationData,

* Removed unused jailbreak_system

* Reverted most core changes, new custom-request.js file

* Forced stream to false, removed duplicate method, exported settingsToUpdate

* Rewrite typedefs to define props one by one

* Added extractData param for simplicity

* Fixed typehints

* Fixed typehints (again)

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2025-03-03 10:30:20 +02:00
Cohee
0088333ebf WI: Fix adding empty text to recursion buffer 2025-03-03 00:05:35 +02:00
Cohee
c9ebea1d0a Merge pull request #3590 from SillyTavern/update-libs
Update third-party dependencies
2025-03-02 23:35:56 +02:00
Cohee
59ee2e1302 Merge pull request #3596 from Tosd0/staging
zh-CN translation
2025-03-02 23:30:15 +02:00
Cohee
074f54d995 Unhide nsigma for kobocpp 2025-03-02 23:04:18 +02:00
Cohee
155956f45b Merge pull request #3593 from SillyTavern/tc-missing-samplers-on-restore
Add missing samplers to TC restore preset
2025-03-02 23:02:20 +02:00
Cohee
5ecfbf3933 Fix element id for nsigma 2025-03-02 23:01:34 +02:00
Sevenyine
b1acfec825 Supplemented translations 2025-03-02 16:44:53 +08:00
Sevenyine
6e6d1b24eb Delete unused i18n keys 2025-03-02 16:33:54 +08:00
Sevenyine
6e15e4875d Update i18n keys in other languages due to changes in index.html 2025-03-02 16:31:40 +08:00
Sevenyine
0a89d9ca6f zh-CN translation 2025-03-02 15:28:46 +08:00
Wolfsblvt
810d954d12 Add missing samplers to TC restore preset 2025-03-02 00:26:47 +01:00
Cohee
64e1fd5f71 Merge pull request #3592 from qvink/specify_api_for_preset_list
Allow specifying API in presetManager.getPresetList()
2025-03-02 01:07:03 +02:00
Cohee
590ad6235b Merge pull request #3586 from DAurielS/novelai-image-update
Added support for NovelAI Diffusion V4 Full via API to Image Generation extension.
2025-03-02 01:05:35 +02:00
Cohee
696a999238 Merge pull request #3591 from SillyTavern/revert-3587-fix-miscounted-messages-on-generate-and-swipe
Revert "Account for generated depth on non-continue"
2025-03-02 00:56:07 +02:00
Cohee
7522fa2e79 Revert "Account for generated depth on non-continue" 2025-03-02 00:55:52 +02:00
qvink
ede9f242af Allow specifying API in presetManager.getPresetList() 2025-03-01 15:54:18 -07:00
Daryl
3a2d29b5cb Responding to PR change reviews 2025-03-01 17:21:11 -04:00
Cohee
f1f7a14349 Merge pull request #3578 from SillyTavern/whitelist-hosts
Whitelist Docker hosts
2025-03-01 21:44:22 +02:00
Cohee
108d9fd74f docker-compose.yml improvements
1. Enable colorized console outputs
2. Set node environment to production
2025-03-01 21:16:28 +02:00
Cohee
4c242fefe8 More concise startup logs 2025-03-01 21:07:12 +02:00
Cohee
55a295f827 Remove version specification from docker-compose.yml 2025-03-01 21:03:53 +02:00
Cohee
a161118308 Execute postinstall in docker entrypoint 2025-03-01 21:03:48 +02:00
Cohee
947a307b25 Update function comment 2025-03-01 20:25:55 +02:00
Cohee
61132dd7b9 Set default for whitelistDockerHosts to true 2025-03-01 20:25:00 +02:00
Cohee
1d995fb92d Rewrite to only consider Docker 2025-03-01 20:22:33 +02:00
Cohee
8aa7ed8635 Rewrite whitelist resolve logic to skip unresolved hosts from whitelist 2025-03-01 19:57:36 +02:00
Cohee
68db63b629 Merge branch 'staging' into whitelist-hosts 2025-03-01 19:44:49 +02:00
Cohee
743f07167c Update third-party dependencies 2025-03-01 19:38:21 +02:00
Cohee
b95dd04fbe Merge pull request #3585 from SillyTavern/chalk-lib
Use chalk lib for console colorization
2025-03-01 19:04:31 +02:00
Cohee
afdf56ce68 Merge pull request #3587 from Reithan/fix-miscounted-messages-on-generate-and-swipe 2025-03-01 15:59:16 +02:00
Reithan
0bedb6e0ff Autoformat 2025-03-01 05:49:18 -08:00
Reithan
ccd6a1631a Account for generated depth on non-continue 2025-03-01 05:48:11 -08:00
Cohee
661b84033f Don't use String constructor in calculateDataSize 2025-03-01 14:30:48 +02:00
Cohee
45d8cac5a9 Fix /go command 2025-03-01 14:30:18 +02:00
Daryl
8271bf36c7 Updated the processReply method to NOT remove pipe | or hash # characters when the selected model is nai-diffusion-v4 curated or full. 2025-03-01 02:06:26 -04:00
Daryl
d788c2fbb5 Added support for NovelAI Diffusion V4 Full via API to Image Generation extension. 2025-03-01 01:30:42 -04:00
Cohee
8a750c6341 Restore chosen AllTalk version on load 2025-03-01 01:33:39 +02:00
Cohee
868e97804a Use chalk lib for console colorization 2025-03-01 00:56:50 +02:00
Cohee
63b95ef504 Add i18n attr for deprecation notice 2025-03-01 00:52:53 +02:00
Cohee
385ef46a2b Add deprecation warning for Extras API in extensions pane 2025-03-01 00:52:26 +02:00
Cohee
7e8471f28f Enhance logging for resolved whitelist hostnames with color formatting 2025-03-01 00:30:00 +02:00
Cohee
8fded75069 Merge branch 'staging' into whitelist-hosts 2025-03-01 00:04:47 +02:00
Cohee
969156d819 Merge pull request #3584 from SillyTavern/chid-unify-type
Always use string for this_chid
2025-03-01 00:04:21 +02:00
Cohee
639c0235f9 Handle 'object' case as indexOf 2025-02-28 23:37:35 +02:00
Cohee
284bac9b49 Add type of this_chid 2025-02-28 22:51:34 +02:00
Cohee
af5e9aa518 Fix shift-click in bulk for first in list 2025-02-28 22:44:10 +02:00
Cohee
e91387c60b Fix rate and pitch for system tts
Closes #2545
2025-02-28 22:18:53 +02:00
Cohee
b3eb6e071f Merge branch 'staging' into chid-unify-type 2025-02-28 22:04:14 +02:00
Cohee
40720971c5 Hide unsupported language warning for 'en' 2025-02-28 21:55:48 +02:00
Cohee
abe55ec905 Add class to language selector 2025-02-28 21:51:06 +02:00
Cohee
ea59dcc30e Equalize group action button heights 2025-02-28 21:34:10 +02:00
Cohee
4f224550f6 Hide "persona connections" in create form 2025-02-28 21:26:16 +02:00
Cohee
12335f4860 Improve type handling 2025-02-28 13:46:16 +00:00
Cohee
b2ce76c84c Return to using string type for this_chid 2025-02-28 13:37:36 +00:00
Cohee
b6af55134a Refactor context change checks during chat summarization 2025-02-28 12:54:52 +00:00
Cohee
1aae08be5b Fix char A/N and expressions folder for first in the list 2025-02-28 09:12:22 +00:00
Cohee
2461913f85 Fix Horde model selection not saving 2025-02-28 10:53:56 +02:00
Cohee
5555b3e7db Use character name for gallery URL 2025-02-28 10:49:15 +02:00
Cohee
76e45abfc6 Fix SD prefixes for first in the list 2025-02-28 10:38:42 +02:00
Cohee
50e49cd67b Fix gallery for first in the list 2025-02-28 10:36:26 +02:00
Cohee
16b62d9fb3 Fix tags selector for first in the list 2025-02-28 10:33:39 +02:00
Cohee
14aec43064 Fix A/N and CFG menus on first in the list 2025-02-28 10:26:03 +02:00
Cohee
76cb34fd06 Fix logprobs menu on empty chats 2025-02-28 10:25:36 +02:00
Cohee
83e75439ab Fix duplication and scenario override for first in the list 2025-02-28 10:21:33 +02:00
Cohee
f33464527b Fix deletion of the first char in the list 2025-02-28 10:18:57 +02:00
Cohee
2df140a6a9 Fix world info binding and alt.greetings editor for first char in the list
Possibly fixes #3579
2025-02-28 10:16:42 +02:00
Cohee
eac0d04fd3 Merge pull request #3580 from AyeeMinerva/staging
add printMessages in st-context.getContext()
2025-02-28 09:43:47 +02:00
AyeeMinerva
73035c1d1c add clearChat in st-context 2025-02-28 15:08:55 +08:00
AyeeMinerva
7c72c1d9f3 add printMessages in st-content
so that we can use this func in extension
2025-02-28 12:31:25 +08:00
Cohee
60e8ffbf90 Improve logging in resolveHostnames function to provide clearer output for resolved IP addresses 2025-02-28 00:39:32 +02:00
Cohee
50ad31f8e8 Update the resolveHostnames function to clarify its behavior and improve documentation 2025-02-28 00:36:27 +02:00
Cohee
978b2cdb21 Refactor whitelist middleware to return a promise and update server.js to handle async initialization 2025-02-28 00:25:59 +02:00
Cohee
58fe54954a Update whitelist entry in config.yaml to use gateway.docker.internal 2025-02-28 00:21:35 +02:00
Cohee
d286fff42c Merge branch 'staging' into whitelist-hosts 2025-02-28 00:17:31 +02:00
Cohee
5c146bdd67 Add gpt-4.5 to caption extension list 2025-02-27 23:31:46 +02:00
Cohee
9c4bffc487 Merge pull request #3577 from SillyTavern/the-best-model-tm
Add gpt-4.5-preview (best model ™️ - most expensive for sure)
2025-02-27 23:30:34 +02:00
Cohee
20b5c962db Merge pull request #3576 from SillyTavern/debug-track-dynamic-translations
Debug function to track missing dynamic translation fields (`t` and `translate` calls)
2025-02-27 23:28:15 +02:00
Cohee
a8f05c92ae Revert "Switch tracking key to accountStorage"
This reverts commit 549fae4015.
2025-02-27 23:22:08 +02:00
Wolfsblvt
549fae4015 Switch tracking key to accountStorage 2025-02-27 22:16:38 +01:00
Cohee
0bc4396427 Resolve hostnames from whitelist 2025-02-27 23:14:57 +02:00
Wolfsblvt
ea643cce6e Add gpt-4.5-preview 2025-02-27 22:08:29 +01:00
Wolfsblvt
f11a834895 Switch tracking from Array to Set 2025-02-27 21:26:45 +01:00
Cohee
f43b42544b Merge pull request #3567 from SillyTavern/cli-args-refactor
Refactor server startup
2025-02-27 22:17:08 +02:00
Wolfsblvt
b98556855d Fix undefined translation 2025-02-27 21:15:12 +01:00
Wolfsblvt
94441c54ae Update logging structure for dyn translations 2025-02-27 20:59:38 +01:00
Wolfsblvt
c6a2b4e429 Trace-log stacktrace of translations without key 2025-02-27 20:48:16 +01:00
Wolfsblvt
08e184de26 Debug Func to track missing dynamic translations
- Add debug function to the debug menu that enables tracking of missing dynamic translations (via `t` or `translate`) once enabled
- Only works with non-English language loaded
- Prints it together with the existing debug print
2025-02-27 20:45:10 +01:00
Cohee
60448f4ce8 Move security checks to users.js 2025-02-27 21:27:39 +02:00
Cohee
d5056a5563 Merge branch 'staging' into cli-args-refactor 2025-02-27 20:48:34 +02:00
Cohee
ae51c39c09 Merge pull request #3572 from SillyTavern/remove-group-starter
Remove group chat starter message
2025-02-27 20:45:50 +02:00
Cohee
6905fcd0a4 Merge pull request #3573 from SillyTavern/extensions-i18n
Add locale data loading for extensions
2025-02-27 20:41:18 +02:00
Cohee
d3006cc720 Load extension i18n before script 2025-02-27 17:41:59 +00:00
Cohee
73786610a6 Merge pull request #3574 from Reithan/update-tfs-and-dyna-temp-expo-to-3-sig-dig
Update TFS and DynaTemp Exponent to use 3 sig dig
2025-02-27 19:33:15 +02:00
Reithan
aaf066699b Update TFS and DynaTemp Exponent to use 3 sig dig 2025-02-27 09:20:07 -08:00
Cohee
e312ae6b3b Add locale data loading for extensions 2025-02-27 16:18:10 +00:00
Cohee
d613e1ee77 Remove group chat starter message 2025-02-27 13:29:21 +00:00
Cohee
c60af6659c Change extensions list to debug level 2025-02-26 20:54:25 +02:00
Cohee
02ab882e63 Fix deno startup 2025-02-26 20:53:17 +02:00
Cohee
7c7de3d965 Update README 2025-02-26 20:45:14 +02:00
Cohee
02cdec5a10 Validate SSL config for sanity before startup 2025-02-26 20:32:26 +02:00
Cohee
813ec537cd Fix default values for SSL command line 2025-02-26 20:24:22 +02:00
Cohee
a20928b02c Fix class method bind. Await open promise 2025-02-26 20:19:32 +02:00
Cohee
1ef04ffc4d Rewrite comments 2025-02-26 16:22:56 +00:00
Cohee
68eecc77bb Refactor IP interface query 2025-02-26 15:44:39 +00:00
Cohee
b64273ab94 Fix comments, update function interfaces 2025-02-26 15:36:01 +00:00
Cohee
e7fcd0072b Refactor server startup 2025-02-26 14:46:54 +00:00
Wolfsblvt
6c0538854d Switch order of persona connections 2025-02-26 11:00:38 +01:00
Cohee
cf14b75091 Merge pull request #3564 from SillyTavern/rename-past-chats-event
Add `RENAMED_PAST_CHAT` event
2025-02-26 10:52:25 +02:00
Wolfsblvt
eab4e8aebc Renamed to CHARACTER_RENAMED_IN_PAST_CHAT 2025-02-26 09:38:25 +01:00
Cohee
2a65688148 Merge pull request #3563 from stevelittlefish/better_forwarded_ip_error_message_stg
Show forwarded IP in whitelist denied message
2025-02-26 10:05:31 +02:00
Wolfsblvt
22d551be3a bonus: jsdoc and modern popup for rename 2025-02-26 01:44:45 +01:00
Wolfsblvt
4e1cb1eba4 Add RENAMED_PAST_CHAT event 2025-02-26 01:28:28 +01:00
Stephen Brown
6947ca7433 Show forwarded IP in whitelist denied message 2025-02-25 23:58:12 +00:00
Cohee
12ef33bca4 Merge pull request #3346 from SillyTavern/persona-improvements
Expand Persona links/locking to characters and allowing more control on which persona to choose/load
2025-02-26 00:55:05 +02:00
Cohee
2cfaa034fb Merge branch 'staging' into persona-improvements 2025-02-26 00:48:23 +02:00
Cohee
e98172bb0e Merge pull request #3521 from SillyTavern/immutable-config
Immutable config
2025-02-26 00:42:26 +02:00
Cohee
90be2eee71 Only navigate to persona if switched by connection 2025-02-26 00:13:55 +02:00
Cohee
4aa8672925 Fix typo in post-install.js comment 2025-02-26 00:08:59 +02:00
Cohee
acd8b817f4 Improve number type conversion in getConfigValue to handle NaN cases 2025-02-26 00:08:04 +02:00
Cohee
6541dcbc66 Comment out persona preservation on character swap with personas open 2025-02-26 00:03:46 +02:00
Cohee
0274d800f9 Navigate to current persona on switching chats 2025-02-25 23:50:49 +02:00
Cohee
cf792c8195 Don't choose chat persona if it's already chosen 2025-02-25 23:37:02 +02:00
Cohee
5af4217fda Merge persona description counter with position header 2025-02-25 23:32:13 +02:00
Wolfsblvt
fec0e248c5 Fix persona UI states sometimes not updating 2025-02-25 21:57:25 +01:00
Wolfsblvt
582b710d3c Merge branch 'staging' into persona-improvements 2025-02-25 21:46:46 +01:00
Cohee
0776f65193 Allow JSON array and objects in env.var configs 2025-02-25 22:20:17 +02:00
Cohee
4edb069bd8 Split avatar dimensions config read by types 2025-02-25 22:19:09 +02:00
Cohee
861c502e44 Return type casts where they were 2025-02-25 22:12:22 +02:00
Cohee
11d56a407d Merge branch 'staging' into immutable-config 2025-02-25 22:08:35 +02:00
Cohee
7b55d91d35 Merge pull request #3561 from SillyTavern/fix-syncing-swipe-data
Fix syncing swipe data on reasoning parse & utility function to sync swipe data
2025-02-25 21:53:43 +02:00
Cohee
8b135f9ca3 Remove async from event handler 2025-02-25 21:52:03 +02:00
Cohee
422517ec93 Cancel debounced chat save if regular save is performed 2025-02-25 21:38:24 +02:00
Cohee
5545a425ea No double check 2025-02-25 21:34:04 +02:00
Cohee
eceaa9cacc Replace debounced save with regular 2025-02-25 21:32:39 +02:00
Cohee
7def85a174 Add couple of extra type checks 2025-02-25 21:21:59 +02:00
Wolfsblvt
5955327f7b Add old preset name to OAI_PRESET_CHANGED_BEFORE 2025-02-25 17:32:36 +01:00
Wolfsblvt
d28f39d77a Save chat on reasoning parse 2025-02-25 17:23:12 +01:00
Wolfsblvt
8bdc00e0b9 Fix reasoning not always being synced to swipe 2025-02-25 17:10:13 +01:00
Wolfsblvt
4ab54016ad Utility func to sync all mes data to swipe 2025-02-25 17:00:41 +01:00
Cohee
f0c7ea062b Merge pull request #3558 from bmen25124/new_exports
New exports - getChatCompletionModel
2025-02-25 15:05:30 +02:00
bmen25124
7064ce81c7 Exported getChatCompletionModel with optional parameter 2025-02-25 15:45:35 +03:00
Cohee
20a982491a Merge pull request #3554 from bmen25124/new_exports
Exported getTextGenServer, extractMessageFromData methods. added opti…
2025-02-25 12:23:09 +02:00
Cohee
5f024823a9 Improve JSdocs 2025-02-25 10:22:03 +00:00
bmen25124
092ef26144 Exported getTextGenServer, extractMessageFromData, getPresetManager methods. Added optional parameters to some methods for generic usage. 2025-02-25 13:20:06 +03:00
Cohee
19fba66d2c Merge pull request #3551 from SillyTavern/claude-thonk
Claude 3.7 think mode
2025-02-25 00:53:20 +02:00
Cohee
f2e47d9276 Update reasoning effort tooltip to specify minimum token allocation 2025-02-24 23:48:04 +02:00
Cohee
b8ebed0f4c Claude 3.7 think mode 2025-02-24 23:43:13 +02:00
Cohee
db148d5142 Merge pull request #3548 from SillyTavern/sonnet-3.7
Sonnet 3.7
2025-02-24 21:15:32 +02:00
Cohee
c855cd2bf0 Bonus: add o1 to captioning list 2025-02-24 21:13:42 +02:00
Cohee
82b74628c6 Sonnet 3.7 2025-02-24 21:06:12 +02:00
Cohee
68234cdcef Merge pull request #3547 from PeterDaveHello/zh-tw
Improve zh-TW Traditional Chinese locale a bit
2025-02-24 18:48:36 +02:00
Cohee
e71427953b Merge pull request #3544 from qvink/get_chat_completion_presets_from_preset_manager
Get chat completion presets from preset manager
2025-02-24 18:45:10 +02:00
qvink
5dc8450559 Fixing getCompletionPresetByName, removing openai option from getSelectedPresetName 2025-02-24 09:31:03 -07:00
Peter Dave Hello
01b0a84b70 Improve zh-TW Traditional Chinese locale a bit
Fix some terms converted from Simplified Chinese, and also improve the
consistency and some spaces.
2025-02-24 22:59:19 +08:00
Cohee
e0d1b21006 Merge pull request #3542 from SillyTavern/summary-improvements
Assorted summary improvements
2025-02-24 09:24:03 +02:00
qvink
d2df04550a Adding function to get preset values by name 2025-02-23 22:11:33 -07:00
qvink
10a72b8c80 Merge branch 'staging' of github.com-qvink:SillyTavern/SillyTavern into get_chat_completion_presets_from_preset_manager 2025-02-23 21:24:13 -07:00
qvink
7eff895e88 Allowing the presetManager to return presets for chat completion 2025-02-23 21:23:43 -07:00
Cohee
296037d1c8 Remove redundant styles 2025-02-24 00:57:00 +02:00
Cohee
ae666c9012 OpenRouter (CC): explicit opt-out for reasoning 2025-02-23 22:13:11 +02:00
Cohee
7fc26c1d53 Merge pull request #3541 from RivelleDays/staging
Update zh-tw.json: Added Missing Translations & Support for Third-Party Extensions
2025-02-23 22:09:41 +02:00
Cohee
7a54b0cad7 Assorted summary improvements 2025-02-23 21:40:15 +02:00
Cohee
919df98c6e Merge pull request #3540 from PeterDaveHello/patch-1
Optimize Dockerfile to use `apk add` with `--no-cache`
2025-02-23 12:50:28 +02:00
Peter Dave Hello
2faaabbf5f Optimize Dockerfile to use apk add with --no-cache
Using the `apk add` command with the `--no-cache` parameter for package installation will prevent the package index from being cached and reduce the image size.
2025-02-23 18:39:22 +08:00
Rivelle
26c9c7e56b Update zh-tw.json 2025-02-23 17:57:27 +08:00
Wolfsblvt
7249d4470a Merge pull request #3539 from RivelleDays/staging
Update zh-tw.json
2025-02-23 06:17:31 +01:00
Rivelle
810bca46a0 Update zh-tw.json 2025-02-23 13:08:36 +08:00
Wolfsblvt
e27e045054 Update persona.js code documentation for exported 2025-02-23 04:58:48 +01:00
Wolfsblvt
76fa90ed9e Switch to char from persona panel decision tree 2025-02-23 02:33:51 +01:00
Wolfsblvt
5a22e64466 Improve tooltip for never_resize_avatars 2025-02-23 02:26:36 +01:00
Cohee
6df2dc11f7 Merge pull request #3538 from SillyTavern/reasoning-parse-on-edit
Reasoning edit/parse updates
2025-02-22 23:11:05 +02:00
Wolfsblvt
8aadada0e2 utility: let setInfoBlock also clear 2025-02-22 21:50:58 +01:00
Cohee
7f9960fa7a Clickable char personas 2025-02-22 22:48:51 +02:00
Wolfsblvt
e0f3a22b80 Refactor: move persona slash commands 2025-02-22 21:45:35 +01:00
Cohee
49d1a16a18 Update rename tooltip 2025-02-22 22:35:09 +02:00
Cohee
ac8c2799b8 Add missing personas on load 2025-02-22 22:26:34 +02:00
Cohee
ee6202c379 Remove margin right from persona name 2025-02-22 22:25:13 +02:00
Cohee
2194bdfd56 Rerender the list if migrated persona 2025-02-22 22:20:45 +02:00
Wolfsblvt
bb03c60c39 Refactor: move showCharConnections 2025-02-22 21:17:56 +01:00
Wolfsblvt
8f38298f90 fix linting errors 2025-02-22 20:48:41 +01:00
Wolfsblvt
9e7f485b65 Merge branch 'persona-improvements' of https://github.com/SillyTavern/SillyTavern into persona-improvements 2025-02-22 20:47:10 +01:00
Cohee
4a9503c056 Align message block baseline 2025-02-22 21:43:16 +02:00
Wolfsblvt
f37541d629 Remove unused old username functions 2025-02-22 20:42:35 +01:00
Cohee
caf3a64a0f Replace gray with opacity 2025-02-22 21:34:23 +02:00
Wolfsblvt
8bd4fd76ae Merge branch 'staging' into persona-improvements 2025-02-22 19:23:59 +01:00
Cohee
252ae9f534 Update access log configuration to enforce boolean type 2025-02-22 20:20:23 +02:00
Cohee
a73dfa7586 Merge branch 'staging' into immutable-config 2025-02-22 20:15:13 +02:00
Cohee
fb06e7afa1 Merge pull request #3403 from SillyTavern/support-multiple-expressions
Support multiple expressions
2025-02-22 20:13:43 +02:00
Cohee
3cf4be8e85 Remove unused import 2025-02-22 20:12:19 +02:00
Cohee
f2cac8e7f7 Revert "Return fallback expression if no group message found" 2025-02-22 20:02:34 +02:00
Cohee
4802e4bed2 Reasoning edit/parse updates
1. Parse reasoning on message edit
2. Reasoning edit follow 'auto-save' preference
2025-02-22 19:14:01 +02:00
Cohee
1a1afd00a1 Merge pull request #3537 from Kas1o/staging
Updated Groq model options to sync with official playground
2025-02-22 14:40:13 +02:00
Cohee
e7d38d95d0 Add max context size for llama-guard-3-8b model 2025-02-22 14:37:53 +02:00
Cohee
15769a7643 Add context sizes for new groq models 2025-02-22 14:36:32 +02:00
Cohee
9b631ed048 Support Qwen tokenizer fro Groq 2025-02-22 14:29:04 +02:00
Cohee
7188060ac8 Merge pull request #3526 from Zhen-Bo/feature/access-log-middleware
Add Separate Access Logging Middleware with Configuration Option
2025-02-22 14:18:38 +02:00
Cohee
3e26b93971 Do not register whitelist middleware if whitelist disabled 2025-02-22 14:14:40 +02:00
Kas1o
159852233f Updated Groq model options to sync with official playground 2025-02-22 20:09:04 +08:00
Cohee
a2ecb81378 Move minLogLevel to logging section 2025-02-22 13:58:08 +02:00
Cohee
b12cd9fe05 Merge branch 'staging' into feature/access-log-middleware 2025-02-22 13:49:36 +02:00
Cohee
d21b0f1b5e Add default fallback expression 2025-02-22 13:45:54 +02:00
KevinSun
42f850239f fix(middleware): skip logging for blocked connections to specific paths 2025-02-22 19:42:38 +08:00
Cohee
db988411fd Return fallback expression if no group message found 2025-02-22 13:40:43 +02:00
Cohee
3a25550f5b Merge pull request #3535 from yokuminto/release
add reasoning display switch in custom source
2025-02-22 13:22:50 +02:00
Cohee
5c79c8e162 [chore] Reformat new code 2025-02-22 12:47:19 +02:00
Cohee
30f97e0e64 Merge branch 'release' into staging 2025-02-22 12:41:18 +02:00
Cohee
938c8a9a36 Add /default do-not-edit notice 2025-02-22 12:41:09 +02:00
yokuminto
13f76c974e reasoning or reasoning_content 2025-02-22 16:09:42 +08:00
Wolfsblvt
afbe21b6b4 Make sendExpressionCall exportable
- For compatibility with existing extensions
2025-02-22 01:44:42 +01:00
Cohee
d32adb8d1d Fix requestProxyBypass command line default value
Closes #3528
2025-02-21 23:07:33 +02:00
Cohee
6e5db5c41a Perplexity: Add new models 2025-02-21 23:03:49 +02:00
Cohee
a7d7b6fb0f Fix group VN updates on switching to chat 2025-02-21 22:05:08 +02:00
Cohee
1adde74f38 Merge branch 'staging' into support-multiple-expressions 2025-02-21 21:06:20 +02:00
Cohee
1ad3f3d6c7 Merge pull request #3530 from SillyTavern/reasoning-block-coloring
Update reasoning block coloring to CSS vars
2025-02-21 20:53:05 +02:00
Wolfsblvt
0cc0d6763e Use hsl instead of color-mix for reasoning css 2025-02-21 19:40:36 +01:00
Cohee
e8cdad0bf2 Merge pull request #3531 from SillyTavern/fix-hidden-reasoning-plus-parsing
Fix hidden reasoning models blocking auto-parsing from working
2025-02-21 19:56:02 +02:00
Wolfsblvt
b0a2f241d2 Fix hidden reasoning not allowing manual parsing 2025-02-21 18:01:25 +01:00
Wolfsblvt
29c71fe8f1 Update reasoning block coloring to CSS vars 2025-02-21 17:30:56 +01:00
KevinSun
f755c3d4cb refactor(middleware): rename accessLogger to accessLogWriter 2025-02-21 23:56:31 +08:00
KevinSun
9c3e8c935b refactor(Middleware): only mount accessLogger when listen is enabled 2025-02-21 23:49:15 +08:00
KevinSun
bfc609c2a8 fix(middleware): skip New connection message and access.log writes for localhost 2025-02-21 22:17:12 +08:00
Cohee
4c7ede67f3 Merge branch 'release' into staging 2025-02-21 12:47:31 +00:00
Cohee
b17fdcbfd9 Fix assistant chat export format 2025-02-21 12:46:49 +00:00
KevinSun
db500188d8 feat(middleware): add separate access log middleware with config option 2025-02-21 20:32:23 +08:00
Cohee
aadae85a2a eventSource: Add autofire on emit for APP_READY 2025-02-21 02:52:45 +02:00
Cohee
cb6adc30ce Fix null confrimation when no custom expressions 2025-02-21 02:05:43 +02:00
Cohee
bdbcf8623e Fix force set emote in group 2025-02-21 01:46:10 +02:00
Cohee
e35217e7e3 Fix image loading resolve 2025-02-21 01:32:13 +02:00
Cohee
aca1cb7f99 Fix first reorder of group VN with reduced motion 2025-02-21 01:19:19 +02:00
Cohee
07160e0e60 Fix group VN mode not updating on kicking group members 2025-02-21 01:01:30 +02:00
Cohee
179153ae67 Fix group VN mode with reduced motion 2025-02-21 00:51:17 +02:00
Cohee
94f53835f4 Forbid custom expressions to be prefixed with defaults 2025-02-21 00:29:05 +02:00
Cohee
ab4d296b22 fix: return empty strings for branch name and commit hash in error response 2025-02-20 23:18:03 +02:00
Cohee
8ad7b5dcc5 Check if git repo root in plugin update 2025-02-20 23:13:23 +02:00
Cohee
00bb36f764 Fix setting basic auth creds with env 2025-02-20 22:38:47 +02:00
Cohee
73784642d2 Save setConfigValue export 2025-02-20 22:31:23 +02:00
Cohee
2b28065c9f Fix setting protocols with env 2025-02-20 22:28:30 +02:00
Cohee
eb31d7baa2 Merge branch 'staging' into immutable-config 2025-02-20 21:54:41 +02:00
Cohee
3f03936125 Add config value type converters for numbers and booleans 2025-02-20 21:53:48 +02:00
KevinSun
3f5b63bba0 Feature: Add configurable X-Real-IP header support for rate limiting (#3504)
* fix: correct client IP detection behind reverse proxy

* Revert "fix: correct client IP detection behind reverse proxy"

This reverts commit 7207506240.

* feat: support X-Real-IP header for reverse proxy setups

* feat: add option to use x-real-ip for rate limiting behind reverse proxy

* docs: update rate limiting configuration comments for X-Real-IP usage

* refactor: extract getIpAddress function to reduce code duplication

* revert(whitelist): rate limit settings shouldn't affect whitelist
2025-02-20 21:11:44 +02:00
Cohee
7571552fef STORAGE_KEYS.cookieSecret deprecated 2025-02-20 20:45:20 +02:00
Cohee
f6fe5fea77 Allow overriding config.yaml values with env vars
Closes #3520
2025-02-20 20:29:42 +02:00
Wolfsblvt
3574527780 fade "reroll if same" if no multi sprites enabled 2025-02-20 19:28:54 +01:00
Wolfsblvt
2834681a4b Fix sprite upload replace existing
- Also fix form not resetting on cancel of replace popup
2025-02-20 19:25:20 +01:00
Cohee
7ea2c5f8cf Move cookie secret to data root. Make config.yaml immutable 2025-02-20 20:16:44 +02:00
Wolfsblvt
19e2a2f7d2 safety check on upload on sprite name 2025-02-20 19:05:20 +01:00
Wolfsblvt
a58e026a40 Don't show del popup on placeholder sprite 2025-02-20 19:02:29 +01:00
Wolfsblvt
a40f568409 Fix sprite deletion 'no' option 2025-02-20 18:51:44 +01:00
Cohee
bad806312d Auto-extend session cookie every 30 minutes 2025-02-20 09:58:17 +02:00
Cohee
3bb8b887e1 Merge pull request #3512 from SillyTavern/session-autoextend
Auto-extend session cookie every 30 minutes
2025-02-20 09:57:19 +02:00
Cohee
135bf8a55b Add progress toast for sprite ZIP upload 2025-02-20 00:12:40 +02:00
Cohee
3d8a897c19 Auto-extend session cookie every 30 minutes 2025-02-19 23:42:28 +02:00
Wolfsblvt
bd6da695c8 cleanup examples for multi sprites 2025-02-19 22:30:51 +01:00
Wolfsblvt
531999dc04 Ensure unique suggested sprite names 2025-02-19 22:12:29 +01:00
Cohee
58bbfc0d4e Add types for global translation function 2025-02-19 22:18:09 +02:00
Cohee
380bd4ef4b refactor: update runWebpackCompiler to accept options object 2025-02-19 22:03:43 +02:00
Cohee
bb64e9b5c5 Merge pull request #3500 from SillyTavern/webpack-cache-dataroot
Move webpack cache to data root
2025-02-19 21:53:58 +02:00
Cohee
1ef5154770 Merge branch 'staging' into webpack-cache-dataroot 2025-02-19 21:34:02 +02:00
Cohee
57aa820dc3 Merge pull request #3510 from underscorex86/patch-3
autoswipe length tooltip
2025-02-19 21:27:41 +02:00
Wolfsblvt
c12f26441e Merge branch 'staging' into support-multiple-expressions 2025-02-19 20:22:02 +01:00
Cohee
e4269f5d1d Update i18n 2025-02-19 21:17:03 +02:00
Sneha C
947d4f215e autoswipe length tooltip
clarify that it is # of characters
2025-02-19 20:13:05 +04:00
Cohee
826e4f6d16 Merge pull request #3499 from SillyTavern/accesslog-dataroot
Move access.log to data root
2025-02-19 11:32:37 +02:00
Cohee
0f46128980 Set lib.js output path to data 2025-02-18 20:24:07 +02:00
Cohee
1a4bcbb794 Remove input length restrictions from OpenAI compatible TTS
Closes #3505
2025-02-18 10:34:15 +02:00
Cohee
441e5c6f7e Move webpack cache to data root 2025-02-17 23:41:59 +02:00
Cohee
da3b620f74 Move access.log to data root 2025-02-17 22:58:06 +02:00
Cohee
fa4a75215b Merge pull request #3497 from SillyTavern/fix-char-rename-aux-connections
Fix renaming characters losing connections of several aux fields
2025-02-17 21:14:41 +02:00
Cohee
0cdc389794 Fix type handling of active_character_id 2025-02-17 21:00:09 +02:00
Cohee
434bdab585 Merge branch 'staging' into fix-char-rename-aux-connections 2025-02-17 20:57:23 +02:00
Cohee
ce67f3a658 Ensure node is an Element in DOMPurify hook 2025-02-17 20:54:11 +02:00
Cohee
277fc00f38 Remove dompurify types stub 2025-02-17 20:53:42 +02:00
Cohee
36a3a7d615 Merge pull request #3486 from Yokayo/staging
Update ru-ru translation
2025-02-17 20:45:40 +02:00
Cohee
d15d49b295 Merge pull request #3484 from SillyTavern/reasoning-parsing-streaming
Implement reasoning parsing during streaming, based on provided prefix/suffix
2025-02-17 20:27:57 +02:00
Cohee
87afb1633b reasoning-set: Return if message not found 2025-02-17 19:54:50 +02:00
Cohee
e5e2c9fe49 Merge branch 'staging' into reasoning-parsing-streaming 2025-02-17 19:43:09 +02:00
Cohee
580856064e Merge pull request #3496 from SillyTavern/parse-reasoning-command-args
Add 'return' and 'strict' to `/reasoning-parse`, and make all reasoning parsing strict by default
2025-02-17 19:37:20 +02:00
Cohee
1a5b1f77d7 Merge pull request #3495 from SillyTavern/vectors-requests
Vectors: Don't use headers for source-specific fields in requests
2025-02-17 15:50:44 +02:00
Yokayo
f5d68f1cd9 Fix typo 2025-02-17 16:36:06 +07:00
Yokayo
2e77171137 Change key 2025-02-17 16:32:40 +07:00
Wolfsblvt
ab27b29819 cleanup group on auto load if name not found 2025-02-17 09:58:37 +01:00
Wolfsblvt
231068f729 await character renamed event 2025-02-17 09:47:35 +01:00
Wolfsblvt
7b65427236 typo 2025-02-17 09:19:08 +01:00
Wolfsblvt
9f21f7771c Auto-load char/group resets if target is not found 2025-02-17 07:28:59 +01:00
Wolfsblvt
1c0ca414b9 Update "active character" field on char rename 2025-02-17 05:34:28 +01:00
Wolfsblvt
4f0921856f On char rename, update auxiliary connections
- Move WI char lore (additional lorebooks) based on rename
- Move character-bound Author's Note based on rename
- Extend core `getCharFilename` to be able to take an avatarKey, instead of just uid
2025-02-17 05:32:13 +01:00
Wolfsblvt
994d69508b Merge branch 'parse-reasoning-command-args' into reasoning-parsing-streaming 2025-02-17 03:54:24 +01:00
Wolfsblvt
1ad3a2b968 Add 'return' and 'strict' to /reasoning-parse
- Add 'return' arg to `/reasoning-parse` to decide whether to return the reasoning, or the content without reasoning. Defaulting to reasoning.
- Add 'strict' arg to `/reasoning-parse` to decide whether the reasoning block has to be at the beginning of the provided message or not. Defaulting to true.
- Update parsing of all reasoning (even the auto parse one) to be strict by default - meaning the regex block has to be at the beginning (excluding whitespaces)
2025-02-17 03:47:31 +01:00
Cohee
cd2d6e85e0 Merge branch 'staging' into reasoning-parsing-streaming 2025-02-17 00:13:27 +02:00
Cohee
058c86f3c1 Vectors: Don't use headers for source-specific fields in requests 2025-02-16 23:59:00 +02:00
Cohee
a771dd5478 Show reasoning editor when hidden and empty 2025-02-16 23:21:08 +02:00
Cohee
baa4632071 Merge branch 'staging' into reasoning-parsing-streaming 2025-02-16 23:16:04 +02:00
Cohee
ebe877e6b6 Update dompurify 2025-02-16 23:14:50 +02:00
Cohee
1156b648eb Merge branch 'staging' into reasoning-parsing-streaming 2025-02-16 23:12:41 +02:00
Cohee
ec49b19aff Fix chat render when OpenRouter "website setting" model used 2025-02-16 22:46:44 +02:00
Cohee
75aec77271 Merge pull request #3493 from SillyTavern/staging
Staging
2025-02-16 21:15:21 +02:00
Cohee
7348e0274d Bump package version 2025-02-16 21:00:25 +02:00
Cohee
362470da18 Plugins: Add auto-update functionality (#3487)
* Plugins: Add auto-update functionality

* Check if directory is a git repo

* Display message if any plugins were loaded
2025-02-16 20:55:53 +02:00
Cohee
4d323ec76f OpenRouter: Add new providers to the list
Closes #3491
2025-02-16 18:15:26 +02:00
Cohee
0039b48d1b Merge pull request #3490 from Dakraid/feature/safety_tolerance-falai
Set safety_tolerance for Flux on FAL
2025-02-16 17:45:13 +02:00
Kristan Schlikow
050e65861c Set safety_tolerance for Flux on FAL 2025-02-16 16:40:10 +01:00
Cohee
a434d217cc Fix input prompt title for creating a new Quick Reply Set 2025-02-16 16:25:08 +02:00
Yokayo
890d10d811 Work on tl 2025-02-16 18:43:57 +07:00
Cohee
1723ce0f22 Merge pull request #3482 from SillyTavern/fix-auto-expand-new-message-v2.1
Fix auto expand on thinking during new message (v2.1)
2025-02-16 12:46:03 +02:00
Wolfsblvt
b3688087d5 Save reasoning type with the message
- use mes extras property to save where the reasoning came from
- update it accordingly on streaming, slash commands and manual add
- Modify title tooltip on reasoning header to show the origin where it makes sense, providing the user with a little bit more orientation about the reasoning.
2025-02-16 05:05:48 +01:00
Wolfsblvt
bcea4248c4 Shouldn't parse reasoning if real reasoning there 2025-02-16 03:21:02 +01:00
Wolfsblvt
9590127bae Handle auto parsing reasoning during streaming
- Add function to handle auto parsing reasoning from the streamed message during streaming
- Only works when the reasoning prefix is EXACTLY at the beginning of the message
- Tried to keep this lightweight, no regex parsing, remembering the index, so it's simple string splicing
- Add utility function that trims a string only if `trim_spaces` is enabled
2025-02-16 03:09:20 +01:00
Wolfsblvt
eb6a158781 Fix resetting reasoning duration correctly 2025-02-16 02:09:33 +01:00
Cohee
cc369d25c5 Merge pull request #3477 from SillyTavern/tc-global-banlist
Text Completion: Add global banned strings list
2025-02-16 02:18:50 +02:00
Cohee
59928d37ff Add common togglable class for coloring buttons 2025-02-16 02:16:21 +02:00
Cohee
1f41124844 Remove pointless return 2025-02-16 02:13:08 +02:00
Cohee
3d492523e2 Merge branch 'staging' into tc-global-banlist 2025-02-16 01:12:23 +02:00
Cohee
fc488bd4fe Merge pull request #3481 from SillyTavern/cache-buster
Add cache buster middleware to clear browser cache on server restart
2025-02-16 01:11:54 +02:00
Cohee
fd38ca503a Evict cache per user agent 2025-02-15 23:05:08 +02:00
Cohee
9a15890745 Merge pull request #3480 from SillyTavern/fix-auto-expand-new-message
Fix auto expand on thinking during new message
2025-02-15 22:57:01 +02:00
Wolfsblvt
37d9d4c253 Make sure auto-expand doesn't conflict with hidden 2025-02-15 21:44:06 +01:00
Cohee
bae02a44ed Add cache buster middleware to clear browser cache on server restart 2025-02-15 12:56:43 +02:00
Cohee
23f0b6ed09 Add a blank line 2025-02-15 12:38:45 +02:00
Cohee
c87e203b4a Refactor banned strings kill switch functions into a single toggle function 2025-02-15 12:37:48 +02:00
Wolfsblvt
dd50f49176 Fix auto expand on thinking during new message 2025-02-15 10:23:36 +01:00
Cohee
c37c9051a6 Fix bug when only global bans are defined 2025-02-15 00:34:07 +02:00
Cohee
8a4cf86b65 Integrate killswitch into the block 2025-02-15 00:28:38 +02:00
Cohee
a2a15b9978 Merge branch 'Banned-Strings-Killswitch' into tc-global-banlist 2025-02-15 00:12:16 +02:00
Cohee
96d6a6df07 Merge pull request #3478 from Dakraid/feature/set-listen-ip
Feature: Allow user to configure an address to listen to
2025-02-15 00:02:15 +02:00
Cohee
dbbf069e85 Remove message redundancy 2025-02-14 23:53:31 +02:00
Cohee
d276d23310 Firefox: Clear cache on avatar upload 2025-02-14 23:20:33 +02:00
Cohee
c98d241f3c Refactor logAddress check 2025-02-14 23:09:36 +02:00
Kristan Schlikow
961a71877b Remove extra resolve for autorun 2025-02-14 22:02:16 +01:00
Kristan Schlikow
13e38c7c86 Add debug script in package.json 2025-02-14 21:13:17 +01:00
Cohee
61e056004a Safari: hide summary block arrow 2025-02-14 22:06:18 +02:00
Kristan Schlikow
b029ae98dc Fix default config for IPv6 2025-02-14 20:06:45 +01:00
Kristan Schlikow
f5bfbce0ad Group listenAddress for config 2025-02-14 20:04:23 +01:00
Kristan Schlikow
a4c124dff0 Remove dead code 2025-02-14 20:00:15 +01:00
Kristan Schlikow
2445b6d9dc Split up listen address configuration between IPv4 and IPv6 2025-02-14 19:58:59 +01:00
Kristan Schlikow
ad8f0f564f Use IP Regex package, update default 2025-02-14 19:06:07 +01:00
Cohee
c47d997a2d Merge pull request #3475 from SillyTavern/ollama-batch
Ollama: Add num_batch config value
2025-02-14 12:34:13 +02:00
Kristan Schlikow
dd55b2770a Address issues with IPv6 binding 2025-02-13 23:51:18 +01:00
Kristan Schlikow
83f74a5d22 Allow user to configure an address to listen to 2025-02-13 23:43:10 +01:00
Cohee
09aaa9181c Good night 'Black Magic Time' 2025-02-13 23:34:20 +02:00
Cohee
5477586ce4 Merge pull request #3476 from Dakraid/feature/fal-integration
Feature: FAL.AI Integration
2025-02-13 23:04:40 +02:00
Kristan Schlikow
76becb43ae Pass through errors coming from FAL to the user 2025-02-13 21:43:08 +01:00
Kristan Schlikow
b033b98532 Address issues raised in PR 2025-02-13 21:09:13 +01:00
Cohee
412d638e9e Text Completion: Add global banned strings list 2025-02-13 22:07:36 +02:00
Kristan Schlikow
6e0ed8552f Add support for FAL.AI as image gen provider 2025-02-13 19:34:34 +01:00
Cohee
dd7391caaf Ollama: Add num_batch config value 2025-02-13 20:17:33 +02:00
Cohee
f101dd571f Add deprecated warnings to f-localStorage 2025-02-13 20:00:47 +02:00
Cohee
1a52d3c293 Fix rendering of messages without extra object 2025-02-13 12:22:41 +00:00
Cohee
d6bf3439b4 Don't try to update reasoning for impersonation stream 2025-02-13 10:55:32 +00:00
Cohee
54a9e0afee Merge pull request #3470 from SillyTavern/o1-vision-support
Add o1 to vision-supported models
2025-02-13 09:48:32 +02:00
Wolfsblvt
5de2f8ea2d Add o1 to vision-supported models 2025-02-13 02:40:34 +01:00
Wolfsblvt
93f3334ad0 Make hidden reasoning blocks not toggleable 2025-02-12 22:38:26 +01:00
Cohee
25a2582d15 Merge pull request #3444 from SillyTavern/hidden-reasoning-tracking
Track reasoning duration for models with hidden reasoning
2025-02-12 23:26:47 +02:00
Cohee
d076a210a1 Bring f-localStorage back 2025-02-12 23:08:11 +02:00
Wolfsblvt
b5fc7d6d4d Add toggle for showing hidden reasoning 2025-02-12 22:04:48 +01:00
Wolfsblvt
a204325136 Merge pull request #3468 from Eradev/kr-i18n
Fix kr i18n
2025-02-12 20:22:02 +01:00
Eradev
0decd4d1b6 Fix kr i18n 2025-02-12 13:32:17 -05:00
Cohee
34db46d84b Merge branch 'staging' into hidden-reasoning-tracking 2025-02-12 20:00:52 +02:00
Wolfsblvt
c2377f0c13 Re-add reasoning placeholder check to prompt build
- Was removed because placeholder is not needed anymore. But for compatibility with old saved chats from staging that might have this, we should keep it for a while (or forever)
2025-02-12 18:43:05 +01:00
Cohee
829888bda7 AccountStorage: Fix migration logic 2025-02-12 12:00:31 +02:00
Cohee
43f524bb5f Merge pull request #3463 from SillyTavern/bogus-localstorage
Add settings.json-backed KV string storage
2025-02-12 11:55:59 +02:00
Cohee
34d17a4fcb Migrate QR editor preferences to accountStorage 2025-02-12 11:29:27 +02:00
Cohee
340c03cedf Make user input saving account-specific 2025-02-12 11:21:13 +02:00
Cohee
5085f6cdc9 Refactor AccountStorage to use private fields for state management 2025-02-12 10:58:36 +02:00
Cohee
798f8d92a3 Update saveSettings function to schedule another save when settings are not ready 2025-02-12 10:43:19 +02:00
Cohee
d4061cc139 Merge branch 'staging' into bogus-localstorage 2025-02-12 10:38:54 +02:00
Cohee
93b6612c75 Remove leftover event handler 2025-02-12 10:36:25 +02:00
Wolfsblvt
48dfee39ae Switched even more to "generating" CSS 2025-02-12 00:22:22 +01:00
Wolfsblvt
6c0ea67d3d Show "Thinking..." while generation is happening
- Show thinking/thought for while generation is happening, even when hidden thinking
- Fix empty reasoning having toggle-able block
2025-02-12 00:00:22 +01:00
Wolfsblvt
58b8e7908d Add data attribute during generation
- Fix reasoning buttons still appearing
- Allow easier customization of HTML elements via CSS that appear during gen
2025-02-11 23:34:21 +01:00
Wolfsblvt
4e94e83540 Swiping doesn't need to reset reasoning UI 2025-02-11 23:15:49 +01:00
Cohee
d1018a824c Merge branch 'staging' into hidden-reasoning-tracking 2025-02-11 23:45:13 +02:00
Cohee
4c8ae0afd3 Merge pull request #3465 from SillyTavern/quiet-reasoning-parse
Remove reasoning from queit prompt results if auto-parse is enabled
2025-02-11 23:37:26 +02:00
Wolfsblvt
d9b2311e17 Allow editing/adding hidden reasoning blocks
- Fix cancel not cancelling correctly
- Allow editing/adding of hidden reasoning blocks
- Make style and tooltip to show on edit that hidden reasoning is present
- Update reasoning UI on edit cancel - to be sure
2025-02-11 22:17:40 +01:00
Wolfsblvt
21af0243d6 Rework reasoning CSS selectors and fixes
- Remove reliance on :empty state of reasoning textbox, now using the actual css class on mes (".mes.reasoning")
- Fix reasoning add not working when Auto-Expand is not enabled
- Clean setting of dataset attributes, now removing when null
2025-02-11 21:45:54 +01:00
Cohee
63e3816e92 Remove reasoning from queit prompt results if auto-parse is enabled
Fixes #3457
2025-02-11 22:35:56 +02:00
Wolfsblvt
d60609716b Yoink reasoning placeholder from being saved 2025-02-11 20:58:05 +01:00
Wolfsblvt
76bd2547e1 Attempt to fix wrong display behavior 2025-02-11 20:23:52 +01:00
Cohee
ee101353d8 Clear media alerts from storage on character deletion 2025-02-11 20:31:37 +02:00
Cohee
d5bdf1cb90 Add settings.json-backed KV string storage
Fixes #3461, #3443
2025-02-11 20:17:48 +02:00
Wolfsblvt
c8b103a9e8 Make "Thinking..." default to fix weird flicker 2025-02-11 18:41:44 +01:00
Cohee
c3dd3e246e DeepSeek: Add tool calling for -chat model 2025-02-11 00:04:40 +02:00
Cohee
47b06b4978 Fix empty lines in generation timer 2025-02-10 22:14:22 +02:00
Cohee
ad845b5fbf Merge branch 'staging' into hidden-reasoning-tracking 2025-02-10 21:49:11 +02:00
Cohee
c7958a4bb8 Merge pull request #3456 from SillyTavern/mobile-prompt-itemization
Allow mobile to access the "Raw Prompt" in Prompt Itemization
2025-02-10 21:41:47 +02:00
Wolfsblvt
aee8441fc4 Mobile prompt itemization - duh
- Make it into a popup. There is no space
2025-02-10 15:07:57 +01:00
Wolfsblvt
703e876f4a Fix and shorten isHiddenReasoningModel 2025-02-10 06:15:47 +01:00
Cohee
d4e77280fc Gemini: don't send "thinkingConfig" to backend
As it does absolutely nothing
2025-02-09 19:03:31 +02:00
Wolfsblvt
31f19d0d8a More fixes on reasoning
- Fix resetting reasoning on swipes
- Fix not updating reasoning time/end on gen when trim spaces was enabled
- Fix hidden model checking not working
2025-02-09 08:26:51 +01:00
Wolfsblvt
32ec475ca2 Merge pull request #3450 from subzero5544/top-k-fix
Fix top_k text value not being able to go up to 500, like the slider does
2025-02-09 08:24:05 +01:00
subzero5544
e8d8cebd8e Update index.html 2025-02-09 00:37:39 -06:00
Wolfsblvt
d48db9aded Update hidden reasoning model function
- Now more flexibly supports different API providers, and uses direct model names
- Fixes hidden reasoning time for OpenRouter and custom endpoints
2025-02-09 06:27:04 +01:00
Wolfsblvt
33fa5aaab8 Merge branch 'staging' into hidden-reasoning-tracking 2025-02-09 06:03:32 +01:00
Wolfsblvt
c501673241 Small improvements to reasoning UI 2025-02-09 06:03:23 +01:00
Wolfsblvt
0792c17f55 Update reasoning CSS hide hidden reasoning again 2025-02-09 05:25:43 +01:00
Wolfsblvt
9697322f1e More coding on ReasoningHandler, fixing stuff 2025-02-09 05:17:56 +01:00
Wolfsblvt
d8eeab0c00 Refactoring StreamProcessor -> ReasoningHandler 2025-02-09 01:26:01 +01:00
Cohee
b2bd73fa78 Merge pull request #3448 from SillyTavern/compact-reasoning-settings
Update layout of Reasoning settings block
2025-02-08 23:15:35 +02:00
Cohee
6e4a51b37f Update i18n 2025-02-08 23:15:11 +02:00
Wolfsblvt
8b4414b799 Add thinking time to gen timer tooltip 2025-02-08 21:58:55 +01:00
Cohee
a2cfcd4ca6 feat: Delete image swipes at once or one by one 2025-02-08 22:55:38 +02:00
Cohee
0bf18e7413 Add debug result console logs for websearch APIs 2025-02-08 22:29:24 +02:00
Cohee
5e540f4f97 Websearch: add Serper API endpoint 2025-02-08 22:28:12 +02:00
Cohee
f83dccda39 Mark 'Extras' option as deprecated in built-in extensions 2025-02-08 21:56:54 +02:00
Cohee
98ea463e0e Update layout of Reasoning settings block 2025-02-08 21:18:46 +02:00
Cohee
d5959a4681 Add awaits to event emissions 2025-02-08 19:13:05 +02:00
Cohee
c886de5deb Move isHiddenReasoningModel 2025-02-08 18:17:38 +02:00
Wolfsblvt
c8e05a34d6 Add gemini pro to hidden thinking models 2025-02-08 01:48:14 +01:00
Wolfsblvt
d94ac48b65 Add thinking time for hidden reasoning models
- Streamline reasoning UI update functionality
- Add helper function to identify hidden reasoning models
- Fix/update reasoning time calculation to actually utilize start gen time
- Fix reasoning UI update on swipe
- add CSS class for hidden reasoning blocks (to make it possible to hide for users)
2025-02-08 00:45:33 +01:00
Cohee
5886bb6b3a Merge pull request #3442 from SillyTavern/more-reasoning-ui
Smaller improvements and fixes to the reasoning UI
2025-02-07 23:55:18 +02:00
Cohee
8387431534 Revert "Unify reasoning request effect on parsing"
This reverts commit ca7d2aeec3.
2025-02-07 23:46:38 +02:00
Cohee
754a14ff3e Add types for dompurify 2025-02-07 23:45:57 +02:00
Cohee
ca7d2aeec3 Unify reasoning request effect on parsing 2025-02-07 23:35:07 +02:00
Cohee
28ba262087 Reduce "few seconds" threshold to 3 2025-02-07 23:33:10 +02:00
Wolfsblvt
23d2c40e05 Remove not needed reasoning ui event handler 2025-02-07 22:21:01 +01:00
Wolfsblvt
4094887624 Add jsdoc 2025-02-07 21:46:41 +01:00
Cohee
4492828b9f Merge pull request #3441 from SillyTavern/gpt-o1-o3-streaming
Enable streaming for gpt-o1 and gpt-o3
2025-02-07 22:05:29 +02:00
Cohee
a2aef5ea4a Use array.includes 2025-02-07 22:04:21 +02:00
Wolfsblvt
cc401b2c9d Whelp, seems like o1 main still no streaming 2025-02-07 20:12:10 +01:00
Wolfsblvt
95a31cdd98 Remove logit bias from o1 and o3
- They do not be supporting it anymore
2025-02-07 19:51:21 +01:00
Wolfsblvt
d1ec9eb8ab Enabled streaming for o1 and o3
- They do be supporting it now
2025-02-07 19:50:01 +01:00
Cohee
0bcf8b5d21 Merge pull request #3439 from sirius422/fix-old-gemini-models
fix: adjust safetySettings handling for legacy Gemini models
2025-02-07 13:54:59 +02:00
sirius422
f32938981c fix: adjust safetySettings handling for legacy and experimental Gemini models
- gemini-1.5-flash-8b-exp-0827
- gemini-1.5-flash-8b-exp-0924
- gemini-pro
- gemini-1.0-pro
2025-02-07 16:35:44 +08:00
Wolfsblvt
25d1db3852 Fix issues with reasoning add/delete 2025-02-06 22:39:29 +01:00
Cohee
9d3ad0d69d Update bug-report.yml 2025-02-06 23:21:29 +02:00
Wolfsblvt
3ec3d71c5f Reduced round corners on thinking, make ppl happy 2025-02-06 22:17:21 +01:00
Wolfsblvt
79b8229b1b Add reasoning time seconds tooltip 2025-02-06 21:53:34 +01:00
Wolfsblvt
06303bb62f Move reasoning stuff to reasoning.js 2025-02-06 21:50:33 +01:00
Cohee
1acee3d4c9 Gemini: Add sysprompt for gemini 2.0 pro/flash 2025-02-06 21:46:17 +02:00
Wolfsblvt
b6d6727135 Merge pull request #3434 from sirius422/add-gemini-models
Add new gemini models and update the safety settings
2025-02-06 20:33:54 +01:00
Wolfsblvt
92a83ed01b Merge branch 'staging' into pr/3434 2025-02-06 20:18:25 +01:00
Wolfsblvt
f85e464ffd Merge pull request #3437 from SillyTavern/gemini-models
Add new gemini models
2025-02-05 23:32:39 +01:00
Wolfsblvt
852ec86e26 Add new gemini models
- Gemini 2.0 Flash
- Gemini 2.0 Flash Lite Preview
- Gemini 2.0 Pro Experimental
2025-02-05 23:30:11 +01:00
Wolfsblvt
72ae3aa33d Just some css classes for WI entries 2025-02-05 23:15:30 +01:00
sirius422
d35bd3b073 feat: update Gemini safety settings
- Set threshold to OFF for most models, except for HARM_CATEGORY_CIVIC_INTEGRITY.
- Handle specific cases for a few models.
2025-02-06 04:59:30 +08:00
sirius422
b074f9fa89 feat: update Gemini models
- Add new Gemini models (2025/02/05)
2025-02-06 04:50:54 +08:00
Cohee
ed46b96ba2 Fix reasoning-get with no argument 2025-02-04 23:41:16 +02:00
Cohee
acf71fd702 Merge pull request #3431 from SillyTavern/ipv6_auto
Better IPv6 support
2025-02-04 23:23:02 +02:00
Cohee
5f564343ec Remove console log 2025-02-04 23:14:01 +02:00
Cohee
dfb062af41 Clean-uo blank lines 2025-02-04 22:52:07 +02:00
Cohee
d9bb5e6b1f Revert old default values 2025-02-04 22:46:24 +02:00
Cohee
363d8a4121 Merge branch 'staging' into ipv6_auto 2025-02-04 22:45:46 +02:00
Cohee
d9fc76f336 Merge pull request #3430 from qvink/generate_before_combine_prompts_await
await GENERATE_BEFORE_COMBINE_PROMPTS
2025-02-04 21:45:59 +02:00
qvink
e2c3af2114 Changing the event GENERATE_BEFORE_COMBINE_PROMPTS to an await emit() instead of emitAndWait(). 2025-02-04 11:22:23 -07:00
Cohee
7aa9b857c2 Merge pull request #3423 from SillyTavern/wi-dry-run-delays
WI dry run checks delay + logging
2025-02-04 17:44:28 +02:00
Cohee
327f4b1074 ditto 2025-02-04 10:56:42 +02:00
Cohee
4a58948b27 fix: correct typo in log message 2025-02-04 10:54:27 +02:00
Cohee
1f206c3a36 Merge pull request #3425 from Tosd0/staging
Optimize zh-CN Translations
2025-02-04 10:53:43 +02:00
Cohee
c9144cd824 Merge pull request #3424 from SillyTavern/oai-reasoning-effort
OpenAI "Reasoning Effort" for o1/o3-mini + oai models restructured
2025-02-04 10:52:30 +02:00
Cohee
dd2154c19b Refactor reasoning effort handling for OpenAI models in chat completions 2025-02-04 10:50:58 +02:00
Cohee
dade4eafa5 Add reasoning_effort to Custom.
Update inline image quality style
2025-02-04 10:45:51 +02:00
Cohee
4f63b471d1 Save reasoning effort to preset 2025-02-04 10:28:04 +02:00
Cohee
16bb9b3679 Update models list
1. Moderation can't be prompted from /chat/completions
2. Move turbo base model on top of the group
2025-02-04 10:23:25 +02:00
Cohee
6ececb2ceb Fix text display on stream abort 2025-02-04 10:16:26 +02:00
Sevenyine
6edbb23903 update 2025-02-04 12:34:33 +08:00
Sevenyine
50baaaae81 Optimize Translations 2025-02-04 11:36:03 +08:00
Wolfsblvt
da531f12c2 Fix reasoning error on empty chat 2025-02-04 00:20:17 +01:00
Wolfsblvt
ba0e852f20 Add o1 + update fill openai model list 2025-02-04 00:11:56 +01:00
Wolfsblvt
d0ebac37c1 Make the backend actually send reasoning_effort 2025-02-03 23:58:01 +01:00
Wolfsblvt
3f9af45493 Add reasoning_effort for OpenAI models 2025-02-03 23:29:53 +01:00
Wolfsblvt
fd3c427f07 WI dry run checks delay
- WI dry run now also checks for delays
- Better visibility of what a dry run is in the logs
2025-02-03 22:12:35 +01:00
Cohee
524ecf8acd Merge pull request #3418 from pcpthm/fix-reasoning-duplicated
Fix reasoning is duplicated when a continue generation is interrupted
2025-02-03 16:44:08 +02:00
pcpthm
c4be4d7d61 Fix reasoning duplicated when continue is interrupted 2025-02-03 21:07:49 +09:00
Cohee
89a16f2030 Merge pull request #3415 from dvejmz/bugfix/fix-o3-mini-selector-labels 2025-02-03 00:47:23 +02:00
David Jimenez
1dfc09e4d2 fix: add missing o3-mini labels to model selector 2025-02-02 21:38:44 +00:00
Cohee
bfd57b66ef [wip] OpenRouter: Add model providers endpoint 2025-02-02 23:30:44 +02:00
Cohee
71e1fc91f1 select2: Add disabled option styling 2025-02-02 23:30:11 +02:00
Cohee
14703846a7 OpenAI: add options for o3-mini 2025-02-02 22:21:21 +02:00
Cohee
5494e89fdb Merge pull request #3413 from SillyTavern/thinking-is-stylish
Thinking is stylish - if you are not cool, I don't know how to help you
2025-02-02 21:46:23 +02:00
Cohee
4ca55d3b9b Revert edit buttons units 2025-02-02 20:55:03 +02:00
Cohee
5aa82eda2b Add missed power_user setting 2025-02-02 20:53:55 +02:00
Cohee
d9f2ee0d48 Localize reasoning duration string 2025-02-02 18:51:55 +02:00
Cohee
ff83ae975d Add toggle for reasoning auto-expand 2025-02-02 18:42:12 +02:00
Cohee
02130b848c Increase left reasoning padding 2025-02-02 18:05:28 +02:00
Cohee
900c0caffa Fix class set condition 2025-02-02 18:02:23 +02:00
Cohee
4e74fd0467 Align ch_name row 2025-02-02 16:51:17 +02:00
Cohee
6fe26f7f77 Fix reasoning editor duplication 2025-02-02 16:40:45 +02:00
Cohee
fb83a3ca3f Position absolute for arrow 2025-02-02 16:26:26 +02:00
Cohee
14c3dae180 Hide reasoning edit buttons if both edits are open. 2025-02-02 16:13:08 +02:00
Cohee
50869757d3 1. Update spacing units to em
2. Hide reasoning icon by default
3. Make arrow scaleable
2025-02-02 16:09:39 +02:00
Cohee
aecbc48d43 Merge pull request #3410 from bmen25124/export_some_world_methods
New exported methods: loadWorldInfo(), saveWorldInfo(), updateWorldIn…
2025-02-02 15:44:55 +02:00
Cohee
0c8a11e28b Further loglevel updates
1. Fix missed endpoints
2. Exclude console.log from loglevel
2025-02-02 15:40:37 +02:00
Wolfsblvt
ffeb6b45aa Make thonking block font size scaling 2025-02-02 14:36:27 +01:00
Cohee
76d1661768 Merge pull request #3307 from Eradev/staging-3071-v2
Added option to disable the chat logs in terminal v2
2025-02-02 15:30:30 +02:00
Wolfsblvt
a14e3b0657 Improve reasoning block inline editing 2025-02-02 12:58:01 +01:00
Wolfsblvt
2d335e27ff Modify when "Add reasoning" button shows up 2025-02-02 12:21:14 +01:00
Wolfsblvt
8fb95f9a84 Reasoning inline edit improvements + style 2025-02-02 10:37:21 +01:00
Eradev
a5399b6614 Sparser use of .error 2025-02-02 03:47:04 -05:00
Wolfsblvt
199be15f4b Allow Ctrl+Enter on reasoning edit 2025-02-02 09:11:54 +01:00
Eradev
055a6527fc PR fixes 2025-02-02 03:10:32 -05:00
Eradev
842b59605b Merge branch 'staging' into staging-3071-v2 2025-02-02 02:44:21 -05:00
Wolfsblvt
3818290e4d Add reasoning time duration
- Add reasoning time calculation, saved in message metadata
- Add event when reasoning streaming is finished
2025-02-02 07:32:45 +01:00
RossAscends
c5dad20fc4 add killswitch for banned strings 2025-02-02 12:00:01 +09:00
Wolfsblvt
e5e931356b Remove forceEnum from char args in slash commands
- This precented people from actually using the characterKey inside the chatbox to go to a character
2025-02-02 03:43:20 +01:00
Wolfsblvt
e7c799ae2a Cooler styling for reasoning blocks 2025-02-02 03:21:52 +01:00
Cohee
6deaa31d41 Move typing indicator to an extension
https://github.com/SillyTavern/Extension-TypingIndicator
2025-02-02 03:54:14 +02:00
Cohee
1f0aa29307 Merge pull request #3408 from conornash/update_groq_models_20250201
Update Groq models
2025-02-02 02:33:00 +02:00
Conor Nash
eeaec2697b Update context lengths and remove guard model 2025-02-01 23:54:14 +00:00
bmen25124
630c7980d3 New exported methods: loadWorldInfo(), saveWorldInfo(), updateWorldInfoList(), convertCharacterBook() 2025-02-02 02:39:12 +03:00
Cohee
890c0c4723 Merge pull request #3409 from Succubyss/member-get
Adds /member-get via enhancing findGroupMemberId
2025-02-02 00:59:03 +02:00
Cohee
9c31c21d79 Use SlashCommandEnumValue 2025-02-02 00:47:12 +02:00
Wolfsblvt
1ea2134936 Add title tooltip to expression sprites
Closes #2596
2025-02-01 23:43:45 +01:00
Succubyss
b35a746470 /member-get tweaks 2025-02-01 15:50:34 -06:00
Succubyss
d26f99b496 full = false to prevent IDE complaints
Co-authored-by: Wolfsblvt <wolfsblvt@gmail.com>
2025-02-01 15:44:14 -06:00
Succubyss
a1abe14e02 add /member-get 2025-02-01 14:44:09 -06:00
Succubyss
ae9296f989 /peek→/member-peek (with /peek alias) 2025-02-01 14:43:08 -06:00
Succubyss
ea1d9e1d1a corrections to /member-* warnings 2025-02-01 14:41:02 -06:00
Succubyss
b8821acb95 add 'full' parameter to findGroupMemberId 2025-02-01 14:37:41 -06:00
Conor Nash
c11e64a782 Update Groq models 2025-02-01 18:26:49 +00:00
Cohee
cc7355358d Fix undefined reasoning append on continue 2025-02-01 19:06:39 +02:00
Cohee
d2cc8b36b8 Fix cfgMessage handling 2025-02-01 16:01:04 +02:00
Cohee
3fe3430006 Fix undefined array access for CFG prompt 2025-02-01 15:36:04 +02:00
Wolfsblvt
fb2ee756dd Update and fix default expressions + emojis
- Move "use default emojis" from its own toggle into the fallback dropdown
- Add "no fallback" to the fallback dropdown
- fix fallback expressions not being consistently used
- Switching fallback will now reroll/reset the relevant expression
- Add html attributes on the expression image
2025-02-01 07:52:04 +01:00
Wolfsblvt
25ffc4ac4a Merge branch 'staging' into support-multiple-expressions 2025-02-01 04:47:48 +01:00
Wolfsblvt
5c30244627 Fix visual novel mode for new expression thingy 2025-02-01 04:46:30 +01:00
Cohee
72e1dcb3f9 Add categories parameter to /searxng endpoint 2025-02-01 03:32:10 +02:00
Cohee
a2a6afb731 Tavily: allow requesting images 2025-02-01 02:23:10 +02:00
Cohee
e59114c1c5 Another crack at o3 2025-01-31 23:14:41 +02:00
Cohee
6180210170 Future-proofing 2025-01-31 22:48:04 +02:00
Cohee
2b98e96784 Don't send max_tokens to o3 2025-01-31 22:47:00 +02:00
Cohee
364078ce27 /del is fine too 2025-01-31 22:36:18 +02:00
Cohee
fda64ffb1f Alias /del to /delete 2025-01-31 22:30:58 +02:00
Cohee
5257a45bde Allow removing group members while generating
Fixes #3389
2025-01-31 22:10:36 +02:00
Cohee
9a03aac224 Allow sending empty messages with /sendas, /sys, etc. 2025-01-31 22:03:09 +02:00
Cohee
f155cc7e92 Merge pull request #3377 from Succubyss/fnr
Adds /replace
2025-01-31 21:13:06 +02:00
Cohee
cee7170763 Merge branch 'staging' into fnr 2025-01-31 21:09:33 +02:00
Cohee
a969d34c03 Merge pull request #3396 from pcpthm/text-completion-include-reasoning
Support reasoning for OpenRouter Text Completion
2025-01-31 21:04:30 +02:00
Cohee
515a5f6943 Exclude 'include_reasoning' from TC presets 2025-01-31 20:43:20 +02:00
Cohee
47bb7ad6a1 Fix /bglock command 2025-01-31 20:37:11 +02:00
Cohee
7d937b36da Merge branch 'staging' into text-completion-include-reasoning 2025-01-31 20:33:02 +02:00
Cohee
9243a68b18 Merge pull request #3395 from pcpthm/reasoning-continue
Always add reasoning for continue
2025-01-31 20:32:14 +02:00
Succubyss
371208c24d add /replace command 2025-01-31 11:08:53 -06:00
Cohee
26030f6ee4 Fix comfy request abort 2025-01-31 16:15:07 +00:00
Cohee
5bd3d9a518 Merge branch 'staging' into reasoning-continue 2025-01-31 13:51:09 +00:00
Cohee
9710d88a88 Stop smooth streaming immediately on abort 2025-01-31 13:38:23 +00:00
pcpthm
a83e7318b0 Make "request model reasoning" default true 2025-01-31 22:38:11 +09:00
Cohee
ae376b4195 Add aliases for reasoning commands 2025-01-31 13:30:57 +00:00
Cohee
f7eab66026 Fix streaming start appending undefined to reasoning block 2025-01-31 13:30:10 +00:00
pcpthm
9de142b9ad Fix MakerSuit show reasoning 2025-01-31 22:23:59 +09:00
Cohee
67a4d10b75 Fix substituting macros in reasoning of a first message 2025-01-31 13:23:22 +00:00
Cohee
56c9b21a28 Merge pull request #3397 from pcpthm/openrouter-providers
Add new OpenRouter providers
2025-01-31 14:57:12 +02:00
pcpthm
94af9fc1a3 Add new OpenRouter providers 2025-01-31 21:49:49 +09:00
Cohee
4bf3bd8343 Fix /lockbg and /unlockbg commands 2025-01-31 12:45:08 +00:00
pcpthm
753a99faf9 Support reasoning for OpenRouter text completion 2025-01-31 21:41:56 +09:00
pcpthm
9ecf261a76 Always add reasoning for continue 2025-01-31 21:06:15 +09:00
Cohee
dfc2eb32c8 Merge pull request #3386 from SillyTavern/reasoning-parse
Reasoning blocks auto-parsing
2025-01-31 11:41:10 +02:00
Cohee
2a904c4aea Fix command argument definitions 2025-01-31 09:39:26 +00:00
Wolfsblvt
2a322faa6a Toast on /qr-get if no label and id are provided 2025-01-30 22:51:40 +01:00
Cohee
e4dda3c488 Run eslint 2025-01-30 22:00:46 +02:00
Cohee
07ef5122bb Add fallback timeout to runAfterAnimation 2025-01-30 22:00:30 +02:00
IceFog72
578c3dda73 Update loader being removed correctly on manually forced transition duration (#3384)
---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2025-01-30 21:59:59 +02:00
Cohee
0c121ee95a Clarify think toggle label 2025-01-30 21:40:22 +02:00
Cohee
3a6d5faa8a Merge branch 'release' into staging 2025-01-30 21:06:40 +02:00
Cohee
44343e8ec9 Merge pull request #3392 from erew123/release
fix: resolve URL duplication in AllTalk TTS audio output on V1 AllTalk
2025-01-30 21:06:07 +02:00
erew123
198fbe1a1f Set RVC version match correctly 2025-01-30 17:41:24 +00:00
erew123
2318df8b74 alltalk.js resolve V1 URL duplication in AllTalk TTS audio output
Fix URL concatenation issue where base URL was being duplicated in audio file paths. 

Updated handling of V1 (full URL) and V2 (relative path) API response formats to prevent `http://localhost:7851http://127.0.0.1:7851` type errors.
2025-01-30 17:21:41 +00:00
Wolfsblvt
198d10e759 Allow setting specific sprites as expressions
- Update /expression-set command to allow setting specific sprites
- Enhance enum completion for /expression-set to show expressions/sprites and more their info
- Fix setting sprite folder reprinting stuff double
- Fix not being able to unset expressions
2025-01-30 02:42:05 +01:00
Wolfsblvt
73393a5d5e yoink talkinghead - goodbye extras dependency 2025-01-30 01:44:27 +01:00
Cohee
cbeb7ddcec Update persona upload methods to fetch 2025-01-30 02:30:51 +02:00
Wolfsblvt
3d817352ec Add rename personas functionality 2025-01-30 01:17:43 +01:00
Cohee
1df209c284 Export variable manipulation functions to getContext 2025-01-30 01:58:55 +02:00
Wolfsblvt
f9324c74cd Streamline persona toasts, infos and states
- Added "info" block to persona description panel to show when a temporary persona is in use. Hide the long text behind a tooltip
- Reduce toast spam even further, not showing toasts when persona panel is open
- Restyle connection state buttons a bit
- Designed common 'info-block' utility to show markdown-like info blocks, with CSS styling
2025-01-30 00:50:48 +01:00
Cohee
80b29ed5cb Use string constructor 2025-01-30 01:04:53 +02:00
Cohee
4b2575f301 Apply regex to parsed reasoning 2025-01-30 01:02:23 +02:00
Cohee
4e7326b61b Add /reasoning-parse command 2025-01-30 01:02:14 +02:00
Cohee
e3f0a8d35b TC: Trim spaces in server URLs 2025-01-30 00:25:02 +02:00
Wolfsblvt
e5db40cf2d Add persona connection states to persona list
- Show persona connection/lock states in persona list (chat & char lock)
- Refactor persona images url to 'data-avatar-id' attribute
- Try make persona blocks' height consistent
- Fix persona list not correctly updating selected persona on navigating pages
- Fix group/char difference not correctly working
- Create common style template for hover-able images buttons/tags where the label only appears on hover
2025-01-29 22:54:22 +01:00
Cohee
a1cacbe904 Merge pull request #3388 from SillyTavern/autoswipe-fix
Autoswipe: Fix endless loop if blacklist empty
2025-01-29 23:22:13 +02:00
Cohee
c32e0bdde7 Autoswipe: Fix endless loop if blacklist empty 2025-01-29 23:01:37 +02:00
Cohee
7bc8087d02 Use separate flag for replacement checks 2025-01-29 21:59:13 +02:00
Cohee
91b2dc57fa Brighter warning for trim spaces disabled 2025-01-29 21:57:27 +02:00
Cohee
7fc0ddb60c Trim spaces in parsed content too 2025-01-29 21:53:48 +02:00
Cohee
d0abba23dc Add reasoning auto-parsing, always show reasoning prefix/suffix in Markdown, respect space trim preference 2025-01-29 21:38:08 +02:00
Cohee
15a3cfcb8a Perplexity: Add reasoning model, remove deprecated models 2025-01-29 20:57:38 +02:00
Cohee
ee57675c12 Merge pull request #3370 from SillyTavern/reasoning-regex
Add regex processing for reasoning blocks
2025-01-29 15:09:55 +02:00
Cohee
249e2555d0 Merge pull request #3378 from BooleanWhale/patch-1
Sets italics inside quotes to parent color.
2025-01-29 11:40:49 +02:00
Cohee
a6a7810be2 Regex: fix "Alter Outgoing Prompt" applying when unchecked (#3380)
* Regex: rework ephemerality options.

* Fix ephemeral regex being executed when unwanted

* Revert to old code style
2025-01-29 11:39:32 +02:00
Cohee
9e8fd3f5a0 Merge pull request #3382 from SillyTavern/staging
Staging into reasoning-regex
2025-01-29 11:38:50 +02:00
Cohee
cd05650164 Merge pull request #3379 from Finadil/staging
Fix /note-role argument name
2025-01-29 01:09:36 +02:00
Finadil
d5f6ecf3c3 Fix /note-role argument name
I am full of shame. 🫢
2025-01-28 18:03:01 -05:00
Ashley Saleem-west
7f321c9cf6 Merge branch 'staging' into patch-1 2025-01-28 22:50:49 +00:00
Cohee
4f456b2b80 TTS: Call module worker when audio stops playing
#3371
2025-01-28 23:14:26 +02:00
Cohee
6dde068e71 Merge pull request #3371 from fearmear/release
Decrease TTS generation delay by splitting a message on a new line
2025-01-28 23:10:12 +02:00
Cohee
2aa1dd41f5 eslint 2025-01-28 23:07:59 +02:00
Cohee
26feb448a3 Merge pull request #3368 from SillyTavern/profile-stopstrings
Add command and profile for custom stop strings
2025-01-28 23:03:09 +02:00
Cohee
0c9676e7fc /stop-strings: add aliases 2025-01-28 23:01:58 +02:00
Cohee
bab8a09a80 /stop-strings: update help 2025-01-28 23:00:28 +02:00
Ashley Saleem-west
b0e80137da Sets italics inside quotes to parent color. 2025-01-28 20:58:26 +00:00
Wolfsblvt
2344d98e20 Move persona buttons to right panel
- Move all buttons from the persona list to the right panel, to the already existing ones
- Common CSS class/style for '.buttons_block'
- Common CSS style for a red button
- Refactored a few persona buttons' functionalities
2025-01-28 20:53:55 +01:00
Cohee
35e8561bff /reasoning-set: fix at argument 2025-01-28 21:03:44 +02:00
Wolfsblvt
6081b9f0ce Merge branch 'staging' into persona-improvements 2025-01-28 18:57:20 +01:00
Eradev
552a418bae Merge branch 'staging' into staging-3071-v2 2025-01-28 10:49:53 -05:00
Cohee
0c9b301a57 Prevent ephemeral message extra changes vanish upon swiping 2025-01-28 15:39:09 +00:00
Cohee
3a8a329b0f Merge pull request #3373 from braxton-p/fix-newlines-skip_tags-regex
Fix tts.skip_tags's regex to match newlines
2025-01-28 09:50:51 +02:00
Dzmitry Kazlouski
63e7acb87b Make this feature togglable in extensions > "Narrate by paragraphs (when not streaming)" 2025-01-28 05:50:25 +03:00
Small Eggs
145136059e Fix tts.skip_tags's regex to match newlines
The extension_settings.tts.skip_tags setting is meant to skip sending
tags and their content to the TTS API provider. The original regular
expression matched content inside tags with ".*?". Unfortunately,
Javascript's engine does *not* match newlines on the "." without the /s
flag.

The /s flag was added in ES2018. To be more compatible, the regex
has been changed to "[\s\S]+?". This gives similar performance (instead
of using capture groups) and matches all content within a tag, as the
original regex intended.
2025-01-27 17:43:24 -08:00
Dzmitry Kazlouski
283ceb6bbf Decrease TTS generation delay by splitting a message on a new line 2025-01-28 02:51:05 +03:00
Wolfsblvt
6348d1f19a CSS fixes (hide overflow, sprites interactable) 2025-01-28 00:17:42 +01:00
Wolfsblvt
d316d51c0b Rework expression slash commands
- Common naming schema for slash commands, all starting with the name of the expression - moved the original names to aliases
- Make char name optional for /expression-last if not in group chat
- Removed legacy 'format' argument handling from /expression-classify
- Fixed /expression-upload to the new backend call, added optional 'spriteName' argument
2025-01-27 23:48:37 +01:00
Cohee
d616dfef38 Prevent log warning spam 2025-01-28 00:03:38 +02:00
Wolfsblvt
84a8a2bc2b Fix expression sprite sorting, fade additional
- Sort alphabetically, but keep the main expression file first
- Fade additional sprite images if "allow multiple" is not chosen
2025-01-27 23:01:29 +01:00
Cohee
0fb9884ab8 Skill issue 2025-01-27 23:59:25 +02:00
Cohee
0a413d63aa Add reasoning regex on edit 2025-01-27 23:11:31 +02:00
Wolfsblvt
7063af7363 Move new expression settings, add tooltip 2025-01-27 22:10:31 +01:00
Cohee
6fc342d446 Add regex processing for reasoning blocks 2025-01-27 23:06:07 +02:00
Wolfsblvt
3d6f48786d Refactor expression popups to modern popup 2025-01-27 21:57:40 +01:00
Wolfsblvt
65ad79adce Fix expression delete 2025-01-27 21:50:13 +01:00
Cohee
fad4e4e75e Add command and profile for custom stop strings 2025-01-27 22:30:35 +02:00
Cohee
3b8fd6f62f Merge pull request #3345 from SillyTavern/woo-yeah
Better reasoning
2025-01-27 22:09:32 +02:00
Cohee
abe240397d Set assistant role to bias in CC
#3366
2025-01-27 22:01:44 +02:00
Cohee
8b5e0df2d7 Refactor reasoning placeholder clean-up 2025-01-27 21:56:15 +02:00
Cohee
2b919d0cf2 Merge pull request #3367 from witten/patch-1
Update docker command in README to actually run the container
2025-01-27 21:39:43 +02:00
Dan Helfman
a03193b2f7 Change docker create to run so it actually runs the container. 2025-01-27 11:08:08 -08:00
Cohee
a5a8f6057b Merge branch 'staging' into woo-yeah 2025-01-27 20:56:04 +02:00
Cohee
fd1fdc6466 Fix fitting class resetting after picking BG 2025-01-27 17:48:50 +00:00
Wolfsblvt
ef127df623 Update sprite delete call 2025-01-27 08:33:14 +01:00
Wolfsblvt
3282c9426c Upload expressions update 2025-01-27 05:39:51 +01:00
Wolfsblvt
5c34c93a84 Merge branch 'staging' into support-multiple-expressions 2025-01-26 23:11:37 +01:00
Wolfsblvt
239c3f1db7 Add settings for multiple expressions 2025-01-26 23:11:22 +01:00
Wolfsblvt
913509f887 Don't look at this 2025-01-26 22:27:59 +01:00
Wolfsblvt
1f116d9afe Reduce persona toast spam 2025-01-26 22:13:32 +01:00
Wolfsblvt
2cfb9e8dab Fix lock icon state on auto-lock to chat 2025-01-26 20:50:10 +01:00
Cohee
8448d6c6e6 Merge branch 'staging' into persona-improvements 2025-01-26 21:18:51 +02:00
Cohee
9f54adbeb4 Comment dupe default persona button 2025-01-26 21:18:38 +02:00
Cohee
6d43eea1bd Merge pull request #3361 from SillyTavern/write-fallback-img
Use default avatar if imported image is corrupted
2025-01-26 20:36:14 +02:00
Cohee
312969462e Fix AICC website reference 2025-01-26 20:35:24 +02:00
Cohee
999da4945a Fix error log 2025-01-26 20:29:04 +02:00
Cohee
bf294aa684 Merge pull request #3360 from SillyTavern/group-member-version
Add char version to group panel member names
2025-01-26 20:22:27 +02:00
Cohee
a58476d079 Clip long version strings 2025-01-26 20:15:32 +02:00
Wolfsblvt
adede8b6be Roll on the sprite to use for an expression 2025-01-26 19:12:37 +01:00
Cohee
65e32f720d Use default avatar if imported image is corrupted 2025-01-26 19:58:37 +02:00
Wolfsblvt
35ab677ff1 Add char version to group panel member names
- Follows the same style as version in char list
- Respects the chosen "auxiliary field" setting

Closes #3359
2025-01-26 18:44:12 +01:00
Cohee
bfedf20db5 Add reasoning tokens to token count. 2025-01-26 18:29:31 +02:00
Cohee
a7516937f7 Add reasoning slash commands 2025-01-26 18:00:14 +02:00
Cohee
a42337ad0a Use 'localhost' as a fallback for hostname 2025-01-26 16:50:59 +02:00
Cohee
c9ab987658 Fix default thonk separator 2025-01-26 16:48:04 +02:00
Cohee
eb798fa4f1 Move reasoning-specific code into its own module 2025-01-26 16:47:13 +02:00
Cohee
17d4175b47 Functional reasoning edit 2025-01-26 05:14:17 +02:00
Cohee
45d4d1bb3e [wip] Open reasoning editor 2025-01-26 02:49:10 +02:00
Cohee
8fc880b69b Early stopping if prompt reasoning limit reached 2025-01-26 02:07:50 +02:00
Cohee
30426d21e7 Merge branch 'staging' into woo-yeah 2025-01-26 01:57:36 +02:00
Cohee
9aac5a22f1 Defer middleware HTML file reads 2025-01-26 01:46:30 +02:00
Cohee
96143177ce Fix logit bias for DeepSeek on OpenRouter 2025-01-26 01:42:08 +02:00
Wolfsblvt
a072951102 Update backend returned sprites list 2025-01-26 00:15:46 +01:00
Cohee
c9a1a3eb94 Merge pull request #3351 from SillyTavern/csrf-sync
Replace CSRF middleware
2025-01-25 23:23:43 +02:00
Cohee
44ade6ad64 Customize CSRF token error message 2025-01-25 23:20:26 +02:00
Cohee
44ad69ceca Merge pull request #3342 from Spappz/staging
Allow customisation of the 403 page
2025-01-25 23:00:23 +02:00
Wolfsblvt
f78bf5e46f Add "StartDev.bat" placeholder to .gitignore 2025-01-25 21:45:55 +01:00
Cohee
94ed548353 Formatting setting to send reasoning back to the model
Supersedes #3352
2025-01-25 22:41:08 +02:00
Spappz
6099ffece1 No exceptions on missing error webpages
- Create a `safeReadFileSync()` function in `src/utils.js` to wrap around `fs.readFileSync()`
- Migrate error-webpage loads to use `safeReadFileSync()`, with default values of an empty string
- Move the 404 error middleware to explicitly only be called *after* extensions are registered
2025-01-25 20:29:31 +00:00
Cohee
347a515c25 Thonk yeet 2025-01-25 21:38:57 +02:00
Spappz
9e54070c1d Revert path/posix to path in post-install.js 2025-01-25 19:38:01 +00:00
Wolfsblvt
9a79c6b1a4 Remove all connections button for the popups 2025-01-25 19:54:45 +01:00
Wolfsblvt
3fc4207cdb Temporary persona toast respects setting 2025-01-25 19:27:29 +01:00
Wolfsblvt
ef73ab43da Fix "Default" persona connection tooltip 2025-01-25 19:25:42 +01:00
Wolfsblvt
2ff1957ca8 Consistent headers in persona panel 2025-01-25 19:24:40 +01:00
Wolfsblvt
0141a60eb8 Add hint on how to use persona connections 2025-01-25 19:20:21 +01:00
Wolfsblvt
2253990898 Highlight personas from current chat in popup 2025-01-25 18:47:53 +01:00
Wolfsblvt
076e5e3186 Fix temporary persona toast
- Temporary persona toast was appearing when auto-lock was enabled, which didn't make sense
2025-01-25 18:23:00 +01:00
Cohee
2d8da60ffc Fix types for session 2025-01-25 19:13:25 +02:00
Cohee
5ff402aabf Replace CSRF middleware
Closes #3349
2025-01-25 16:56:11 +02:00
Spappz
e07faea874 rework createDefaultFiles()
Reorganised copy-able `default/` files as a sparse copy of the production file-tree. This should save the `defaultItems` (formerly `files`) array from getting unwieldy.
2025-01-25 03:45:16 +00:00
Spappz
a5dc505e61 add 404 error-handling to server
This is all that seems necessary according to Express? Admittedly my first time using it.
https://expressjs.com/en/starter/faq.html#how-do-i-handle-404-responses
2025-01-25 03:42:04 +00:00
Spappz
538d66191e add 401 error page for basicAuth mode
Most modern browsers don't actually show users 401 responses, but it doesn't hurt to have it in there anyway ¯\_(ツ)_/¯
2025-01-25 03:40:47 +00:00
Spappz
928487985d defer 403 HTML to file 2025-01-25 03:38:52 +00:00
Wolfsblvt
e1bf781b10 Fix wrongly changed jQuery data "chid" attribute 2025-01-25 03:33:53 +01:00
Wolfsblvt
608e1c195b Add button to show connections for current char 2025-01-25 02:52:41 +01:00
Cohee
9d73189133 Add updateMessageBlock and appendMediaToMessage to getContext 2025-01-25 00:38:13 +02:00
Cohee
536d4218c2 Update button class 2025-01-25 00:33:07 +02:00
Cohee
e3885c2b5c Combine functions 2025-01-25 00:29:55 +02:00
Cohee
9250be348d Split if condition 2025-01-25 00:28:16 +02:00
Wolfsblvt
7c12a286c3 Fix one persona connected warning 2025-01-24 23:27:31 +01:00
Wolfsblvt
7454532641 Expand /persona-lock command for type
- Add new main alias for /lock, renamed to /persona-lock
- Allow no state to be provided to return the current lock state
- Deprecate the old usage of /lock without state, without breaking it
2025-01-24 23:24:35 +01:00
Cohee
8d35ca90e1 Decrease block size 2025-01-25 00:12:48 +02:00
Cohee
24c16f622f Update styles for mes_reasoning 2025-01-24 23:56:16 +02:00
Cohee
9a2968d1eb Merge branch 'staging' into woo-yeah 2025-01-24 23:50:15 +02:00
Cohee
0937f44f39 Validate avatar_url field with a middleware (#3314)
* Validate avatar_url field with a middleware

* Fix validating wrong endpoint
2025-01-24 23:47:32 +02:00
Wolfsblvt
91dabeff53 Add css class to allow multiple avatar lists 2025-01-24 21:57:47 +01:00
Wolfsblvt
7c9b347116 Refactor chid/grid attributes to data attributes
- We don't believe in imaginary HTML attributes that we make up, right?
2025-01-24 21:12:49 +01:00
Spappz
075368b5ae Ensure Handlebars template is only compiled once 2025-01-24 19:56:19 +00:00
Wolfsblvt
a611a3ac59 Merge branch 'staging' into persona-improvements 2025-01-24 20:42:04 +01:00
Spappz
90459116e3 woohoo 2025-01-24 03:39:05 +00:00
Wolfsblvt
d4672b3517 Merge pull request #3340 from bmen25124/export_getCharacters_uuidv4_humanizedDateTime
New exported methods: getCharacters(), uuidv4(), humanizedDateTime()
2025-01-24 02:39:30 +01:00
bmen25124
bbf28c74f7 New exported methods: getCharacters(), uuidv4(), humanizedDateTime() 2025-01-24 04:27:12 +03:00
Cohee
bbd85fc823 Merge pull request #3315 from SillyTavern/extensions-config
config.yaml: Group extension settings into one section
2025-01-24 02:54:48 +02:00
Cohee
291a5f42cd Merge pull request #3338 from Tosd0/staging
Update zh-CN translations
2025-01-24 01:58:33 +02:00
Cohee
1dd73e74ab Add thonk block copy 2025-01-24 01:21:08 +02:00
Cohee
03c98fb55a OpenRouter: Support reasoning blocks 2025-01-24 00:56:44 +02:00
Cohee
7f9b139ae0 Merge branch 'staging' into woo-yeah 2025-01-24 00:13:06 +02:00
Cohee
6aaeb754ef Exportable temporary assistant chats 2025-01-24 00:12:00 +02:00
Cohee
144277bdcc Wrap thonk into collapsible 2025-01-23 22:43:04 +02:00
Cohee
823b9db6f6 Gemini: Fix requesting thought blocks 2025-01-23 22:41:39 +02:00
Sevenyine
adad1fde19 Modified Translations about Group Chats 2025-01-23 22:56:59 +08:00
Sevenyine
8b2d97b946 Modification 2025-01-23 22:32:41 +08:00
Sevenyine
515f78619f Update 2025-01-23 22:25:17 +08:00
Sevenyine
71be63dbb1 Update zh-CN translations about lorebook 2025-01-23 22:23:46 +08:00
subzero5544
a503f58d0c Adding reverse proxy support to DeepSeek chat completion (#3328)
* added reverse proxy settings to deepseek chat completion

* Update chat-completions.js

* Update chat-completions.js

* Update chat-completions.js

* Update chat-completions.js

* Update chat-completions.js

* Update chat-completions.js

* Unify API key requirement

---------

Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
2025-01-23 09:02:44 +02:00
Cohee
afae8d02be The THONKening 2025-01-23 02:52:52 +02:00
Cohee
6fef696268 Featherless: use scaleable font sizes for models list 2025-01-22 22:58:58 +02:00
Cohee
e4290140bc TC: Remove -1 seeds from request body
Closes #3336
2025-01-22 22:45:30 +02:00
Cohee
7c93acedc3 post-install: Fix getting keys of null values
Original commit by @honey-tree
5c40876a4a
2025-01-22 22:41:34 +02:00
Cohee
ae29f06e44 Gemini: Fix image inlining for new models
#3332
2025-01-22 22:38:13 +02:00
Cohee
a2f71d387f Merge pull request #3331 from qvink/emit_event_on_load_messages
adding event after loading more messages in chat
2025-01-22 18:21:26 +02:00
Cohee
8f18d35109 [chore] Add missing semi 2025-01-22 16:18:34 +00:00
qvink
f1923c5364 making showMoreMessages async to await event emission 2025-01-22 08:36:47 -07:00
Cohee
636c8cb165 Merge pull request #3332 from sirius422/add-new-gemini-model
Add new Gemini thinking model and its alias
2025-01-22 15:10:28 +02:00
Cohee
513ea97769 Merge pull request #3333 from kallewoof/202501-deepseek-fix
fix: corrects the preset name and adds deepseek v2.5 hash.
2025-01-22 15:08:00 +02:00
Karl-Johan Alm
93b18e6440 fix: corrects the preset name and adds deepseek v2.5 hash. 2025-01-22 21:36:18 +09:00
sirius422
11882827c7 Add new Gemini thinking model and its alias, specify context size and vision support 2025-01-22 18:37:43 +08:00
Cohee
9f1d431c99 Merge pull request #3327 from qvink/staging
exporting openGroupId from group-chats.js
2025-01-22 10:30:49 +02:00
Cohee
d45e9a0c30 Merge pull request #3329 from kallewoof/202501-deepseek-presets
add presets for DeepSeek R1 models
2025-01-22 10:28:27 +02:00
Karl-Johan Alm
2b00cdce7b system same as user 2025-01-22 17:07:23 +09:00
Karl-Johan Alm
636e79c438 fixes 2025-01-22 16:03:32 +09:00
qvink
1641b1f91f adding event after loading more messages in chat 2025-01-21 22:14:35 -07:00
Karl-Johan Alm
7877e6601d add presets for DeepSeek R1 models 2025-01-22 13:13:41 +09:00
qvink
08b6ee0297 exporting openGroupId from group-chats.js 2025-01-21 16:50:01 -07:00
Cohee
d7bb92be54 deepseek reasoner
Closes #3322
2025-01-20 23:31:40 +02:00
Cohee
cc010643ad Merge pull request #3319 from SillyTavern/staging
Staging
2025-01-19 00:13:38 +02:00
Cohee
d87b925488 Bump package version 2025-01-18 23:34:03 +02:00
Cohee
5e396e2a91 Merge pull request #3317 from NodudeWasTaken/fix-empty-examples
Fix mes examples being undefined if empty
2025-01-18 23:31:32 +02:00
Nodude
4fdff9fce2 Fix mes examples being undefined if empty 2025-01-18 14:07:09 +01:00
Cohee
4d18ddba6d config.yaml: Group extension settings into one section 2025-01-17 20:18:27 +02:00
Cohee
a53ebe7572 Add vllm.svg 2025-01-17 11:47:55 +02:00
Cohee
df28c2c676 Merge pull request #3311 from SillyTavern/fix-http-copy
Fix copy actions for non-HTTPS/localhost
2025-01-16 23:05:54 +02:00
Cohee
b5a6199784 Merge pull request #3308 from RivelleDays/staging
Update zh-tw Translation
2025-01-16 22:05:53 +02:00
Cohee
75f36b992d Merge pull request #3309 from SillyTavern/extensions-sort
Add sorting order for extensions manager
2025-01-16 22:05:28 +02:00
Cohee
6e2b5d5dc8 Fix copy actions for non-HTTPS/localhost
Fixes #2352
2025-01-16 01:55:26 +02:00
Cohee
f98d27f187 Add sorting order for extensions manager 2025-01-15 22:59:41 +02:00
Rivelle
af987143b7 Update zh-tw.json 2025-01-16 04:23:26 +08:00
Rivelle
2723d3b73b Update zh-tw.json 2025-01-16 04:20:22 +08:00
Cohee
0441a8725f WebSearch: Add KoboldCpp search endpoint. 2025-01-15 21:58:49 +02:00
Cohee
ac455ebb45 Add RisuAI chats JSON import 2025-01-15 21:15:25 +02:00
Cohee
8acba00655 Upscale default monocolor BGs 2025-01-15 21:02:10 +02:00
Rivelle
94d69b764a Update zh-tw Translation
- Update translations
- Minor adjustments and terminology unification
2025-01-16 02:02:48 +08:00
Cohee
e7bcac0171 Merge pull request #3305 from Eradev/staging
Fixed featherless.ai models display and filters
2025-01-15 17:37:20 +02:00
Eradev
1f9fa74786 Rewritten minLogLevel feature 2025-01-15 10:02:32 -05:00
Eradev
a06270fc85 Fixed display bug when selecting a model 2025-01-15 08:04:15 -05:00
Eradev
c1535f1b34 Fixed class filter & new models count in featherless.ai 2025-01-15 00:35:40 -05:00
Eradev
6b494af146 Fix the date for featherless.ai models 2025-01-15 00:19:47 -05:00
Wolfsblvt
beced225a3 Update persona toasts 2025-01-15 02:48:35 +01:00
Wolfsblvt
776dedea82 Persona settings for auto-lock & multi connection
- Add setting to auto-lock persona to chat. Triggered on chat changed (creation/loaded) and on persona selection.
- Add setting to allow multiple persona<->char connections, which then triggers the popup to select one
- If no multi connections allowed, the connect toggle will remove all existing connections from personas to that character
2025-01-15 02:20:48 +01:00
Wolfsblvt
08a4cee48f Add/expand persona auto selection from char / chat
- Persona selection on chat based on three levels:
  1. Chat Locking
  2. Char connected personas
  3. Default persona
- Add popup if multiple personas are connected to char
- Add utility function to print persona avatar lists
2025-01-15 01:18:31 +01:00
Cohee
78e67080c9 Hide placeholder overflow of send textarea 2025-01-15 01:45:17 +02:00
Cohee
bb0c662713 Note when char description is hidden with creator notes 2025-01-15 01:30:01 +02:00
Cohee
fb15480f6b Merge pull request #3282 from SillyTavern/fix-chat-comp-label-wrapping
Fix Chat Completion list label descriptions not correctly wrapping on non-chromium browsers
2025-01-15 00:34:13 +02:00
Cohee
f8c6a62c23 Add separate drag handle for prompt manager on touch screen
Fixes #2239
2025-01-15 00:07:06 +02:00
Cohee
eee45281ea Merge branch 'staging' into fix-chat-comp-label-wrapping 2025-01-15 00:06:16 +02:00
Cohee
3770410bed Merge pull request #3303 from sakhavhyand/staging
Update fr-fr translation
2025-01-14 21:35:11 +02:00
Cohee
15cc825f43 Template clean-up 2025-01-14 21:34:39 +02:00
Cohee
5734722c5d Merge branch 'staging' into frFr 2025-01-14 21:32:58 +02:00
Cohee
aaeb26e2b7 Defininitions 2025-01-14 21:28:18 +02:00
Rendal
3674c9d020 Fix formatting of 'Context Size - Response Length' label.
Fixing and adding more translations.
2025-01-14 14:45:17 +00:00
Cohee
5120b8fbf5 Merge pull request #3301 from SillyTavern/tempresponselength
Restore temp response length as early as possible
2025-01-14 10:29:59 +02:00
Wolfsblvt
255e75c6cf Show connected characters in persona panel
- Print list of connected characters in persona panel
- Fix smaller bugs with missing connections in persona description
2025-01-14 01:37:45 +01:00
Wolfsblvt
74fc259c9c Reworked persona lock buttons + lock to character
- Slight redesign of the persona panel right side, add headers
- Add buttons for all three different lock states (chat, character, default)
- Update lock and toggle lock functions to accept toggle type
- Write persona locking to chat functionality (saves to persona description object)
2025-01-14 00:59:21 +01:00
Cohee
0773a86922 Loop 3 times before discarding response length override on save 2025-01-14 00:15:23 +02:00
Cohee
749c5df29a Restore temp response length as early as possible
Fixes #3297
2025-01-13 21:20:26 +02:00
Wolfsblvt
82422b4500 Refactor persona panel with headings 2025-01-13 19:52:23 +01:00
Cohee
4322197aba Merge pull request #3291 from Yokayo/staging
Update ru-ru translation
2025-01-13 19:02:40 +02:00
Cohee
4ebff0ffcc Merge branch 'staging' into ruRuJan 2025-01-13 16:53:26 +00:00
Cohee
7e691143d0 Merge pull request #3299 from johnfrian/alternate-greeting-scroll
Constrict scrolling to lower dynamic formarea in alternate greetings popup
2025-01-13 18:49:08 +02:00
uberubert
f840d63bdb Fix formatting 2025-01-13 15:56:17 +01:00
uberubert
e38cd31ca7 Relocate scroll constriction in alternate greetings popup 2025-01-13 15:45:47 +01:00
Cohee
218f198ec6 Merge pull request #3247 from Tosd0/staging
zh-CN translation staging
2025-01-13 16:02:53 +02:00
Cohee
d78c8b7cc8 Merge pull request #3283 from BPplays/ipv6_auto
adds checking for if localhost resolves + JSDoc additions
2025-01-13 15:59:31 +02:00
Yokayo
977e7a40bc Fix typo 2025-01-13 15:29:23 +07:00
BPplays
d769798ba3 replaced some jsdoc with assigning false by default 2025-01-12 22:39:42 -08:00
Tosd
867a9950d5 Update zh-CN translation 2025-01-13 13:16:56 +08:00
Azariel Del Carmen
6ab79ae689 feat: add Prome spanish translation (#3293)
* feat: add Prome spanish translation

Since someone added Traditional Chinese translations to Prome for ST, might as well do the same for Spanish.

* chore: disable biome formatting

* chore: add parenthesis
2025-01-12 05:27:38 +01:00
Cohee
40d29bd453 Merge pull request #3292 from SillyTavern/macrosparser 2025-01-12 03:53:45 +02:00
Cohee
1f66bc7756 Don't allow duplicate registrations 2025-01-11 23:18:03 +02:00
Cohee
b177affd81 Merge pull request #3289 from zerofata/vector-db-search-cmd
Add returnChunks and resultSize args to /db-search
2025-01-11 23:05:06 +02:00
zerofata
89c984830b rename resultSize to count 2025-01-12 07:20:36 +13:00
Yokayo
1d5cf8d25c Work on translation 2025-01-12 00:42:58 +07:00
Cohee
1dccb08cd6 Add enumerator for MacrosParser 2025-01-11 19:04:36 +02:00
Cohee
f462436450 Merge pull request #3290 from SillyTavern/qr-set-rename
QR Set buttons for rename and duplicate
2025-01-11 14:49:17 +02:00
zerofata
fc5debc660 replaced returnChunks with return arg to use existing helper functions 2025-01-11 17:42:19 +13:00
Wolfsblvt
b89d41a701 Refactor prepare/redraw for consistency 2025-01-11 02:31:14 +01:00
Wolfsblvt
3455da404a Add QR set duplicate button 2025-01-11 02:22:10 +01:00
Wolfsblvt
0f45ebda03 Refactor QR set popups to new popup 2025-01-11 01:59:38 +01:00
Wolfsblvt
4c1c62a56b Add QR set rename button 2025-01-11 01:41:46 +01:00
zerofata
7f5ce54b1f Add returnChunks and resultSize args to /db-search 2025-01-11 11:32:05 +13:00
Rendal
1528e2afed Merge branch 'SillyTavern:staging' into staging 2025-01-10 16:32:03 +01:00
Rendal
a66f9bf494 Fix translation inconsistencies and typos in UI files.
This commit resolves several translation inaccuracies, grammatical errors, and formatting issues in the French UI locale and HTML files.
2025-01-10 15:27:28 +00:00
BPplays
faaa4ba6bc changed formatting 2025-01-10 03:58:15 -08:00
BPplays
aa10dd98c9 more jsdoc stuff 2025-01-10 02:56:00 -08:00
Cohee
a62fa3b073 Merge pull request #3287 from SillyTavern/fix-first-included-message-id-macro
Fix `{{firstIncludedMessageId}}` to not rely on DOM
2025-01-10 12:17:09 +02:00
BPplays
9f98bee362 foramtting 2025-01-09 19:42:27 -08:00
BPplays
f372e1a69d more jsdoc stuff 2025-01-09 19:09:55 -08:00
BPplays
5b5b9a91aa more jsdoc stuff 2025-01-09 18:44:48 -08:00
BPplays
b43ac187ec formatting changes 2025-01-09 18:27:21 -08:00
BPplays
adc5940d15 formatting changes 2025-01-09 18:17:02 -08:00
Wolfsblvt
e33c3771f5 No metadata save 2025-01-10 01:27:02 +01:00
Cohee
d78577c46d Merge pull request #3266 from d-ber/character_import_speedup
Character import speedup by delaying tag import
2025-01-09 23:06:07 +02:00
Cohee
2ab59f5a7a chore: reformat new code 2025-01-09 22:57:43 +02:00
Cohee
1807af355b Merge pull request #3284 from SillyTavern/css-var-slash-command
Add `/css-var` slash command
2025-01-09 22:49:14 +02:00
Cohee
efeedc1274 Revert gallery selector changes 2025-01-09 22:39:40 +02:00
Cohee
f869b26664 Ensure unique selectors for loaded extension files 2025-01-09 22:32:15 +02:00
Wolfsblvt
7a2276c176 Fix {{firstIncludedMessageId}} to not rely on DOM
Up until now, the {{firstIncludedMessageId}} macro relied on searching the DOM for the actual CSS class applied for the context line.
Bad design, as the actual message was maybe not display, with display X messages enabled.

- Use setInContextMessages() that sets the context line on generation to also update a chat metadata field
- Utilize that field inside the macro
- Update docs to clarify that this will only show the mesid that was relevant during last generation
2025-01-09 21:23:18 +01:00
Cohee
b604588638 Add scroll option to /chat-render command 2025-01-09 21:15:34 +02:00
Cohee
a585f3abcc Add {{firstDisplayedMessageId}} macro 2025-01-09 21:12:34 +02:00
Cohee
0a03793d7b Add /chat-render and /chat-reload commands 2025-01-09 21:10:12 +02:00
Cohee
667ab77651 Merge pull request #3285 from SillyTavern/zoom-image-closing
Allow zoomed in images in chat to be closed by clicking outside
2025-01-09 21:01:19 +02:00
Cohee
9be04fd69f Fix <code> tag structure 2025-01-09 20:58:36 +02:00
Wolfsblvt
ba73d278ae Allow zoomed in images be closed by click outside
- Add event listener to close image enlarge popup when clicked outside of image or description
- Change img div to not be width:100% by default, was useless and just confusing when you could click next to the image and it zoomed in
2025-01-09 19:16:48 +01:00
Wolfsblvt
a8b5f8a95f Add /css-var slash command
- Add /css-var slash command to set CSS variables on some elements
- Update gallery div id to something actually unique ("#draggable_gallery")
2025-01-09 18:37:50 +01:00
BPplays
45e7edc9b8 formatting 2025-01-09 07:35:17 -08:00
BPplays
874127a4f9 lint 2025-01-09 07:30:50 -08:00
BPplays
d177314676 formatting 2025-01-09 07:30:22 -08:00
BPplays
bab4f21056 added dns checking 2025-01-09 07:29:37 -08:00
BPplays
188a043967 started adding dns checking 2025-01-09 04:12:02 -08:00
Wolfsblvt
5e881e5944 Fix chat comp label wrapping on non-chrome
- Fixes #3280
- No one noticed, because on Chrome it works, eh
2025-01-09 03:48:04 +01:00
Cohee
23779fe565 Merge branch 'release' into staging 2025-01-08 21:20:50 +02:00
Cohee
d1f1299d43 Merge pull request #3275 from erew123/release
Correct skipping RVC on AllTalk V1 Server
2025-01-08 21:20:36 +02:00
Wolfsblvt
126e4fa698 Display additional images in expression list
- Update Expressions List to display additional images per expression
- Make additional images appear visually distinct
- Fix small issues with custom labels not always being shown
- Add tooltip on all expression images
- Modify /api/sprites/get endpoint to correctly parse the label from filenames that might be additional files
2025-01-08 01:20:25 +01:00
Cohee
2b3e44cca3 Clear custom model selection on loading presets 2025-01-08 02:06:29 +02:00
erew123
5ea8309a30 Change check from ! not to is == V2 2025-01-08 00:01:36 +00:00
Cohee
1557dec2bc Revert "Don't auto-select custom model to the first model in the list"
This reverts commit d791b54528.
2025-01-08 01:46:31 +02:00
erew123
de8ecc6903 Correct skipping RVC on AllTalk V1 Server
Silly bug that caused the extension when used with the legacy V1 AllTalk server, would cause it to skip downloading Narrator voices.

Literally changed "v2" to "v1" on line 391

No other changes.
2025-01-07 23:20:53 +00:00
Cohee
5b37d22e2d Merge pull request #3274 from SillyTavern/search-term-empty-folders
Search term search will show empty folders too
2025-01-07 22:21:43 +02:00
Wolfsblvt
7b5baad5cd Search term search will show empty folders too
- Char list did hide folders with 0 sub entities inside. This also applied to any search being done. Now when searching, if a tag/folder matches, it is shown, even if the chars inside don't match. Before that, it was not possible to "search" for tags without the "Advanced Character Search" enabled
2025-01-07 20:54:52 +01:00
Cohee
d791b54528 Don't auto-select custom model to the first model in the list 2025-01-07 20:39:35 +02:00
Cohee
49fb2f4d79 Declare compiler in the inner scope #3272 2025-01-07 20:24:57 +02:00
Cohee
41a0d6919f Merge pull request #3273 from cierru/force_chid_in_generate_quite_prompt
Add the option to specify a character for generateQuietPrompt
2025-01-07 20:18:56 +02:00
Cohee
68d8d322a9 Clarify comment regarding groups 2025-01-07 20:15:35 +02:00
Cohee
d7b3a56c3d chore: await before returning 2025-01-07 20:07:41 +02:00
Cohee
81841ca2a6 WebLLM: use current tokenizer if not available 2025-01-07 20:01:59 +02:00
Cohee
5af7852465 Null Webpack compiler after run
Fixes #3272
2025-01-07 19:54:31 +02:00
cierru
57d6938d6c Added the force_chid parameter to the generateQuietPrompt function 2025-01-07 17:54:23 +05:00
d-ber
d4f23de003 fix toasts and final char selection 2025-01-06 22:41:32 +01:00
d-ber
c22ed52c72 fix function name, and minor fixes 2025-01-06 21:49:02 +01:00
Cohee
6029b51f7e Merge pull request #3265 from SillyTavern/fix-bogus-sorting
Folders should not be sorted in the char list
2025-01-06 19:34:46 +02:00
Cohee
8bc515c6a1 Merge branch 'staging' into fix-bogus-sorting 2025-01-06 19:26:22 +02:00
Cohee
f91e1b3d2f Merge pull request #3271 from tincansimagine/geminifeat2
Fix: Ensure "OFF" safety settings are applied to gemini-2.0-flash-exp for unfiltered responses
2025-01-06 19:25:45 +02:00
Cohee
b66c4d7206 Merge branch 'staging' into geminifeat2 2025-01-06 19:20:58 +02:00
Cohee
9062b6bc4d Whitespace clean-up 2025-01-06 19:20:04 +02:00
Cohee
0f03dcfc0f Merge pull request #3269 from fizzAI/patch-1
Change Gemini system instruction parameter key to `systemInstruction`
2025-01-06 19:19:03 +02:00
tincansimagine
2103e6238c Fix: Apply OFF safety settings for gemini-2.0-flash-exp model 2025-01-07 02:17:09 +09:00
Fizz~
b6e7f4f493 Change Gemini system instruction parameter key to systemInstruction
Refer to https://github.com/googleapis/python-genai/blob/main/google/genai/models.py#L772, it seems like both work(?) but this is probably the more correct option if the newer library is using it
2025-01-06 11:44:11 -05:00
Cohee
d13ec29158 Merge pull request #3264 from SillyTavern/backup-config-reorg
Reorganize backup configs
2025-01-06 10:58:23 +02:00
d-ber
96cd683d0e added tag import back into importCharacter 2025-01-06 00:30:15 +01:00
d-ber
c7cbeed9bb speed up char import by postponing tag import 2025-01-05 22:36:10 +01:00
Wolfsblvt
9264008766 Folders should not be sorted in the char list
- Folders respect the chosen sorting of the "Tag Management"
- They will still always be displayed on top
- They will now not follow any chosen list sorting, so do not get changed based on alphabetical sorting of the char list
2025-01-05 20:27:20 +01:00
Cohee
9db9c5c9ca Reorganize backup configs 2025-01-05 16:03:52 +02:00
Sevenyine
efa80267f6 Update 2025-01-05 10:19:55 +08:00
Cohee
989f5a8692 Image Gen: don't generate a new swipe seed if already using a random seed 2025-01-05 00:49:23 +02:00
Cohee
8623d1198d Add thumbnail dimensions to config (#3262)
* Add thumbnail dimensions to config

* Fix default value for thumbnails.enabled

* Update comment for thumbnail recreation instructions in config.yaml

* Lint config values

* Verify config size > 0

* More config lint
2025-01-05 00:38:50 +02:00
Cohee
e75d03fea9 Fix lint 2025-01-04 16:23:21 +02:00
Cohee
48be0ceb16 Use named constants 2025-01-04 16:23:21 +02:00
Cohee
0e3ff1699a Merge pull request #3226 from BPplays/ipv6_auto
Automatically detect what IP versions are available and use them
2025-01-04 16:22:53 +02:00
Cohee
7f5dc72161 Fix user settings doc link 2025-01-04 16:02:09 +02:00
Cohee
5a617f60f5 Merge pull request #3261 from underscorex86/patch-2
Update inclusion-group tooltip doc site link
2025-01-04 15:49:50 +02:00
Sneha C
18243fe879 Update inclusion-group tooltip doc site link 2025-01-04 17:18:16 +04:00
Rivelle
446a9adcf1 Update readme-zh_tw.md (#3259)
* Update readme-zh_tw.md

- Complete punctuation and remove redundant words
- Make minor adjustments to phrasing to align with traditional Chinese (Taiwan) usage conventions

* Update readme-zh_tw.md

* Update readme-zh_tw.md

* Update readme-zh_tw.md
2025-01-04 14:18:46 +02:00
Cohee
7fdeeb0fae Merge pull request #3258 from RivelleDays/i18n
Fix i18n Issues & Update zh-TW Translation
2025-01-04 14:17:44 +02:00
Cohee
6552038712 Update no validate warning 2025-01-04 14:16:25 +02:00
Sevenyine
0bda86c352 Supplemented zh-CN UI translation 2025-01-04 18:09:12 +08:00
Rivelle
8514ac29fc Merge branch 'i18n' of https://github.com/RivelleDays/SillyTavern into i18n 2025-01-04 16:03:20 +08:00
Rivelle
c2caad3904 Update zh-tw.json 2025-01-04 16:03:14 +08:00
Rivelle
fae11fc04a Update personas.js: fix i18n 2025-01-04 15:14:14 +08:00
Rivelle
81cb3430bb Update openai.js: fix i18n 2025-01-04 15:12:55 +08:00
Cohee
0a8fae06c2 Don't set an undefined theme field to an empty string 2025-01-04 00:07:26 +02:00
Cohee
77bee453ab Vectors: Add only custom boundary chunking 2025-01-03 20:44:25 +02:00
Cohee
590e52442c Fix /api/secrets/find return on 404 2025-01-03 12:48:24 +00:00
Cohee
dd273a7727 Docker build: Pre-compile public libraries 2025-01-03 12:30:55 +00:00
Cohee
02900520c9 chore: Add index property to HashedMessage 2025-01-03 03:09:16 +02:00
Cohee
eff4da42c5 Vector storage: skip for quiet prompts 2025-01-03 03:04:45 +02:00
Cohee
dea4a63022 Move rss extension container to other column 2025-01-03 01:42:03 +02:00
Cohee
2f5f9a437d Allow running generate interceptors on quiet prompts 2025-01-03 01:10:14 +02:00
Cohee
68437ed81c Enable strictBindCallApply in jsconfig 2025-01-03 00:28:09 +02:00
Cohee
8ed2721ddd Set server jsconfig target to ES2023 2025-01-03 00:27:13 +02:00
Cohee
97f6dcace0 Fix types for extractFileFromZipBuffer 2025-01-03 00:16:14 +02:00
Cohee
fc4fecf0fd Add model hash to TC API tokenizer cache key 2025-01-02 23:49:22 +02:00
Cohee
40b05bb6b1 Add best match tokenizer logic for DeepSeek and Nemo 2025-01-02 23:22:53 +02:00
Cohee
2d4bae17cc Merge branch 'release' into staging 2025-01-02 22:58:15 +02:00
Cohee
d0e1c3287a NovelAI: Fix scheduler auto-assign 2025-01-02 22:58:06 +02:00
Cohee
b7a96b3143 Add fixed containers for downloadable extensions 2025-01-02 22:25:44 +02:00
Cohee
612fda4cfc Merge branch 'release' into staging 2025-01-02 00:41:05 +02:00
Cohee
beb4328714 Revert using url-join for SD WebUI paths 2025-01-02 00:40:56 +02:00
Cohee
5db7a9cf1e Fix fetch buffer deprecation warnings 2025-01-01 22:18:23 +02:00
Cohee
e99f918454 Fix fetch buffer deprecation warnings 2025-01-01 22:12:04 +02:00
Cohee
102d170752 Merge branch 'staging' into release 2025-01-01 20:15:55 +02:00
Cohee
6768264514 Docker: add git safe.directory exclusion
Closes #3250
2025-01-01 19:45:34 +02:00
Cohee
a867b2f85a Add global extensions Docker volume
Closes #3251
2025-01-01 19:13:47 +02:00
Cohee
f246bc5ac6 Merge pull request #3248 from SillyTavern/staging
Staging
2025-01-01 17:21:09 +02:00
Cohee
2c5cffe6be Typo fix in data-i18n attr 2025-01-01 17:12:36 +02:00
Cohee
f9e3666d23 Add debug function to toggle regeneration warning with Ctrl+Enter 2025-01-01 16:56:44 +02:00
Cohee
72e0f8ccc5 Fix available CC models log header 2025-01-01 16:28:47 +02:00
Sevenyine
ee6eb5572d add translations 2025-01-01 21:55:03 +08:00
Sevenyine
dec4a7d31e add i18n keys and zh-CN translations 2025-01-01 21:45:18 +08:00
Cohee
e45d2252aa Allow admin actions when accounts are disabled 2025-01-01 15:00:59 +02:00
Cohee
1d22cd7592 Bump package version 2025-01-01 14:58:43 +02:00
Cohee
ac4a0e8af5 Merge pull request #3246 from waht41/bugfix/extension-translate
bug fix, use data-i18n="[title]Extensions"
2025-01-01 14:52:56 +02:00
BPplays
8a321a7450 added better logging 2024-12-31 22:41:13 -08:00
BPplays
092d11bbe6 added better logging 2024-12-31 22:34:41 -08:00
waht
cf8bb8817b bug fix, use data-i18n="[title]Extensions" 2025-01-01 10:52:01 +08:00
BPplays
d956e0ebdc changed formatting 2024-12-31 14:46:41 -08:00
Cohee
9e6db659d9 Fix icon lookup logic for system prompts in PromptManager 2025-01-01 00:22:08 +02:00
Cohee
7c879a3abc Farewell system icon 2024-12-31 23:42:06 +02:00
Cohee
e9c9dda3fb Remove unspecified role, hide icons for non-custom prompts of non-system roles 2024-12-31 23:28:52 +02:00
Cohee
569f9a2091 Popup: do not require body text on input/confirm 2024-12-31 22:59:08 +02:00
Cohee
8508c4bf9b eslint: allow irregular whitespace in template literals 2024-12-31 22:58:51 +02:00
Cohee
4698b41d26 Fix chat manager not displaying empty chats 2024-12-31 22:40:33 +02:00
Cohee
f47c98f85d Merge pull request #3242 from SillyTavern/role-icons-for-PM
add prompt role icons to prompt manager
2024-12-31 21:35:55 +02:00
Cohee
48e5c11f9b Change icon for preset prompt 2024-12-31 21:17:15 +02:00
Cohee
8a55cd776f Unset => Unspecified 2024-12-31 21:08:42 +02:00
Cohee
f43f057b07 Merge branch 'staging' into role-icons-for-PM 2024-12-31 20:53:12 +02:00
Cohee
6d0f58c862 Merge pull request #3244 from waht41/bugfix/extension-translate
bug fix, translate extension button
2024-12-31 20:50:08 +02:00
Cohee
b4c275f9e4 Move translation to HTML template 2024-12-31 20:49:29 +02:00
Cohee
170378e615 Merge pull request #3245 from Succubyss/revert-manual_selection
Reverts MANUAL_SELECTION from tokenizers.js
2024-12-31 20:46:11 +02:00
Succubyss
97dc041777 Revert MANUAL_SELECTION
This partially reverts commit c89804677a (keeps the turbo-0301 removal).
2024-12-31 11:18:43 -06:00
waht
ca62db2fbd Merge remote-tracking branch 'origin/staging' into bugfix/extension-translate
# Conflicts:
#	public/scripts/extensions.js
2025-01-01 00:37:08 +08:00
waht
5b4adbacba bug fix, translate extension button 2025-01-01 00:08:36 +08:00
Cohee
56da6eb39d Merge pull request #3241 from RivelleDays/staging
Fix Missing i18n Tags & Update zh-tw.json
2024-12-31 16:18:17 +02:00
Cohee
75485f2d7d Add missing space and line break 2024-12-31 16:09:25 +02:00
Cohee
b4e5cfe797 Reset prompt role to unset 2024-12-31 15:21:36 +02:00
Cohee
9ad9877d3e Shirinkflate the pencil 2024-12-31 15:18:44 +02:00
Cohee
227201a5fc Add "unset" value for PM prompt role, refactor icons display 2024-12-31 15:14:29 +02:00
Cohee
d58f471cc3 Merge branch 'staging' into role-icons-for-PM 2024-12-31 14:37:08 +02:00
Cohee
d46a551d78 Update public/scripts/PromptManager.js
Co-authored-by: valadaptive <79560998+valadaptive@users.noreply.github.com>
2024-12-31 14:36:56 +02:00
BPplays
93e0efa241 made var names better 2024-12-31 03:29:15 -08:00
Cohee
6432adaf3c Merge pull request #3243 from valadaptive/no-unneeded-ternary
Enable no-unneeded-ternary ESLint rule
2024-12-31 11:55:23 +02:00
valadaptive
8bf78ce9cb Enable no-unneeded-ternary ESLint rule 2024-12-31 03:43:49 -05:00
RossAscends
2109a7bda1 add prompt role icons to prompt manager 2024-12-31 17:27:07 +09:00
Rivelle
fba02d69fa Update zh-tw.json 2024-12-31 15:24:51 +08:00
Rivelle
7896e81986 Update zh-tw.json 2024-12-31 14:29:21 +08:00
Rivelle
6b587c1160 Update zh-tw.json 2024-12-31 14:27:46 +08:00
Rivelle
e5989e0118 Update themeDelete.html 2024-12-31 14:18:57 +08:00
Rivelle
e34d777e11 Update itemizationChat.html 2024-12-31 14:17:04 +08:00
Rivelle
71fc73ce37 Update itemizationChat.html 2024-12-31 14:04:30 +08:00
Rivelle
245b9384bc Update debug.html 2024-12-31 14:03:05 +08:00
Rivelle
4ee0375120 Update installExtension.html 2024-12-31 14:02:09 +08:00
Cohee
d463677328 Check of optionsResult.ok 2024-12-31 00:29:56 +02:00
Cohee
de6c8c1501 Remove forge override from non-forge SD requests 2024-12-31 00:27:12 +02:00
Cohee
e0af5ff353 Default to undefined for no VAE selected 2024-12-31 00:13:26 +02:00
Cohee
8447c7e637 Fix VAE for SD forge 2024-12-31 00:12:25 +02:00
Cohee
f416b6cd54 Revert "Pass VAE name to SD forge"
This reverts commit 3a29756109.
2024-12-30 23:47:57 +02:00
Rivelle
e9260e8809 Update zh-tw.json 2024-12-30 19:41:20 +08:00
Rivelle
e92d49377f Update userReset.html: fix data-i18n 2024-12-30 19:08:06 +08:00
BPplays
f27b3361e5 lint 2024-12-30 03:01:04 -08:00
BPplays
f67abf9e03 improved urlHostnameToIPv6 2024-12-30 02:59:41 -08:00
Rivelle
ca9d5c2fd8 Update themeDelete.html: fix data-i18n 2024-12-30 18:57:53 +08:00
Rivelle
a2355ab2ef Update scenarioOverride.html: fix data-i18n 2024-12-30 18:48:25 +08:00
Rivelle
7c40834eb7 Update resetSettings.html: fix data-i18n 2024-12-30 18:15:18 +08:00
Rivelle
b834b71c69 Update masterImport.html: fix data-i18n 2024-12-30 17:51:56 +08:00
Rivelle
b4aadff649 Update masterExport.html: fix data-i18n 2024-12-30 17:44:28 +08:00
Rivelle
7baf7da90d Update itemizationChat.html: fix data-i18n 2024-12-30 17:28:05 +08:00
Rivelle
8a80b43c52 Update itemizationChat.html: fix data-i18n 2024-12-30 17:06:42 +08:00
Rivelle
8454583131 Update installExtension.html: fix data-i18n 2024-12-30 15:48:06 +08:00
Rivelle
5da312356a Update createCheckpoint.html: fix data-i18n 2024-12-30 15:36:06 +08:00
Rivelle
cfa4bcc1b8 Update debug.html: fix data-i18n 2024-12-30 15:35:05 +08:00
Rivelle
421402615a Update changeName.html: fix data-i18n 2024-12-30 15:19:58 +08:00
Rivelle
7db2042b7b Update debug.html: fix data-i18n 2024-12-30 15:08:59 +08:00
Cohee
3a29756109 Pass VAE name to SD forge 2024-12-30 01:12:37 +02:00
Cohee
ec0f57a8eb Fix bad copypaste 2024-12-30 00:41:43 +02:00
Cohee
ad19a800ce Fix getting VAEs for SD forge 2024-12-30 00:25:35 +02:00
Cohee
e1b6eab9eb Fix SD forge generation with hires 2024-12-30 00:09:37 +02:00
Cohee
2ca70090aa Mistral: Fix endpoint validation on status check 2024-12-29 22:39:26 +02:00
Cohee
69f8d02c53 Fix continue prefill using Claude prefill for non-Claude sources 2024-12-29 22:34:56 +02:00
Cohee
44833b665e Merge pull request #3237 from SillyTavern/deepseek
Deepseek
2024-12-29 22:29:15 +02:00
Cohee
e37a4b982a Add deepseek logo 2024-12-29 21:28:12 +02:00
Cohee
cdb31699d4 Expose new post-processing as "Semi-strict" 2024-12-29 21:20:15 +02:00
Cohee
c9db7a1574 Don't add user placeholders 2024-12-29 21:14:27 +02:00
Cohee
0ded442bd3 Fix status check 2024-12-29 20:39:47 +02:00
Cohee
4c7d160d41 DeepSeek
Closes #3233
2024-12-29 20:38:13 +02:00
Cohee
662f0e9c73 Gemini: Thought toggle
Closes #3220
2024-12-29 18:23:07 +02:00
BPplays
7744be3319 commited util 2024-12-29 04:20:59 -08:00
BPplays
07cff878e5 commited util 2024-12-29 04:20:39 -08:00
BPplays
dd6dcf1c5b changed to check 127.0.0.1 because that's what it binds to 2024-12-28 17:27:49 -08:00
BPplays
0382afc488 changed foramtting 2024-12-28 17:15:44 -08:00
BPplays
19eae8cb49 fixed broken ipv6 on linux, and weird implementation in general 2024-12-28 17:14:30 -08:00
BPplays
1a1ab1d18a check for localhost ip and ignore link-local v6, i think you need to specify an interface 2024-12-28 13:31:50 -08:00
Cohee
c3ad87cea1 ComfyUI: negate clip_skip placeholder value 2024-12-28 16:05:58 +02:00
Cohee
d8b738d73e Merge pull request #3232 from RivelleDays/staging
Update zh-tw.json
2024-12-28 15:00:53 +02:00
Cohee
7edc6b4123 Merge pull request #3231 from Sevenyine/staging
Optimized zh-cn translation
2024-12-28 14:59:46 +02:00
Sevenyine
af21c92bd6 Optimized and supplemented zh-CN translation 2024-12-28 20:31:43 +08:00
79
3596ba6d38 Sort Keys 2024-12-28 14:53:33 +08:00
Rivelle
e7d3351c1d Update zh-tw.json
- Added a few missing translations
- Corrected phrasing
- Removed duplicate entries
2024-12-28 11:20:48 +08:00
Rivelle
7a7d6a500d Update zh-tw.json
- Added a few missing translations  
- Corrected phrasing  
- Removed duplicate entries
2024-12-28 11:18:45 +08:00
79
35913e2dfb Optimized zh-cn translation 2024-12-28 11:06:25 +08:00
Cohee
57a7d549c0 Merge pull request #3230 from RivelleDays/staging
Update zh-tw.json: Translation Fixes and Terminology Refinement
2024-12-28 02:56:20 +02:00
Cohee
149de7d257 Image Gen: make CFG step 0.1 2024-12-28 02:28:58 +02:00
Rivelle
6a76ebe747 Update zh-tw.json
- Added translation for the third-party "Dialogue Colorizer" extension (an attempt to integrate SillyTavern-i18n translation)
2024-12-28 08:07:15 +08:00
Rivelle
aaf0f24d60 Update zh-tw.json: Translation Fixes and Terminology Refinement
- Updated untranslated text using SillyTavern-i18n (thanks to ceruleandeep for the documentation)
- Fixed known translation issues (mismatched translations and functionality)
- Refined phrasing and standardized terminology (did my best while reviewing the documentation...)
2024-12-28 06:34:00 +08:00
Cohee
c4f119ebf9 cfg: Adjust max context size based on injected prompt
Close #2424
2024-12-27 23:43:16 +02:00
Cohee
39cfb35c1a Gemini: Fix cross-chunk parsing of multipart replies 2024-12-27 23:15:09 +02:00
Cohee
77f5f00151 Remove no-connection class from send form on connection 2024-12-27 22:43:40 +02:00
Cohee
08baa1f9ae Gemini: lean sysprompt hint 2024-12-27 22:40:59 +02:00
Cohee
59772bfd27 Merge pull request #3229 from Sevenyine/staging
Add new Google AI Studio model
2024-12-27 22:40:04 +02:00
Cohee
a82c05a8ac Gemini thinking: Specify context size, system prompt and vision support 2024-12-27 22:39:26 +02:00
Cohee
6286eb5827 Move color-scheme preference to body element 2024-12-27 21:05:47 +02:00
Cohee
7885739a55 Remove auto dark theme hindrance 2024-12-27 20:53:05 +02:00
Cohee
bba36e2145 Remove transparency from toast container 2024-12-27 19:53:57 +02:00
Cohee
90ff4c7308 Merge pull request #3228 from isaac-mcfadyen/llamacpp-logprobs
Fix recent llama.cpp server logprobs
2024-12-27 19:49:21 +02:00
Cohee
29acc2e2db Add Deepl endpoint selection
Fixes #3224
2024-12-27 13:02:06 +00:00
79
0d8977d688 Update index.html - New Google AI Studio Model 2024-12-27 15:08:16 +08:00
Isaac McFadyen
d14f2f3c77 llama.cpp: fixed wording in comment for logprobs 2024-12-27 01:15:35 -05:00
Isaac McFadyen
77414045d9 llama.cpp: fixed logprobs for newest server version 2024-12-27 01:00:55 -05:00
Cohee
4fa8e0a89c Accounts: fix dangling session cookies on logout 2024-12-27 01:36:23 +02:00
Cohee
c42a7739d6 NovelAI: Fix backward compatibility with scheduler setting 2024-12-27 00:24:53 +02:00
Cohee
b5eb2b5150 NovelAI: Limit maximum steps to 50 2024-12-26 22:51:58 +02:00
Cohee
27f8768141 NovelAI: Make Euler Ancestral a default sampler 2024-12-26 22:44:15 +02:00
Cohee
844d8bdee7 NovelAI: Disable SMEA/DYN for V4 2024-12-26 22:42:01 +02:00
Cohee
f92f8f4a84 NovelAI: Remove deprecated SD models 2024-12-26 22:24:37 +02:00
Cohee
4a4e02450c locales: update API key hint from Horde KoboldAI to AI Horde 2024-12-26 21:54:24 +02:00
BPplays
ae79616c73 changed color of ip warning 2024-12-26 11:44:30 -08:00
BPplays
9c0993908a moved stringtobool 2024-12-26 11:42:32 -08:00
BPplays
647b89f8ad changed settings value error to just set to auto 2024-12-26 11:40:22 -08:00
BPplays
591a61a61c misc formatting 2024-12-26 10:51:45 -08:00
BPplays
4a8b47a6ff fixed cli args and logic bug 2024-12-26 10:44:48 -08:00
BPplays
1689baa2a4 changed back const 2024-12-26 10:30:51 -08:00
BPplays
ca283c0da6 fixed backward compat, and check if auto before getting addrs 2024-12-26 10:29:04 -08:00
Cohee
0d79bb6f6d Firefox: restore chat scroll top on edit textarea autofit 2024-12-26 13:24:48 +00:00
Cohee
e33e0b1e64 trimToEndSentence: fix emoji trim after whitespace 2024-12-26 10:45:10 +02:00
BPplays
9e049f44e2 fixed logic bug 2024-12-25 17:28:44 -08:00
BPplays
0bc0569932 changed to always report supported ip ver even when disabled, green means it's enabled 2024-12-25 17:25:02 -08:00
BPplays
e861b18992 added better error reporting 2024-12-25 17:22:18 -08:00
BPplays
26c0b620f8 added better error reporting 2024-12-25 17:16:40 -08:00
BPplays
324eb695f5 added better error reporting 2024-12-25 17:16:12 -08:00
BPplays
b5139e3ff9 fixed linting issues 2024-12-25 17:06:05 -08:00
BPplays
38b1c26396 made loop better 2024-12-25 17:01:12 -08:00
BPplays
418a2564b2 added better error handling 2024-12-25 16:59:47 -08:00
BPplays
8d0261bab3 fixed dumb mistake 2024-12-25 16:52:13 -08:00
BPplays
dc3b18de94 fixed typo 2024-12-25 16:47:08 -08:00
BPplays
b0cb982978 added automatic ipv6 ipv4 detection 2024-12-25 16:46:16 -08:00
Cohee
7f2cf6f7e6 Add provider arg to /translate command 2024-12-25 23:31:37 +02:00
Cohee
0cb82b3288 Merge pull request #3221 from Succubyss/manual_selection
tokenizers.js: Add MANUAL_SELECTION (& removes turbo-0301 lines)
2024-12-25 22:14:28 +02:00
Cohee
28c7dbbe1b Merge pull request #3222 from SillyTavern/bg-fitting
Add background image fitting options
2024-12-25 22:09:01 +02:00
Succubyss
c89804677a tokenizers.js: add MANUAL_SELECTION (& removes turbo-0301 lines) 2024-12-24 16:45:35 -06:00
Cohee
0b43717931 Add background image fitting options
Closes #3133
2024-12-24 23:32:31 +02:00
Cohee
540d93592b Add fallback mechanism for background selection in autoBackgroundCommand 2024-12-24 22:15:33 +02:00
Cohee
7adc6d38e2 OpenRouter: Add control for middle-out transform
Closes #3033
2024-12-24 21:51:47 +02:00
Cohee
09dd9762f7 Clean-up try/catch blocks in translate.js 2024-12-23 23:42:20 +02:00
Cohee
7490357d9e Merge pull request #3219 from SillyTavern/pt-br
Translate: Split Portuguese languages
2024-12-23 23:31:04 +02:00
Cohee
1a16957519 Construct Lingva URL using url-join 2024-12-23 21:51:33 +02:00
Cohee
83e677d6cb Fix default URL check for Lingva translator 2024-12-23 21:38:19 +02:00
Cohee
8394b97600 Add default URL for Lingva translator 2024-12-23 21:34:16 +02:00
Cohee
c4a92c95e6 Update bing translate API package, fix language codes 2024-12-23 21:12:18 +02:00
Cohee
650853eabb Translation: Split Portuguese langs 2024-12-23 20:28:21 +02:00
Cohee
71050ef1d2 Fix AI Horde deadnaming 2024-12-23 19:37:51 +02:00
Cohee
d166ccf455 Merge pull request #3218 from soyangel/patch-1
Fix "save" translation in es-es
2024-12-23 15:39:21 +02:00
Angel Luis Jimenez Martinez
5eff49f442 Fix "save" translation in es-es 2024-12-23 10:56:08 +01:00
Cohee
616fc34826 Add type definitions for jQuery plugins 2024-12-23 01:08:56 +02:00
Cohee
404a217622 Backfill imported bias entry ids 2024-12-23 00:49:35 +02:00
Cohee
7f94cb4bee CC: Simplify default wrappers for personality and scenario 2024-12-22 23:36:58 +02:00
Cohee
f0b124221c Merge pull request #3216 from HiroseKoichi/release
Remove brackets around `{{name}}` in `ChatML-Names` and `Llama-3-Instruct-Names`
2024-12-22 23:32:08 +02:00
Cohee
3f7b91a4eb Add uuid to CC logit bias entries 2024-12-22 23:27:20 +02:00
Hirose
17df259afd Update ChatML-Names.json
Remove brackets from `ChatML-Names`
2024-12-22 15:00:00 -06:00
Hirose
964437ed13 Update Llama-3-Instruct-Names.json
Remove brackets from `Llama-3-Instruct-Names`
2024-12-22 14:59:35 -06:00
Cohee
6044aebe1f Merge branch 'staging' of https://github.com/SillyTavern/SillyTavern into staging 2024-12-22 19:26:51 +02:00
Cohee
1ebaf18210 feat: add drag-and-drop functionality for logit bias lists 2024-12-22 19:26:47 +02:00
Cohee
352a8e9a61 Merge pull request #3215 from ceruleandeep/feature/uploadSprite
/uploadsprite slashcommand
2024-12-22 18:13:39 +02:00
Cohee
0f93caa427 Fix type errors in command registration 2024-12-22 18:12:07 +02:00
Cohee
e6107ad447 Add NAI Diffusion V4 2024-12-22 15:39:41 +02:00
ceruleandeep
c3a12cc1a2 feat: /uploadsprite slash command 2024-12-22 12:55:20 +11:00
ceruleandeep
7bb37f129d fix: move cache-busting to server side 2024-12-22 12:33:01 +11:00
ceruleandeep
78a1397a3c fix: log arguments when eventTracing is set 2024-12-22 12:32:18 +11:00
Cohee
713443d234 Fix ComfyUI generation for non-relative paths 2024-12-22 00:52:09 +02:00
Cohee
d9101ce679 Add is-mobile command and macro 2024-12-21 22:25:14 +02:00
Cohee
5739efc59b Support ComfyUI hosted on relative URLs
Closes #3208
2024-12-21 21:25:02 +02:00
Cohee
71d2530329 Merge pull request #3191 from SillyTavern/group-join-examples
Fixes to group join examples parsing
2024-12-21 20:15:59 +02:00
Cohee
2c0895bd7d Merge branch 'release' into staging 2024-12-21 19:43:10 +02:00
Cohee
6033c38b19 Safari: Fix chat history popup sizing 2024-12-21 19:41:38 +02:00
Cohee
107e2e0ed0 PromptNames: Rename startsWithGroupName function 2024-12-21 19:00:14 +02:00
Cohee
2796d5dcde getGroupNames: Short circuit if no group selected 2024-12-21 18:52:42 +02:00
Cohee
ba7e34c195 Image Generation: Use wrench symbol for function tool 2024-12-21 18:47:46 +02:00
Cohee
c51e27fb69 Merge branch 'staging' into group-join-examples 2024-12-21 18:39:14 +02:00
Cohee
f056e6a89c Merge pull request #3213 from SillyTavern/expressions-webllm
Expressions: Add WebLLM extension classification
2024-12-21 18:38:55 +02:00
Cohee
f794b7621f Merge pull request #3210 from SillyTavern/sendtextarea-fieldsizing
Use CSS resizing for send textarea
2024-12-21 17:56:13 +02:00
Cohee
21ee072677 Revert "Add overscroll contain for edit textarea"
This reverts commit d07ee76784.
2024-12-21 17:50:37 +02:00
Cohee
d07ee76784 Add overscroll contain for edit textarea 2024-12-21 17:48:12 +02:00
Cohee
252043ae11 Move code for cleaner diff 2024-12-21 17:33:18 +02:00
Cohee
85ce522270 Remove invalid style 2024-12-21 17:24:54 +02:00
Cohee
2fbe689605 Implement autofit for edit textarea 2024-12-21 16:47:25 +02:00
Cohee
1f22b9c6bc Merge pull request #3211 from cloak1505/staging
OpenRouter: Update providers list
2024-12-21 14:30:44 +02:00
cloak1505
222edd5c36 OpenRouter: Update providers list 2024-12-21 01:30:35 -06:00
Cohee
f649e4698b Invert if cssAutofit 2024-12-21 02:52:05 +02:00
Cohee
d27d750cb2 Use CSS resizing for send textarea 2024-12-21 02:50:42 +02:00
Cohee
f1bc217e79 Expressions: Add WebLLM extension classification 2024-12-21 01:14:50 +02:00
Cohee
73614f2f8d Refactor prompt converters with group names awareness 2024-12-20 23:30:57 +02:00
Cohee
d7328af4c8 Merge branch 'staging' into group-join-examples 2024-12-20 22:32:19 +02:00
Cohee
94de9411b6 UI performance fixes (#3207)
* Optimize visibility checks for burger and wand menus

* Optimize message actions visibility toggle

* Run drawer toggle in animation frame

* Replace jQuery slideToggle with a 3rd-party lib

* Refactor export button functionality to manage popup state with a boolean flag

* Do not close the pinned drawer on unpin

* Revert "Do not close the pinned drawer on unpin"

This reverts commit e3b34e9a58.

* Refactor slideToggle options

* ease-in-out

* Don't skip frame on drawer toggle
2024-12-20 22:20:46 +02:00
Cohee
4232f6c5f4 More null checks for llamacpp logprobs parser 2024-12-20 22:00:36 +02:00
Cohee
1dd97c139e Text Completion: Improve generic source model display 2024-12-20 20:59:36 +02:00
Cohee
7e7b3e30c4 Tool Calling: Implement stealth tool defintions (#3192)
* Tool Calling: Implement stealth tool defintions

* Move isStealth check up

* Always stop generation on stealth tool calls

* Image Generation: use stealth flag for tool registration

* Update stealth property description to clarify no follow-up generation will be performed

* Revert "Image Generation: use stealth flag for tool registration"

This reverts commit 8d13445c0b.
2024-12-19 21:17:47 +02:00
Cohee
e83182c03b Image Generation: Add tool message visibility toggle 2024-12-19 19:33:29 +02:00
Cohee
f3c12fb926 Merge pull request #3205 from SillyTavern/forbid-empty-varnames
Do not allow empty or undefined variable names.
2024-12-19 19:16:20 +02:00
Cohee
d5ed0f6cdf Also check global variable names 2024-12-19 19:15:04 +02:00
Cohee
503c3ad22b Merge pull request #3206 from DocShotgun/staging
Add DRY to llama.cpp sampler order
2024-12-19 10:40:23 +02:00
DocShotgun
6193eb14da Add DRY to llama.cpp sampler order 2024-12-18 19:04:49 -08:00
Cohee
372ac26080 Do not allow empty or undefined variable names.
Closes #3204
2024-12-18 20:22:27 +02:00
Cohee
00363cc206 Merge branch 'release' into staging 2024-12-17 21:44:28 +02:00
Cohee
dbc78c1c42 Fix OpenRouter caching at depth with null model selection 2024-12-17 21:40:33 +02:00
Cohee
8753ae34be Merge pull request #3193 from cloak1505/r7b
Add Cohere command-r7b-12-2024
2024-12-17 12:18:54 +02:00
Cohee
a6f37880e2 Merge pull request #3198 from ceruleandeep/i18n/generateImage
Fix i18n tags for Generate Image/Stop Image Generation, add translations
2024-12-17 07:55:08 +02:00
Cohee
7eacdac665 Add bypass status check for Generic TC API type 2024-12-16 21:29:41 +02:00
Cohee
0819588e7a Merge pull request #3190 from M0ch0/staging
Update for Latest Google AI Studio
2024-12-16 21:04:44 +02:00
Cohee
0180e01c25 Merge pull request #3195 from RivelleDays/patch-2
Update zh-tw.json
2024-12-16 20:32:20 +02:00
ceruleandeep
b094a355c0 Remove spurious attrib tags inserted by getMissingTranslations 2024-12-16 22:43:14 +11:00
ceruleandeep
2ef9f5d748 Fix i18n for Prompt Inspector in wand menu 2024-12-16 21:31:47 +11:00
ceruleandeep
247a23bda9 Fix i18n for "Generate Caption" in wand menu 2024-12-16 20:51:29 +11:00
ceruleandeep
0ea4494dea Fix i18n tags for Generate Image/Stop Image Generation, add translations 2024-12-16 20:03:40 +11:00
Rivelle
d8b1fd3b0b Update zh-tw.json
Adjust translation terms to align with actual functionality.
2024-12-16 15:41:01 +08:00
M0cho
3f253f42f2 Update: [constants.js] Remove BISON_SAFETY 2024-12-16 12:45:30 +09:00
M0cho
0e3b4335eb Update: [prompt-converters.js] Remove entire dummy img codes 2024-12-16 12:44:02 +09:00
cloak1505
ce536201e6 Fix Cohere context sizes 2024-12-15 17:12:58 -06:00
cloak1505
12cc607754 Replace invalid aya-23 model name 2024-12-15 17:12:45 -06:00
cloak1505
266b181d49 Add Cohere command-r7b-12-2024
Also slightly reorder model list
2024-12-15 14:47:22 -06:00
Cohee
2d66b7204a Fixes to group join examples parsing 2024-12-15 18:09:17 +02:00
Cohee
e49301308c Merge pull request #3189 from Succubyss/substr
Add /substr command
2024-12-15 17:27:00 +02:00
Cohee
4c3b987ee4 Merge pull request #3188 from InspectorCaracal/fix-double-prefix-2
Fix double prefix mk 2
2024-12-15 17:05:26 +02:00
M0cho
d16f5a24f4 Update: [prompt-converters.js] Remove gemini-pro-vision from constants
Removed gemini-pro-vision from visionSupportedModels. Also removed dummyRequiredModels as Gemini Pro, its cause, has been deleted.
2024-12-15 13:07:02 +09:00
M0cho
43feffdfae Update: [chat-completions.js] Update sendMakerSuiteRequest function
Removed branching logic for differences in JSON request body between PaLM and Gemini, following the removal of PaLM from Google AI Studio.
2024-12-15 13:06:48 +09:00
M0cho
9ea8fc92e4 Update: [openai.js] Remove deleted GAI models from context length checks
Removed gemini-pro-vision and text-bison-001 (PaLM) from context length checks.
2024-12-15 13:06:30 +09:00
M0cho
9cab0618b6 Update: [caption/settings.html] Remove GAI version of gemini-pro-vision
Retained the OpenRouter version, as it is still available via Vertex.
2024-12-15 12:43:16 +09:00
M0cho
58213d0ab0 Update: [index.html] Fixed inconsistent notation of GAI models
Corrected the text from "Experiment" to "Experimental" to align with the terminology used on https://aistudio.google.com/.
2024-12-15 12:29:44 +09:00
M0cho
954ed6c2b2 Update: [index.html] Remove PaLM from GAI models
The PaLM family (PaLM 2, PaLM 2 Chat) is no longer available on AI Studio.
```
Google AI Studio API returned error: 404 Not Found {
  "error": {
    "code": 404,
    "message": "Requested entity was not found.",
    "status": "NOT_FOUND"
  }
```
2024-12-15 12:28:37 +09:00
M0cho
df5f69dc66 Update: [index.html] Added notes for deprecated GAI models
Based on https://ai.google.dev/gemini-api/docs/models/gemini, the 1.0 Pro model has been marked as deprecated.
2024-12-15 12:18:34 +09:00
M0cho
e762405cba Update: [index.html] Remove GAI models deleted from the API
The 1.0 Pro Vision model has already been removed.
```
Google AI Studio API returned error: 404 Not Found {
  "error": {
    "code": 404,
    "message": "Gemini 1.0 Pro Vision has been deprecated on July 12, 2024. Consider switching to a different model, for example gemini-1.5-flash.",
    "status": "NOT_FOUND"
  }
}
```
2024-12-15 12:11:56 +09:00
Succubyss
6fce056b8c Add /substr command 2024-12-14 19:25:09 -06:00
InspectorCaracal
b8fc9f2194 Fix name-inclusion logic check 2024-12-14 15:10:31 -07:00
Cohee
713c05f808 Add /getcharlore and /getpersonalore commands
Closes #3183
2024-12-14 18:48:14 +02:00
Cohee
e960ae64c5 Add a name argument for /getchatbook
Closes #2599
2024-12-14 18:20:13 +02:00
Cohee
8811010c73 Merge pull request #3181 from SillyTavern/tc-split-generic
Add generic text completion API type (100% OAI compatible)
2024-12-14 16:05:44 +02:00
Cohee
e15e6dc3bd One more example of generic endpoint 2024-12-14 16:04:01 +02:00
Cohee
756f88b5aa Merge branch 'staging' into tc-split-generic 2024-12-14 15:24:10 +02:00
Cohee
5c1a9a3003 Merge pull request #3187 from InspectorCaracal/fix-double-prefix
Fix example messages being double-prefixed for group chats
2024-12-14 15:17:56 +02:00
Cohee
a7e8d00145 Use Array.includes 2024-12-14 15:16:43 +02:00
Cohee
103251070f Merge pull request #3186 from Succubyss/getcontext_gettexttokens
Expose `tokenizers` & `getTextTokens` in `getContext`
2024-12-14 14:14:00 +02:00
InspectorCaracal
1ef25d6176 fix double-prefixing on example messages 2024-12-13 17:56:06 -07:00
Succubyss
0e5100180b expose tokenizers & getTextTokens in getContext 2024-12-13 16:29:34 -06:00
Cohee
cd0b834291 Implement "except" mode for type-specific controls in settings 2024-12-13 20:58:16 +02:00
Cohee
f9eb720f2a Merge pull request #3185 from SillyTavern/inject-filter
Inject filter
2024-12-13 19:49:49 +02:00
Cohee
6f4350b3a7 Add error handler to filter closure executor 2024-12-13 01:23:13 +02:00
Cohee
294b15976c Add validation for filter inject argument 2024-12-13 01:20:43 +02:00
Cohee
3167019faf Add generic text completion API type (100% OAI compatible) 2024-12-13 01:12:10 +02:00
Cohee
d1932f4cb5 Merge branch 'staging' into inject-filter 2024-12-13 00:03:03 +02:00
Cohee
e7b53dcb46 Merge branch 'release' into staging 2024-12-13 00:02:38 +02:00
Cohee
205f1d7adb Add filter arg for inject command 2024-12-13 00:02:24 +02:00
Cohee
47dea8159e Merge branch 'staging' into inject-filter 2024-12-12 23:35:23 +02:00
Cohee
79e3dda1df Merge pull request #3178 from ptm0000/release
Add korean readme
2024-12-12 16:52:31 +02:00
ptm0000
fa62326eeb Update readme-ko_kr.md 2024-12-12 21:25:52 +09:00
ptm0000
10835de6e2 Update readme-ko_kr.md 2024-12-12 21:20:51 +09:00
Cohee
5c82ccf435 Refactor endpoints/chats.js
1. Move formatBytes utility to util.js
2. Fix type error related to dates sorting
3. Add type to backupFunctions map
2024-12-12 14:07:37 +02:00
ptm0000
b94ed54283 Update readme-ko_kr.md 2024-12-12 20:12:36 +09:00
ptm0000
f05ad26969 add korean readme 2024-12-12 19:57:53 +09:00
Cohee
cf1b98e25d Add 'gemini-2.0-flash-exp' to supported vision models 2024-12-11 23:40:45 +02:00
Cohee
c4c9f43a60 Merge pull request #3176 from M0ch0/staging
Support Gemini-2.0-flash-exp
2024-12-11 23:39:55 +02:00
M0cho
67cb89f634 Sort Gemini-Subversion: gemini-exp-series by date 2024-12-12 06:33:21 +09:00
M0cho
a64c8ade9d Support Gemini 2.0 Flash-exp 2024-12-12 06:31:27 +09:00
Cohee
0090d68559 Fix title of checkbox 2024-12-11 23:25:52 +02:00
Cohee
d9e0df0884 Extensions: stable manifests sorting if conflicts in loading order 2024-12-11 23:00:57 +02:00
Cohee
7b0d854fe6 Add header to extensions list console log 2024-12-11 22:46:12 +02:00
Cohee
9e8277882c Docker: combine entrypoints 2024-12-11 21:38:39 +02:00
Cohee
5f8989437e Merge pull request #3169 from yarathenomad/docker-add-ssl
Add SSL support to the Docker image
2024-12-11 21:30:23 +02:00
Cohee
f677b914f7 Merge branch 'staging' into docker-add-ssl 2024-12-11 18:39:35 +02:00
Cohee
c05265d1a1 Merge pull request #3158 from SillyTavern/max-total-chat-backups
Add maxTotalChatBackups config.yaml value
2024-12-11 18:38:58 +02:00
Cohee
363c36da9c Merge branch 'staging' into max-total-chat-backups 2024-12-11 18:36:03 +02:00
Cohee
3698f40709 Merge pull request #3146 from SillyTavern/persona-lorebook
Persona lorebook
2024-12-11 18:35:05 +02:00
Cohee
16c2183fd0 Add filter for active persona LB button 2024-12-11 18:30:36 +02:00
Cohee
3be17e2ed8 Merge branch 'staging' into persona-lorebook 2024-12-11 18:25:58 +02:00
Cohee
00006aa072 Merge pull request #3145 from SillyTavern/redesign-extension-manager
Redesign extension manager
2024-12-11 18:24:17 +02:00
Cohee
62be0939d0 Refactor manifests sorting 2024-12-11 18:20:29 +02:00
Cohee
bc94ff7800 Preserve scrollTop on popup reopen 2024-12-11 18:09:30 +02:00
Cohee
84bc14dfe5 Merge branch 'staging' into redesign-extension-manager 2024-12-11 17:50:28 +02:00
Cohee
0e81fb6a4a Async logic fixes 2024-12-11 17:49:03 +02:00
Cohee
4bf58ca2d5 Merge branch 'release' into staging 2024-12-11 17:44:33 +02:00
Cohee
003d17b2c5 Merge pull request #3173 from ceruleandeep/redesign-extension-manager
Redesign extension manager
2024-12-11 17:43:57 +02:00
ceruleandeep
58ac746442 Show error popup if extension update fails 2024-12-11 19:37:21 +11:00
ceruleandeep
19c18d54f5 If cannot get current commit hash for a repo, mark it as up to date 2024-12-11 19:17:11 +11:00
ceruleandeep
9c08f20e06 Add aider logs and env to gitignore 2024-12-11 12:34:58 +11:00
Cohee
e773678f2d Prompt Manager: forbid overrides if a prompt is disabled 2024-12-11 02:19:13 +02:00
YaraTheNomad
01dec6466c Docker image now allows passing CLI args to node 2024-12-10 16:05:13 +00:00
Cohee
bcfb07de5e New llama-3.3 Groq model
Closes #3168
2024-12-10 17:59:59 +02:00
Cohee
df8e0ba923 Don't insert non-HTTP links to extension origin 2024-12-10 00:01:54 +02:00
Cohee
5a01eb8eb1 Ok, the manifest version can stay 2024-12-09 23:55:08 +02:00
Cohee
f5088b398f Improve styles of extension blocks 2024-12-09 22:37:43 +02:00
Cohee
3c82d961bd Batch extension version checks 2024-12-09 22:24:02 +02:00
Cohee
c5b3ce0d5c Merge branch 'staging' into redesign-extension-manager 2024-12-09 22:12:50 +02:00
Cohee
050f485a5b Merge pull request #3162 from alexdenton123/patch-1
Update index.js
2024-12-09 18:51:17 +02:00
Cohee
2922f19a2a Merge pull request #3165 from AlpinDale/default_order
aphrodite: send an empty list if using the default sampler priority
2024-12-09 17:34:11 +02:00
Cohee
cc73a45d1f Make lint happy 2024-12-09 17:32:23 +02:00
AlpinDale
bcbfcb87b5 aphrodite: send an empty sampler priority list if using the default order 2024-12-09 14:05:33 +00:00
Cohee
66f02f59c0 Merge pull request #3132 from AlpinDale/sampler_order
aphrodite: sampler order block
2024-12-09 15:27:30 +02:00
Cohee
323b9407df Small cosmetic fixes 2024-12-09 15:26:57 +02:00
Cohee
3ed5d892f7 Fix bugs with the settings 2024-12-09 15:13:19 +02:00
Cohee
d2a39f7de8 Update readme-zh_tw.md 2024-12-09 13:03:47 +02:00
Cohee
b500406c2f Merge pull request #3163 from RivelleDays/release
Create readme-zh_tw.md
2024-12-09 13:02:26 +02:00
Rivelle
099744b298 Update readme-de_de.md 2024-12-09 19:00:53 +08:00
Rivelle
024213a8e4 Update readme-ja_jp.md 2024-12-09 19:00:39 +08:00
Rivelle
c268713d84 Update readme-ru_ru.md 2024-12-09 19:00:26 +08:00
Rivelle
1d0664a197 Update readme-zh_cn.md 2024-12-09 19:00:12 +08:00
Rivelle
ece0cc9080 Update readme.md 2024-12-09 18:59:51 +08:00
Cohee
5166720f07 Merge pull request #3164 from RivelleDays/patch-1
Update zh-tw.json: Improved Translation Quality and Terminology Consistency
2024-12-09 12:17:30 +02:00
Rivelle
60caa67667 Update zh-tw.json 2024-12-09 14:29:10 +08:00
Rivelle
d9ee8aa3dc Update zh-tw.json 2024-12-09 14:26:46 +08:00
Rivelle
7a463708bd Create readme-zh_tw.md
The readme.md file has been translated into Traditional Chinese. The translation uses concise, professional, and neutral language, tailored to the preferences of Traditional Chinese users, particularly those in Taiwan.
2024-12-09 13:10:29 +08:00
Alex Denton
f98f83471a Update index.js
Changes for LLM API
- Avoid sending partial API requests when streaming.
- Avoid checking character length when using API as it can afford more characters.
2024-12-08 23:31:03 +01:00
Cohee
c842c6f238 Merge branch 'staging' into redesign-extension-manager 2024-12-08 16:30:16 +02:00
Cohee
9a13128398 Merge pull request #3159 from RivelleDays/patch-1
Enhance zh-tw.json: Completing and Refining Previous Translations
2024-12-08 14:34:55 +02:00
Cohee
210fac321b Move config reading to top-level 2024-12-08 14:05:14 +02:00
Cohee
7098e17d22 Change default value of maxTotalChatBackups 2024-12-08 14:04:13 +02:00
Rivelle
e21931b6eb Update zh-tw.json
Translated previously incomplete sections.
Refined certain terms for improved professionalism and neutrality. Key adjustments include:
1. The previous translator rendered "Persona" as "玩家角色" (player character). This has been revised to "使用者" (user) to avoid giving SillyTavern the impression of being a game.
2. Simplified "角色人物卡" (character profile card) to "角色卡" (character card), as current character cards may represent non-human entities, non-living objects, or even settings. Removing "人物" (character) does not impact clarity.
3. Unified the translation of "Tokenizer" as "分詞器" (tokenizer), which is more common in professional discussions in Traditional Chinese.
4. Translated "Global" as "全域" (global), aligning better with technical terminology.
5. Revised certain translations to better match their intended functionalities, such as:
   - "Reduced Motion" is more accurately described as "減少介面的動畫效果" (reduce interface animations).
   - "Auto-Expand Message Actions" is now "展開訊息快速編輯選單工具" (expand quick edit menu for messages).
2024-12-08 18:27:44 +08:00
Cohee
12db782a30 Merge branch 'release' into staging 2024-12-08 01:00:39 +02:00
Cohee
1d3abf54a5 Move AllTalk event handlers setup up 2024-12-08 00:48:44 +02:00
Cohee
1ecc65f5fe Log failed image decoding 2024-12-07 22:49:21 +02:00
Cohee
87535c6ec8 Merge branch 'staging' into redesign-extension-manager 2024-12-07 20:34:10 +02:00
Cohee
0638953a20 Clean-up debug logs 2024-12-07 20:34:01 +02:00
Cohee
126616d539 Refactor and JSDoc extensions.js 2024-12-07 20:31:16 +02:00
Cohee
83965fb611 Implement move extensions 2024-12-07 18:42:37 +02:00
Cohee
c33649753b Improve extension type indication 2024-12-07 18:12:27 +02:00
Cohee
abe51682c8 [wip] Add global extensions 2024-12-07 17:10:26 +02:00
Cohee
84d2530c52 Merge branch 'staging' into persona-lorebook 2024-12-07 15:52:23 +02:00
Cohee
bea991b665 Merge branch 'staging' into redesign-extension-manager 2024-12-07 15:49:44 +02:00
Cohee
3849908fe1 Add maxTotalChatBackups config.yaml value 2024-12-07 15:37:57 +02:00
Cohee
bf4357774d Merge pull request #3156 from SillyTavern/staging
Staging
2024-12-07 15:12:23 +02:00
Cohee
54ca9477dd Bump package version 2024-12-07 14:53:13 +02:00
Cohee
8574a5dd27 Improve KAI lite import 2024-12-07 14:50:24 +02:00
Cohee
f6b9cd970d Add gemini-exp-1206 to supported image prompt models 2024-12-07 14:36:53 +02:00
AlpinDale
add108b821 fix the JS issue where both ooba and aphro were using the same container ID 2024-12-07 12:36:10 +00:00
AlpinDale
a1115ab4ff Merge remote-tracking branch 'alpin/staging' into sampler_order 2024-12-07 12:27:55 +00:00
Cohee
b8a9a55246 Fix group candidates fuzzy filter 2024-12-06 23:04:18 +02:00
Cohee
51f89aaf7b Merge pull request #3152 from SillyTavern/getcontext-typed
Add types for SillyTavern.getContext
2024-12-06 22:20:57 +02:00
Cohee
0849cfca98 Remove unused imports 2024-12-06 22:13:34 +02:00
Cohee
485e9e2eaa Fix redundancy in getContext. Add power user settings 2024-12-06 21:54:07 +02:00
Cohee
3ae858113b Set strict function binds in jsconfig 2024-12-06 21:50:08 +02:00
Cohee
192a1f4014 getContext: Simplify chatId access 2024-12-06 21:41:04 +02:00
Cohee
0da4590597 Merge branch 'staging' into getcontext-typed 2024-12-06 21:31:53 +02:00
Cohee
3ed095bb0e Merge pull request #3154 from SillyTavern/optimize-past-swipes
Optimize past swipes
2024-12-06 21:31:19 +02:00
Cohee
22ea5f3c3c Lint fix 2024-12-06 21:30:05 +02:00
Cohee
c78cb3b463 Merge pull request #3153 from M0ch0/staging
Support Gemini-exp-1206
2024-12-06 21:29:19 +02:00
Cohee
1a8e37d3a5 Remove counter hide on right swipe 2024-12-06 20:54:45 +02:00
Cohee
d5221760a3 Hide swipe counter with visibility 2024-12-06 20:24:22 +02:00
Cohee
dce63f52c0 Remove SD module worker 2024-12-06 20:21:01 +02:00
Cohee
d6f34f7b2c Add prompt injection filters 2024-12-06 19:53:02 +02:00
M0cho
073b76a693 Support Gemini-exp-1206 2024-12-07 02:19:15 +09:00
Cohee
9c43999e4b Fix /tools-unregister 2024-12-06 17:15:40 +02:00
Cohee
8663c88ae8 Merge branch 'release' into staging 2024-12-06 16:59:46 +02:00
Cohee
7b732edf61 Fix npm audit 2024-12-06 16:59:39 +02:00
Cohee
77841dbc21 Add types for SillyTavern.getContext 2024-12-06 16:41:26 +02:00
Cohee
3502bfcaa0 Add {{groupNotMuted}} 2024-12-05 22:57:02 +02:00
Cohee
f5f60e269e Merge pull request #3150 from Succubyss/getpromptentry
add /getpromptentry command
2024-12-05 22:06:38 +02:00
Cohee
7dfba69fc1 Import promptManager from openai.js 2024-12-05 22:06:16 +02:00
Succubyss
4cf5d1535e add /getpromptentry command 2024-12-05 12:38:21 -06:00
Cohee
7f9766c918 Merge pull request #3144 from Meus-Artis/patch-1
Better console output
2024-12-05 18:56:39 +02:00
Cohee
e55748fe92 Fix Date constructor call 2024-12-05 18:55:17 +02:00
Cohee
a137c23116 Merge pull request #3148 from IceFog72/release
Small css fix.
2024-12-05 18:51:04 +02:00
Cohee
63f9f33e20 calc() is not needed 2024-12-05 18:50:20 +02:00
Cohee
3dd1e25a3b Hide past swipes with opacity 2024-12-05 15:56:17 +00:00
Cohee
23a10fdc22 Optimize past swipe counters performance 2024-12-05 15:32:30 +00:00
Cohee
373a0ad321 Add config.yaml value for cards cache capacity. 2024-12-05 12:59:03 +00:00
IceFog72
960db2d59b Update tts/style.css
.at-settings-separator padding fix
2024-12-05 03:25:13 +02:00
IceFog72
3d8f8d90c3 Update stable-diffusion/style.css
#sd_dropdown backdrop-filter fix
2024-12-05 03:23:11 +02:00
Cohee
41a3035a2a Use filter order in group candidates list 2024-12-04 15:22:53 +00:00
Cohee
a702dab68b Alt+Click to open lorebook 2024-12-04 13:53:10 +00:00
Cohee
efe25ddc04 Merge branch 'staging' into persona-lorebook 2024-12-04 13:35:54 +00:00
Cohee
a7c8b93652 Merge pull request #3147 from SillyTavern/off-by-one
Fix -0 comparison
2024-12-04 15:35:16 +02:00
Cohee
23e59a1189 Document that -0 is supported 2024-12-04 12:57:02 +00:00
Cohee
e9fc488661 Properly check for -0 2024-12-04 12:53:34 +00:00
Cohee
2ef095c273 Merge branch 'release' into staging 2024-12-04 01:35:50 +02:00
Cohee
e6be28acea llama.cpp: Don't send empty DRY sequence breakers
Fixes #3048
2024-12-04 01:32:27 +02:00
Cohee
fb1f890974 Merge branch 'release' into staging 2024-12-04 01:05:56 +02:00
Cohee
8ef49b40b2 Add error handling to group parsing in chat search 2024-12-04 01:05:14 +02:00
Cohee
79700fd983 Add Kobold Lite chats import 2024-12-04 00:44:50 +02:00
Cohee
8de1d26eaa NanoGPT: Unhide sampling parameters 2024-12-04 00:00:08 +02:00
Cohee
69da293fb9 Show used preset in itemization dialog 2024-12-03 23:27:39 +02:00
Cohee
cb21162558 No dangling promise 2024-12-03 22:56:19 +02:00
Cohee
bab9d3c74b Merge branch 'staging' into persona-lorebook 2024-12-03 22:54:42 +02:00
Cohee
9960db0ae2 Redesign extension manager 2024-12-03 22:48:10 +02:00
Meus Artis
4466da63bc Update users-public.js
Replace session touch timestamp with Date()
2024-12-03 14:56:40 -05:00
Cohee
7ce2841588 Add trim_stop to koboldcpp requests
Fixes #3143
2024-12-03 14:49:20 +00:00
Meus Artis
c3f988f246 Update users-public.js
Better/more detailed console output for multi-user installs
2024-12-03 01:09:41 -05:00
AlpinDale
80c8e83f09 use strings instead of IDs 2024-12-03 01:46:51 +00:00
AlpinDale
86b4247767 Merge remote-tracking branch 'alpin/staging' into sampler_order 2024-12-03 01:27:08 +00:00
Cohee
36051fa5db Merge pull request #3141 from Ivruix/docker-instructions-russian 2024-12-03 02:03:11 +02:00
Cohee
980ebb2fbc Merge pull request #3142 from AlpinDale/aphrodite_dry_range 2024-12-03 02:01:42 +02:00
AlpinDale
1c803972cd aphrodite: add range parameter for DRY 2024-12-02 22:11:04 +00:00
Ivruix
82dff4f204 Add docker tutorial to Russian readme 2024-12-02 20:37:17 +00:00
Cohee
af582f43a6 [wip] Persona lorebook 2024-12-02 02:52:00 +02:00
Cohee
b08cdffc64 Add {{lastGenerationType}} macro 2024-12-02 01:39:57 +02:00
Cohee
ce34f14f19 Merge pull request #3137 from SillyTavern/dependabot/npm_and_yarn/tests/cross-spawn-7.0.6
Bump cross-spawn from 7.0.3 to 7.0.6 in /tests
2024-12-01 17:41:37 +02:00
dependabot[bot]
ade6980037 Bump cross-spawn from 7.0.3 to 7.0.6 in /tests
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-01 15:40:45 +00:00
Cohee
de3f340a55 Merge pull request #3135 from SillyTavern/staging
Staging
2024-12-01 17:31:30 +02:00
Cohee
39c3924b3f Merge pull request #3112 from kallewoof/202411-backend-maxctx
feature: allow auto-use of max context size given by backend
2024-12-01 15:15:15 +02:00
Cohee
8e94589f83 Revert keepContextLock flag in setGenerationParamsFromPreset 2024-12-01 15:13:17 +02:00
Cohee
66a862f797 Lint the use of data-i18n attributes 2024-12-01 15:10:22 +02:00
Cohee
c930a66d81 Merge branch 'staging' into 202411-backend-maxctx 2024-12-01 14:39:01 +02:00
Cohee
89ec8fd23a Bump package version 2024-12-01 14:38:17 +02:00
AlpinDale
d1a654f41f add to index.html 2024-12-01 02:37:11 +00:00
Cohee
a86735d743 Fix sendless statuses 2024-11-30 19:30:14 +02:00
Cohee
56c99000c4 Split auto-switch toast 2024-11-30 18:21:15 +02:00
Cohee
4a7a11dfd5 Add JSdoc for function 2024-11-30 18:19:31 +02:00
Cohee
8e20ebb534 Run eslint 2024-11-30 18:14:46 +02:00
Cohee
04b68d2cce Move derive context size to TC settings 2024-11-30 18:08:12 +02:00
Cohee
c3c16ea0d6 Merge pull request #3106 from joenunezb/optimize/improve-search
perf(search): improve fuzzy character search performance by ~13x (4.5s → 350ms)
2024-11-30 17:50:40 +02:00
Cohee
8b7a14f895 Merge pull request #3124 from ceruleandeep/feature/actuallyCompactContextMenus
Filter out hidden items in context menus
2024-11-30 17:39:50 +02:00
ceruleandeep
2f7bc7ca8d Filter out hidden items in context menus
Add CSS to apply label show/hide settings to QRs in context menus

Add provision for QR set applied to one of its own buttons as "burger" menu
2024-11-30 00:46:04 +11:00
Cohee
a444a782e2 Fix input outline on discreet login page 2024-11-29 13:32:53 +00:00
Cohee
0bebf02c97 Merge pull request #3119 from SillyTavern/webpack-memory
Replace webpack-dev-middleware with a statically compiled file
2024-11-29 15:24:53 +02:00
Cohee
7fbff41329 Unasync route handler 2024-11-29 13:14:40 +00:00
Cohee
53514b5e1a Prettify compilation console logs 2024-11-29 13:12:46 +00:00
Cohee
c0b37631bc Merge branch 'staging' into webpack-memory 2024-11-29 13:07:17 +00:00
Cohee
e124a22ffd Merge pull request #3120 from SillyTavern/char-cache-limit
(perf) Add 100MB limit to parsed characters cache
2024-11-29 15:04:03 +02:00
Cohee
095d19cda7 Rename LimitedMap => MemoryLimitedMap 2024-11-29 12:33:48 +00:00
Cohee
176ef77624 Merge branch 'staging' into char-cache-limit 2024-11-29 12:30:26 +00:00
Cohee
2384031d09 Merge pull request #3121 from ceruleandeep/fix/handleIdForQRMenuAdd
Wire up id= parameter for /qr-context*
2024-11-29 14:27:57 +02:00
Cohee
710a4ee867 Merge pull request #3122 from ceruleandeep/feature/compactererQRContextMenus
Make QR context menu display options more consistent with QR bar
2024-11-29 14:17:24 +02:00
ceruleandeep
3a1a955164 Make QR context menu display options more consistent with QR bar
Use QR title as tooltip if set on the QR

Add qr--hidden class to "invisible" context items to allow hiding with CSS

Add title and isHidden props to MenuItem

Remove domIcon and domLabel props: not needed for ctx menu rendering; isForceExpanded: unimplemented
2024-11-29 17:44:51 +11:00
ceruleandeep
e8004b5b56 Wire up id= parameter for /qr-context*
Parameter is in the named arguments but was not handled in the handler. Added `args.id !== undefined ? Number(args.id) : args.label` etc, as used elsewhere.
2024-11-29 11:52:57 +11:00
Cohee
c873362d01 Safer estimation of possibly undefined values 2024-11-29 01:28:10 +02:00
Cohee
52606616c4 Add 100MB limit to parsed characters cache 2024-11-29 01:06:10 +02:00
Cohee
768b3e48f7 Remove webpack watch unhook 2024-11-29 00:25:31 +02:00
Cohee
afccb8517a Ditch webpack-dev-middleware 2024-11-29 00:13:43 +02:00
Cohee
b5c2ecdfcc Webpack: cache lib.js to disk to prevent occasional OOM 2024-11-28 22:47:27 +02:00
Cohee
afb4acc19b Revert "Webpack: cache lib.js to disk to prevent occasional OOM"
This reverts commit f630c8892a.
2024-11-28 22:45:45 +02:00
Cohee
f630c8892a Webpack: cache lib.js to disk to prevent occasional OOM 2024-11-28 22:39:20 +02:00
Cohee
4f24f8078d Merge pull request #3118 from kallewoof/202411-tulu-nl
tulu template: added \n to input/system_suffix to match model card
2024-11-28 14:38:45 +02:00
Cohee
8bfb695536 Adjust documentation links 2024-11-28 11:38:10 +00:00
Karl-Johan Alm
ef35adb9e4 tulu template: added \n to input_suffix and system_suffix to match model card 2024-11-28 13:04:40 +09:00
Cohee
76c2789587 Merge pull request #3117 from kallewoof/202411-tulu
Add Tulu templates
2024-11-27 12:31:44 +02:00
Joe
f4ef9697e9 Account for optional cache and remove timing code 2024-11-26 20:07:30 -08:00
Joe
309157dd89 Remove unnecesary key only clearing for cache clearing 2024-11-26 19:52:21 -08:00
Joe
1395c0b8c6 Encapsulate logic into filters instead of spreading around 2024-11-26 19:47:09 -08:00
Karl-Johan Alm
8d67bdee84 Add Tulu templates 2024-11-27 11:58:12 +09:00
Joe
78c55558af Merge branch 'staging' of https://github.com/joenunezb/SillyTavern into optimize/improve-search 2024-11-26 18:00:28 -08:00
Joe
dd4a1bf072 Attempt to allow preview for github 2024-11-26 13:32:40 -08:00
Joe
16ba8331b5 Document Fuzzy Search process 2024-11-26 13:27:27 -08:00
Cohee
8dbd78f560 Merge pull request #3108 from SillyTavern/claude-no-filler
Claude: remove user filler from prompt converter
2024-11-26 21:41:33 +02:00
Cohee
f730e2179b Merge branch 'staging' into claude-no-filler 2024-11-26 21:25:47 +02:00
Karl-Johan Alm
faf80d1b62 UI: move the derived context size flag into connection pane 2024-11-26 10:36:40 +09:00
Karl-Johan Alm
e02f57b7b0 respect context unlocked flag when auto-setting context size 2024-11-26 10:00:52 +09:00
Karl-Johan Alm
4988f22e94 feature: allow auto-use of max context size given by backend 2024-11-25 23:08:11 +09:00
Joe
e56faaaed5 Remove hash function 2024-11-24 14:55:22 -08:00
Joe
e1d6a47048 Remove key hashing and explicitly clear the cache after printing characters 2024-11-24 14:54:12 -08:00
Cohee
9382845dee Claude: remove user filler from prompt converter 2024-11-24 19:05:41 +02:00
Joe
d1cac298c6 Coment out log statements 2024-11-23 22:51:48 -08:00
Joe
e2c083ba31 Remove duplicated code 2024-11-23 22:34:56 -08:00
Joe
2661881bc4 Handle stale cache 2024-11-23 22:13:20 -08:00
Joe
eb29f03ab0 Sped up character search by 93% 2024-11-23 20:48:36 -08:00
294 changed files with 26872 additions and 10853 deletions

View File

@@ -12,3 +12,4 @@ access.log
/data /data
/cache /cache
.DS_Store .DS_Store
/public/scripts/extensions/third-party

View File

@@ -54,6 +54,7 @@ module.exports = {
}, },
// These scripts are loaded in HTML; tell ESLint not to complain about them being undefined // These scripts are loaded in HTML; tell ESLint not to complain about them being undefined
globals: { globals: {
globalThis: 'readonly',
ePub: 'readonly', ePub: 'readonly',
pdfjsLib: 'readonly', pdfjsLib: 'readonly',
toastr: 'readonly', toastr: 'readonly',
@@ -74,6 +75,7 @@ module.exports = {
'plugins/**', 'plugins/**',
'**/*.min.js', '**/*.min.js',
'public/scripts/extensions/quick-reply/lib/**', 'public/scripts/extensions/quick-reply/lib/**',
'public/scripts/extensions/tts/lib/**',
], ],
rules: { rules: {
'no-unused-vars': ['error', { args: 'none' }], 'no-unused-vars': ['error', { args: 'none' }],
@@ -90,6 +92,8 @@ module.exports = {
'space-infix-ops': 'error', 'space-infix-ops': 'error',
'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }], 'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }],
'no-cond-assign': 'error', 'no-cond-assign': 'error',
'no-unneeded-ternary': 'error',
'no-irregular-whitespace': ['error', { skipStrings: true, skipTemplates: true }],
// These rules should eventually be enabled. // These rules should eventually be enabled.
'no-async-promise-executor': 'off', 'no-async-promise-executor': 'off',

View File

@@ -1,4 +1,5 @@
name: Bug Report 🐛 name: Bug Report 🐛
type: Bug
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! Please use English only. 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! Please use English only.
title: '[BUG] <title>' title: '[BUG] <title>'
labels: ['🐛 Bug'] labels: ['🐛 Bug']
@@ -80,6 +81,8 @@ body:
required: true required: true
- label: I have checked the [docs](https://docs.sillytavern.app/) ![important](https://img.shields.io/badge/Important!-F6094E) - label: I have checked the [docs](https://docs.sillytavern.app/) ![important](https://img.shields.io/badge/Important!-F6094E)
required: true required: true
- label: I confirm that my issue is not related to third-party content, unofficial extension or patch. If in doubt, check with a new [user account](https://docs.sillytavern.app/administration/multi-user/) and with extensions disabled
required: true
- type: markdown - type: markdown
attributes: attributes:

View File

@@ -1,4 +1,5 @@
name: Feature Request ✨ name: Feature Request ✨
type: Feature
description: Suggest an idea for future development of this project. Please use English only. description: Suggest an idea for future development of this project. Please use English only.
title: '[FEATURE_REQUEST] <title>' title: '[FEATURE_REQUEST] <title>'
labels: ['🦄 Feature Request'] labels: ['🦄 Feature Request']
@@ -32,7 +33,7 @@ body:
id: solution id: solution
attributes: attributes:
label: Describe the solution you'd like 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 placeholder: An outline of how you would like this to be implemented, include as much details as possible
validations: validations:
required: true required: true

View File

@@ -1,2 +0,0 @@
🐛 Bug: ✅ Fixed
🦄 Feature Request: ✅ Implemented

View File

@@ -1,62 +0,0 @@
comment:
footer: |
---
> I am a bot, and this is an automated message 🤖
labels:
- name: ✖️ Invalid
labeled:
issue:
action: close
body: >
Hello @{{ issue.user.login }} your ticket has been marked as invalid.
Please ensure you follow the issue template, provide all requested info,
and be sure to check the docs + previous issues prior to raising tickets.
pr:
body: Thank you @{{ pull_request.user.login }} for suggesting this. Please follow the pull request templates.
action: close
- name: 👩‍💻 Good First Issue
labeled:
issue:
body: >
This issue has been marked as a good first issue for first-time contributors to implement!
This is a great way to support the project, while also improving your skills, you'll also be credited as a contributor once your PR is merged.
If you're new to SillyTavern [here are a collection of resources](https://docs.sillytavern.app/)
If you need any support at all, feel free to reach out via [Discord](https://discord.gg/sillytavern).
- name: ❌ wontfix
labeled:
issue:
action: close
body: >
This ticked has been marked as 'wontfix', which usually means it is out-of-scope, or not feasible at this time.
You can still fork the project and make the changes yourself.
- name: ✅ Fixed
labeled:
issue:
body: >
Hello @{{ issue.user.login }}! It looks like all or part of this issue has now been implemented.
- name: ‼️ High Priority
labeled:
issue:
body: >
This ticket has been marked as high priority, and has been bumped to the top of the priority list.
You should expect an implementation to be pushed out soon. Thank you for your patience.
- name: 💀 Spam
labeled:
issue:
action: close
locking: lock
lock_reason: spam
body: >
This issue has been identified as spam, and is now locked.
Users who repeatedly raise spam issues may be blocked or reported.
- name: ⛔ Don't Merge
labeled:
pr:
body: This PR has been temporarily blocked from merging.

69
.github/issues-auto-comments.yml vendored Normal file
View File

@@ -0,0 +1,69 @@
labels:
- name: ✖️ Invalid
labeled:
issue:
action: close
body: >
Hey @{{ issue.user.login }}, this issue has been marked as invalid.
Please double-check that you've followed the issue template, included all necessary details, and reviewed the docs & previous issues before submitting.
If provided, follow the instructions given by maintainers.
- name: 👩‍💻 Good First Issue
labeled:
issue:
body: >
🏆 This issue has been marked as a good first issue for contributors to implement!
This is a great way to support the project. While also improving your skills, you'll also be credited as a contributor once your PR is merged.
If you're new to SillyTavern [here is the official documentation](https://docs.sillytavern.app/). The official contribution guide can be found [here](https://github.com/SillyTavern/SillyTavern/blob/release/CONTRIBUTING.md).
If you need any support, feel free to reach out via [Discord](https://discord.gg/sillytavern), or let us know in this issue or via [discussions](https://github.com/SillyTavern/SillyTavern/discussions).
- name: ❌ wontfix
labeled:
issue:
action: close
body: >
❌ This issue has been marked as 'wontfix', which usually means it is out-of-scope, not feasible at this time or will not be implemented for various reasons.
If you have any questions about this, feel free to reach out.
- name: 🛑 Out of Scope
labeled:
issue:
action: close
body: >
🛑 This issue has been marked as 'out of scope', as this can't or won't be implemented.
If you have any questions about this, feel free to reach out.
- name: ✅ Done (staging)
labeled:
issue:
body: >
✅ It looks like all or part of this issue has now been implemented as part of the `staging` branch.
If you currently are on the `release` branch, you can switch to `staging` to test this right away.
Note that `staging` is considered less stable than the official releases. To switch, follow existing instructions,
or simply enter the following command: `git switch staging`
- name: ✅ Done
labeled:
issue:
body: >
✅ It looks like all or part of this issue has now been implemented as part of the latest release.
- name: ‼️ High Priority
labeled:
issue:
body: >
🚨 This issue has been marked high priority, meaning it's important to the maintainers or community.
While we can't promise immediate changes, it is on our radar and will be addressed whenever possible. Thanks for your patience!
- name: 💀 Spam
labeled:
issue:
action: close
locking: lock
lock_reason: spam
body: >
💀 This issue has been flagged as spam and is now locked.
Please avoid posting spam - it disrupts the community and wastes everyone's time.

View File

@@ -1,7 +1,3 @@
# Add/remove 'critical' label if issue contains the words 'urgent' or 'critical'
#critical:
# - '(critical|urgent)'
🪟 Windows: 🪟 Windows:
- '(🪟 Windows)' - '(🪟 Windows)'
@@ -15,4 +11,10 @@
- '(📱 Termux)' - '(📱 Termux)'
🐧 Linux: 🐧 Linux:
- '(🐧 Linux)' - '(🐧 Linux)'
🦊 Firefox:
- '(firefox|mozilla)'
📱 Mobile:
- '(iphone|ios|android|📱 Termux)'

51
.github/pr-auto-comments.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
labels:
- name: ✖️ Invalid
labeled:
pr:
action: close
body: >
Hey @{{ pull_request.user.login }}, thanks for your contribution!
Unfortunately, this PR has been marked as invalid.
Please check that you've followed the PR template, included all relevant details, and are targeting the correct branch (`staging` for regular contributions, `release` only for hotfixes).
If you need help, feel free to ask!
- name: ⛔ Don't Merge
labeled:
pr:
body: >
🚨 This PR has been temporarily blocked from merging.
- name: 💥💣 Breaking Changes
labeled:
pr:
body: >
⚠️ Heads up! This PR introduces breaking changes.
Make sure these changes are well-documented and that users will be properly informed when this is released.
- name: ⛔ Waiting For External/Upstream
labeled:
pr:
body: >
⛔ This PR is awaiting external or upstream changes or approval.
It can only be merged once those changes have been implemented and approved.
Please inform us of any progress on the upstream changes or approval.
- name: 🔬 Needs Testing
labeled:
pr:
body: >
🔬 This PR needs testing!
Any contributor can test and leave reviews, so feel free to help us out!
- name: 🟥 ⬤⬤⬤⬤⬤
labeled:
pr:
body: >
⚠️ This PR is over 1000 lines, which is larger than recommended.
Please make sure that it only addresses a single issue - PRs this large are hard to test and may be rejected.

77
.github/pr-auto-labels-by-branch.yml vendored Normal file
View File

@@ -0,0 +1,77 @@
####################################
# Label PRs against 'release' #
####################################
❗ Against Release Branch:
- base-branch: 'release'
####################################
# Labels based on PR branch name #
####################################
🦋 Bug Fix:
- head-branch: ['^fix[/-]', '\bfixes\b']
🚑 Hot Fix:
- head-branch: ['^hotfix[/-]']
✨ New Feature:
- head-branch: ['^feat(ure)?[/-].*?\badd', '^add-']
✨ Feature Changes:
- head-branch: ['^feat(ure)?[/-](?!.*\badd\b)', '\bchanges?\b']
🤖 API / Model:
- head-branch: ['\bapi\b', '\bmodels?\b']
🏭 Backend Changes:
- head-branch: ['\bbackend\b', '\bendpoints?\b']
🐋 Docker:
- head-branch: ['\bdocker\b']
Extension:
- head-branch: ['\bextension\b', '\bext\b']
🦊 Firefox:
- head-branch: ['\bfirefox\b']
🖼️ Image Gen:
- head-branch: ['\bimage-gen\b']
🌐 Language:
- head-branch: ['\btranslations?\b', '\blanguages?\b']
🐧 Linux:
- head-branch: ['\blinux\b']
🧩 Macros:
- head-branch: ['\bmacros?\b']
📱 Mobile:
- head-branch: ['\bmobile\b', '\bios\b', '\bandroid\b']
🚄 Performance:
- head-branch: ['\bperformance\b']
⚙️ Preset:
- head-branch: ['\bpresets?\b']
📜 Prompt:
- head-branch: ['\bprompt\b']
🚚 Refactor:
- head-branch: ['\brefactor(s|ed)?\b']
📜 STscript:
- head-branch: ['\bstscript\b', '\bslash-commands\b']
🏷️ Tags / Folders:
- head-branch: ['\btags\b']
🎙️ TTS / Voice:
- head-branch: ['\btts\b', '\bvoice\b']
🌟 UX:
- head-branch: ['\bux\b']
🗺️ World Info:
- head-branch: ['\bworld-info\b', '\bwi\b']

46
.github/pr-auto-labels-by-files.yml vendored Normal file
View File

@@ -0,0 +1,46 @@
####################################
# Labels based on changed files #
####################################
🏭 Backend Changes:
- changed-files:
- any-glob-to-any-file:
- "src/**"
- "default/config.yaml"
- "server.js"
- "plugins.js"
- "recover.js"
- "webpack.config.js"
- "Start.bat"
- "start.sh"
- "UpdateAndStart.bat"
- "UpdateForkAndStart.bat"
⚙️ config.yaml:
- changed-files:
- any-glob-to-any-file:
- "default/config.yaml"
🛠️ Build Changes:
- changed-files:
- any-glob-to-any-file:
- ".github/workflows/**"
- "docker/**"
- ".dockerignore"
- "Dockerfile"
- "webpack.config.js"
🌐 Language:
- changed-files:
- any-glob-to-any-file:
- "public/locales/**"
📥 Dependencies:
- changed-files:
- any-glob-to-any-file:
- "public/lib/**" # Every frontend lib counts as a dependency as well
- "package.json"
- "package-lock.json"
- "tests/package.json"
- "tests/package-lock.json"
- "src/electron/package.json"
- "src/electron/package-lock.json"

View File

@@ -8,7 +8,7 @@
<div align="center"> <div align="center">
[English](readme.md) | German | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) [English](readme.md) | German | [中文](readme-zh_cn.md) | [繁體中文](readme-zh_tw.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) | [한국어](readme-ko_kr.md)
[![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers)
[![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network)

View File

@@ -5,7 +5,7 @@
<div align="center"> <div align="center">
[English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | 日本語 | [Русский](readme-ru_ru.md) [English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [繁體中文](readme-zh_tw.md) | 日本語 | [Русский](readme-ru_ru.md) | [한국어](readme-ko_kr.md)
[![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers)
[![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network)

394
.github/readme-ko_kr.md vendored Normal file
View File

@@ -0,0 +1,394 @@
> [!IMPORTANT]
> 이곳에 게재된 정보는 오래되거나 불완전할 수 있습니다. 최신 정보는 영어 버전을 이용하십시오.
<a name="readme-top"></a>
![][cover]
<div align="center">
[English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [繁體中文](readme-zh_tw.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) | 한국어
[![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers)
[![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network)
[![GitHub Issues](https://img.shields.io/github/issues/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/issues)
[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/pulls)
</div>
---
SillyTavern은 많은 LLM API(KoboldAI/CPP, Horde, NovelAI, Ooba, Tabby, OpenAI, OpenRouter, Claude, Mistral 등)에 대한 단일 통합 인터페이스, 모바일 친화적 레이아웃, 비주얼 노벨 모드, Automatic1111 & ComfyUI API 이미지 생성 통합, TTS, 월드 인포 (로어북), 커스텀 가능한 UI, 자동 번역, 필요 이상의 프롬프트 옵션, 그리고 서드파티 확장을 통한 무궁무진한 성장 가능성을 제공합니다.
또한, 자주 묻는 질문에 대한 답변과, 시작하는 데 도움을 주기 위한 [문서 웹사이트](https://docs.sillytavern.app/)가 있습니다.
## SillyTavern이 무엇인가요?
SillyTavern(짧게는 ST)은 텍스트 생성 LLM, 이미지 생성 엔진, TTS 음성 모델 등과 상호작할 수 있는 로컬 설치형 UI 입니다.
2023년 2월, TavernAI 1.2.8의 포크로 시작한 SillyTavern은 현재 100명이 넘는 기여자를 보유하고 있으며, 2년간의 독자적인 개발을 거쳐 숙련된 AI 애호가들을 위한 선도적인 소프트웨어로 자리매김하고 있습니다.
## 우리의 비전
1. 저희는 사용자가 LLM 프롬프트에 대한 최대한의 유용성과 제어 능력을 갖도록 하는 것을 목표로 합니다. 빠르게 배우는 것 역시 재미의 일부입니다!
2. 저희는 어떠한 온라인 및 호스팅 서브시도 제공하지 않으며, 프로그래밍으로 사용자의 데이터를 추적하지 않습니다.
3. SillyTavern은 헌신적인 LLM 커뮤니티가 여러분에게 제공하는 열정적인 프로젝트이며, 언제나 무료이며 오픈소스로 제공될 것입니다.
## 브랜치
SillyTavern은 모든 사용자가 원활한 경험을 할 수 있도록 두 개의 브랜치를 활용하여 개발되고 있습니다.
* `release` -🌟 **대부분의 사용자에게 추천됨.** 가장 안정적이고 권장되는 브랜치이며, 주요 릴리스가 배포될 때만 업데이트됩니다. 대부분의 사용자에게 적합합니다. 일반적으로 한달에 한번 업데이트됩니다.
* `staging` - ⚠️ **일반적인 사용에 추천되지 않음.** 최신 기능을 가지고 있지만, 언제든지 문제가 발생할 수 있습니다. 고급 사용자 및 숙련자 전용입니다. 하루에 여러번 업데이트됩니다.
만약 git CLI 사용에 익숙하지 않거나 브랜치가 무엇인지 모르겠다면 release 브랜치가 더 나은 선택입니다.
## SillyTavern 외에 무엇이 필요한가요?
SillyTavern은 인터페이스 역할만 하기 때문에, 실제로 채팅하려면 LLM 백엔드에 대한 액세스 권한이 필요합니다. 즉시 사용 가능한 채팅을 위해 AI Horde를 사용할 수 있습니다. 그 외에도 OpenAI 호환 API, KoboldAI, Tabby 등 많은 로컬 및 클라우드 기반 LLM 백엔드를 지원합니다. 지원되는 API에 대한 자세한 내용은 [FAQ](https://docs.sillytavern.app/usage/api-connections/)에서 확인할 수 있습니다.
### SillyTavern을 위해서 좋은 성능의 PC가 필요한가요?
하드웨어 요구 사항은 거의 없습니다: NodeJS 18 이상을 실행할 수 있는 모든 환경에서 작동합니다. 다만 로컬 LLM 모델을 사용할 경우, 최소 6GB VRAM 이상의 3000번대 NVIDIA 그래픽 카드를 권장합니다. 자세한 내용은 백엔드 문서를 참고하세요.
### 추천되는 백엔드 (제휴 없음)
* [AI Horde](https://aihorde.net/) - 자원 봉사자들이 호스팅하는 모델을 사용합니다. 추가 설정이 필요하지 않습니다.
* [KoboldCpp](https://github.com/LostRuins/koboldcpp) - 로컬에서 GGUF 모델을 실행하기 위한 커뮤니티에서 선호하는 옵션입니다.
* [tabbyAPI](https://github.com/theroyallab/tabbyAPI) - 인기 있는 경량 로컬 exl2 추론 API입니다.
* [OpenRouter](https://openrouter.ai) - OpenAI, Claude, Meta Llama 등 다양한 클라우드 제공업체와 인기 있는 커뮤니티 모델을 위한 단일 API입니다.
## 질문이나 제안이 있으신가요?
### 디스코드 서버
| [![][discord-shield-badge]][discord-link] | [저희의 디스코드에 참여하세요!](https://discord.gg/sillytavern) 지원을 받고, 좋아하는 캐릭터와 프롬프트를 공유하세요. |
| :---------------------------------------- | :----------------------------------------------------------------------------------------------------------------- |
혹은 저희의 개발자들과 직접 연락할 수 있습니다:
* 디스코드: cohee, rossascends, wolfsblvt
* 레딧: [/u/RossAscends](https://www.reddit.com/user/RossAscends/), [/u/sillylossy](https://www.reddit.com/user/sillylossy/), [u/Wolfsblvt](https://www.reddit.com/user/Wolfsblvt/)
* [GitHub issue를 작성하세요](https://github.com/SillyTavern/SillyTavern/issues)
### 이 프로젝트가 마음에 들어요! 어떻게 기여할 수 있을까요?
1. PULL REQUEST를 생성하세요. 기여 방법에 대해서는 [CONTRIBUTING.md](../CONTRIBUTING.md)를 참고하세요.
2. 제공된 탬플릿에 따라 기능 제안이나 이슈 리포트를 생성하세요.
3. 중복된 이슈를 생성하지 않도록 이 README 파일 전체를 읽고 문서 웹사이트를 먼저 확인하세요.
## 스크린샷
<img width="500" alt="image" src="https://github.com/user-attachments/assets/9b5f32f0-c3b3-4102-b3f5-0e9213c0f50f">
<img width="500" alt="image" src="https://github.com/user-attachments/assets/913fdbaa-7d33-42f1-ae2c-89dca41c53d1">
## 캐릭터 카드
SillyTavern은 "캐릭터 카드"라는 개념을 중심으로 구축되었습니다. 캐릭터 카드는 LLM의 동작을 설정하는 프롬프트 모음이며, SillyTavern에서 지속적인 대화를 하려면 필수적입니다. 이는 ChatGPT의 GPT 또는 Poe의 봇과 유사하게 작동합니다. 캐릭터 카드의 내용은 추상적인 시나리오, 특정 작업에 맞춰진 도우미, 유명 인사 또는 가상 인물 등 무엇이든 될 수 있습니다.
이름 필드는 유일한 필수 캐릭터 카드 입력 항목입니다. 언어 모델과 중립적인 대화를 시작하려면 "도우미"라고 간단히 이름 지은 새 카드를 만들고 나머지 상자는 비워 두세요. 더 주제가 있는 채팅을 원한다면 언어 모델에 다양한 배경 정보, 행동 및 작문 패턴, 그리고 채팅을 바로 시작할 시나리오를 제공할 수 있습니다.
캐릭터 카드를 선택하지 않고 빠른 대화를 하거나 LLM 연결을 테스트하려면 SillyTavern을 연 후 시작 화면의 입력 창에 프롬프트 입력을 입력하기만 하면 됩니다. 이러한 채팅은 임시적이며 저장되지 않습니다.
캐릭터 카드를 정의하는 방법에 대한 일반적인 아이디어를 얻으려면 기본 캐릭터(Seraphina)를 보거나 "확장 프로그램 및 에셋 다운로드" 메뉴에서 선택된 커뮤니티 제작 카드를 다운로드하세요.
## 핵심 기능
* 고급 텍스트 생성 설정과 다양한 커뮤니티 제작 프리셋
* 월드 인포 지원: 풍부한 설정을 만들거나 캐릭터 카드에 토큰 저장
* 그룹 채팅: 캐릭터가 사용자 혹은 다른 캐릭터와 대화할 수 있는 방
* 다양한 UI 커스텀 옵션: 테마 색, 뱌경 이미지, 커스텀 CSS 등
* 유저 페르소나: AI에게 사용자에 대한 정보를 주어 더욱 몰입감을 높임
* 내장 RAG 지원: AI가 참조할 수 있도록 채팅에 문서를 추가
* 광범위한 채팅 명령어 시스템 및 자체 [스크립트](https://docs.sillytavern.app/usage/st-script/)
## 확장
SillyTavern은 확장(익스텐션)을 지원합니다.
* 캐릭터 감정 표현 (스프라이트)
* 채팅 기록 자동 요약
* 자동 UI 및 채팅 번역
* Stable Diffusion/FLUX/DALL-E 이미지 생성
* AI 응답 메시지 텍스트 음성 변환 (ElevenLabs, Silero 또는 OS 시스템 TTS 사용)
* 프롬프트에 추가적인 현실 세계 맥락을 추가하기 위한 웹 검색 기능
* "확장 프로그램 및 에셋 다운로드" 메뉴에서 더 많은 기능을 다운로드할 수 있습니다.
사용 방법에 대한 튜토리얼은 [Docs](https://docs.sillytavern.app/)에서 확인할 수 있습니다.
# ⌛ Installation
> \[!WARNING]
>
> * **윈도우 제어 폴더에는 설치하지 마십시오 (Program Files, System32 등).**
> * **권리자 권한으로 START.BAT을 실행하지 마십시오.**
> * **Windows 7에서는 NodeJS 18.16을 실행할 수 없으므로 설치가 불가능합니다.**
## 🪟 Windows
### Git을 통해 설치하기
1. [NodeJS](https://nodejs.org/ko) 설치 (최신 LTS 버전 권장)
2. [Git for Windows](https://gitforwindows.org/) 설치
3. 파일 탐색기 열기 (`Win+E`)
4. Windows에서 제어하거나 모니터하지 않는 폴더를 찾거나 만드세요. (ex: C:\MySpecialFolder\)
5. 상단의 주소 표시줄을 클릭하고 `cmd`를 입력한 후 Enter 키를 눌러 해당 폴더 내에서 명령 프롬프트를 여세요.
6. 검은색 창(명령 프롬프트)이 나타나면 다음 중 하나를 입력하고 Enter 키를 누르세요.
* Release 브랜치: `git clone https://github.com/SillyTavern/SillyTavern -b release`
* Staging 브랜치: `git clone https://github.com/SillyTavern/SillyTavern -b staging`
7. clone이 완료되면, `Start.bat`을 더블 클릭하여 NodeJS가 필요한 구성요소를 설치하도록 하세요.
8. 그러면 서버가 시작하고, SillyTavern이 브라우저에 나타납니다.
### GitHub Desktop을 통해 설치하기
(이 방법은 **오직** GitHub Desktop에서만 git 사용이 가능합니다. 명령 프롬프트에서 git을 사용하려면 [Git for Windows](https://gitforwindows.org/)를 설치해야 합니다.)
1. [NodeJS](https://nodejs.org/ko) 설치 (최신 LTS 버전 권장)
2. [GitHub Desktop](https://central.github.com/deployments/desktop/desktop/latest/win32) 설치
3. GitHub Desktop을 설치했으면, `Clone a repository from the internet....`를 클릭하세요. (참고: 이 과정에서는 Github 계정이 **필요하지 않습니다**.)
4. 메뉴에서 URL 탭을 클릭하고, 다음 URL을 입력한 후 복제를 클릭합니다: `https://github.com/SillyTavern/SillyTavern` 리포지토리가 다운로드될 위치를 변경하려면 로컬 경로를 변경할 수 있습니다.
5. SillyTavern을 열려면 파일 탐색기를 사용하여 리포지토리를 복제한 폴더로 이동합니다. 기본적으로 리포지토리는 다음 위치에 복제됩니다: `C:\Users\[사용자 Windows 사용자 이름]\Documents\GitHub\SillyTavern`
6. `start.bat` 파일을 더블 클릭 하세요. (참고: `.bat` 확장자 명은 OS 설정에 따라 보이지 않을 수 있습니다, 그럴 때는 파일 이름이 "`Start`" 처럼 보일 수 있습니다. 이 파일을 더블 클릭해 SillyTavern을 실행하세요.)
7. 더블 클릭하면, 검고 큰 명령 프롬프트 창이 열리고 SillyTavern이 작동하는데 필요한 항목을 설치하기 시작합니다.
8. 설치 과정이 끝나고 모든 것이 잘 작동한다면, 브라우저에 SillyTavern 탭이 열려 있어야 하고, 명령 프롬프트 창에 다음과 같이 표시되어야 합니다:
9. Connect to any of the [supported APIs](https://docs.sillytavern.app/usage/api-connections/) and start chatting!
## 🐧 Linux & 🍎 MacOS
MacOS / Linux 에서는 이 모든 작업이 터미널에서 수행됩니다.
1. git과 nodeJS 설치 (이 작업은 OS에 따라 달라집니다.)
2. 리포지토리 clone하기
* Release 브랜치: `git clone https://github.com/SillyTavern/SillyTavern -b release`
* Staging 브랜치: `git clone https://github.com/SillyTavern/SillyTavern -b staging`
3. `cd SillyTavern` 를 입력해 설치 폴더로 이동하기
4. `start.sh` 스크립트를 아래의 명령어 중 하나로 실행하기:
* `./start.sh`
* `bash start.sh`
## ⚡ SillyTavern Launcher를 통해 설치하기
SillyTavern 런처는 로컬 LLM 사용을 위한 백엔드 설치를 포함하여 다양한 설정을 도와주는 설치 마법사입니다.
### Windows 사용자
1. 키보드에서 **`WINDOWS + R`** 키를 눌러 실행 창을 여세요. 그리고 아래의 명령어를 입력해 git을 설치하세요.
```shell
cmd /c winget install -e --id Git.Git
```
2. 키보드에서 **`WINDOWS + E`** 키를 눌러 파일 탐색기를 열고 런처를 설치할 폴더로 이동합니다. 원하는 폴더에 도착하면 주소 표시줄에 `cmd`를 입력하고 Enter 키를 누릅니다. 그 후 아래의 명령어를 입력합니다.
```shell
git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher && start installer.bat
```
### Linux 사용자
1. 선호하는 터미널을 열고 git을 설치하세요.
2. SillyTavern-Launcher를 clone 하세요:
```shell
git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher
```
3. installer.sh를 실행하세요:
```shell
chmod +x install.sh && ./install.sh
```
4. 설치가 끝나면 launcher.sh를 실행하세요:
```shell
chmod +x launcher.sh && ./launcher.sh
```
### Mac 사용자
1. 터미널을 열고 Brew를 설치하세요:
```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
2. git을 설치하세요:
```shell
brew install git
```
3. SillyTavern-Launcher를 clone 하세요:
```shell
git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher
```
4. installer.sh를 실행하세요:
```shell
chmod +x install.sh && ./install.sh
```
5. 설치가 끝나면 launcher.sh를 실행하세요:
```shell
chmod +x launcher.sh && ./launcher.sh
```
## 🐋 Docker를 통해 설치하기
이 방법은 Docker가 설치되어 있고, Docker 설치를 위해 커맨드 라인에 접근할 수 있으며, Docker의 일반적인 작동 방식에 익숙하다고 가정합니다.
### 이미지 직접 빌드하기
SillyTavern을 Docker에서 사용하는 방법에 대한 포괄적인 가이드는 [여기서](http://docs.sillytavern.app/installation/docker/) 확인할 수 있습니다. 이 가이드는 Windows, macOS 및 Linux에서의 설치를 다룹니다! 직접 이미지를 빌드하려면 이 가이드를 읽어보세요.
### GitHub Container Registry 사용하기 (가장 쉬움)
SillyTavern이 작동하려면 두 개의 필수 디렉터리 매핑과 하나의 포트 매핑이 필요합니다. 명령에서 다음 위치의 선택 항목을 바꿔주세요.
#### Container Variables
##### Volume Mappings
* [config] - SillyTavern 구성 파일이 호스트 컴퓨터에 저장될 디렉터리
* [data] - 캐릭터를 포함한 SillyTavern 사용자 데이터가 호스트 컴퓨터에 저장될 디렉터리
* [plugins] - (선택 사항) SillyTavern 서버 플러그인이 호스트 컴퓨터에 저장될 디렉터리
##### Port Mappings
* [PublicPort] - 트래픽을 노출할 포트입니다. 가상 머신 컨테이너 외부에서 인스턴스에 접근하므로 필수 사항입니다. 보안을 위한 별도의 서비스를 구현하지 않고는 인터넷에 노출하지 마십시오.
##### Additional Settings
* [DockerNet] - 컨테이너가 연결되어 생성되어야 하는 Docker 네트워크입니다. 해당 내용을 모르는 경우 [공식 Docker 문서](https://docs.docker.com/reference/cli/docker/network/)를 참조하세요.
* [version] - 이 GitHub 페이지의 오른쪽에서 "Packages"를 선택하면 "sillytavern" 패키지를 볼 수 있습니다. "latest" 이미지 태그는 현재 릴리스와 함께 최신 상태를 유지합니다. 각 브랜치의 야간 이미지를 가리키는 "staging" 및 "release" 태그를 사용할 수도 있지만, 업데이트에 시간이 걸릴 수 있고 중단될 수 있는 확장 프로그램을 사용하는 경우에는 적합하지 않을 수 있습니다.
#### 설치 명령어
1. 커맨드 라인 열기
2. 아래의 명령어 실행
`docker create --name='sillytavern' --net='[DockerNet]' -p '8000:8000/tcp' -v '[plugins]':'/home/node/app/plugins':'rw' -v '[config]':'/home/node/app/config':'rw' -v '[data]':'/home/node/app/data':'rw' 'ghcr.io/sillytavern/sillytavern:[version]'`
> 8000은 기본 리스닝 포트입니다. 구성에서 포트를 변경한 경우 적절한 포트를 사용하는 것을 잊지 마세요.
## 📱 Termux를 통해 Android OS에 설치하기
> \[!NOTE]
> **SillyTavern은 Termux를 사용하여 Android 기기에서 기본적으로 실행할 수 있지만, 이러한 사용 사례에 대한 공식적인 지원은 제공하지 않습니다.**
>
> **ArroganceComplex#2659의 가이드를 참조하세요:**
>
> * <https://rentry.org/STAI-Termux>
**지원되지 않는 플랫폼: android arm LEtime-web.** 32비트 Android는 npm으로 설치할 수 없는 외부 종속성이 필요합니다. 다음 명령어를 사용하여 설치하세요: pkg install esbuild. 그런 다음 일반적인 설치 단계를 진행하세요.
## API 키 관리
SillyTavern은 API 키를 사용자 데이터 디렉터리의 `secrets.json` 파일에 저장합니다 (`/data/default-user/secrets.json`이 기본 경로입니다).
기본적으로 API 키는 저장하고 페이지를 새로 고침한 후에는 인터페이스에서 보이지 않습니다.
키 보기 기능을 활성화하려면 다음 단계를 따르세요:
1. `config.yaml` 파일에서 `allowKeysExposure` 값을 `true로` 설정합니다.
2. SillyTavern 서버를 다시 시작합니다.
3. API 연결 패널 오른쪽 하단에 있는 '숨겨진 API 키 보기' 링크를 클릭합니다.
## 커맨드 라인 인수
`config.yaml`의 일부 설정을 덮어쓰기 위해 SillyTavern 서버 시작 시 커맨드 라인 인수를 전달할 수 있습니다.
### 예시
```shell
node server.js --port 8000 --listen false
# 혹은
npm run start -- --port 8000 --listen false
# 혹은 (Windows 전용)
Start.bat --port 8000 --listen false
```
### 지원되는 인수
| 옵션 | 설명 | 타입 |
|-------------------------|------------------------------------------------------------------------------------------------------|----------|
| `--version` | 버전 표시 | boolean |
| `--enableIPv6` | IPv6 활성화 | boolean |
| `--enableIPv4` | IPv4 활성화 | boolean |
| `--port` | SillyTavern이 실행될 포트를 설정합니다. 설정되지 않은 경우 yaml config 'port'를 불러옵니다. | number |
| `--dnsPreferIPv6` | DNS에 IPv6를 우선으로 할당합니다. 설정되지 않은 경우 yaml config를 불러옵니다. | boolean |
| `--autorun` | 브라우저에서 SillyTavern을 자동으로 실행합니다. 설정되지 않은 경우 yaml config 'autorun'를 불러옵니다. | boolean |
| `--autorunHostname` | 자동 실행 호스트 이름, 'auto'가 최적의 설정일 것입니다. | string |
| `--autorunPortOverride` | 자동 실행 포트 덮어쓰기 | string |
| `--listen` | SillyTavern이 모든 네트워크 인터페이스에서 수신 대기합니다. 설정되지 않은 경우 yaml 구성 'listen'을 불러옵니다. | boolean |
| `--corsProxy` | CORS 프록시 활성화. 설정되지 않은 경우 yaml 구성 'enableCorsProxy'을 불러옵니다. | boolean |
| `--disableCsrf` | CSRF 보호 비활성화 | boolean |
| `--ssl` | SSL 활성화 | boolean |
| `--certPath` | 인증서 파일 경로 | string |
| `--keyPath` | 프라이빗 키 파일 경로 | string |
| `--whitelist` | 화이트리스트 모드 활성화 | boolean |
| `--dataRoot` | 데이터 스토리지의 루트 디렉토리 | string |
| `--avoidLocalhost` | 자동 모드에서 자동 실행 시 'localhost' 사용 방지 | boolean |
| `--basicAuthMode` | 기본 인증 활성화 | boolean |
| `--requestProxyEnabled` | 외부 리퀘스트 프록시 활성화 | boolean |
| `--requestProxyUrl` | 프록시 URL 리퀘스트 (HTTP 혹은 SOCKS 프로토콜) | string |
| `--requestProxyBypass` | 프록시 바이패스 리스트 리퀘스트 (공백으로 구분된 호스트 목록) | array |
## 원격 연결
대부분의 경우 이는 PC에서 ST 서버를 실행하는 동안 모바일 장치에서 SillyTavern을 사용하려는 사람들을 위한 것입니다. 그러나 원격 연결을 다른 곳에서도 허용하도록 사용할 수 있습니다.
원격 연결 설정 방법에 대한 자세한 가이드는 [Docs](https://docs.sillytavern.app/usage/remoteconnections/)에서 확인할 수 있습니다.
또한 암호 보호 기능이 포함된 SillyTavern 사용자 프로필을 구성할 수 있습니다 (선택 사항): [Users](https://docs.sillytavern.app/installation/st-1.12.0-migration-guide/#users).
## 성능 이슈가 발생하나요?
1. 사용자 설정 패널(UI 테마 전환 카테고리)에서 흐림 효과를 비활성화하고 동작 줄이기를 활성화합니다.
2. 응답 스트리밍을 사용하는 경우 스트리밍 FPS를 더 낮은 값(10-15 FPS 권장)으로 설정합니다.
3. 브라우저에서 렌더링에 GPU 가속을 사용하도록 설정되어 있는지 확인합니다.
## 라이센스 및 크레딧
**이 프로그램은 유용할 것이라는 희망으로 배포되지만, 어떠한 보증도 제공하지 않습니다. 상품성 또는 특정 목적에의 적합성에 대한 묵시적인 보증조차도 제공하지 않습니다. 자세한 내용은 GNU Affero 일반 공중 사용 허가서를 참조하십시오.**
* Humi의 [TavernAI](https://github.com/TavernAI/TavernAI) 1.2.8: MIT 라이선스
* CncAnon의 TavernAITurbo 모드의 일부는 허가를 받아 사용됨
* PepperTaco의 작업(<https://github.com/peppertaco/Tavern/>)에 영감을 받은 비주얼 노벨 모드
* Noto Sans Font by Google (OFL 라이선스)
* Font Awesome의 아이콘 테마 <https://fontawesome.com> (아이콘: CC BY 4.0, 폰트: SIL OFL 1.1, 코드: MIT 라이선스)
* 기본 콘텐츠는 @OtisAlejandro (Seraphina 캐릭터 및 로어북)와 @kallmeflocc (10K 디스코드 사용자 축전 배경화면)가 제공함
* [@mrguymiah](https://github.com/mrguymiah)와 [@Bronya-Rand](https://github.com/Bronya-Rand)의 Docker 가이드
## 상위 기여자
[![Contributors](https://contrib.rocks/image?repo=SillyTavern/SillyTavern)](https://github.com/SillyTavern/SillyTavern/graphs/contributors)
<!-- LINK GROUP -->
[cover]: https://github.com/user-attachments/assets/01a6ae9a-16aa-45f2-8bff-32b5dc587e44
[discord-link]: https://discord.gg/sillytavern
[discord-shield-badge]: https://img.shields.io/discord/1100685673633153084?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=for-the-badge

View File

@@ -7,7 +7,7 @@
<div align="center"> <div align="center">
[English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | Русский [English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [繁體中文](readme-zh_tw.md) | [日本語](readme-ja_jp.md) | Русский | [한국어](readme-ko_kr.md)
[![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers)
[![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network)
@@ -209,6 +209,44 @@ SillyTavern поддерживает расширения.
5. Запустите лаунчер установки: `chmod +x install.sh && ./install.sh` and choose what you wanna install 5. Запустите лаунчер установки: `chmod +x install.sh && ./install.sh` and choose what you wanna install
6. После завершения установки, запустите лаунчер следующей командой: `chmod +x launcher.sh && ./launcher.sh` 6. После завершения установки, запустите лаунчер следующей командой: `chmod +x launcher.sh && ./launcher.sh`
## 🐋 Установка с помощью Docker
Предполагается, что вы уже установили Docker, имеете доступ к командной строке для установки контейнеров и знакомы с их базовым управлением.
### Сборка образа самостоятельно
У нас есть подробное руководство по использованию SillyTavern в Docker [здесь](http://docs.sillytavern.app/installation/docker/), которое охватывает установку на Windows, macOS и Linux! Ознакомьтесь с ним, если хотите создать образ самостоятельно.
### Использование реестра контейнеров GitHub (самый простой способ)
Для работы SillyTavern вам понадобятся две обязательные настройки каталогов и одна настройка порта. В команде замените указанные значения на свои:
#### Переменные контейнера
##### Маппинг томов
* [config] - директория, где на вашем хосте будут храниться файлы конфигурации SillyTavern.
* [data] - директория, где на вашем хосте будут храниться пользовательские данные SillyTavern (включая персонажей).
* [plugins] - (необязательно) директория, где на вашем хосте будут храниться плагины сервера SillyTavern.
##### Маппинг портов
* [PublicPort] - Порт, через который будет передаваться трафик. Это обязательно, так как вы будете обращаться к контейнеру извне его виртуальной машины. НЕ ОТКРЫВАЙТЕ этот порт в интернет без реализации дополнительного уровня безопасности.
##### Дополнительные настройки
* [DockerNet] - Docker сеть, к которой контейнер должен быть подключен. Если вы не знаете, что это, обратитесь к [официальной документации Docker](https://docs.docker.com/reference/cli/docker/network/).
* [version] - на правой части этой страницы GitHub вы найдете раздел "Packages". Выберите пакет "sillytavern", чтобы увидеть версии образов. Тег "latest" позволит вам обновляться до текущего релиза. Также доступны теги "staging" и "release", которые соответствуют ночным сборкам соответствующих веток. Однако это может быть нецелесообразно, если вы используете расширения, которые могут ломаться и требуют времени для обновления.
#### Команда установки
1. Откройте командную строку
2. Выполните следующую команду
`docker create --name='sillytavern' --net='[DockerNet]' -p '8000:8000/tcp' -v '[plugins]':'/home/node/app/plugins':'rw' -v '[config]':'/home/node/app/config':'rw' -v '[data]':'/home/node/app/data':'rw' 'ghcr.io/sillytavern/sillytavern:[version]'`
> Заметьте, что 8000 является портом по умолчанию. Не забудьте использовать соответствующий порт, если вы измените его в конфиге.
## 📱 Мобильные устройства - Установка при помощи termux ## 📱 Мобильные устройства - Установка при помощи termux
> **ОБРАТИТЕ ВНИМАНИЕ!** > **ОБРАТИТЕ ВНИМАНИЕ!**

View File

@@ -5,7 +5,7 @@
<div align="center"> <div align="center">
[English](readme.md) | [German](readme-de_de.md) | 中文 | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) [English](readme.md) | [German](readme-de_de.md) | 中文 | [繁體中文](readme-zh_tw.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) | [한국어](readme-ko_kr.md)
[![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers)
[![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network)

381
.github/readme-zh_tw.md vendored Normal file
View File

@@ -0,0 +1,381 @@
> [!IMPORTANT]
> 此處資訊可能已經過時或不完整,僅供您參考。請使用英文版本以取得最新資訊。
<a name="readme-top"></a>
![][cover]
<div align="center">
[English](readme.md) | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | 繁體中文 | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) | [한국어](readme-ko_kr.md)
[![GitHub 星標](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers)
[![GitHub 分支](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network)
[![GitHub 問題](https://img.shields.io/github/issues/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/issues)
[![GitHub 拉取請求](https://img.shields.io/github/issues-pr/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/pulls)
</div>
---
SillyTavern 提供一個統一的前端介面,整合多種大型語言模型的 API包括KoboldAI/CPP、Horde、NovelAI、Ooba、Tabby、OpenAI、OpenRouter、Claude、Mistral 等。同時具備對行動裝置友善的佈局、視覺小說模式Visual Novel Mode、Automatic1111 與 ComfyUI 的影像生成 API 整合、TTS語音合成、世界資訊Lorebook、可自訂 UI、自動翻譯功能以及強大的提示詞prompt設定選項和無限的第三方擴充潛力。
我們擁有一個 [官方文件網站](https://docs.sillytavern.app/) 可以幫助解答絕大多數的使用問題,並幫助您順利入門。
## SillyTavern 是什麼?
SillyTavern簡稱 ST是一款本地安裝的使用者介面讓您能與大型語言模型LLM、影像生成引擎以及語音合成模型互動的前端。
SillyTavern 起源於 2023 年 2 月,作為 TavernAI 1.2.8 的分支版本發展至今。目前已有超過 100 位貢獻者,並擁有超過兩年的獨立開發歷史。如今,它已成為 AI 愛好者中備受推崇的軟體之一。
## 我們的願景
1. 我們致力於賦予使用者對 LLM 提示詞的最大控制權與實用性,並認為學習過程中的挑戰是樂趣的一部分。
2. 我們不提供任何線上或託管服務,也不會程式化追蹤任何使用者數據。
3. SillyTavern 是由一群熱衷於 LLM 的開發者社群所打造的專案,並將永遠保持免費與開源。
## 分支介紹
SillyTavern 採用雙分支開發模式,確保為所有使用者提供流暢的體驗。
* `release`(穩定版):🌟 **推薦給大部分的使用者使用。** 此分支最為穩定,僅在主要版本發布時更新。適合大多數人,通常每月更新一次。
* `staging`(開發版):⚠️ **不建議普通使用者使用。** 此分支包含最新功能,但可能隨時出現問題。適合進階使用者與愛好者,每日多次更新。
如果您不熟悉 git CLI 或對分支概念不清楚,請放心,對您來說,`release`(穩定版)分支永遠是首選。
## 使用 SillyTavern 需要什麼?
由於 SillyTavern 僅是一個介面,您需要一個 LLM 後端來提供推理能力。您可以使用 AI Horde 以立即開始聊天。此外,我們支持許多其他本地和雲端 LLM 後端,例如 OpenAI 兼容 API、KoboldAI、Tabby 等。更多支持的 API 資訊,請參閱 [常見問題](https://docs.sillytavern.app/usage/api-connections/)。
### 我需要高效能電腦才能運行 SillyTavern 嗎?
SillyTavern 的硬體需求相當低。任何能夠運行 NodeJS 18 或更高版本的設備都可以執行。若您打算在本地機器上進行 LLM 推理,我們建議使用擁有至少 6GB VRAM 的 3000 系列 NVIDIA 顯示卡。更多詳細資訊,請參考您使用的後端文檔。
### 推薦後端(僅為推薦,非官方合作和隸屬關係)
* [AI Horde](https://aihorde.net/):使用志願者託管的模型,無需進一步設定
* [KoboldCpp](https://github.com/LostRuins/koboldcpp):社群推崇的選擇,可在本地運行 GGUF 模型
* [tabbyAPI](https://github.com/theroyallab/tabbyAPI):一個流行且輕量的本地託管 exl2 推理 API
* [OpenRouter](https://openrouter.ai):提供多個雲端 LLM 提供商(如 OpenAI、Claude、Meta Llama 等)及熱門社群模型的單一 API
## 有任何問題或建議?
### 歡迎加入我們的 Discord 伺服器
| [![][discord-shield-badge]][discord-link] | [加入我們的 Disocrd 伺服器](https://discord.gg/sillytavern) 以獲得技術支援、分享您喜愛的角色與提示詞。 |
| :---------------------------------------- | :----------------------------------------------------------------------------------------------------------------- |
或直接聯繫開發者:
* Discord: cohee, rossascends, wolfsblvt
* Reddit: [/u/RossAscends](https://www.reddit.com/user/RossAscends/), [/u/sillylossy](https://www.reddit.com/user/sillylossy/), [u/Wolfsblvt](https://www.reddit.com/user/Wolfsblvt/)
* [提交 GitHub 問題](https://github.com/SillyTavern/SillyTavern/issues)
### 我喜歡這個專案,我該如何貢獻呢?
1. **提交拉取要求Pull Request**:想了解如何貢獻,請參閱 [CONTRIBUTING.md](../CONTRIBUTING.md)。
2. **提供功能建議與問題報告**:使用本專案所提供的模板提交建議或問題報告。
3. **仔細閱讀此 README 文件及相關文檔**:請避免提出重複問題或建議。
## 螢幕截圖
<img width="500" alt="image" src="https://github.com/user-attachments/assets/9b5f32f0-c3b3-4102-b3f5-0e9213c0f50f">
<img width="500" alt="image" src="https://github.com/user-attachments/assets/913fdbaa-7d33-42f1-ae2c-89dca41c53d1">
## 角色卡
SillyTavern 的核心概念是「角色卡」Character Cards。角色卡是一組設定 LLM 行為的提示詞,用於 SillyTavern 中進行持續性對話。功能類似於 ChatGPT 的 GPT 或 Poe 的聊天機器人。角色卡的內容可以是任何形式:抽象場景、針對特定任務設計的助手、知名人物,或者虛構角色。
角色卡中唯一必填的項目是名稱欄位。若想與語言模型開始一般對話您只需創建一個名稱為「Assistant」的新卡片其餘欄位皆可保持空白。若希望進行更具主題性的對話則可以提供語言模型背景資訊、行為模式、寫作風格以及特定情境來啟動聊天。
如果僅想進行快速對話而不選擇角色卡片,或想測試 LLM 的連線,則可在開啟 SillyTavern 後,於歡迎頁面的輸入欄位中直接輸入您的提示內容。請注意,這類對話是暫時的,不會被永久保存。
若想了解如何設定角色卡,可參考預設角色(如 Seraphina或從「下載擴充功能 & 資源」Download Extensions & Assets選單中下載社群製作的角色卡。
## 核心功能
* 進階文本生成設定:內含許多社群製作的預設設定
* 支援世界資訊World Info創建豐富的背景故事或節省角色卡中的 Token符元使用
* 群組聊天:多角色聊天室,可讓角色與您或彼此對話
* 豐富的 UI 自定義選項:主題顏色、背景圖片、自定義 CSS 等
* 使用者設定:讓 AI 更了解您並提升沉浸感
* 內建 RAG 支持:可將文檔加入對話,供 AI 參考
* 強大的聊天指令子系統:內含 [腳本引擎Scripting Engine](https://docs.sillytavern.app/usage/st-script/)
## 擴充功能
SillyTavern 支持多種擴充功能。
* 角色情感表達:使用視覺圖片(立繪)呈現情緒表達
* 聊天記錄自動摘要
* 自動化介面與聊天翻譯
* 穩定擴散Stable Diffusion、FLUX 和 DALL-E 的影像生成整合
* 語音合成AI 回應的訊息可使用 ElevenLabs、Silero 或系統 TTS 語音合成
* 網頁搜尋功能:為提示詞添加真實世界的上下文資訊
* 更多擴展:可從「下載擴充功能 & 資源」Download Extensions & Assets選單中下載
想了解如何使用這些擴充功能,請參考:[官方說明文件](https://docs.sillytavern.app/)
# ⌛ 安裝指南
> \[!WARNING]
>
> * 請勿將程式安裝到 Windows 的系統控制資料夾(如 Program Files、System32 等)
> * 請勿以管理員權限執行 Start.bat
> * 無法在 Windows 7 系統上安裝,因為它無法執行 NodeJS 18.16
## 🪟 Windows
### 使用 Git 安裝
1. 安裝 [NodeJS](https://nodejs.org/en)(建議使用最新的 LTS 版本)
2. 安裝 [Git for Windows](https://gitforwindows.org/)
3. 打開 Windows 檔案總管(`Win+E`
4. 創建/使用一個不受 Windows 系統控制或監控的資料夾例如C:\MySpecialFolder\
5. 在該資料夾內開啟命令提示字元Command Prompt點擊地址欄輸入 `cmd` 並按下 Enter
6. 當命令提示字元黑框彈出時,輸入以下其中一條指令後,按下 Enter
* 安裝 Release穩定版分支`git clone https://github.com/SillyTavern/SillyTavern -b release`
* 安裝 Staging開發板分支`git clone https://github.com/SillyTavern/SillyTavern -b staging`
7. 當程式碼下載完成後,雙擊 `Start.bat`NodeJS 將自動安裝所需的依賴項
8. 本地伺服器啟動後SillyTavern 將自動在您的瀏覽器中打開
### 使用 GitHub Desktop 安裝
(此方式僅允許通過 GitHub Desktop 使用 git。如果您也希望在命令列中使用 `git`,則需額外安裝 [Git for Windows](https://gitforwindows.org/)
1. 安裝 [NodeJS](https://nodejs.org/en)(建議使用最新的 LTS 版本)
2. 安裝 [GitHub Desktop](https://central.github.com/deployments/desktop/desktop/latest/win32)
3. 安裝完成後,打開 GitHub Desktop點擊 `Clone a repository from the internet....` (注意:此步驟 **無需創建 GitHub 帳號**。)
4. 在彈出選單中點擊「URL」選項輸入此網址`https://github.com/SillyTavern/SillyTavern`然後點擊「Clone」。您可以更改「Local path」來選擇 SillyTavern 的下載位置
6. 若想開啟 SillyTavern需使用 Windows 檔案總管以進入您複製儲存庫的資料夾。預設位置為:`C:\Users\[您的 Windows 使用者名稱]\Documents\GitHub\SillyTavern`
7. 雙擊 `start.bat` 文件。(請注意:若您的作業系統隱藏了 `.bat` 副檔名,該文件可能顯示為「`Start`」。這就是您需要雙擊運行的文件。)
8. 雙擊後將會彈出一個大型黑色的命令提示字元視窗SillyTavern 會開始安裝其運行所需的文件與依賴
9. 安裝完成後,若一切正常,命令提示字元視窗應顯示運行中的訊息,且您的瀏覽器會自動打開 SillyTavern 頁籤
10. 連接到任何 SillyTavern [支援的 APIs](https://docs.sillytavern.app/usage/api-connections/) 並開始聊天吧!
## 🐧 Linux & 🍎 MacOS
對於 MacOS 和 Linux 系統所有操作都將在終端機Terminal中完成。
1. 安裝 git 和 NodeJS具體方法因操作系統而異
2. 複製儲存庫Clone the repo
* 安裝 Release穩定版分支`git clone https://github.com/SillyTavern/SillyTavern -b release`
* 安裝 Staging開發板分支`git clone https://github.com/SillyTavern/SillyTavern -b staging`
3. 使用命令 `cd SillyTavern` 以進入安裝資料夾
4. 使用以下其中一條命令,以執行 `start.sh` 腳本:
* `./start.sh`
* `bash start.sh`
## ⚡ 使用 SillyTavern Launcher 安裝
SillyTavern Launcher 是一個安裝嚮導協助您設定多種選項包括安裝本地推理inference的後端。
### 對於 Windows 使用者
1. 在鍵盤上按下 **`WINDOWS + R`** 打開「執行」對話框,然後輸入以下指令以安裝 git
```shell
cmd /c winget install -e --id Git.Git
```
2. 在鍵盤上按下 **`WINDOWS + E`** 打開檔案總管,導航至您想要安裝 Launcher 的資料夾。在目標資料夾的地址欄輸入 `cmd` 並按下 Enter。接著執行以下命令
```shell
git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher && start installer.bat
```
### 對於 Linux 使用者
1. 打開您喜歡的終端機Terminal安裝 git
2. 使用以下指令以複製 Sillytavern-Launcher
```shell
git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher
```
3. 執行安裝腳本installer.sh
```shell
chmod +x install.sh && ./install.sh
```
4. 安裝完成後執行啟動腳本launcher.sh
```shell
chmod +x launcher.sh && ./launcher.sh
```
### 對於 Mac 使用者
1. 打開終端機Terminal並使用以下指令安裝 Homebrew
```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
2. 使用 Homebrew 以安裝 git
```shell
brew install git
```
3. 使用以下指令以複製 Sillytavern-Launcher
```shell
git clone https://github.com/SillyTavern/SillyTavern-Launcher.git && cd SillyTavern-Launcher
```
4. 執行安裝腳本installer.sh
```shell
chmod +x install.sh && ./install.sh
```
5. 安裝完成後執行啟動腳本launcher.sh
```shell
chmod +x launcher.sh && ./launcher.sh
```
## 🐋 使用 Docker 安裝
以下指南已假設您安裝 Docker能夠訪問命令列進行容器安裝並熟悉 Docker 的基本使用。
### 自行構建映像
我們提供了一份完整的 [SillyTavern Docker 使用指南](http://docs.sillytavern.app/installation/docker/)。該指南涵蓋了 Windows、macOS 和 Linux 的安裝過程。若您希望自行構建映像,建議先閱讀該文檔。
### 使用 GitHub 容器註冊表(最簡易的方式)
您需要設定兩個必要的目錄映射directory mappings和一個端口映射port mapping來使 SillyTavern 正常運行。在執行指令時,請將以下佔位符替換為您的實際配置:
#### 容器變數
##### 目錄映射Volume Mappings
* [config]:用於存放 SillyTavern 設定文件的本地資料夾
* [data]:用於存放 SillyTavern 使用者數據(包括角色)的本地資料夾
* [plugins](可選):用於存放 SillyTavern 擴充功能的本地資料夾
##### 端口映射Port Mappings
* [PublicPort]:對外流量的訪問端口。這是必需的,因為您將從虛擬機容器外部訪問實例。除非實施了額外的安全服務,否則請勿將此端口暴露於網路
##### 其他設定Additional Settings
* [DockerNet]:容器應連接的 Docker 網路。如果您不熟悉此概念,請參閱 [Docker 官方說明文件](https://docs.docker.com/reference/cli/docker/network/)
* [version]:在 GitHub 頁面的右側您可以找到「Packages」。選擇「sillytavern」包然後查看映像版本。「latest」標籤會使您保持與當前版本同步。您也可以選擇「staging」或「release」標籤但這可能不適用於依賴擴充功能的使用者因為擴充功能可能需要時間進行更新
#### 安裝命令
1. 打開命令列Command Line
2. 執行以下指令:
`docker create --name='sillytavern' --net='[DockerNet]' -p '8000:8000/tcp' -v '[plugins]':'/home/node/app/plugins':'rw' -v '[config]':'/home/node/app/config':'rw' -v '[data]':'/home/node/app/data':'rw' 'ghcr.io/sillytavern/sillytavern:[version]'`
> 請注意:默認的監聽端口為 8000。如果您在設定文件中更改了此端口請務必使用適當的端口號
## 📱 於 Android 系統中使用 Termux 安裝
> \[!NOTE]
> **雖然您可以在 Android 設備上使用 Termux 直接運行 SillyTavern但這不在我們的官方支持範圍內。**
>
> **請參閱 ArroganceComplex#2659 所提供的指南:**
>
> * <https://rentry.org/STAI-Termux>
**不支援Android ARM LEtime-web。** 32 位 Android 系統需要額外的依賴項,這無法通過 npm 安裝。請使用以下命令安裝:`pkg install esbuild`。完成後,請按照普通的安裝步驟進行操作
## API 金鑰管理
SillyTavern 將您的 API 金鑰Keys保存在使用者數據目錄中的 `secrets.json` 文件內(默認路徑為`/data/default-user/secrets.json`
默認情況下API 金鑰在您保存並重新載入頁面後,將不會自介面中顯示
如需啟用查看金鑰功能:
1.`config.yaml` 文件中,將 `allowKeysExposure` 的「值」設為 `true`
2. 重新啟動 SillyTavern 伺服器
3. 點擊 API 連線頁面右下角的「查看隱藏的 API 金鑰View hidden API keys」超連結
## 命令列參數Command-line Arguments
您可以在啟動 SillyTavern 伺服器時傳遞命令列參數,以覆蓋 `config.yaml` 文件中的某些設定。
### 範例
```shell
node server.js --port 8000 --listen false
# or
npm run start -- --port 8000 --listen false
# or僅適用於 Windows
Start.bat --port 8000 --listen false
```
### Supported arguments
| Option | Description | Type |
|-------------------------|------------------------------------------------------------------------------------------------------|----------|
| `--version` | 顯示版本序號 | boolean |
| `--enableIPv6` | 啟用 IPv6 | boolean |
| `--enableIPv4` | 啟用 IPv4 | boolean |
| `--port` | 設定 SillyTavern 運行的端口。若未提供,則預設使用 `config.yaml` 中的 'port' | number
| `--dnsPreferIPv6` | 偏好使用 IPv6 解析 DNS。未提供則默認使用 `config.yaml` 中的 'preferIPv6' | boolean |
| `--autorun` | 自動在瀏覽器中啟動 SillyTavern。未提供則默認使用 `config.yaml` 中的 'autorun' | boolean |
| `--autorunHostname` | 自動啟動時的主機名稱,通常建議保持為 'auto' | string |
| `--autorunPortOverride` | 覆蓋自動啟動的端口設定 | string |
| `--listen` | SillyTavern 是否可監聽所有網路接口。若未提供,則默認使用 `config.yaml` 中的 'listen' | boolean |
| `--corsProxy` | 啟用 CORS 代理。若未提供,則默認使用 `config.yaml` 中的 'enableCorsProxy' | boolean |
| `--disableCsrf` | 停用 CSRF 保護 | boolean |
| `--ssl` | 啟用 SSL | boolean |
| `--certPath` | 設定您證書文件的路徑 | string |
| `--keyPath` | 設定您私人金鑰文件的路徑 | string |
| `--whitelist` | 啟用白名單模式 | boolean |
| `--dataRoot` | 設定數據儲存的根目錄 | string |
| `--avoidLocalhost` | 在自動模式下避免使用 'localhost' | boolean |
| `--basicAuthMode` | 啟用基本身份驗證模式 | boolean |
| `--requestProxyEnabled` | 啟用代理以處理外部請求 | boolean |
| `--requestProxyUrl` | 設定請求代理的 URL支持 HTTP 或 SOCKS 協議) | string |
| `--requestProxyBypass` | 請求代理的例外主機清單(主機列表需以空格分隔) | array |
## 遠端連線
遠端連線功能最常用於希望在手機上使用 SillyTavern 的使用者。此時伺服器將由同一 Wi-Fi 網路上的 PC 運行。不過,您也可以設定來自其他網路的遠端連線。
詳細設定指南請參閱 [官方說明文件](https://docs.sillytavern.app/usage/remoteconnections/)。
您還可以選擇設定 SillyTavern 的使用者檔案,並開啟密碼保護(可選):[使用者設定指南](https://docs.sillytavern.app/installation/st-1.12.0-migration-guide/#users)。
## 遇到任何效能問題?
1. 在「使用者設定」選單設定介面主題禁用模糊效果Blur Effect並開啟「減少動畫效果」Reduced Motion
2. 若使用響應串流傳輸,請將串流的 FPS 設定為較低的值(建議設定為 10-15 FPS
3. 確保瀏覽器已啟用 GPU 加速以進行渲染
## 授權與致謝
**本程式SillyTavern的發布是基於其可能對使用者有所幫助的期許但不提供任何形式的保證包括但不限於對可銷售性marketability或特定用途適用性的隱含保證。如需更多詳情請參閱 GNU Affero 通用公共許可證。**
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
* [TavernAI](https://github.com/TavernAI/TavernAI) 1.2.8 由 Humi 提供MIT 許可
* 經授權使用部分來自 CncAnon 的 TavernAITurbo 模組
* 視覺小說模式Visual Novel Mode的靈感來源於 PepperTaco 的貢獻(<https://github.com/peppertaco/Tavern/>
* Noto Sans 字體由 Google 提供OFL 許可)
* 主題圖示由 Font Awesome <https://fontawesome.com> 提供圖示CC BY 4.0字體SIL OFL 1.1程式碼MIT 許可)
* 預設資源來源於 @OtisAlejandro(包含角色 Seraphina 與知識書)與 @kallmefloccSillyTavern 官方 Discord 伺服器成員突破 10K 的慶祝背景)
* Docker 安裝指南由 [@mrguymiah](https://github.com/mrguymiah) 和 [@Bronya-Rand](https://github.com/Bronya-Rand) 編寫
## 主要貢獻者
[![Contributors](https://contrib.rocks/image?repo=SillyTavern/SillyTavern)](https://github.com/SillyTavern/SillyTavern/graphs/contributors)
<!-- LINK GROUP -->
[cover]: https://github.com/user-attachments/assets/01a6ae9a-16aa-45f2-8bff-32b5dc587e44
[discord-link]: https://discord.gg/sillytavern
[discord-shield-badge]: https://img.shields.io/discord/1100685673633153084?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=for-the-badge

176
.github/readme.md vendored
View File

@@ -4,7 +4,7 @@
<div align="center"> <div align="center">
English | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) English | [German](readme-de_de.md) | [中文](readme-zh_cn.md) | [繁體中文](readme-zh_tw.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) | [한국어](readme-ko_kr.md)
[![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers) [![GitHub Stars](https://img.shields.io/github/stars/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/stargazers)
[![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network) [![GitHub Forks](https://img.shields.io/github/forks/SillyTavern/SillyTavern.svg)](https://github.com/SillyTavern/SillyTavern/network)
@@ -23,7 +23,7 @@ We have a [Documentation website](https://docs.sillytavern.app/) to answer most
SillyTavern (or ST for short) is a locally installed user interface that allows you to interact with text generation LLMs, image generation engines, and TTS voice models. SillyTavern (or ST for short) is a locally installed user interface that allows you to interact with text generation LLMs, image generation engines, and TTS voice models.
Beginning in February 2023 as a fork of TavernAI 1.2.8, SillyTavern now has over 100 contributors and 2 years of independent development under its belt, and continues to serve as a leading software for savvy AI hobbyists. Beginning in February 2023 as a fork of TavernAI 1.2.8, SillyTavern now has over 200 contributors and 2 years of independent development under its belt, and continues to serve as a leading software for savvy AI hobbyists.
## Our Vision ## Our Vision
@@ -113,7 +113,9 @@ SillyTavern has extensibility support.
Tutorials on how to use them can be found in the [Docs](https://docs.sillytavern.app/). Tutorials on how to use them can be found in the [Docs](https://docs.sillytavern.app/).
# ⌛ Installation ## ⌛ Installation
### 🪟 Windows
> \[!WARNING] > \[!WARNING]
> >
@@ -121,9 +123,7 @@ Tutorials on how to use them can be found in the [Docs](https://docs.sillytavern
> * DO NOT RUN START.BAT WITH ADMIN PERMISSIONS > * DO NOT RUN START.BAT WITH ADMIN PERMISSIONS
> * INSTALLATION ON WINDOWS 7 IS IMPOSSIBLE AS IT CAN NOT RUN NODEJS 18.16 > * INSTALLATION ON WINDOWS 7 IS IMPOSSIBLE AS IT CAN NOT RUN NODEJS 18.16
## 🪟 Windows #### Installing via Git (recommended)
### Installing via Git
1. Install [NodeJS](https://nodejs.org/en) (latest LTS version is recommended) 1. Install [NodeJS](https://nodejs.org/en) (latest LTS version is recommended)
2. Install [Git for Windows](https://gitforwindows.org/) 2. Install [Git for Windows](https://gitforwindows.org/)
@@ -138,7 +138,7 @@ Tutorials on how to use them can be found in the [Docs](https://docs.sillytavern
7. Once everything is cloned, double-click `Start.bat` to make NodeJS install its requirements. 7. Once everything is cloned, double-click `Start.bat` to make NodeJS install its requirements.
8. The server will then start, and SillyTavern will pop up in your browser. 8. The server will then start, and SillyTavern will pop up in your browser.
### Installing via GitHub Desktop #### Installing via GitHub Desktop
(This allows git usage **only** in GitHub Desktop, if you want to use `git` on the command line too, you also need to install [Git for Windows](https://gitforwindows.org/)) (This allows git usage **only** in GitHub Desktop, if you want to use `git` on the command line too, you also need to install [Git for Windows](https://gitforwindows.org/))
@@ -152,7 +152,7 @@ Tutorials on how to use them can be found in the [Docs](https://docs.sillytavern
9. After the installation process, if everything is working, the command console window should look like this and a SillyTavern tab should be open in your browser: 9. After the installation process, if everything is working, the command console window should look like this and a SillyTavern tab should be open in your browser:
10. Connect to any of the [supported APIs](https://docs.sillytavern.app/usage/api-connections/) and start chatting! 10. Connect to any of the [supported APIs](https://docs.sillytavern.app/usage/api-connections/) and start chatting!
## 🐧 Linux & 🍎 MacOS ### 🐧 Linux & 🍎 MacOS
For MacOS / Linux all of these will be done in a Terminal. For MacOS / Linux all of these will be done in a Terminal.
@@ -168,6 +168,57 @@ For MacOS / Linux all of these will be done in a Terminal.
* `./start.sh` * `./start.sh`
* `bash start.sh` * `bash start.sh`
## 🐋 Installing via Docker
These instructions assume you have installed Docker, are able to access your command line for the installation of containers, and familiar with their general operation.
### Using the GitHub Container Registry
#### Docker Compose (easiest)
Grab the `docker-compose.yml` file from the [GitHub Repository](https://github.com/SillyTavern/SillyTavern/blob/release/docker/docker-compose.yml) and run the following command in the directory where the file is located. This will pull the latest release image from the GitHub Container Registry and start the container, automatically creating the necessary volumes.
```shell
docker-compose up
```
Customize the `docker-compose.yml` file to your needs. The default port is 8000. If you want to adjust the server configuration using environment variables, read the documentation [here](https://docs.sillytavern.app/administration/config-yaml/#environment-variables).
#### Docker CLI (advanced)
You will need two mandatory directory mappings and a port mapping to allow SillyTavern to function. In the command, replace your selections in the following places:
#### Container Variables
##### Volume Mappings
* [config] - The directory where SillyTavern configuration files will be stored on your host machine
* [data] - The directory where SillyTavern user data (including characters) will be stored on your host machine
* [plugins] - (optional) The directory where SillyTavern server plugins will be stored on your host machine
* [extensions] - (optional) The directory where global UI extensions will be stored on your host machine
##### Port Mappings
* [PublicPort] - The port to expose the traffic on. This is mandatory, as you will be accessing the instance from outside of its virtual machine container. DO NOT expose this to the internet without implementing a separate service for security.
##### Additional Settings
* [DockerNet] - The docker network that the container should be created with a connection to. If you don't know what it is, see the [official Docker documentation](https://docs.docker.com/reference/cli/docker/network/).
* [version] - On the right-hand side of this GitHub page, you'll see "Packages". Select the "sillytavern" package and you'll see the image versions. The image tag "latest" will keep you up-to-date with the current release. You can also utilize "staging" and "release" tags that point to the nightly images of the respective branches, but this may not be appropriate, if you are utilizing extensions that could be broken, and may need time to update.
#### Install command
1. Open your Command Line
2. Run the following command
`docker run --name='sillytavern' --net='[DockerNet]' -p '8000:8000/tcp' -v '[plugins]':'/home/node/app/plugins':'rw' -v '[config]':'/home/node/app/config':'rw' -v '[data]':'/home/node/app/data':'rw' -v '[extensions]':'/home/node/app/public/scripts/extensions/third-party':'rw' 'ghcr.io/sillytavern/sillytavern:[version]'`
> Note that 8000 is a default listening port. Don't forget to use an appropriate port if you change it in the config.
### Building the image yourself
We have a comprehensive guide on using SillyTavern in Docker [here](http://docs.sillytavern.app/installation/docker/) which covers installations on Windows, macOS and Linux! Give it a read if you wish to build the image yourself.
## ⚡ Installing via SillyTavern Launcher ## ⚡ Installing via SillyTavern Launcher
SillyTavern Launcher is an installation wizard that will help you get setup with many options, including installing a backend for local inference. SillyTavern Launcher is an installation wizard that will help you get setup with many options, including installing a backend for local inference.
@@ -239,44 +290,6 @@ chmod +x install.sh && ./install.sh
chmod +x launcher.sh && ./launcher.sh chmod +x launcher.sh && ./launcher.sh
``` ```
## 🐋 Installing via Docker
These instructions assume you have installed Docker, are able to access your command line for the installation of containers, and familiar with their general operation.
### Building the image yourself
We have a comprehensive guide on using SillyTavern in Docker [here](http://docs.sillytavern.app/installation/docker/) which covers installations on Windows, macOS and Linux! Give it a read if you wish to build the image yourself.
### Using the GitHub Container Registry (easiest)
You will need two mandatory directory mappings and a port mapping to allow SillyTavern to function. In the command, replace your selections in the following places:
#### Container Variables
##### Volume Mappings
* [config] - The directory where SillyTavern configuration files will be stored on your host machine
* [data] - The directory where SillyTavern user data (including characters) will be stored on your host machine
* [plugins] - (optional) The directory where SillyTavern server plugins will be stored on your host machine
##### Port Mappings
* [PublicPort] - The port to expose the traffic on. This is mandatory, as you will be accessing the instance from outside of its virtual machine container. DO NOT expose this to the internet without implementing a separate service for security.
##### Additional Settings
* [DockerNet] - The docker network that the container should be created with a connection to. If you don't know what it is, see the [official Docker documentation](https://docs.docker.com/reference/cli/docker/network/).
* [version] - On the right-hand side of this GitHub page, you'll see "Packages". Select the "sillytavern" package and you'll see the image versions. The image tag "latest" will keep you up-to-date with the current release. You can also utilize "staging" and "release" tags that point to the nightly images of the respective branches, but this may not be appropriate, if you are utilizing extensions that could be broken, and may need time to update.
#### Install command
1. Open your Command Line
2. Run the following command
`docker create --name='sillytavern' --net='[DockerNet]' -p '8000:8000/tcp' -v '[plugins]':'/home/node/app/plugins':'rw' -v '[config]':'/home/node/app/config':'rw' -v '[data]':'/home/node/app/data':'rw' 'ghcr.io/sillytavern/sillytavern:[version]'`
> Note that 8000 is a default listening port. Don't forget to use an appropriate port if you change it in the config.
## 📱 Installing via Termux on Android OS ## 📱 Installing via Termux on Android OS
> \[!NOTE] > \[!NOTE]
@@ -316,29 +329,34 @@ Start.bat --port 8000 --listen false
### Supported arguments ### Supported arguments
| Option | Description | Type | > \[!TIP]
|-------------------------|------------------------------------------------------------------------------------------------------|----------| > None of the arguments are required. If you don't provide them, SillyTavern will use the settings in `config.yaml`.
| `--version` | Show version number | boolean |
| `--enableIPv6` | Enables IPv6. | boolean | | Option | Description | Type |
| `--enableIPv4` | Enables IPv4. | boolean | |-------------------------|----------------------------------------------------------------------|----------|
| `--port` | Sets the port under which SillyTavern will run. If not provided falls back to yaml config 'port'. | number | | `--version` | Show version number | boolean |
| `--dnsPreferIPv6` | Prefers IPv6 for dns. If not provided falls back to yaml config 'preferIPv6'. | boolean | | `--dataRoot` | Root directory for data storage | string |
| `--autorun` | Automatically launch SillyTavern in the browser. If not provided falls back to yaml config 'autorun'.| boolean | | `--port` | Sets the port under which SillyTavern will run | number |
| `--autorunHostname` | The autorun hostname, probably best left on 'auto'. | string | | `--listen` | SillyTavern will listen on all network interfaces | boolean |
| `--autorunPortOverride` | Overrides the port for autorun. | string | | `--whitelist` | Enables whitelist mode | boolean |
| `--listen` | SillyTavern is listening on all network interfaces. If not provided falls back to yaml config 'listen'.| boolean | | `--basicAuthMode` | Enables basic authentication | boolean |
| `--corsProxy` | Enables CORS proxy. If not provided falls back to yaml config 'enableCorsProxy'. | boolean | | `--enableIPv4` | Enables IPv4 protocol | boolean |
| `--disableCsrf` | Disables CSRF protection | boolean | | `--enableIPv6` | Enables IPv6 protocol | boolean |
| `--ssl` | Enables SSL | boolean | | `--listenAddressIPv4` | Specific IPv4 address to listen to | string |
| `--certPath` | Path to your certificate file. | string | | `--listenAddressIPv6` | Specific IPv6 address to listen to | string |
| `--keyPath` | Path to your private key file. | string | | `--dnsPreferIPv6` | Prefers IPv6 for DNS | boolean |
| `--whitelist` | Enables whitelist mode | boolean | | `--ssl` | Enables SSL | boolean |
| `--dataRoot` | Root directory for data storage | string | | `--certPath` | Path to your certificate file | string |
| `--avoidLocalhost` | Avoids using 'localhost' for autorun in auto mode. | boolean | | `--keyPath` | Path to your private key file | string |
| `--basicAuthMode` | Enables basic authentication | boolean | | `--autorun` | Automatically launch SillyTavern in the browser | boolean |
| `--requestProxyEnabled` | Enables a use of proxy for outgoing requests | boolean | | `--autorunHostname` | Autorun hostname | string |
| `--requestProxyUrl` | Request proxy URL (HTTP or SOCKS protocols) | string | | `--autorunPortOverride` | Overrides the port for autorun | string |
| `--requestProxyBypass` | Request proxy bypass list (space separated list of hosts) | array | | `--avoidLocalhost` | Avoids using 'localhost' for autorun in auto mode | boolean |
| `--corsProxy` | Enables CORS proxy | boolean |
| `--requestProxyEnabled` | Enables a use of proxy for outgoing requests | boolean |
| `--requestProxyUrl` | Request proxy URL (HTTP or SOCKS protocols) | string |
| `--requestProxyBypass` | Request proxy bypass list (space separated list of hosts) | array |
| `--disableCsrf` | Disables CSRF protection (NOT RECOMMENDED) | boolean |
## Remote connections ## Remote connections
@@ -350,10 +368,29 @@ You may also want to configure SillyTavern user profiles with (optional) passwor
## Performance issues? ## Performance issues?
### General tips
1. Disable the Blur Effect and enable Reduced Motion on the User Settings panel (UI Theme toggles category). 1. Disable the Blur Effect and enable Reduced Motion on the User Settings panel (UI Theme toggles category).
2. If using response streaming, set the streaming FPS to a lower value (10-15 FPS is recommended). 2. If using response streaming, set the streaming FPS to a lower value (10-15 FPS is recommended).
3. Make sure the browser is enabled to use GPU acceleration for rendering. 3. Make sure the browser is enabled to use GPU acceleration for rendering.
### Input lag
Performance degradation, particularly input lag, is most commonly attributed to browser extensions. Known problematic extensions include:
* iCloud Password Manager
* DeepL Translation
* AI-based grammar correction tools
* Various ad-blocking extensions
If you experience performance issues and cannot identify the cause, or suspect an issue with SillyTavern itself, please:
1. [Record a performance profile](https://developer.chrome.com/docs/devtools/performance/reference)
2. Export the profile as a JSON file
3. Submit it to the development team for analysis
We recommend first testing with all browser extensions and third-party SillyTavern extensions disabled to isolate the source of the performance degradation.
## License and credits ## License and credits
**This program is distributed in the hope that it will be useful, **This program is distributed in the hope that it will be useful,
@@ -368,6 +405,7 @@ GNU Affero General Public License for more details.**
* Icon theme by Font Awesome <https://fontawesome.com> (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Icon theme by Font Awesome <https://fontawesome.com> (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Default content by @OtisAlejandro (Seraphina character and lorebook) and @kallmeflocc (10K Discord Users Celebratory Background) * Default content by @OtisAlejandro (Seraphina character and lorebook) and @kallmeflocc (10K Discord Users Celebratory Background)
* Docker guide by [@mrguymiah](https://github.com/mrguymiah) and [@Bronya-Rand](https://github.com/Bronya-Rand) * Docker guide by [@mrguymiah](https://github.com/mrguymiah) and [@Bronya-Rand](https://github.com/Bronya-Rand)
* kokoro-js library by [@hexgrad](https://github.com/hexgrad) (Apache-2.0 License)
## Top Contributors ## Top Contributors

View File

@@ -1,28 +0,0 @@
# Based on a label applied to an issue, the bot will add a comment with some additional info
name: 🎯 Auto-Reply to Labeled Tickets
on:
issues:
types:
- labeled
- unlabeled
pull_request_target:
types:
- labeled
- unlabeled
permissions:
contents: read
issues: write
pull-requests: write
jobs:
comment:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Label Commenter
uses: peaceiris/actions-label-commenter@v1
with:
config_file: .github/issue-auto-comments.yml
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}

View File

@@ -1,17 +0,0 @@
# Detect and label pull requests that have merge conflicts
name: 🏗️ Check Merge Conflicts
on:
push:
branches:
- staging
jobs:
check-conflicts:
if: github.repository == 'SillyTavern/SillyTavern'
runs-on: ubuntu-latest
steps:
- uses: mschilde/auto-label-merge-conflicts@master
with:
CONFLICT_LABEL_NAME: "🚫 Merge Conflicts"
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
MAX_RETRIES: 5
WAIT_MS: 5000

View File

@@ -1,82 +0,0 @@
# Closes any issues that no longer have user interaction
name: 🎯 Close Stale Issues
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *' # Runs every day at midnight UTC
jobs:
stale:
runs-on: ubuntu-latest
steps:
# Comment on, then close issues that haven't been updated for ages
- name: Close Stale Issues
uses: actions/stale@v4
with:
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
days-before-stale: 183
days-before-close: 7
operations-per-run: 30
remove-stale-when-updated: true
enable-statistics: true
stale-issue-message: >
This issue has gone 6 months without an update. To keep the ticket open, please indicate that it is still relevant in a comment below.
Otherwise it will be closed in 7 days.
stale-pr-message: >
This PR is stale because it has been open 6 months with no activity. Either remove the stale label or comment below with a short update,
otherwise this PR will be closed in 7 days.
close-issue-message: >
This issue was automatically closed because it has been stalled for over 6 months with no activity.
close-pr-message: >
This pull request was automatically closed because it has been stalled for over 6 months with no activity.
stale-issue-label: '⚰️ Stale'
close-issue-label: '🕸️ Inactive'
stale-pr-label: '⚰️ Stale'
close-pr-label: '🕸️ Inactive'
exempt-issue-labels: '📌 Keep Open'
exempt-pr-labels: '📌 Keep Open'
labels-to-add-when-unstale: '📌 Keep Open'
# Comment on, then close issues that required a response from the user, but didn't get one
- name: Close Issues without Response
uses: actions/stale@v4
with:
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
days-before-stale: 7
days-before-close: 7
operations-per-run: 30
remove-stale-when-updated: true
stale-issue-message: >
Hi! Looks like additional info is required for this issue to be addressed.
Don't forget to provide this within the next few days to keep your ticket open.
close-issue-message: 'Issue closed due to no response from user.'
only-labels: '🚏 Awaiting User Response'
labels-to-remove-when-unstale: '🚏 Awaiting User Response, 🛑 No Response'
stale-issue-label: '🛑 No Response'
close-issue-label: '🕸️ Inactive'
exempt-issue-labels: '📌 Keep Open'
exempt-pr-labels: '📌 Keep Open'
# Comment on issues that we should have replied to
- name: Notify Repo Owner to Respond
uses: actions/stale@v4
with:
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
days-before-stale: 7
days-before-close: 183
operations-per-run: 30
remove-stale-when-updated: true
stale-issue-message: Hey SillyTavern, - Don't forget to respond!
stale-pr-message: Hey SillyTavern, - Don't forget to respond!
only-labels: '👤 Awaiting Maintainer Response'
labels-to-remove-when-unstale: '👤 Awaiting Maintainer Response'
close-issue-message: 'Closed due to no response from repo author for over a year'
close-pr-message: 'Closed due to no response from repo author for over a year'
stale-issue-label: '👤 Awaiting Maintainer Response'
stale-pr-label: '👤 Awaiting Maintainer Response'
close-issue-label: '🕸️ Inactive'
close-pr-label: '🕸️ Inactive'
exempt-issue-labels: '📌 Keep Open'
exempt-pr-labels: '📌 Keep Open'

View File

@@ -1,39 +0,0 @@
# Adds a comment to new PRs, showing the compressed size and size difference of new code
# And also labels the PR based on the number of lines changes
name: 🌈 Check PR Size
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
# Find and comment with compressed size
- name: Get Compressed Size
uses: preactjs/compressed-size-action@v2
with:
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
pattern: './dist/**/*.{js,css,html}'
strip-hash: '\\b\\w{8}\\.'
exclude: '**/node_modules/**'
minimum-change-threshold: 100
# Check number of lines of code added
- name: Label based on Lines of Code
uses: codelytv/pr-size-labeler@v1
with:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
xs_max_size: '10'
s_max_size: '100'
m_max_size: '500'
l_max_size: '1000'
s_label: '🟩 PR - Small'
m_label: '🟨 PR - Medium'
l_label: '🟧 PR - Large'
xl_label: '🟥 PR - XL'
fail_if_xl: 'false'
message_if_xl: >
It looks like this PR is very large (over 1000 lines).
Try to avoid addressing multiple issues in a single PR, and
in the future consider breaking large tasks down into smaller steps.
This it to make reviewing, testing, reverting and general quality management easier.

View File

@@ -0,0 +1,116 @@
name: 🛠️ Issues Manager
on:
issues:
types: [opened, edited, labeled, unlabeled]
# Re also listen to comments, to remove stale labels right away
issue_comment:
types: [created]
permissions:
contents: read
issues: write
jobs:
label-on-content:
name: 🏷️ Label Issues by Content
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
# Checkout
# https://github.com/marketplace/actions/checkout
uses: actions/checkout@v4.2.2
- name: Auto-Label Issues (Based on Issue Content)
# only auto label based on issue content once, on open (to prevent re-labeling removed labels)
if: github.event.action == 'opened'
# Issue Labeler
# https://github.com/marketplace/actions/regex-issue-labeler
uses: github/issue-labeler@v3.4
with:
configuration-path: .github/issues-auto-labels.yml
enable-versioned-regex: 0
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
label-on-labels:
name: 🏷️ Label Issues by Labels
runs-on: ubuntu-latest
steps:
- name: ✅ Add "👍 Approved" for relevant labels
if: contains(fromJSON('["👩‍💻 Good First Issue", "🙏 Help Wanted", "🪲 Confirmed", "⚠️ High Priority", "❕ Medium Priority", "💤 Low Priority"]'), github.event.label.name)
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: 'add-labels'
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
labels: '👍 Approved'
- name: ❌ Remove progress labels when issue is marked done or stale
if: contains(fromJSON('["✅ Done", "✅ Done (staging)", "⚰️ Stale", "❌ wontfix"]'), github.event.label.name)
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: 'remove-labels'
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
labels: '🧑‍💻 In Progress,🤔 Unsure,🤔 Under Consideration'
- name: ❌ Remove temporary labels when confirmed labels are added
if: contains(fromJSON('["❌ wontfix","👍 Approved","👩‍💻 Good First Issue"]'), github.event.label.name)
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: 'remove-labels'
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
labels: '🤔 Unsure,🤔 Under Consideration'
- name: ❌ Remove no bug labels when "🪲 Confirmed" is added
if: github.event.label.name == '🪲 Confirmed'
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: 'remove-labels'
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
labels: '✖️ Not Reproducible,✖️ Not A Bug'
remove-stale-label:
name: 🗑️ Remove Stale Label on Comment
runs-on: ubuntu-latest
# Only run this on new comments, to automatically remove the stale label
if: github.event_name == 'issue_comment' && github.actor != 'github-actions[bot]'
steps:
- name: Remove Stale Label
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: 'remove-labels'
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: '⚰️ Stale,🕸️ Inactive,🚏 Awaiting User Response,🛑 No Response'
write-auto-comments:
name: 💬 Post Issue Comments Based on Labels
needs: [label-on-content, label-on-labels]
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
# Checkout
# https://github.com/marketplace/actions/checkout
uses: actions/checkout@v4.2.2
- name: Post Issue Comments Based on Labels
# Label Commenter
# https://github.com/marketplace/actions/label-commenter
uses: peaceiris/actions-label-commenter@v1.10.0
with:
config_file: .github/issues-auto-comments.yml
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}

View File

@@ -0,0 +1,45 @@
name: 🔄 Update Issues on Push
on:
push:
branches:
- staging
- release
permissions:
contents: read
issues: write
jobs:
# This runs commits to staging/release, reading the commit messages. Check `pr-auto-manager.yml`:`update-linked-issues` for PR-linked updates.
update-linked-issues:
name: 🔗 Mark Linked Issues Done on Push
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
# Checkout
# https://github.com/marketplace/actions/checkout
uses: actions/checkout@v4.2.2
- name: Extract Linked Issues from Commit Message
id: extract_issues
run: |
ISSUES=$(git log ${{ github.event.before }}..${{ github.event.after }} --pretty=%B | grep -oiE '(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved) #([0-9]+)' | awk '{print $2}' | tr -d '#' | jq -R -s -c 'split("\n")[:-1]')
echo "issues=$ISSUES" >> $GITHUB_ENV
- name: Label Linked Issues
id: label_linked_issues
env:
GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
run: |
for ISSUE in $(echo $issues | jq -r '.[]'); do
if [ "${{ github.ref }}" == "refs/heads/staging" ]; then
LABEL="✅ Done (staging)"
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "$LABEL"
elif [ "${{ github.ref }}" == "refs/heads/release" ]; then
LABEL="✅ Done"
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "$LABEL"
fi
echo "Added label '$LABEL' to issue #$ISSUE"
done

100
.github/workflows/job-close-stale.yml vendored Normal file
View File

@@ -0,0 +1,100 @@
name: 🕒 Close Stale Issues/PRs Workflow
on:
# Run the workflow every day
workflow_dispatch:
schedule:
- cron: '0 0 * * *' # Runs every day at midnight UTC
permissions:
contents: read
issues: write
pull-requests: write
jobs:
mark-inactivity:
name: ⏳ Mark Issues/PRs without Activity
runs-on: ubuntu-latest
steps:
- name: Mark Issues/PRs without Activity
# Close Stale Issues and PRs
# https://github.com/marketplace/actions/close-stale-issues
uses: actions/stale@v9.1.0
with:
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
days-before-stale: 183
days-before-close: 7
operations-per-run: 30
remove-stale-when-updated: true
enable-statistics: true
stale-issue-message: >
⏳ This issue has been inactive for 6 months. If it's still relevant, drop a comment below to keep it open.
Otherwise, it will be auto-closed in 7 days.
stale-pr-message: >
⏳ This PR has been inactive for 6 months. If it's still relevant, update it or remove the stale label.
Otherwise, it will be auto-closed in 7 days.
close-issue-message: >
🔒 This issue was auto-closed due to inactivity for over 6 months.
close-pr-message: >
🔒 This PR was auto-closed due to inactivity for over 6 months.
stale-issue-label: '⚰️ Stale'
close-issue-label: '🕸️ Inactive'
stale-pr-label: '⚰️ Stale'
close-pr-label: '🕸️ Inactive'
exempt-issue-labels: '📌 Keep Open'
exempt-pr-labels: '📌 Keep Open'
await-user-response:
name: ⚠️ Mark Issues/PRs Awaiting User Response
runs-on: ubuntu-latest
needs: mark-inactivity
steps:
- name: Mark Issues/PRs Awaiting User Response
# Close Stale Issues and PRs
# https://github.com/marketplace/actions/close-stale-issues
uses: actions/stale@v9.1.0
with:
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
days-before-stale: 7
days-before-close: 7
operations-per-run: 30
remove-stale-when-updated: true
stale-issue-message: >
⚠️ Hey! We need some more info to move forward with this issue.
Please provide the requested details in the next few days to keep this ticket open.
close-issue-message: >
🔒 This issue was auto-closed due to no response from user.
only-labels: '🚏 Awaiting User Response'
labels-to-remove-when-unstale: '🚏 Awaiting User Response'
stale-issue-label: '🛑 No Response'
close-issue-label: '🕸️ Inactive'
exempt-issue-labels: '🚧 Alternative Exists'
alternative-exists:
name: 🔄 Mark Issues with Alternative Exists
runs-on: ubuntu-latest
needs: await-user-response
steps:
- name: Mark Issues with Alternative Exists
# Close Stale Issues and PRs
# https://github.com/marketplace/actions/close-stale-issues
uses: actions/stale@v9.1.0
with:
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
days-before-stale: 7
days-before-close: 7
operations-per-run: 30
remove-stale-when-updated: true
stale-issue-message: >
🔄 An alternative solution has been provided for this issue.
Did this solve your problem? If so, we'll go ahead and close it.
If you still need help, drop a comment within the next 7 days to keep this open.
close-issue-message: >
✅ Closing this issue due to no confirmation on the alternative solution.
only-labels: '🚧 Alternative Exists'
stale-issue-label: '🚏 Awaiting User Response'
close-issue-label: '🕸️ Inactive'
exempt-issue-labels: '📌 Keep Open'

View File

@@ -1,19 +0,0 @@
name: "Issue Labeler"
on:
issues:
types: [opened, edited]
permissions:
issues: write
contents: read
jobs:
triage:
runs-on: ubuntu-latest
steps:
- uses: github/issue-labeler@v3.4
with:
configuration-path: .github/labeler.yml
# not-before: 2020-01-15T02:54:32Z # optional and will result in any issues prior to this timestamp to be ignored.
enable-versioned-regex: 0
repo-token: ${{ github.token }}

View File

@@ -1,17 +0,0 @@
# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels, then those labels will be removed
name: 🎯 Remove Pending Labels on Close
on:
issues:
types: [closed]
jobs:
remove-labels:
runs-on: ubuntu-latest
steps:
- name: Remove Labels when Closed
uses: actions-cool/issues-helper@v2
with:
actions: remove-labels
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: '🚏 Awaiting User Response,⚰️ Stale,👤 Awaiting Maintainer Response'

View File

@@ -1,42 +0,0 @@
# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels, then those labels will be removed
name: 🎯 Add/ Remove Awaiting Response Labels
on:
issue_comment:
types: [created]
jobs:
remove-stale:
runs-on: ubuntu-latest
if: ${{ github.event.comment.author_association != 'COLLABORATOR' && github.event.comment.author_association != 'OWNER' }}
steps:
- name: Remove Stale labels when Updated
uses: actions-cool/issues-helper@v2
with:
actions: remove-labels
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: '🚏 Awaiting User Response,⚰️ Stale'
add-awaiting-author:
runs-on: ubuntu-latest
if: ${{!github.event.issue.pull_request && github.event.comment.author_association != 'COLLABORATOR' && github.event.comment.author_association != 'OWNER' && github.event.issue.state == 'open' }}
steps:
- name: Add Awaiting Author labels when Updated
uses: actions-cool/issues-helper@v2
with:
actions: add-labels
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: '👤 Awaiting Maintainer Response'
remove-awaiting-author:
runs-on: ubuntu-latest
if: ${{ github.event.comment.author_association == 'OWNER' }}
steps:
- name: Remove Awaiting Author labels when Updated
uses: actions-cool/issues-helper@v2
with:
actions: remove-labels
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: '👤 Awaiting Maintainer Response'

28
.github/workflows/on-close-handler.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: 🚪 Issues/PRs On Close Handler
on:
issues:
types: [closed]
pull_request_target:
types: [closed]
permissions:
contents: read
issues: write
pull-requests: write
jobs:
remove-labels:
name: 🗑️ Remove Pending Labels on Close
runs-on: ubuntu-latest
steps:
- name: Remove Pending Labels on Close
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: remove-labels
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number || github.event.pull_request.number }}
labels: '🚏 Awaiting User Response,🧑‍💻 In Progress,📌 Keep Open,🚫 Merge Conflicts,🔬 Needs Testing,🔨 Needs Work,⚰️ Stale,⛔ Waiting For External/Upstream'

29
.github/workflows/on-open-handler.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: 📨 Issues/PRs Open Handler
on:
issues:
types: [opened]
pull_request_target:
types: [opened]
permissions:
contents: read
issues: write
pull-requests: write
jobs:
label-maintainer:
name: 🏷️ Label if Author is a Repo Maintainer
runs-on: ubuntu-latest
if: contains(fromJson('["Cohee1207", "RossAscends", "Wolfsblvt"]'), github.actor)
steps:
- name: Label if Author is a Repo Maintainer
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: 'add-labels'
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number || github.event.pull_request.number }}
labels: '👷 Maintainer'

202
.github/workflows/pr-auto-manager.yml vendored Normal file
View File

@@ -0,0 +1,202 @@
name: 🔀 Pull Request Manager
on:
pull_request_target:
types: [opened, synchronize, reopened, edited, labeled, unlabeled, closed]
pull_request_review_comment:
types: [created]
permissions:
contents: read
pull-requests: write
jobs:
label-by-size:
name: 🏷️ Label PR by Size
runs-on: ubuntu-latest
steps:
- name: Label PR Size
# Pull Request Size Labeler
# https://github.com/marketplace/actions/pull-request-size-labeler
uses: codelytv/pr-size-labeler@v1.10.2
with:
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
xs_label: '🟩 ⬤○○○○'
xs_max_size: '20'
s_label: '🟩 ⬤⬤○○○'
s_max_size: '100'
m_label: '🟨 ⬤⬤⬤○○'
m_max_size: '500'
l_label: '🟧 ⬤⬤⬤⬤○'
l_max_size: '1000'
xl_label: '🟥 ⬤⬤⬤⬤⬤'
fail_if_xl: 'false'
github_api_url: 'https://api.github.com'
files_to_ignore: |
"package-lock.json"
"public/lib/*"
label-by-branches:
name: 🏷️ Label PR by Branches
runs-on: ubuntu-latest
# Only label once when PR is created or branches are changed, to allow manual label removal
if: github.event.action == 'opened' || (github.event.action == 'synchronize' && (github.event.changes.base || github.event.changes.head))
steps:
- name: Checkout Repository
# Checkout
# https://github.com/marketplace/actions/checkout
uses: actions/checkout@v4.2.2
- name: Apply Labels Based on Branch Name and Target Branch
# Pull Request Labeler
# https://github.com/marketplace/actions/labeler
uses: actions/labeler@v5.0.0
with:
configuration-path: .github/pr-auto-labels-by-branch.yml
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
label-by-files:
name: 🏷️ Label PR by Files
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
# Checkout
# https://github.com/marketplace/actions/checkout
uses: actions/checkout@v4.2.2
- name: Apply Labels Based on Changed Files
# Pull Request Labeler
# https://github.com/marketplace/actions/labeler
uses: actions/labeler@v5.0.0
with:
configuration-path: .github/pr-auto-labels-by-files.yml
repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
remove-stale-label:
name: 🗑️ Remove Stale Label on Comment
runs-on: ubuntu-latest
# Only runs when this is not done by the github actions bot
if: github.event_name == 'pull_request_review_comment' && github.actor != 'github-actions[bot]'
steps:
- name: Remove Stale Label
# 🤖 Issues Helper
# https://github.com/marketplace/actions/issues-helper
uses: actions-cool/issues-helper@v3.6.0
with:
actions: 'remove-labels'
token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
labels: '⚰️ Stale'
check-merge-blocking-labels:
name: 🚫 Check Merge Blocking Labels
needs: [label-by-branches, label-by-files]
runs-on: ubuntu-latest
# Run, even if the previous jobs were skipped/failed
if: always()
# Override permissions, as this needs to write a check
permissions:
checks: write
contents: read
pull-requests: read
steps:
- name: Check Merge Blocking
# GitHub Script
# https://github.com/marketplace/actions/github-script
id: label-check
uses: actions/github-script@v7.0.1
with:
script: |
const prLabels = context.payload.pull_request.labels.map(label => label.name);
const blockingLabels = [
"⛔ Don't Merge",
"🔨 Needs Work",
"🔬 Needs Testing",
"⛔ Waiting For External/Upstream",
"❗ Against Release Branch",
"💥💣 Breaking Changes"
];
const hasBlockingLabel = prLabels.some(label => blockingLabels.includes(label));
if (hasBlockingLabel) {
console.log("Blocking label detected. Setting warning status.");
await github.rest.checks.create({
owner: context.repo.owner,
repo: context.repo.repo,
name: "PR Label Warning",
head_sha: context.payload.pull_request.head.sha,
status: "completed",
conclusion: "neutral",
output: {
title: "Potential Merge Issue",
summary: "This PR has a merge-blocking label. Proceed with caution."
}
});
} else {
console.log("No merge-blocking labels found.");
}
write-auto-comments:
name: 💬 Post PR Comments Based on Labels
needs: [label-by-size, label-by-branches, label-by-files]
runs-on: ubuntu-latest
# Run, even if the previous jobs were skipped/failed
if: always()
steps:
- name: Checkout Repository
# Checkout
# https://github.com/marketplace/actions/checkout
uses: actions/checkout@v4.2.2
- name: Post PR Comments Based on Labels
# Label Commenter for PRs
# https://github.com/marketplace/actions/label-commenter
uses: peaceiris/actions-label-commenter@v1.10.0
with:
config_file: .github/pr-auto-comments.yml
github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
# This runs on merged PRs to staging, reading the PR body and directly linked issues. Check `issues-updates-on-merge.yml`:`update-linked-issues` for commit-based updates.
update-linked-issues:
name: 🔗 Mark Linked Issues Done on Staging Merge
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'staging'
steps:
- name: Extract Linked Issues From PR Description
id: extract_issues
run: |
ISSUES=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH" | grep -oiE '(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved) #([0-9]+)' | awk '{print $2}' | tr -d '#' | jq -R -s -c 'split("\n")[:-1]')
echo "issues=$ISSUES" >> $GITHUB_ENV
- name: Fetch Directly Linked Issues
id: fetch_linked_issues
run: |
PR_NUMBER=${{ github.event.pull_request.number }}
REPO=${{ github.repository }}
API_URL="https://api.github.com/repos/$REPO/pulls/$PR_NUMBER/issues"
ISSUES=$(curl -s -H "Authorization: token ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}" "$API_URL" | jq -r '.[].number' | jq -R -s -c 'split("\n")[:-1]')
echo "linked_issues=$ISSUES" >> $GITHUB_ENV
- name: Merge Issue Lists
id: merge_issues
run: |
ISSUES=$(jq -c -n --argjson a "$issues" --argjson b "$linked_issues" '$a + $b | unique')
echo "final_issues=$ISSUES" >> $GITHUB_ENV
- name: Label Linked Issues
id: label_linked_issues
env:
GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
run: |
for ISSUE in $(echo $final_issues | jq -r '.[]'); do
gh issue edit $ISSUE -R ${{ github.repository }} --add-label "✅ Done (staging)"
echo "Added label '✅ Done (staging)' to issue #$ISSUE"
done

View File

@@ -0,0 +1,28 @@
name: ⚔️ Check Merge Conflicts
on:
# So that PRs touching the same files as the push are updated
push:
# So that the `dirtyLabel` is removed if conflicts are resolved
pull_request_target:
types: [synchronize]
permissions:
contents: read
pull-requests: write
jobs:
check-merge-conflicts:
name: ⚔️ Check Merge Conflicts
runs-on: ubuntu-latest
steps:
- name: Check Merge Conflicts
# Label Conflicting Pull Requests
# https://github.com/marketplace/actions/label-conflicting-pull-requests
uses: eps1lon/actions-label-merge-conflict@v3.0.3
with:
dirtyLabel: '🚫 Merge Conflicts'
repoToken: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
commentOnDirty: >
⚠️ This PR has conflicts that need to be resolved before it can be merged.

5
.gitignore vendored
View File

@@ -45,8 +45,13 @@ access.log
/vectors/ /vectors/
/cache/ /cache/
public/css/user.css public/css/user.css
public/error/
/plugins/ /plugins/
/data /data
/default/scaffold /default/scaffold
public/scripts/extensions/third-party public/scripts/extensions/third-party
/certs /certs
.aider*
.env
/StartDev.bat

View File

@@ -11,3 +11,4 @@ access.log
.github .github
.vscode .vscode
.git .git
/public/scripts/extensions/third-party

View File

@@ -4,10 +4,7 @@ FROM node:lts-alpine3.19
ARG APP_HOME=/home/node/app ARG APP_HOME=/home/node/app
# Install system dependencies # Install system dependencies
RUN apk add gcompat tini git RUN apk add --no-cache gcompat tini git
# Ensure proper handling of kernel signals
ENTRYPOINT [ "tini", "--" ]
# Create app directory # Create app directory
WORKDIR ${APP_HOME} WORKDIR ${APP_HOME}
@@ -30,6 +27,11 @@ RUN \
ln -s "./config/config.yaml" "config.yaml" || true && \ ln -s "./config/config.yaml" "config.yaml" || true && \
mkdir "config" || true mkdir "config" || true
# Pre-compile public libraries
RUN \
echo "*** Run Webpack ***" && \
node "./docker/build-lib.js"
# Cleanup unnecessary files # Cleanup unnecessary files
RUN \ RUN \
echo "*** Cleanup ***" && \ echo "*** Cleanup ***" && \
@@ -40,6 +42,10 @@ RUN \
echo "*** Convert line endings to Unix format ***" && \ echo "*** Convert line endings to Unix format ***" && \
dos2unix "./docker-entrypoint.sh" dos2unix "./docker-entrypoint.sh"
# Fix extension repos permissions
RUN git config --global --add safe.directory "*"
EXPOSE 8000 EXPOSE 8000
CMD [ "./docker-entrypoint.sh" ] # Ensure proper handling of kernel signals
ENTRYPOINT ["tini", "--", "./docker-entrypoint.sh"]

View File

@@ -0,0 +1,13 @@
These are master copies of the default content files and are managed by SillyTavern.
Editing any of these files would not only have no effect, but will also cause merge conflicts during update pulls.
You should edit their respective copies instead, for example:
1. /default/config.yaml => /config.yaml
2. /default/public/css/user.css => /public/css/user.css
etc.
Any questions? You're always welcome at our official documentation website:
https://docs.sillytavern.app/

View File

@@ -4,7 +4,13 @@ dataRoot: ./data
# -- SERVER CONFIGURATION -- # -- SERVER CONFIGURATION --
# Listen for incoming connections # Listen for incoming connections
listen: false listen: false
# Listen on a specific address, supports IPv4 and IPv6
listenAddress:
ipv4: 0.0.0.0
ipv6: '[::]'
# Enables IPv6 and/or IPv4 protocols. Need to have at least one enabled! # Enables IPv6 and/or IPv4 protocols. Need to have at least one enabled!
# - Use option "auto" to automatically detect support
# - Use true or false (no qoutes) to enable or disable each protocol
protocol: protocol:
ipv4: true ipv4: true
ipv6: false ipv6: false
@@ -20,6 +26,11 @@ port: 8000
# - Use -1 to use the server port. # - Use -1 to use the server port.
# - Specify a port to override the default. # - Specify a port to override the default.
autorunPortOverride: -1 autorunPortOverride: -1
# -- SSL options --
ssl:
enabled: false
certPath: "./certs/cert.pem"
keyPath: "./certs/privkey.pem"
# -- SECURITY CONFIGURATION -- # -- SECURITY CONFIGURATION --
# Toggle whitelist mode # Toggle whitelist mode
whitelistMode: true whitelistMode: true
@@ -29,6 +40,8 @@ enableForwardedWhitelist: true
whitelist: whitelist:
- ::1 - ::1
- 127.0.0.1 - 127.0.0.1
# Automatically whitelist Docker host and gateway IPs
whitelistDockerHosts: true
# Toggle basic authentication for endpoints # Toggle basic authentication for endpoints
basicAuthMode: false basicAuthMode: false
# Basic authentication credentials # Basic authentication credentials
@@ -68,36 +81,70 @@ perUserBasicAuth: false
## Set to a positive number to expire session after a certain time of inactivity ## Set to a positive number to expire session after a certain time of inactivity
## Set to 0 to expire session when the browser is closed ## Set to 0 to expire session when the browser is closed
## Set to a negative number to disable session expiration ## Set to a negative number to disable session expiration
sessionTimeout: 86400 sessionTimeout: -1
# Used to sign session cookies. Will be auto-generated if not set
cookieSecret: ''
# Disable CSRF protection - NOT RECOMMENDED # Disable CSRF protection - NOT RECOMMENDED
disableCsrfProtection: false disableCsrfProtection: false
# Disable startup security checks - NOT RECOMMENDED # Disable startup security checks - NOT RECOMMENDED
securityOverride: false securityOverride: false
# -- LOGGING CONFIGURATION --
logging:
# Enable access logging to access.log file
# Records new connections with timestamp, IP address and user agent
enableAccessLog: true
# Minimum log level to display in the terminal (DEBUG = 0, INFO = 1, WARN = 2, ERROR = 3)
minLogLevel: 0
# -- RATE LIMITING CONFIGURATION --
rateLimiting:
# Use X-Real-IP header instead of socket IP for rate limiting
# Only enable this if you are using a properly configured reverse proxy (like Nginx/traefik/Caddy)
preferRealIpHeader: false
# -- ADVANCED CONFIGURATION -- # -- ADVANCED CONFIGURATION --
# Open the browser automatically # Open the browser automatically
autorun: true autorun: true
# Avoids using 'localhost' for autorun in auto mode. # Avoids using 'localhost' for autorun in auto mode.
# use if you don't have 'localhost' in your hosts file # use if you don't have 'localhost' in your hosts file
avoidLocalhost: false avoidLocalhost: false
# Disable thumbnail generation
disableThumbnails: false ## BACKUP CONFIGURATION
# Thumbnail quality (0-100) backups:
thumbnailsQuality: 95 # Common settings for all backup types
# Generate avatar thumbnails as PNG instead of JPG (preserves transparency but increases filesize by about 100%) common:
# Changing this only affects new thumbnails. To recreate the old ones, clear out your ST/thumbnails/ folder. # Number of backups to keep for each chat and settings file
avatarThumbnailsPng: false numberOfBackups: 50
chat:
# Enable automatic chat backups
enabled: true
# Maximum number of chat backups to keep per user (starting from the most recent). Set to -1 to keep all backups.
maxTotalBackups: -1
# Interval in milliseconds to throttle chat backups per user
throttleInterval: 10000
# THUMBNAILING CONFIGURATION
thumbnails:
# Enable thumbnail generation
enabled: true
# Image format of avatar thumbnails:
# * "jpg": best compression with adjustable quality, no transparency
# * "png": preserves transparency but increases filesize by about 100%
# Changing this only affects new thumbnails. To recreate the old ones, clear out /thumbnails folder in your user data.
format: "jpg"
# JPG thumbnail quality (0-100)
quality: 95
# Maximum thumbnail dimensions per type [width, height]
dimensions: { 'bg': [160, 90], 'avatar': [96, 144] }
# PERFORMANCE-RELATED CONFIGURATION
performance:
# Enables lazy loading of character cards. Improves performances with large card libraries.
# May have compatibility issues with some extensions.
lazyLoadCharacters: false
# The maximum amount of memory that parsed character cards can use. Set to 0 to disable memory caching.
memoryCacheCapacity: '100mb'
# Allow secret keys exposure via API # Allow secret keys exposure via API
allowKeysExposure: false allowKeysExposure: false
# Skip new default content checks # Skip new default content checks
skipContentCheck: false skipContentCheck: false
# Disable automatic chats backup
disableChatBackup: false
# Number of backups to keep for each chat and settings file
numberOfBackups: 50
# Interval in milliseconds to throttle chat backups per user
chatBackupThrottleInterval: 10000
# Allowed hosts for card downloads # Allowed hosts for card downloads
whitelistImportDomains: whitelistImportDomains:
- localhost - localhost
@@ -115,24 +162,26 @@ whitelistImportDomains:
## headers: ## headers:
## User-Agent: "Googlebot/2.1 (+http://www.google.com/bot.html)" ## User-Agent: "Googlebot/2.1 (+http://www.google.com/bot.html)"
requestOverrides: [] requestOverrides: []
# -- EXTENSIONS CONFIGURATION --
# Enable UI extensions # EXTENSIONS CONFIGURATION
enableExtensions: true extensions:
# Automatically update extensions when a release version changes # Enable UI extensions
enableExtensionsAutoUpdate: true enabled: true
# Automatically update extensions when a release version changes
autoUpdate: true
models:
# Enables automatic model download from HuggingFace
autoDownload: true
# Additional models for extensions. Expects model IDs from HuggingFace model hub in ONNX format
classification: Cohee/distilbert-base-uncased-go-emotions-onnx
captioning: Xenova/vit-gpt2-image-captioning
embedding: Cohee/jina-embeddings-v2-base-en
speechToText: Xenova/whisper-small
textToSpeech: Xenova/speecht5_tts
# Additional model tokenizers can be downloaded on demand. # Additional model tokenizers can be downloaded on demand.
# Disabling will fallback to another locally available tokenizer. # Disabling will fallback to another locally available tokenizer.
enableDownloadableTokenizers: true enableDownloadableTokenizers: true
# Extension settings
extras:
# Disables automatic model download from HuggingFace
disableAutoDownload: false
# Extra models for plugins. Expects model IDs from HuggingFace model hub in ONNX format
classificationModel: Cohee/distilbert-base-uncased-go-emotions-onnx
captioningModel: Xenova/vit-gpt2-image-captioning
embeddingModel: Cohee/jina-embeddings-v2-base-en
speechToTextModel: Xenova/whisper-small
textToSpeechModel: Xenova/speecht5_tts
# -- OPENAI CONFIGURATION -- # -- OPENAI CONFIGURATION --
# A placeholder message to use in strict prompt post-processing mode when the prompt doesn't start with a user message # A placeholder message to use in strict prompt post-processing mode when the prompt doesn't start with a user message
promptPlaceholder: "[Start a new chat]" promptPlaceholder: "[Start a new chat]"
@@ -159,6 +208,10 @@ ollama:
# * 0: Unload the model immediately after the request # * 0: Unload the model immediately after the request
# * N (any positive number): Keep the model loaded for N seconds after the request. # * N (any positive number): Keep the model loaded for N seconds after the request.
keepAlive: -1 keepAlive: -1
# Controls the "num_batch" (batch size) parameter of the generation request
# * -1: Use the default value of the model
# * N (positive number): Use the specified value. Must be a power of 2, e.g. 128, 256, 512, etc.
batchSize: -1
# -- ANTHROPIC CLAUDE API CONFIGURATION -- # -- ANTHROPIC CLAUDE API CONFIGURATION --
claude: claude:
# Enables caching of the system prompt (if supported). # Enables caching of the system prompt (if supported).
@@ -178,3 +231,5 @@ claude:
cachingAtDepth: -1 cachingAtDepth: -1
# -- SERVER PLUGIN CONFIGURATION -- # -- SERVER PLUGIN CONFIGURATION --
enableServerPlugins: false enableServerPlugins: false
# Attempt to automatically update server plugins on startup
enableServerPluginsAutoUpdate: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -627,6 +627,14 @@
"filename": "presets/instruct/Synthia.json", "filename": "presets/instruct/Synthia.json",
"type": "instruct" "type": "instruct"
}, },
{
"filename": "presets/instruct/Tulu.json",
"type": "instruct"
},
{
"filename": "presets/context/Tulu.json",
"type": "context"
},
{ {
"filename": "presets/instruct/Vicuna 1.0.json", "filename": "presets/instruct/Vicuna 1.0.json",
"type": "instruct" "type": "instruct"
@@ -663,10 +671,6 @@
"filename": "presets/moving-ui/Default.json", "filename": "presets/moving-ui/Default.json",
"type": "moving_ui" "type": "moving_ui"
}, },
{
"filename": "presets/moving-ui/Black Magic Time.json",
"type": "moving_ui"
},
{ {
"filename": "presets/quick-replies/Default.json", "filename": "presets/quick-replies/Default.json",
"type": "quick_replies" "type": "quick_replies"
@@ -774,5 +778,13 @@
{ {
"filename": "presets/context/Mistral V7.json", "filename": "presets/context/Mistral V7.json",
"type": "context" "type": "context"
},
{
"filename": "presets/instruct/DeepSeek-V2.5.json",
"type": "instruct"
},
{
"filename": "presets/context/DeepSeek-V2.5.json",
"type": "context"
} }
] ]

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}}{{char}}'s personality: {{personality}}\n{{/if}}{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}{{trim}}\n",
"example_separator": "",
"chat_start": "",
"use_stop_strings": false,
"allow_jailbreak": false,
"always_force_name2": true,
"trim_sentences": false,
"single_line": false,
"name": "DeepSeek-V2.5"
}

View File

@@ -0,0 +1,11 @@
{
"story_string": "<|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}}{{trim}}\n",
"example_separator": "",
"chat_start": "",
"use_stop_strings": false,
"allow_jailbreak": false,
"always_force_name2": true,
"trim_sentences": false,
"single_line": false,
"name": "Tulu"
}

View File

@@ -1,6 +1,6 @@
{ {
"input_sequence": "<|im_start|>[{{name}}]", "input_sequence": "<|im_start|>{{name}}",
"output_sequence": "<|im_start|>[{{name}}]", "output_sequence": "<|im_start|>{{name}}",
"last_output_sequence": "", "last_output_sequence": "",
"system_sequence": "<|im_start|>system", "system_sequence": "<|im_start|>system",
"stop_sequence": "<|im_end|>", "stop_sequence": "<|im_end|>",

View File

@@ -0,0 +1,22 @@
{
"input_sequence": "<User>",
"output_sequence": "<Assistant>",
"first_output_sequence": "",
"last_output_sequence": "",
"system_sequence_prefix": "",
"system_sequence_suffix": "",
"stop_sequence": "",
"wrap": false,
"macro": true,
"names_behavior": "force",
"activation_regex": "",
"skip_examples": false,
"output_suffix": "<end▁of▁sentence>",
"input_suffix": "",
"system_sequence": "",
"system_suffix": "",
"user_alignment_message": "",
"last_system_sequence": "",
"system_same_as_user": true,
"name": "DeepSeek-V2.5"
}

View File

@@ -1,6 +1,6 @@
{ {
"input_sequence": "<|start_header_id|>[{{name}}]<|end_header_id|>\n\n", "input_sequence": "<|start_header_id|>{{name}}<|end_header_id|>\n\n",
"output_sequence": "<|start_header_id|>[{{name}}]<|end_header_id|>\n\n", "output_sequence": "<|start_header_id|>{{name}}<|end_header_id|>\n\n",
"last_output_sequence": "", "last_output_sequence": "",
"system_sequence": "<|start_header_id|>system<|end_header_id|>\n\n", "system_sequence": "<|start_header_id|>system<|end_header_id|>\n\n",
"stop_sequence": "<|eot_id|>", "stop_sequence": "<|eot_id|>",

View File

@@ -0,0 +1,22 @@
{
"input_sequence": "<|user|>\n",
"output_sequence": "<|assistant|>\n",
"first_output_sequence": "",
"last_output_sequence": "",
"system_sequence_prefix": "",
"system_sequence_suffix": "",
"stop_sequence": "<|end_of_text|>",
"wrap": false,
"macro": true,
"names_behavior": "always",
"activation_regex": "",
"skip_examples": false,
"output_suffix": "<|end_of_text|>\n",
"input_suffix": "\n",
"system_sequence": "<|system|>\n",
"system_suffix": "\n",
"user_alignment_message": "",
"last_system_sequence": "",
"system_same_as_user": false,
"name": "Tulu"
}

View File

@@ -1,45 +0,0 @@
{
"name": "Black Magic Time",
"movingUIState": {
"sheld": {
"top": 488,
"left": 1407,
"right": 1,
"bottom": 4,
"margin": "unset",
"width": 471,
"height": 439
},
"floatingPrompt": {
"width": 369,
"height": 441
},
"right-nav-panel": {
"top": 0,
"left": 1400,
"right": 111,
"bottom": 446,
"margin": "unset",
"width": 479,
"height": 487
},
"WorldInfo": {
"top": 41,
"left": 369,
"right": 642,
"bottom": 51,
"margin": "unset",
"width": 1034,
"height": 858
},
"left-nav-panel": {
"top": 442,
"left": 0,
"right": 1546,
"bottom": 25,
"margin": "unset",
"width": 368,
"height": 483
}
}
}

View File

@@ -28,19 +28,18 @@
"wrap_in_quotes": false, "wrap_in_quotes": false,
"names_behavior": 0, "names_behavior": 0,
"send_if_empty": "", "send_if_empty": "",
"jailbreak_system": false,
"impersonation_prompt": "[Write your next reply from the point of view of {{user}}, using the chat history so far as a guideline for the writing style of {{user}}. Don't write as {{char}} or system. Don't describe actions of {{char}}.]", "impersonation_prompt": "[Write your next reply from the point of view of {{user}}, using the chat history so far as a guideline for the writing style of {{user}}. Don't write as {{char}} or system. Don't describe actions of {{char}}.]",
"new_chat_prompt": "[Start a new Chat]", "new_chat_prompt": "[Start a new Chat]",
"new_group_chat_prompt": "[Start a new group chat. Group members: {{group}}]", "new_group_chat_prompt": "[Start a new group chat. Group members: {{group}}]",
"new_example_chat_prompt": "[Example Chat]", "new_example_chat_prompt": "[Example Chat]",
"continue_nudge_prompt": "[Continue the following message. Do not include ANY parts of the original message. Use capitalization and punctuation as if your reply is a part of the original message: {{lastChatMessage}}]", "continue_nudge_prompt": "[Continue your last message without repeating its original content.]",
"bias_preset_selected": "Default (none)", "bias_preset_selected": "Default (none)",
"reverse_proxy": "", "reverse_proxy": "",
"proxy_password": "", "proxy_password": "",
"max_context_unlocked": false, "max_context_unlocked": false,
"wi_format": "{0}", "wi_format": "{0}",
"scenario_format": "[Circumstances and context of the dialogue: {{scenario}}]", "scenario_format": "{{scenario}}",
"personality_format": "[{{char}}'s personality: {{personality}}]", "personality_format": "{{personality}}",
"group_nudge_prompt": "[Write the next reply only as {{char}}.]", "group_nudge_prompt": "[Write the next reply only as {{char}}.]",
"stream_openai": true, "stream_openai": true,
"prompts": [ "prompts": [
@@ -230,7 +229,6 @@
"show_external_models": false, "show_external_models": false,
"assistant_prefill": "", "assistant_prefill": "",
"assistant_impersonation": "", "assistant_impersonation": "",
"human_sysprompt_message": "Let's get started. Please generate your response based on the information and instructions provided above.",
"claude_use_sysprompt": false, "claude_use_sysprompt": false,
"use_alt_scale": false, "use_alt_scale": false,
"squash_system_messages": false, "squash_system_messages": false,

View File

@@ -593,24 +593,28 @@
"new_chat_prompt": "[Start a new Chat]", "new_chat_prompt": "[Start a new Chat]",
"new_group_chat_prompt": "[Start a new group chat. Group members: {{group}}]", "new_group_chat_prompt": "[Start a new group chat. Group members: {{group}}]",
"new_example_chat_prompt": "[Example Chat]", "new_example_chat_prompt": "[Example Chat]",
"continue_nudge_prompt": "[Continue the following message. Do not include ANY parts of the original message. Use capitalization and punctuation as if your reply is a part of the original message: {{lastChatMessage}}]", "continue_nudge_prompt": "[Continue your last message without repeating its original content.]",
"bias_preset_selected": "Default (none)", "bias_preset_selected": "Default (none)",
"bias_presets": { "bias_presets": {
"Default (none)": [], "Default (none)": [],
"Anti-bond": [ "Anti-bond": [
{ {
"id": "22154f79-dd98-41bc-8e34-87015d6a0eaf",
"text": " bond", "text": " bond",
"value": -50 "value": -50
}, },
{ {
"id": "8ad2d5c4-d8ef-49e4-bc5e-13e7f4690e0f",
"text": " future", "text": " future",
"value": -50 "value": -50
}, },
{ {
"id": "52a4b280-0956-4940-ac52-4111f83e4046",
"text": " bonding", "text": " bonding",
"value": -50 "value": -50
}, },
{ {
"id": "e63037c7-c9d1-4724-ab2d-7756008b433b",
"text": " connection", "text": " connection",
"value": -25 "value": -25
} }
@@ -622,7 +626,6 @@
"ai21_model": "jamba-1.5-large", "ai21_model": "jamba-1.5-large",
"windowai_model": "", "windowai_model": "",
"openrouter_model": "OR_Website", "openrouter_model": "OR_Website",
"jailbreak_system": true,
"reverse_proxy": "", "reverse_proxy": "",
"chat_completion_source": "openai", "chat_completion_source": "openai",
"max_context_unlocked": false, "max_context_unlocked": false,

View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<title>Forbidden</title>
</head>
<body>
<h1>Forbidden</h1>
<p>
If you are the system administrator, add your IP address to the
whitelist or disable whitelist mode by editing
<code>config.yaml</code> in the root directory of your installation.
</p>
<hr />
<p>
<em>Connection from {{ipDetails}} has been blocked. This attempt
has been logged.</em>
</p>
</body>
</html>

View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<title>Unauthorized</title>
</head>
<body>
<h1>Unauthorized</h1>
<p>
If you are the system administrator, you can configure the
<code>basicAuthUser</code> credentials by editing
<code>config.yaml</code> in the root directory of your installation.
</p>
</body>
</html>

View File

@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Not found</title>
</head>
<body>
<h1>Not found</h1>
<p>
The requested URL was not found on this server.
</p>
</body>
</html>

4
docker/build-lib.js Normal file
View File

@@ -0,0 +1,4 @@
import getWebpackServeMiddleware from '../src/middleware/webpack-serve.js';
const middleware = getWebpackServeMiddleware();
await middleware.runWebpackCompiler({ forceDist: true });

View File

@@ -1,14 +1,17 @@
version: "3"
services: services:
sillytavern: sillytavern:
build: .. build: ..
container_name: sillytavern container_name: sillytavern
hostname: sillytavern hostname: sillytavern
image: ghcr.io/sillytavern/sillytavern:latest image: ghcr.io/sillytavern/sillytavern:latest
environment:
- NODE_ENV=production
- FORCE_COLOR=1
ports: ports:
- "8000:8000" - "8000:8000"
volumes: volumes:
- "./config:/home/node/app/config" - "./config:/home/node/app/config"
- "./data:/home/node/app/data" - "./data:/home/node/app/data"
- "./plugins:/home/node/app/plugins" - "./plugins:/home/node/app/plugins"
- "./extensions:/home/node/app/public/scripts/extensions/third-party"
restart: unless-stopped restart: unless-stopped

View File

@@ -5,5 +5,8 @@ if [ ! -e "config/config.yaml" ]; then
cp -r "default/config.yaml" "config/config.yaml" cp -r "default/config.yaml" "config/config.yaml"
fi fi
# Execute postinstall to auto-populate config.yaml with missing values
npm run postinstall
# Start the server # Start the server
exec node server.js --listen exec node server.js --listen "$@"

62
index.d.ts vendored
View File

@@ -1,6 +1,53 @@
import { UserDirectoryList, User } from "./src/users"; import { EventEmitter } from 'node:events';
import { CsrfSyncedToken } from 'csrf-sync';
import { UserDirectoryList, User } from './src/users.js';
import { CommandLineArguments } from './src/command-line.js';
import { EVENT_NAMES } from './src/server-events.js';
/**
* Event payload for SERVER_STARTED event.
*/
export interface ServerStartedEvent {
/**
* The URL the server is listening on.
*/
url: URL;
}
/**
* Map of all server events to their payload types.
*/
export interface ServerEventMap {
[EVENT_NAMES.SERVER_STARTED]: [ServerStartedEvent];
}
declare global { declare global {
declare namespace NodeJS {
export interface Process {
/**
* A global instance of the server events emitter.
*/
serverEvents: EventEmitter<ServerEventMap>;
}
}
declare namespace CookieSessionInterfaces {
export interface CookieSessionObject {
/**
* The CSRF token for the session.
*/
csrfToken: CsrfSyncedToken;
/**
* Authenticated user handle.
*/
handle: string;
/**
* Last time the session was extended.
*/
touch: number;
}
}
namespace Express { namespace Express {
export interface Request { export interface Request {
user: { user: {
@@ -14,12 +61,9 @@ declare global {
* The root directory for user data. * The root directory for user data.
*/ */
var DATA_ROOT: string; var DATA_ROOT: string;
}
declare module 'express-session' { /**
export interface SessionData { * Parsed command line arguments.
handle: string; */
touch: number; var COMMAND_LINE_ARGS: CommandLineArguments;
// other properties... }
}
}

View File

@@ -1,20 +1,21 @@
{ {
"compilerOptions": { "compilerOptions": {
"module": "ESNext", "module": "ESNext",
"target": "ESNext", "target": "ES2023",
"moduleResolution": "Node", "moduleResolution": "Node",
"strictNullChecks": true, "strictNullChecks": true,
"strictFunctionTypes": true, "strictFunctionTypes": true,
"checkJs": true, "checkJs": true,
"allowUmdGlobalAccess": true, "allowUmdGlobalAccess": true,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"resolveJsonModule": true "resolveJsonModule": true,
"strictBindCallApply": true
}, },
"exclude": [ "exclude": [
"**/node_modules/**", "**/node_modules/**",
"**/dist/**", "**/dist/**",
"**/.git/**", "**/.git/**",
"public/lib/**", "public/**",
"backups/**", "backups/**",
"data/**", "data/**",
"cache/**", "cache/**",

1299
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,37 +1,41 @@
{ {
"dependencies": { "dependencies": {
"@adobe/css-tools": "^4.4.0", "@adobe/css-tools": "^4.4.2",
"@agnai/sentencepiece-js": "^1.1.1", "@agnai/sentencepiece-js": "^1.1.1",
"@agnai/web-tokenizers": "^0.1.3", "@agnai/web-tokenizers": "^0.1.3",
"@iconfu/svg-inject": "^1.2.3", "@iconfu/svg-inject": "^1.2.3",
"@mozilla/readability": "^0.5.0", "@mozilla/readability": "^0.6.0",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"@zeldafan0225/ai_horde": "^5.1.0", "@zeldafan0225/ai_horde": "^5.2.0",
"archiver": "^7.0.1", "archiver": "^7.0.1",
"bing-translate-api": "^2.9.1", "bing-translate-api": "^4.0.2",
"body-parser": "^1.20.2", "body-parser": "^1.20.2",
"bowser": "^2.11.0", "bowser": "^2.11.0",
"bytes": "^3.1.2",
"chalk": "^5.4.1",
"command-exists": "^1.2.9", "command-exists": "^1.2.9",
"compression": "^1", "compression": "^1.8.0",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"cookie-session": "^2.1.0", "cookie-session": "^2.1.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"csrf-csrf": "^2.2.3", "csrf-sync": "^4.0.3",
"diff-match-patch": "^1.0.5", "diff-match-patch": "^1.0.5",
"dompurify": "^3.1.7", "dompurify": "^3.2.4",
"droll": "^0.2.1", "droll": "^0.2.1",
"express": "^4.21.0", "express": "^4.21.0",
"form-data": "^4.0.0", "form-data": "^4.0.2",
"fuse.js": "^7.0.0", "fuse.js": "^7.1.0",
"google-translate-api-browser": "^3.0.1", "google-translate-api-browser": "^3.0.1",
"google-translate-api-x": "^10.7.1", "google-translate-api-x": "^10.7.2",
"handlebars": "^4.7.8", "handlebars": "^4.7.8",
"helmet": "^7.1.0", "helmet": "^7.2.0",
"highlight.js": "^11.10.0", "highlight.js": "^11.11.1",
"html-entities": "^2.5.2", "html-entities": "^2.5.2",
"iconv-lite": "^0.6.3", "iconv-lite": "^0.6.3",
"ip-matching": "^2.1.2", "ip-matching": "^2.1.2",
"ipaddr.js": "^2.0.1", "ip-regex": "^5.0.0",
"ipaddr.js": "^2.2.0",
"is-docker": "^3.0.0",
"jimp": "^0.22.10", "jimp": "^0.22.10",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
@@ -40,27 +44,28 @@
"morphdom": "^2.7.4", "morphdom": "^2.7.4",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"node-fetch": "^3.3.2", "node-fetch": "^3.3.2",
"node-persist": "^4.0.1", "node-persist": "^4.0.4",
"open": "^8.4.2", "open": "^8.4.2",
"png-chunk-text": "^1.0.0", "png-chunk-text": "^1.0.0",
"png-chunks-encode": "^1.0.0", "png-chunks-encode": "^1.0.0",
"png-chunks-extract": "^1.0.0", "png-chunks-extract": "^1.0.0",
"proxy-agent": "^6.4.0", "proxy-agent": "^6.5.0",
"rate-limiter-flexible": "^5.0.0", "rate-limiter-flexible": "^5.0.5",
"response-time": "^2.3.2", "response-time": "^2.3.3",
"sanitize-filename": "^1.6.3", "sanitize-filename": "^1.6.3",
"seedrandom": "^3.0.5", "seedrandom": "^3.0.5",
"showdown": "^2.1.0", "showdown": "^2.1.0",
"sillytavern-transformers": "2.14.6", "sillytavern-transformers": "2.14.6",
"simple-git": "^3.19.1", "simple-git": "^3.27.0",
"tiktoken": "^1.0.16", "slidetoggle": "^4.0.0",
"tiktoken": "^1.0.20",
"url-join": "^5.0.0",
"vectra": "^0.2.2", "vectra": "^0.2.2",
"wavefile": "^11.0.0", "wavefile": "^11.0.0",
"webpack": "^5.95.0", "webpack": "^5.98.0",
"webpack-dev-middleware": "^7.4.2",
"write-file-atomic": "^5.0.1", "write-file-atomic": "^5.0.1",
"ws": "^8.17.1", "ws": "^8.18.1",
"yaml": "^2.3.4", "yaml": "^2.7.0",
"yargs": "^17.7.1", "yargs": "^17.7.1",
"yauzl": "^2.10.0" "yauzl": "^2.10.0"
}, },
@@ -85,9 +90,11 @@
"type": "git", "type": "git",
"url": "https://github.com/SillyTavern/SillyTavern.git" "url": "https://github.com/SillyTavern/SillyTavern.git"
}, },
"version": "1.12.7", "version": "1.12.13",
"scripts": { "scripts": {
"start": "node server.js", "start": "node server.js",
"debug": "node --inspect server.js",
"start:electron": "cd ./src/electron && npm run start",
"start:deno": "deno run --allow-run --allow-net --allow-read --allow-write --allow-sys --allow-env server.js", "start:deno": "deno run --allow-run --allow-net --allow-read --allow-write --allow-sys --allow-env server.js",
"start:bun": "bun server.js", "start:bun": "bun server.js",
"start:no-csrf": "node server.js --disableCsrf", "start:no-csrf": "node server.js --disableCsrf",
@@ -106,28 +113,33 @@
}, },
"main": "server.js", "main": "server.js",
"devDependencies": { "devDependencies": {
"@types/archiver": "^6.0.2", "@types/archiver": "^6.0.3",
"@types/bytes": "^3.1.5",
"@types/command-exists": "^1.2.3", "@types/command-exists": "^1.2.3",
"@types/compression": "^1.7.5", "@types/compression": "^1.7.5",
"@types/cookie-parser": "^1.4.7", "@types/cookie-parser": "^1.4.8",
"@types/cookie-session": "^2.0.49", "@types/cookie-session": "^2.0.49",
"@types/cors": "^2.8.17", "@types/cors": "^2.8.17",
"@types/deno": "^2.0.0", "@types/deno": "^2.2.0",
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"@types/jquery": "^3.5.29", "@types/jquery": "^3.5.32",
"@types/lodash": "^4.17.10", "@types/jquery-cropper": "^1.0.4",
"@types/jquery.transit": "^0.9.33",
"@types/jqueryui": "^1.12.24",
"@types/lodash": "^4.17.16",
"@types/mime-types": "^2.1.4", "@types/mime-types": "^2.1.4",
"@types/multer": "^1.4.12", "@types/multer": "^1.4.12",
"@types/node": "^18.19.55", "@types/node": "^18.19.80",
"@types/node-persist": "^3.1.8", "@types/node-persist": "^3.1.8",
"@types/png-chunk-text": "^1.0.3", "@types/png-chunk-text": "^1.0.3",
"@types/png-chunks-encode": "^1.0.2", "@types/png-chunks-encode": "^1.0.2",
"@types/png-chunks-extract": "^1.0.2", "@types/png-chunks-extract": "^1.0.2",
"@types/response-time": "^2.3.8", "@types/response-time": "^2.3.8",
"@types/select2": "^4.0.63",
"@types/toastr": "^2.1.43", "@types/toastr": "^2.1.43",
"@types/write-file-atomic": "^4.0.3", "@types/write-file-atomic": "^4.0.3",
"@types/yargs": "^17.0.33", "@types/yargs": "^17.0.33",
"@types/yauzl": "^2.10.3", "@types/yauzl": "^2.10.3",
"eslint": "^8.57.0" "eslint": "^8.57.1"
} }
} }

View File

@@ -8,7 +8,7 @@ import path from 'node:path';
import process from 'node:process'; import process from 'node:process';
import { fileURLToPath } from 'node:url'; import { fileURLToPath } from 'node:url';
import { default as git } from 'simple-git'; import { default as git, CheckRepoActions } from 'simple-git';
import { color } from './src/util.js'; import { color } from './src/util.js';
const __dirname = import.meta.dirname ?? path.dirname(fileURLToPath(import.meta.url)); const __dirname = import.meta.dirname ?? path.dirname(fileURLToPath(import.meta.url));
@@ -48,6 +48,13 @@ async function updatePlugins() {
console.log(`Updating plugin ${color.green(directory)}...`); console.log(`Updating plugin ${color.green(directory)}...`);
const pluginPath = path.join(pluginsPath, directory); const pluginPath = path.join(pluginsPath, directory);
const pluginRepo = git(pluginPath); const pluginRepo = git(pluginPath);
const isRepo = await pluginRepo.checkIsRepo(CheckRepoActions.IS_REPO_ROOT);
if (!isRepo) {
console.log(`Directory ${color.yellow(directory)} is not a Git repository`);
continue;
}
await pluginRepo.fetch(); await pluginRepo.fetch();
const commitHash = await pluginRepo.revparse(['HEAD']); const commitHash = await pluginRepo.revparse(['HEAD']);
const trackingBranch = await pluginRepo.revparse(['--abbrev-ref', '@{u}']); const trackingBranch = await pluginRepo.revparse(['--abbrev-ref', '@{u}']);

View File

@@ -7,26 +7,107 @@ import crypto from 'node:crypto';
import process from 'node:process'; import process from 'node:process';
import yaml from 'yaml'; import yaml from 'yaml';
import _ from 'lodash'; import _ from 'lodash';
import chalk from 'chalk';
import { createRequire } from 'node:module'; import { createRequire } from 'node:module';
/** /**
* Colorizes console output. * Colorizes console output.
*/ */
const color = { const color = chalk;
byNum: (mess, fgNum) => {
mess = mess || ''; const keyMigrationMap = [
fgNum = fgNum === undefined ? 31 : fgNum; {
return '\u001b[' + fgNum + 'm' + mess + '\u001b[39m'; oldKey: 'disableThumbnails',
newKey: 'thumbnails.enabled',
migrate: (value) => !value,
}, },
black: (mess) => color.byNum(mess, 30), {
red: (mess) => color.byNum(mess, 31), oldKey: 'thumbnailsQuality',
green: (mess) => color.byNum(mess, 32), newKey: 'thumbnails.quality',
yellow: (mess) => color.byNum(mess, 33), migrate: (value) => value,
blue: (mess) => color.byNum(mess, 34), },
magenta: (mess) => color.byNum(mess, 35), {
cyan: (mess) => color.byNum(mess, 36), oldKey: 'avatarThumbnailsPng',
white: (mess) => color.byNum(mess, 37), newKey: 'thumbnails.format',
}; migrate: (value) => (value ? 'png' : 'jpg'),
},
{
oldKey: 'disableChatBackup',
newKey: 'backups.chat.enabled',
migrate: (value) => !value,
},
{
oldKey: 'numberOfBackups',
newKey: 'backups.common.numberOfBackups',
migrate: (value) => value,
},
{
oldKey: 'maxTotalChatBackups',
newKey: 'backups.chat.maxTotalBackups',
migrate: (value) => value,
},
{
oldKey: 'chatBackupThrottleInterval',
newKey: 'backups.chat.throttleInterval',
migrate: (value) => value,
},
{
oldKey: 'enableExtensions',
newKey: 'extensions.enabled',
migrate: (value) => value,
},
{
oldKey: 'enableExtensionsAutoUpdate',
newKey: 'extensions.autoUpdate',
migrate: (value) => value,
},
{
oldKey: 'extras.disableAutoDownload',
newKey: 'extensions.models.autoDownload',
migrate: (value) => !value,
},
{
oldKey: 'extras.classificationModel',
newKey: 'extensions.models.classification',
migrate: (value) => value,
},
{
oldKey: 'extras.captioningModel',
newKey: 'extensions.models.captioning',
migrate: (value) => value,
},
{
oldKey: 'extras.embeddingModel',
newKey: 'extensions.models.embedding',
migrate: (value) => value,
},
{
oldKey: 'extras.speechToTextModel',
newKey: 'extensions.models.speechToText',
migrate: (value) => value,
},
{
oldKey: 'extras.textToSpeechModel',
newKey: 'extensions.models.textToSpeech',
migrate: (value) => value,
},
{
oldKey: 'minLogLevel',
newKey: 'logging.minLogLevel',
migrate: (value) => value,
},
{
oldKey: 'cardsCacheCapacity',
newKey: 'performance.memoryCacheCapacity',
migrate: (value) => `${value}mb`,
},
{
oldKey: 'cookieSecret',
newKey: 'cookieSecret',
migrate: () => void 0,
remove: true,
},
];
/** /**
* Gets all keys from an object recursively. * Gets all keys from an object recursively.
@@ -35,7 +116,7 @@ const color = {
* @returns {string[]} Array of all keys in the object * @returns {string[]} Array of all keys in the object
*/ */
function getAllKeys(obj, prefix = '') { function getAllKeys(obj, prefix = '') {
if (typeof obj !== 'object' || Array.isArray(obj)) { if (typeof obj !== 'object' || Array.isArray(obj) || obj === null) {
return []; return [];
} }
@@ -83,6 +164,33 @@ function addMissingConfigValues() {
const defaultConfig = yaml.parse(fs.readFileSync(path.join(process.cwd(), './default/config.yaml'), 'utf8')); const defaultConfig = yaml.parse(fs.readFileSync(path.join(process.cwd(), './default/config.yaml'), 'utf8'));
let config = yaml.parse(fs.readFileSync(path.join(process.cwd(), './config.yaml'), 'utf8')); let config = yaml.parse(fs.readFileSync(path.join(process.cwd(), './config.yaml'), 'utf8'));
// Migrate old keys to new keys
const migratedKeys = [];
for (const { oldKey, newKey, migrate, remove } of keyMigrationMap) {
if (_.has(config, oldKey)) {
if (remove) {
_.unset(config, oldKey);
migratedKeys.push({
oldKey,
newValue: void 0,
});
continue;
}
const oldValue = _.get(config, oldKey);
const newValue = migrate(oldValue);
_.set(config, newKey, newValue);
_.unset(config, oldKey);
migratedKeys.push({
oldKey,
newKey,
oldValue,
newValue,
});
}
}
// Get all keys from the original config // Get all keys from the original config
const originalKeys = getAllKeys(config); const originalKeys = getAllKeys(config);
@@ -95,11 +203,18 @@ function addMissingConfigValues() {
// Find the keys that were added // Find the keys that were added
const addedKeys = _.difference(updatedKeys, originalKeys); const addedKeys = _.difference(updatedKeys, originalKeys);
if (addedKeys.length === 0) { if (addedKeys.length === 0 && migratedKeys.length === 0) {
return; return;
} }
console.log('Adding missing config values to config.yaml:', addedKeys); if (addedKeys.length > 0) {
console.log('Adding missing config values to config.yaml:', addedKeys);
}
if (migratedKeys.length > 0) {
console.log('Migrating config values in config.yaml:', migratedKeys);
}
fs.writeFileSync('./config.yaml', yaml.stringify(config)); fs.writeFileSync('./config.yaml', yaml.stringify(config));
} catch (error) { } catch (error) {
console.error(color.red('FATAL: Could not add missing config values to config.yaml'), error); console.error(color.red('FATAL: Could not add missing config values to config.yaml'), error);
@@ -110,20 +225,60 @@ function addMissingConfigValues() {
* Creates the default config files if they don't exist yet. * Creates the default config files if they don't exist yet.
*/ */
function createDefaultFiles() { function createDefaultFiles() {
const files = { /**
config: './config.yaml', * @typedef DefaultItem
user: './public/css/user.css', * @type {object}
}; * @property {'file' | 'directory'} type - Whether the item should be copied as a single file or merged into a directory structure.
* @property {string} defaultPath - The path to the default item (typically in `default/`).
* @property {string} productionPath - The path to the copied item for production use.
*/
for (const file of Object.values(files)) { /** @type {DefaultItem[]} */
const defaultItems = [
{
type: 'file',
defaultPath: './default/config.yaml',
productionPath: './config.yaml',
},
{
type: 'directory',
defaultPath: './default/public/',
productionPath: './public/',
},
];
for (const defaultItem of defaultItems) {
try { try {
if (!fs.existsSync(file)) { if (defaultItem.type === 'file') {
const defaultFilePath = path.join('./default', path.parse(file).base); if (!fs.existsSync(defaultItem.productionPath)) {
fs.copyFileSync(defaultFilePath, file); fs.copyFileSync(
console.log(color.green(`Created default file: ${file}`)); defaultItem.defaultPath,
defaultItem.productionPath,
);
console.log(
color.green(`Created default file: ${defaultItem.productionPath}`),
);
}
} else if (defaultItem.type === 'directory') {
fs.cpSync(defaultItem.defaultPath, defaultItem.productionPath, {
force: false, // Don't overwrite existing files!
recursive: true,
});
console.log(
color.green(`Synchronized missing files: ${defaultItem.productionPath}`),
);
} else {
throw new Error(
'FATAL: Unexpected default file format in `post-install.js#createDefaultFiles()`.',
);
} }
} catch (error) { } catch (error) {
console.error(color.red(`FATAL: Could not write default file: ${file}`), error); console.error(
color.red(
`FATAL: Could not write default ${defaultItem.type}: ${defaultItem.productionPath}`,
),
error,
);
} }
} }
} }

View File

@@ -65,7 +65,7 @@ label[for="extensions_autoconnect"] {
} }
.extensions_info .extension_enabled { .extensions_info .extension_enabled {
color: green; font-weight: bold;
} }
.extensions_info .extension_disabled { .extensions_info .extension_disabled {
@@ -76,13 +76,44 @@ label[for="extensions_autoconnect"] {
color: gray; color: gray;
} }
input.extension_missing[type="checkbox"] { .extensions_info .extension_modules {
opacity: 0.5; font-size: 0.8em;
font-weight: normal;
} }
#extensions_list .disabled { .extensions_info .extension_block {
text-decoration: line-through; display: flex;
color: lightgray; flex-wrap: nowrap;
padding: 5px;
margin-bottom: 5px;
border: 1px solid var(--SmartThemeBorderColor);
border-radius: 10px;
align-items: baseline;
justify-content: space-between;
gap: 5px;
}
.extensions_info .extension_name {
font-size: 1.05em;
}
.extensions_info .extension_version {
opacity: 0.8;
font-size: 0.8em;
font-weight: normal;
margin-left: 2px;
}
.extensions_info .extension_block a {
color: var(--SmartThemeBodyColor);
}
.extensions_info .extension_name.update_available {
color: limegreen;
}
input.extension_missing[type="checkbox"] {
opacity: 0.5;
} }
.update-button { .update-button {
@@ -105,3 +136,13 @@ input.extension_missing[type="checkbox"] {
#extensionsMenu>div.extension_container:empty { #extensionsMenu>div.extension_container:empty {
display: none; display: none;
} }
.extensions_info .extension_text_block {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.extensions_info .extension_actions {
flex-wrap: nowrap;
}

View File

@@ -42,3 +42,9 @@ body.login .userSelect .userHandle {
body.login .userSelect:hover { body.login .userSelect:hover {
background-color: var(--black30a); background-color: var(--black30a);
} }
body.login #handleEntryBlock,
body.login #passwordEntryBlock,
body.login #passwordRecoveryBlock {
margin: 2px;
}

View File

@@ -216,8 +216,6 @@
} }
#showRawPrompt,
#copyPromptToClipboard,
#groupCurrentMemberPopoutButton, #groupCurrentMemberPopoutButton,
#summaryExtensionPopoutButton { #summaryExtensionPopoutButton {
display: none; display: none;

View File

@@ -9,3 +9,11 @@ body.safari .popup .popup-body {
max-height: 90vh; max-height: 90vh;
max-height: 90dvh; max-height: 90dvh;
} }
body.safari #select_chat_div {
height: auto;
}
body.safari #select_chat_popup {
height: max-content;
}

View File

@@ -72,6 +72,10 @@ dialog {
overflow-x: auto; overflow-x: auto;
} }
.popup.left_aligned_dialogue_popup .popup-content {
text-align: start;
}
/* Opening animation */ /* Opening animation */
.popup[opening] { .popup[opening] {
animation: pop-in var(--popup-animation-speed) ease-in-out; animation: pop-in var(--popup-animation-speed) ease-in-out;

View File

@@ -28,6 +28,11 @@
color: var(--white50a); color: var(--white50a);
} }
#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .completion_prompt_manager_prompt_name .fa-solid[data-role] {
vertical-align: unset;
margin-left: 3px;
}
#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_invisible { #completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_invisible {
display: none; display: none;
} }
@@ -260,12 +265,30 @@
} }
#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .completion_prompt_manager_prompt_name .fa-solid.prompt-manager-overridden { #completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .completion_prompt_manager_prompt_name .fa-solid.prompt-manager-overridden {
margin-left: 5px; margin-left: 3px;
color: var(--SmartThemeQuoteColor); color: var(--SmartThemeQuoteColor);
cursor: pointer; cursor: pointer;
opacity: 0.8; opacity: 0.8;
} }
#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .drag-handle:not(.ui-sortable-handle) {
display: none;
}
#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt:has(.drag-handle.ui-sortable-handle) {
position: relative;
padding-left: 20px;
}
#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .drag-handle {
position: absolute;
height: 100%;
top: 0;
padding: 0 5px;
display: flex;
align-items: center;
}
#completion_prompt_manager_footer_append_prompt { #completion_prompt_manager_footer_append_prompt {
font-size: 1em; font-size: 1em;
} }

View File

@@ -1,6 +1,5 @@
.scrollable-buttons-container { .scrollable-buttons-container {
max-height: 50vh; /* Use viewport height instead of fixed pixels */ max-height: 50vh; /* Use viewport height instead of fixed pixels */
overflow-y: auto;
-webkit-overflow-scrolling: touch; /* Momentum scrolling on iOS */ -webkit-overflow-scrolling: touch; /* Momentum scrolling on iOS */
margin-top: 1rem; /* m-t-1 is equivalent to margin-top: 1rem; */ margin-top: 1rem; /* m-t-1 is equivalent to margin-top: 1rem; */
flex-shrink: 1; flex-shrink: 1;

View File

@@ -100,6 +100,13 @@
border: 1px solid var(--SmartThemeBorderColor); border: 1px solid var(--SmartThemeBorderColor);
} }
.select2-container .select2-results .select2-results__option--disabled {
color: inherit;
background-color: inherit;
cursor: not-allowed;
filter: brightness(0.5);
}
.select2-container .select2-selection--multiple .select2-selection__choice, .select2-container .select2-selection--multiple .select2-selection__choice,
.select2-container .select2-selection--single .select2-selection__choice { .select2-container .select2-selection--single .select2-selection__choice {
border-radius: 5px; border-radius: 5px;

View File

@@ -96,11 +96,6 @@ body.charListGrid #rm_print_characters_block .group_select .group_name_block,
flex-direction: column; flex-direction: column;
} }
#user_avatar_block.gridView .avatar-container .avatar-buttons {
flex-wrap: wrap;
justify-content: space-evenly;
}
body.charListGrid #rm_print_characters_block .bogus_folder_select .character_select_container, body.charListGrid #rm_print_characters_block .bogus_folder_select .character_select_container,
body.charListGrid #rm_print_characters_block .character_select .character_select_container, body.charListGrid #rm_print_characters_block .character_select .character_select_container,
body.charListGrid #rm_print_characters_block .group_select .group_select_container, body.charListGrid #rm_print_characters_block .group_select .group_select_container,
@@ -231,10 +226,16 @@ body.big-avatars .avatars_inline_small .avatar img {
body.big-avatars .avatars_inline { body.big-avatars .avatars_inline {
max-height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) + 2 * var(--avatar-base-border-radius)); max-height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) + 2 * var(--avatar-base-border-radius));
} }
body.big-avatars .avatars_inline.avatars_multiline {
max-height: fit-content;
}
body.big-avatars .avatars_inline.avatars_inline_small { body.big-avatars .avatars_inline.avatars_inline_small {
height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) * var(--inline-avatar-small-factor) + 2 * var(--avatar-base-border-radius)); height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) * var(--inline-avatar-small-factor) + 2 * var(--avatar-base-border-radius));
} }
body.big-avatars .avatars_inline.avatars_inline_small.avatars_multiline {
height: inherit;
}
body:not(.big-avatars) .avatars_inline_small .avatar_collage { body:not(.big-avatars) .avatars_inline_small .avatar_collage {
min-width: calc(var(--avatar-base-width) * var(--inline-avatar-small-factor)); min-width: calc(var(--avatar-base-width) * var(--inline-avatar-small-factor));
@@ -472,6 +473,11 @@ label[for="trim_spaces"]:has(input:checked) i.warning {
display: none; display: none;
} }
label[for="trim_spaces"]:not(:has(input:checked)) small {
color: var(--warning);
opacity: 1;
}
#claude_function_prefill_warning { #claude_function_prefill_warning {
display: none; display: none;
color: red; color: red;
@@ -488,3 +494,7 @@ label[for="trim_spaces"]:has(input:checked) i.warning {
#mistralai_other_models:empty { #mistralai_other_models:empty {
display: none; display: none;
} }
#banned_tokens_block_ooba:not(:has(#send_banned_tokens_textgenerationwebui:checked)) #banned_tokens_controls_ooba {
filter: brightness(0.5);
}

450
public/global.d.ts vendored
View File

@@ -1,17 +1,25 @@
import libs from './lib'; import libs from './lib';
import getContext from './scripts/st-context';
// Global namespace modules import { power_user } from './scripts/power-user';
declare var ai;
declare var pdfjsLib;
declare var ePub;
declare var SillyTavern: {
getContext(): any;
llm: any;
libs: typeof libs;
};
declare global { declare global {
// Custom types
declare type InstructSettings = typeof power_user.instruct;
// Global namespace modules
interface Window {
ai: any;
}
declare var pdfjsLib;
declare var ePub;
declare var SillyTavern: {
getContext(): typeof getContext;
llm: any;
libs: typeof libs;
};
// Jquery plugins // Jquery plugins
interface JQuery { interface JQuery {
nanogallery2(options?: any): JQuery; nanogallery2(options?: any): JQuery;
@@ -19,400 +27,32 @@ declare global {
pagination(method: 'getCurrentPageNum'): number; pagination(method: 'getCurrentPageNum'): number;
pagination(method: string, options?: any): JQuery; pagination(method: string, options?: any): JQuery;
pagination(options?: any): JQuery; pagination(options?: any): JQuery;
transition(options?: any, complete?: function): JQuery;
autocomplete(options?: any): JQuery;
autocomplete(method: string, options?: any): JQuery;
slider(options?: any): JQuery;
slider(method: string, func: string, options?: any): JQuery;
cropper(options?: any): JQuery;
izoomify(options?: any): JQuery; izoomify(options?: any): JQuery;
//#region select2
/**
* Initializes or modifies a select2 instance with provided options
*
* @param options - Configuration options for the select2 instance
* @returns The jQuery object for chaining
*/
select2(options?: Select2Options): JQuery;
/**
* Retrieves data currently selected in the select2 instance
*
* @param field - A string specifying the 'data' method
* @returns An array of selected items
*/
select2(field: 'data'): any[];
/**
* Calls the specified select2 method
*
* @param method - The name of the select2 method to invoke
* @returns The jQuery object for chaining
*/
select2(method: 'open' | 'close' | 'destroy' | 'focus' | 'val', value?: any): JQuery;
//#endregion
//#region sortable
/**
* Initializes or updates a sortable instance with the provided options
*
* @param options - Configuration options for the sortable instance
* @returns The jQuery object for chaining
*/
sortable(options?: SortableOptions): JQuery;
/**
* Calls a sortable method to perform actions on the instance
*
* @param method - The name of the sortable method to invoke
* @returns The jQuery object for chaining
*/
sortable(method: 'destroy' | 'disable' | 'enable' | 'refresh' | 'toArray'): JQuery;
/**
* Retrieves the sortable's instance object. If the element does not have an associated instance, undefined is returned.
*
* @returns The instance of the sortable object
*/
sortable(method: 'instance'): object;
/**
* Retrieves the current option value for the specified option
*
* @param method - The string 'option' to retrieve an option value
* @param optionName - The name of the option to retrieve
* @returns The value of the specified option
*/
sortable(method: 'option', optionName: string): any;
/**
* Sets the value of the specified option
*
* @param method - The string 'option' to set an option value
* @param optionName - The name of the option to set
* @param value - The value to assign to the option
* @returns The jQuery object for chaining
*/
sortable(method: 'option', optionName: string, value: any): JQuery;
/**
* Sets multiple options using an object
*
* @param method - The string 'option' to set options
* @param options - An object containing multiple option key-value pairs
* @returns The jQuery object for chaining
*/
sortable(method: 'option', options: SortableOptions): JQuery;
//#endregion
} }
namespace Select2 {
interface Options<Result = DataFormat | GroupedDataFormat, RemoteResult = any> {
/**
* Extends Select2 v4 plugin by adding an option to set a placeholder for the 'search' input field
* [Custom Field]
* @default ''
*/
searchInputPlaceholder?: string;
/**
* Extends select2 plugin by adding a custom css class for the 'search' input field
* [Custom Field]
* @default ''
*/
searchInputCssClass?: string;
}
}
/**
* Translates a text to a target language using a translation provider.
* @param text Text to translate
* @param lang Target language
* @param provider Translation provider
*/
async function translate(text: string, lang: string, provider: string = null): Promise<string>;
} }
//#region select2
/** Options for configuring a select2 instance */
interface Select2Options {
/**
* Provides support for ajax data sources
* @param params - Parameters including the search term
* @param callback - A callback function to handle the results
* @default null
*/
ajax?: {
url: string;
dataType?: string;
delay?: number;
data?: (params: any) => any;
processResults?: (data: any, params: any) => any;
} | { transport: (params, success, failure) => any };
/**
* Provides support for clearable selections
* @default false
*/
allowClear?: boolean;
/**
* See Using Select2 with AMD or CommonJS loaders
* @default './i18n/'
*/
amdLanguageBase?: string;
/**
* Controls whether the dropdown is closed after a selection is made
* @default true
*/
closeOnSelect?: boolean;
/**
* Allows rendering dropdown options from an array
* @default null
*/
data?: object[];
/**
* Used to override the built-in DataAdapter
* @default SelectAdapter
*/
dataAdapter?: SelectAdapter;
/**
* Enable debugging messages in the browser console
* @default false
*/
debug?: boolean;
/**
* Sets the dir attribute on the selection and dropdown containers to indicate the direction of the text
* @default 'ltr'
*/
dir?: string;
/**
* When set to true, the select control will be disabled
* @default false
*/
disabled?: boolean;
/**
* Used to override the built-in DropdownAdapter
* @default DropdownAdapter
*/
dropdownAdapter?: DropdownAdapter;
/**
* @default false
*/
dropdownAutoWidth?: boolean;
/**
* Adds additional CSS classes to the dropdown container. The helper :all: can be used to add all CSS classes present on the original <select> element.
* @default ''
*/
dropdownCssClass?: string;
/**
* Allows you to customize placement of the dropdown
* @default $(document.body)
*/
dropdownParent?: JQuery | HTMLElement;
/**
* Handles automatic escaping of content rendered by custom templates
* @default Utils.escapeMarkup
*/
escapeMarkup?: function;
/**
* Specify the language used for Select2 messages
* @default EnglishTranslation
*/
language?: string | object;
/**
* Handles custom search matching
* @default null
*/
matcher?: (searchParams: object, data: object) => boolean;
/**
* Maximum number of characters that may be provided for a search term
* @default 0
*/
maximumInputLength?: number;
/**
* The maximum number of items that may be selected in a multi-select control. If the value of this option is less than 1, the number of selected items will not be limited.
* @default 0
*/
maximumSelectionLength?: number;
/**
* Minimum number of characters required to start a search
* @default 0
*/
minimumInputLength?: number;
/**
* The minimum number of results required to display the search box
* @default 0
*/
minimumResultsForSearch?: number;
/**
* This option enables multi-select (pillbox) mode. Select2 will automatically map the value of the multiple HTML attribute to this option during initialization.
* @default false
*/
multiple?: boolean;
/**
* Specifies the placeholder for the control
* @default null
*/
placeholder?: string;
/**
* Used to override the built-in ResultsAdapter
* @default ResultsAdapter
*/
resultsAdapter?: ResultsAdapter;
/**
* Used to override the built-in SelectionAdapter
* @default SingleSelection | MultipleSelection
*/
selectionAdapter?: SingleSelection | MultipleSelection;
/**
* Adds additional CSS classes to the selection container. The helper :all: can be used to add all CSS classes present on the original <select> element
* @default ''
*/
selectionCssClass?: string;
/**
* Implements automatic selection when the dropdown is closed
* @default false
*/
selectOnClose?: boolean;
sorter?: function;
/**
* When set to `true`, allows the user to create new tags that aren't pre-populated
* Used to enable free text responses
* @default false
*/
tags?: boolean | object[];
/**
* Customizes the way that search results are rendered
* @param item - The item object to format
* @returns The formatted representation
* @default null
*/
templateResult?: (item: any) => JQuery | string;
/**
* Customizes the way that selections are rendered
* @param item - The selected item object to format
* @returns The formatted representation
* @default null
*/
templateSelection?: (item: any) => JQuery | string;
/**
* Allows you to set the theme
* @default 'default'
*/
theme?: string;
/**
* A callback that handles automatic tokenization of free-text entry
* @default null
*/
tokenizer?: (input: { _type: string, term: string }, selection: { options: object }, callback: (Select2Option) => any) => { term: string };
/**
* The list of characters that should be used as token separators
* @default null
*/
tokenSeparators?: string[];
/**
* Supports customization of the container width
* @default 'resolve'
*/
width?: string;
/**
* If true, resolves issue for multiselects using closeOnSelect: false that caused the list of results to scroll to the first selection after each select/unselect
* @default false
*/
scrollAfterSelect?: boolean;
/**
* Extends Select2 v4 plugin by adding an option to set a placeholder for the 'search' input field
* [Custom Field]
* @default ''
*/
searchInputPlaceholder?: string;
/**
* Extends select2 plugin by adding a custom css class for the 'searcH' input field
* [Custom Field]
* @default ''
*/
searchInputCssClass?: string;
}
//#endregion
//#region sortable
/** Options for configuring a sortable instance */
interface SortableOptions {
/**
* When set, prevents the sortable items from being dragged unless clicked with a delay
* @default 0
*/
delay?: number;
/**
* Class name for elements to handle sorting. Elements with this class can be dragged to sort.
* @default ''
*/
handle?: string;
/**
* Whether to allow sorting between different connected lists
* @default false
*/
connectWith?: string | boolean;
/**
* Function called when sorting starts
* @param event - The event object
* @param ui - The UI object containing the helper and position information
*/
start?: (event: Event, ui: SortableUI) => void;
/**
* Function called when sorting stops
* @param event - The event object
* @param ui - The UI object containing the helper and position information
*/
stop?: (event: Event, ui: SortableUI) => void;
/**
* Function called when sorting updates
* @param event - The event object
* @param ui - The UI object containing the helper and position information
*/
update?: (event: Event, ui: SortableUI) => void;
/**
* Specifies which items inside the element should be sortable
* @default '> *'
*/
items?: string;
}
/** UI object passed to sortable event handlers */
interface SortableUI {
/** jQuery object representing the helper element */
helper: JQuery;
/** The current position of the helper element */
position: { top: number; left: number };
/** Original position of the helper element */
originalPosition: { top: number; left: number };
/** jQuery object representing the item being sorted */
item: JQuery;
/** The placeholder element used during sorting */
placeholder: JQuery;
}
//#endregion

6
public/img/deepseek.svg Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128px" height="128px" viewBox="0 0 128 128" version="1.1">
<g id="surface1">
<path d="M 126.65625 23.902344 C 125.300781 23.242188 124.714844 24.507812 123.925781 25.152344 C 123.652344 25.359375 123.425781 25.632812 123.195312 25.878906 C 121.210938 27.996094 118.894531 29.382812 115.871094 29.214844 C 111.449219 28.96875 107.675781 30.355469 104.335938 33.738281 C 103.625 29.566406 101.269531 27.082031 97.683594 25.484375 C 95.808594 24.652344 93.910156 23.824219 92.59375 22.015625 C 91.675781 20.730469 91.425781 19.296875 90.964844 17.886719 C 90.671875 17.035156 90.378906 16.164062 89.402344 16.019531 C 88.335938 15.855469 87.921875 16.746094 87.503906 17.492188 C 85.835938 20.542969 85.1875 23.902344 85.253906 27.308594 C 85.398438 34.964844 88.628906 41.066406 95.054688 45.402344 C 95.785156 45.898438 95.972656 46.398438 95.742188 47.125 C 95.308594 48.617188 94.785156 50.070312 94.324219 51.566406 C 94.03125 52.523438 93.59375 52.726562 92.570312 52.316406 C 89.109375 50.828125 85.96875 48.691406 83.3125 46.019531 C 78.742188 41.605469 74.613281 36.730469 69.460938 32.910156 C 68.269531 32.03125 67.042969 31.191406 65.785156 30.398438 C 60.535156 25.296875 66.480469 21.105469 67.855469 20.609375 C 69.296875 20.085938 68.351562 18.304688 63.703125 18.324219 C 59.050781 18.347656 54.792969 19.898438 49.371094 21.972656 C 48.566406 22.28125 47.734375 22.527344 46.890625 22.703125 C 41.820312 21.75 36.636719 21.566406 31.515625 22.160156 C 21.460938 23.28125 13.433594 28.039062 7.53125 36.148438 C 0.4375 45.898438 -1.230469 56.980469 0.8125 68.535156 C 2.960938 80.714844 9.179688 90.800781 18.730469 98.683594 C 28.640625 106.859375 40.046875 110.863281 53.066406 110.097656 C 60.96875 109.644531 69.777344 108.582031 79.703125 100.175781 C 82.207031 101.425781 84.832031 101.921875 89.195312 102.292969 C 92.554688 102.609375 95.785156 102.132812 98.289062 101.609375 C 102.207031 100.777344 101.9375 97.148438 100.523438 96.484375 C 89.03125 91.128906 91.550781 93.3125 89.253906 91.546875 C 95.097656 84.632812 103.898438 77.457031 107.34375 54.199219 C 107.609375 52.347656 107.382812 51.183594 107.34375 49.691406 C 107.324219 48.785156 107.53125 48.425781 108.570312 48.324219 C 111.457031 48.027344 114.253906 47.164062 116.8125 45.792969 C 124.257812 41.722656 127.265625 35.046875 127.972656 27.035156 C 128.078125 25.808594 127.953125 24.542969 126.65625 23.898438 Z M 61.765625 96 C 50.625 87.242188 45.222656 84.355469 42.992188 84.480469 C 40.902344 84.609375 41.28125 86.992188 41.738281 88.550781 C 42.21875 90.085938 42.84375 91.140625 43.71875 92.492188 C 44.324219 93.382812 44.742188 94.710938 43.113281 95.707031 C 39.523438 97.925781 33.289062 94.960938 32.996094 94.816406 C 25.738281 90.539062 19.664062 84.894531 15.390625 77.179688 C 11.265625 69.75 8.863281 61.78125 8.46875 53.273438 C 8.363281 51.214844 8.964844 50.492188 11.011719 50.117188 C 13.703125 49.601562 16.457031 49.53125 19.167969 49.910156 C 30.539062 51.574219 40.214844 56.65625 48.332031 64.703125 C 52.960938 69.289062 56.464844 74.769531 60.074219 80.121094 C 63.914062 85.808594 68.042969 91.226562 73.300781 95.664062 C 75.15625 97.222656 76.632812 98.40625 78.054688 99.273438 C 73.777344 99.753906 66.640625 99.863281 61.765625 96 Z M 67.097656 61.652344 C 67.097656 61.117188 67.359375 60.609375 67.800781 60.304688 C 68.246094 60 68.808594 59.929688 69.3125 60.121094 C 70.378906 62.097656 70.207031 62.515625 69.894531 62.824219 C 69.585938 63.132812 69.164062 63.300781 68.726562 63.296875 C 68.292969 63.296875 67.875 63.125 67.570312 62.816406 C 67.265625 62.507812 67.097656 62.085938 67.105469 61.652344 Z M 83.683594 70.164062 C 82.617188 70.597656 81.558594 70.96875 80.539062 71.019531 C 79.007812 71.070312 77.503906 70.59375 76.28125 69.664062 C 74.820312 68.4375 73.777344 67.753906 73.339844 65.621094 C 73.1875 64.578125 73.214844 63.519531 73.425781 62.484375 C 73.796875 60.742188 73.382812 59.621094 72.148438 58.609375 C 71.152344 57.777344 69.878906 57.546875 68.480469 57.546875 C 68 57.519531 67.535156 57.375 67.125 57.128906 C 66.539062 56.84375 66.058594 56.117188 66.515625 55.222656 C 66.667969 54.933594 67.371094 54.230469 67.542969 54.101562 C 69.441406 53.023438 71.632812 53.375 73.652344 54.1875 C 75.53125 54.953125 76.949219 56.363281 78.992188 58.355469 C 81.078125 60.761719 81.457031 61.429688 82.644531 63.230469 C 83.585938 64.644531 84.4375 66.097656 85.019531 67.753906 C 85.375 68.792969 84.917969 69.644531 83.683594 70.164062 Z M 83.683594 70.164062 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

15
public/img/generic.svg Normal file
View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="616.86328"
height="616.86328"
viewBox="0 0 77.10791 77.10791"
version="1.1"
id="svg4"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs4" />
<path
id="circle1"
d="M 38.553955,0 A 38.554,38.554 0 0 0 0,38.553955 38.554,38.554 0 0 0 38.553955,77.107911 38.554,38.554 0 0 0 77.107911,38.553955 38.554,38.554 0 0 0 38.553955,0 Z m -3.125976,13.545898 h 6.251953 v 19.593751 l 16.968751,-9.796875 3.125974,5.414306 -16.968506,9.796875 16.968506,9.796877 -3.125974,5.414305 -16.968751,-9.796874 V 63.56201 H 35.427979 V 43.968263 l -16.968506,9.796874 -3.125977,-5.414305 16.96875,-9.796877 -16.96875,-9.796875 3.125977,-5.414306 16.968506,9.796875 z" />
</svg>

After

Width:  |  Height:  |  Size: 803 B

1
public/img/vllm.svg Normal file
View File

@@ -0,0 +1 @@
<svg version="1.0" width="565.752" height="586.537" viewBox="0 0 424.314 439.903" preserveAspectRatio="xMidYMid" xmlns="http://www.w3.org/2000/svg"><path d="M344.6 41.703c-43.4 23-79.3 42.4-79.7 43.2-.8 1.4-72.3 276.1-84.3 323.5-6.2 24.9-7.1 27.7-8 25.5-.4-.8-.5-77.7-.4-170.8l.3-169.2H86.3c-47.5 0-86.3.2-86.3.5 0 1 162.2 325 166.9 333.3 2.5 4.6 5 9.2 5.6 10.3.9 1.8 2.7 1.9 68.2 1.9 63.1 0 67.2-.1 67.7-1.8.3-.9 24.2-90.8 53-199.7 51-192.7 58.9-222.4 62-233.3.8-2.8 1.1-5.2.8-5.1-.4 0-36.2 18.8-79.6 41.7z"/></svg>

After

Width:  |  Height:  |  Size: 516 B

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,8 @@
"module": "ESNext", "module": "ESNext",
"moduleResolution": "node", "moduleResolution": "node",
"allowUmdGlobalAccess": true, "allowUmdGlobalAccess": true,
"allowSyntheticDefaultImports": true "allowSyntheticDefaultImports": true,
"strictBindCallApply": true
}, },
"exclude": [ "exclude": [
"**/node_modules/**", "**/node_modules/**",
@@ -13,7 +14,8 @@
"**/.git/**", "**/.git/**",
"lib/**", "lib/**",
"**/*.min.js", "**/*.min.js",
"scripts/extensions/quick-reply/lib/**" "scripts/extensions/quick-reply/lib/**",
"scripts/extensions/tts/lib/**"
], ],
"typeAcquisition": { "typeAcquisition": {
"include": [] "include": []

View File

@@ -19,6 +19,8 @@ import seedrandom from 'seedrandom';
import * as Popper from '@popperjs/core'; import * as Popper from '@popperjs/core';
import droll from 'droll'; import droll from 'droll';
import morphdom from 'morphdom'; import morphdom from 'morphdom';
import { toggle as slideToggle } from 'slidetoggle';
import chalk from 'chalk';
/** /**
* Expose the libraries to the 'window' object. * Expose the libraries to the 'window' object.
@@ -94,6 +96,8 @@ export default {
Popper, Popper,
droll, droll,
morphdom, morphdom,
slideToggle,
chalk,
}; };
export { export {
@@ -115,4 +119,6 @@ export {
Popper, Popper,
droll, droll,
morphdom, morphdom,
slideToggle,
chalk,
}; };

View File

@@ -24,10 +24,22 @@ if (typeof Array.prototype.indexOf === 'function') {
/* Polyfill EventEmitter. */ /* Polyfill EventEmitter. */
var EventEmitter = function () { /**
* Creates an event emitter.
* @param {string[]} autoFireAfterEmit Auto-fire event names
*/
var EventEmitter = function (autoFireAfterEmit = []) {
this.events = {}; this.events = {};
this.autoFireLastArgs = new Map();
this.autoFireAfterEmit = new Set(autoFireAfterEmit);
}; };
/**
* Adds a listener to an event.
* @param {string} event Event name
* @param {function} listener Event listener
* @returns
*/
EventEmitter.prototype.on = function (event, listener) { EventEmitter.prototype.on = function (event, listener) {
// Unknown event used by external libraries? // Unknown event used by external libraries?
if (event === undefined) { if (event === undefined) {
@@ -40,6 +52,10 @@ EventEmitter.prototype.on = function (event, listener) {
} }
this.events[event].push(listener); this.events[event].push(listener);
if (this.autoFireAfterEmit.has(event) && this.autoFireLastArgs.has(event)) {
listener.apply(this, this.autoFireLastArgs.get(event));
}
}; };
/** /**
@@ -60,6 +76,10 @@ EventEmitter.prototype.makeLast = function (event, listener) {
} }
events.push(listener); events.push(listener);
if (this.autoFireAfterEmit.has(event) && this.autoFireLastArgs.has(event)) {
listener.apply(this, this.autoFireLastArgs.get(event));
}
} }
/** /**
@@ -80,8 +100,17 @@ EventEmitter.prototype.makeFirst = function (event, listener) {
} }
events.unshift(listener); events.unshift(listener);
if (this.autoFireAfterEmit.has(event) && this.autoFireLastArgs.has(event)) {
listener.apply(this, this.autoFireLastArgs.get(event));
}
} }
/**
* Removes a listener from an event.
* @param {string} event Event name
* @param {function} listener Event listener
*/
EventEmitter.prototype.removeListener = function (event, listener) { EventEmitter.prototype.removeListener = function (event, listener) {
var idx; var idx;
@@ -94,14 +123,19 @@ EventEmitter.prototype.removeListener = function (event, listener) {
} }
}; };
/**
* Emits an event with optional arguments.
* @param {string} event Event name
*/
EventEmitter.prototype.emit = async function (event) { EventEmitter.prototype.emit = async function (event) {
let args = [].slice.call(arguments, 1);
if (localStorage.getItem('eventTracing') === 'true') { if (localStorage.getItem('eventTracing') === 'true') {
console.trace('Event emitted: ' + event, args); console.trace('Event emitted: ' + event, args);
} else { } else {
console.debug('Event emitted: ' + event); console.debug('Event emitted: ' + event);
} }
var i, listeners, length, args = [].slice.call(arguments, 1); let i, listeners, length;
if (typeof this.events[event] === 'object') { if (typeof this.events[event] === 'object') {
listeners = this.events[event].slice(); listeners = this.events[event].slice();
@@ -117,16 +151,21 @@ EventEmitter.prototype.emit = async function (event) {
} }
} }
} }
if (this.autoFireAfterEmit.has(event)) {
this.autoFireLastArgs.set(event, args);
}
}; };
EventEmitter.prototype.emitAndWait = function (event) { EventEmitter.prototype.emitAndWait = function (event) {
let args = [].slice.call(arguments, 1);
if (localStorage.getItem('eventTracing') === 'true') { if (localStorage.getItem('eventTracing') === 'true') {
console.trace('Event emitted: ' + event, args); console.trace('Event emitted: ' + event, args);
} else { } else {
console.debug('Event emitted: ' + event); console.debug('Event emitted: ' + event);
} }
var i, listeners, length, args = [].slice.call(arguments, 1); let i, listeners, length;
if (typeof this.events[event] === 'object') { if (typeof this.events[event] === 'object') {
listeners = this.events[event].slice(); listeners = this.events[event].slice();
@@ -142,10 +181,14 @@ EventEmitter.prototype.emitAndWait = function (event) {
} }
} }
} }
if (this.autoFireAfterEmit.has(event)) {
this.autoFireLastArgs.set(event, args);
}
}; };
EventEmitter.prototype.once = function (event, listener) { EventEmitter.prototype.once = function (event, listener) {
this.on(event, function g () { this.on(event, function g() {
this.removeListener(event, g); this.removeListener(event, g);
listener.apply(this, arguments); listener.apply(this, arguments);
}); });

View File

@@ -267,7 +267,7 @@
"Text Completion": "اكتمال النص", "Text Completion": "اكتمال النص",
"Chat Completion": "إكمال الدردشة", "Chat Completion": "إكمال الدردشة",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "جماعة KoboldAI", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "تجنب إرسال معلومات حساسة إلى الجماعة.", "Avoid sending sensitive information to the Horde.": "تجنب إرسال معلومات حساسة إلى الجماعة.",
"Review the Privacy statement": "مراجعة بيان الخصوصية", "Review the Privacy statement": "مراجعة بيان الخصوصية",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "فصل بفواصل دون مسافة بينها", "separate with commas w/o space between": "فصل بفواصل دون مسافة بينها",
"Custom Stopping Strings": "سلاسل توقف مخصصة", "Custom Stopping Strings": "سلاسل توقف مخصصة",
"JSON serialized array of strings": "مصفوفة سلسلة JSON متسلسلة", "JSON serialized array of strings": "مصفوفة سلسلة JSON متسلسلة",
"Replace Macro in Custom Stopping Strings": "استبدال الماكرو في سلاسل التوقف المخصصة", "Replace Macro in Stop Strings": "استبدال الماكرو في سلاسل التوقف المخصصة",
"Auto-Continue": "المتابعة التلقائية", "Auto-Continue": "المتابعة التلقائية",
"Allow for Chat Completion APIs": "السماح بواجهات برمجة التطبيقات لإكمال الدردشة", "Allow for Chat Completion APIs": "السماح بواجهات برمجة التطبيقات لإكمال الدردشة",
"Target length (tokens)": "الطول المستهدف (رموز)", "Target length (tokens)": "الطول المستهدف (رموز)",
@@ -558,7 +558,7 @@
"Delete a theme": "حذف موضوع", "Delete a theme": "حذف موضوع",
"Update a theme file": "تحديث ملف السمة", "Update a theme file": "تحديث ملف السمة",
"Save as a new theme": "حفظ كسمة جديدة", "Save as a new theme": "حفظ كسمة جديدة",
"Avatar Style": "نمط الصورة الرمزية", "Avatar Style:": "نمط الصورة الرمزية",
"Circle": "دائرة", "Circle": "دائرة",
"Square": "مربع", "Square": "مربع",
"Rectangle": "مستطيل", "Rectangle": "مستطيل",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "تفضيل التعليمات من بطاقة الشخصية", "Prefer Character Card Prompt": "تفضيل التعليمات من بطاقة الشخصية",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "إذا تم التحقق وكانت بطاقة الشخصية تحتوي على تجاوز للكسر (تعليمات تاريخ المشاركة)، استخدم ذلك بدلاً من ذلك", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "إذا تم التحقق وكانت بطاقة الشخصية تحتوي على تجاوز للكسر (تعليمات تاريخ المشاركة)، استخدم ذلك بدلاً من ذلك",
"Prefer Character Card Jailbreak": "تفضيل كسر الحصار من بطاقة الشخصية", "Prefer Character Card Jailbreak": "تفضيل كسر الحصار من بطاقة الشخصية",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "تجنب اقتصاص صور الأحرف المستوردة وتغيير حجمها. عند إيقاف التشغيل، قم بالقص/تغيير الحجم إلى 512 × 768.", "never_resize_avatars_tooltip": "تجنب اقتصاص صور الأحرف المستوردة وتغيير حجمها. عند إيقاف التشغيل، قم بالقص/تغيير الحجم إلى 512 × 768.",
"Never resize avatars": "لا تغيير حجم الصور الرمزية أبدًا", "Never resize avatars": "لا تغيير حجم الصور الرمزية أبدًا",
"Show actual file names on the disk, in the characters list display only": "عرض الأسماء الفعلية للملفات على القرص، في عرض قائمة الشخصيات فقط", "Show actual file names on the disk, in the characters list display only": "عرض الأسماء الفعلية للملفات على القرص، في عرض قائمة الشخصيات فقط",
"Show avatar filenames": "عرض أسماء ملفات الصور الرمزية", "Show avatar filenames": "عرض أسماء ملفات الصور الرمزية",
@@ -709,7 +709,7 @@
"Auto-swipe": "السحب التلقائي", "Auto-swipe": "السحب التلقائي",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "تمكين وظيفة السحب التلقائي. الإعدادات في هذا القسم تؤثر فقط عند تمكين السحب التلقائي", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "تمكين وظيفة السحب التلقائي. الإعدادات في هذا القسم تؤثر فقط عند تمكين السحب التلقائي",
"Minimum generated message length": "الحد الأدنى لطول الرسالة المولدة", "Minimum generated message length": "الحد الأدنى لطول الرسالة المولدة",
"If the generated message is shorter than this, trigger an auto-swipe": "إذا كانت الرسالة المولدة أقصر من هذا، فتحريض السحب التلقائي", "If the generated message is shorter than these many characters, trigger an auto-swipe": "إذا كانت الرسالة المولدة أقصر من هذا، فتحريض السحب التلقائي",
"Blacklisted words": "الكلمات الممنوعة", "Blacklisted words": "الكلمات الممنوعة",
"words you dont want generated separated by comma ','": "الكلمات التي لا تريد توليدها مفصولة بفاصلة ','", "words you dont want generated separated by comma ','": "الكلمات التي لا تريد توليدها مفصولة بفاصلة ','",
"Blacklisted word count to swipe": "عدد الكلمات الممنوعة للسحب", "Blacklisted word count to swipe": "عدد الكلمات الممنوعة للسحب",
@@ -879,7 +879,7 @@
"popup-button-no": "لا", "popup-button-no": "لا",
"popup-button-cancel": "يلغي", "popup-button-cancel": "يلغي",
"popup-button-import": "يستورد", "popup-button-import": "يستورد",
"Advanced Defininitions": "تعريفات متقدمة", "Advanced Definitions": "تعريفات متقدمة",
"Prompt Overrides": "التجاوزات السريعة", "Prompt Overrides": "التجاوزات السريعة",
"(For Chat Completion and Instruct Mode)": "(لاستكمال الدردشة ووضع التعليمات)", "(For Chat Completion and Instruct Mode)": "(لاستكمال الدردشة ووضع التعليمات)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "أدخل {{original}} في أي مربع لتضمين التعليمات الافتراضية المعنية من إعدادات النظام.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "أدخل {{original}} في أي مربع لتضمين التعليمات الافتراضية المعنية من إعدادات النظام.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "قم بتشغيل تطبيق DrawThings مع تمكين مفتاح HTTP API في واجهة المستخدم! يجب أن يكون الخادم قابلاً للوصول من الجهاز المضيف SillyTavern.", "sd_drawthings_auth_txt": "قم بتشغيل تطبيق DrawThings مع تمكين مفتاح HTTP API في واجهة المستخدم! يجب أن يكون الخادم قابلاً للوصول من الجهاز المضيف SillyTavern.",
"sd_vlad_url": "مثال: {{vlad_url}}", "sd_vlad_url": "مثال: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "يجب أن يكون الخادم قابلاً للوصول من الجهاز المضيف SillyTavern.", "The server must be accessible from the SillyTavern host machine.": "يجب أن يكون الخادم قابلاً للوصول من الجهاز المضيف SillyTavern.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "تلميح: احفظ مفتاح API في إعدادات Horde KoboldAI API لاستخدامه هنا.", "Hint: Save an API key in AI Horde API settings to use it here.": "تلميح: احفظ مفتاح API في إعدادات AI Horde API لاستخدامه هنا.",
"Allow NSFW images from Horde": "السماح بصور NSFW من Horde", "Allow NSFW images from Horde": "السماح بصور NSFW من Horde",
"Sanitize prompts (recommended)": "مطالبات التعقيم (مستحسن)", "Sanitize prompts (recommended)": "مطالبات التعقيم (مستحسن)",
"Automatically adjust generation parameters to ensure free image generations.": "قم بضبط معلمات الإنشاء تلقائيًا لضمان إنشاء صور مجانية.", "Automatically adjust generation parameters to ensure free image generations.": "قم بضبط معلمات الإنشاء تلقائيًا لضمان إنشاء صور مجانية.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub Lorebook (رابط مباشر أو معرف)", "char_import_2": "Chub Lorebook (رابط مباشر أو معرف)",
"char_import_3": "حرف JanitorAI (رابط مباشر أو UUID)", "char_import_3": "حرف JanitorAI (رابط مباشر أو UUID)",
"char_import_4": "حرف Pygmalion.chat (رابط مباشر أو UUID)", "char_import_4": "حرف Pygmalion.chat (رابط مباشر أو UUID)",
"char_import_5": "حرف AICharacterCard.com (رابط مباشر أو معرف)", "char_import_5": "حرف AICharacterCards.com (رابط مباشر أو معرف)",
"char_import_6": "رابط PNG المباشر (راجع", "char_import_6": "رابط PNG المباشر (راجع",
"char_import_7": "للمضيفين المسموح بهم)", "char_import_7": "للمضيفين المسموح بهم)",
"char_import_8": "شخصية RisuRealm (رابط مباشر)", "char_import_8": "شخصية RisuRealm (رابط مباشر)",

View File

@@ -267,7 +267,7 @@
"Text Completion": "Textvervollständigung", "Text Completion": "Textvervollständigung",
"Chat Completion": "Chat-Abschluss", "Chat Completion": "Chat-Abschluss",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "KoboldAI Horde", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Vermeide das Senden sensibler Informationen an die Horde.", "Avoid sending sensitive information to the Horde.": "Vermeide das Senden sensibler Informationen an die Horde.",
"Review the Privacy statement": "Überprüfe die Datenschutzerklärung", "Review the Privacy statement": "Überprüfe die Datenschutzerklärung",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "getrennt durch Kommas ohne Leerzeichen dazwischen", "separate with commas w/o space between": "getrennt durch Kommas ohne Leerzeichen dazwischen",
"Custom Stopping Strings": "Benutzerdefinierte Stoppzeichenfolgen", "Custom Stopping Strings": "Benutzerdefinierte Stoppzeichenfolgen",
"JSON serialized array of strings": "JSON serialisierte Reihe von Zeichenfolgen", "JSON serialized array of strings": "JSON serialisierte Reihe von Zeichenfolgen",
"Replace Macro in Custom Stopping Strings": "Makro in benutzerdefinierten Stoppzeichenfolgen ersetzen", "Replace Macro in Stop Strings": "Makro in benutzerdefinierten Stoppzeichenfolgen ersetzen",
"Auto-Continue": "Automatisch fortsetzen", "Auto-Continue": "Automatisch fortsetzen",
"Allow for Chat Completion APIs": "Erlaube Chat-Vervollständigungs-APIs", "Allow for Chat Completion APIs": "Erlaube Chat-Vervollständigungs-APIs",
"Target length (tokens)": "Ziel-Länge (Tokens)", "Target length (tokens)": "Ziel-Länge (Tokens)",
@@ -558,7 +558,7 @@
"Delete a theme": "Löschen eines Designs", "Delete a theme": "Löschen eines Designs",
"Update a theme file": "Ein Theme-Datei aktualisieren", "Update a theme file": "Ein Theme-Datei aktualisieren",
"Save as a new theme": "Als neues Theme speichern", "Save as a new theme": "Als neues Theme speichern",
"Avatar Style": "Avatar-Stil", "Avatar Style:": "Avatar-Stil",
"Circle": "Kreis", "Circle": "Kreis",
"Square": "Quadrat", "Square": "Quadrat",
"Rectangle": "Rechteck", "Rectangle": "Rechteck",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Bevorzuge Charakterkarten-Prompt", "Prefer Character Card Prompt": "Bevorzuge Charakterkarten-Prompt",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Wenn aktiviert und die Charakterkarte eine Jailbreak-Überschreibung enthält (Post-History-Instruction), verwende stattdessen diese", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Wenn aktiviert und die Charakterkarte eine Jailbreak-Überschreibung enthält (Post-History-Instruction), verwende stattdessen diese",
"Prefer Character Card Jailbreak": "Bevorzuge Charakterkarten-Jailbreak", "Prefer Character Card Jailbreak": "Bevorzuge Charakterkarten-Jailbreak",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Vermeiden Sie das Zuschneiden und Ändern der Größe importierter Zeichenbilder. Wenn deaktiviert, wird die Größe auf 512 x 768 zugeschnitten/angepasst.", "never_resize_avatars_tooltip": "Vermeiden Sie das Zuschneiden und Ändern der Größe importierter Zeichenbilder. Wenn deaktiviert, wird die Größe auf 512 x 768 zugeschnitten/angepasst.",
"Never resize avatars": "Avatare niemals verkleinern", "Never resize avatars": "Avatare niemals verkleinern",
"Show actual file names on the disk, in the characters list display only": "Zeige tatsächliche Dateinamen auf der Festplatte, nur in der Anzeige der Charakterliste", "Show actual file names on the disk, in the characters list display only": "Zeige tatsächliche Dateinamen auf der Festplatte, nur in der Anzeige der Charakterliste",
"Show avatar filenames": "Avatar-Dateinamen anzeigen", "Show avatar filenames": "Avatar-Dateinamen anzeigen",
@@ -709,7 +709,7 @@
"Auto-swipe": "Automatisches Wischen", "Auto-swipe": "Automatisches Wischen",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Aktiviere die Auto-Wisch-Funktion. Einstellungen in diesem Abschnitt haben nur dann Auswirkungen, wenn das automatische Wischen aktiviert ist", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Aktiviere die Auto-Wisch-Funktion. Einstellungen in diesem Abschnitt haben nur dann Auswirkungen, wenn das automatische Wischen aktiviert ist",
"Minimum generated message length": "Minimale generierte Nachrichtenlänge", "Minimum generated message length": "Minimale generierte Nachrichtenlänge",
"If the generated message is shorter than this, trigger an auto-swipe": "Wenn die generierte Nachricht kürzer ist als diese, löse automatisches Wischen aus", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Wenn die generierte Nachricht kürzer ist als diese, löse automatisches Wischen aus",
"Blacklisted words": "Verbotene Wörter", "Blacklisted words": "Verbotene Wörter",
"words you dont want generated separated by comma ','": "Wörter, die du nicht generiert haben möchtest, durch Komma ',' getrennt", "words you dont want generated separated by comma ','": "Wörter, die du nicht generiert haben möchtest, durch Komma ',' getrennt",
"Blacklisted word count to swipe": "Anzahl der verbotenen Wörter, um zu wischen", "Blacklisted word count to swipe": "Anzahl der verbotenen Wörter, um zu wischen",
@@ -879,7 +879,7 @@
"popup-button-no": "NEIN", "popup-button-no": "NEIN",
"popup-button-cancel": "Stornieren", "popup-button-cancel": "Stornieren",
"popup-button-import": "Importieren", "popup-button-import": "Importieren",
"Advanced Defininitions": "Erweiterte Definitionen", "Advanced Definitions": "Erweiterte Definitionen",
"Prompt Overrides": "Eingabeaufforderungsüberschreibungen", "Prompt Overrides": "Eingabeaufforderungsüberschreibungen",
"(For Chat Completion and Instruct Mode)": "(Für Chat-Abschluss und Anweisungsmodus)", "(For Chat Completion and Instruct Mode)": "(Für Chat-Abschluss und Anweisungsmodus)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Füge {{original}} in eines der Felder ein, um den jeweiligen Standardprompt aus den Systemeinstellungen einzuschließen.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Füge {{original}} in eines der Felder ein, um den jeweiligen Standardprompt aus den Systemeinstellungen einzuschließen.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "Führen Sie die DrawThings-App mit aktiviertem HTTP-API-Schalter in der Benutzeroberfläche aus! Der Server muss vom SillyTavern-Hostcomputer aus zugänglich sein.", "sd_drawthings_auth_txt": "Führen Sie die DrawThings-App mit aktiviertem HTTP-API-Schalter in der Benutzeroberfläche aus! Der Server muss vom SillyTavern-Hostcomputer aus zugänglich sein.",
"sd_vlad_url": "Beispiel: {{vlad_url}}", "sd_vlad_url": "Beispiel: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "Der Server muss vom SillyTavern-Hostcomputer aus zugänglich sein.", "The server must be accessible from the SillyTavern host machine.": "Der Server muss vom SillyTavern-Hostcomputer aus zugänglich sein.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Tipp: Speichern Sie einen API-Schlüssel in den Horde KoboldAI API-Einstellungen, um ihn hier zu verwenden.", "Hint: Save an API key in AI Horde API settings to use it here.": "Tipp: Speichern Sie einen API-Schlüssel in den AI Horde API-Einstellungen, um ihn hier zu verwenden.",
"Allow NSFW images from Horde": "NSFW-Bilder von Horde zulassen", "Allow NSFW images from Horde": "NSFW-Bilder von Horde zulassen",
"Sanitize prompts (recommended)": "Eingabeaufforderungen bereinigen (empfohlen)", "Sanitize prompts (recommended)": "Eingabeaufforderungen bereinigen (empfohlen)",
"Automatically adjust generation parameters to ensure free image generations.": "Passen Sie die Generierungsparameter automatisch an, um eine freie Bildgenerierung zu gewährleisten.", "Automatically adjust generation parameters to ensure free image generations.": "Passen Sie die Generierungsparameter automatisch an, um eine freie Bildgenerierung zu gewährleisten.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub Lorebook (Direktlink oder ID)", "char_import_2": "Chub Lorebook (Direktlink oder ID)",
"char_import_3": "JanitorAI-Charakter (Direktlink oder UUID)", "char_import_3": "JanitorAI-Charakter (Direktlink oder UUID)",
"char_import_4": "Pygmalion.chat-Charakter (Direktlink oder UUID)", "char_import_4": "Pygmalion.chat-Charakter (Direktlink oder UUID)",
"char_import_5": "AICharacterCard.com-Charakter (Direktlink oder ID)", "char_import_5": "AICharacterCards.com-Charakter (Direktlink oder ID)",
"char_import_6": "Direkter PNG-Link (siehe", "char_import_6": "Direkter PNG-Link (siehe",
"char_import_7": "für erlaubte Hosts)", "char_import_7": "für erlaubte Hosts)",
"char_import_8": "RisuRealm-Charakter (Direktlink)", "char_import_8": "RisuRealm-Charakter (Direktlink)",

View File

@@ -267,7 +267,7 @@
"Text Completion": "Completar texto", "Text Completion": "Completar texto",
"Chat Completion": "Finalización del chat", "Chat Completion": "Finalización del chat",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "Horde de KoboldAI", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Evite enviar información sensible a Horde.", "Avoid sending sensitive information to the Horde.": "Evite enviar información sensible a Horde.",
"Review the Privacy statement": "Revise la declaración de privacidad", "Review the Privacy statement": "Revise la declaración de privacidad",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "separe con comas sin espacio entre ellas", "separate with commas w/o space between": "separe con comas sin espacio entre ellas",
"Custom Stopping Strings": "Cadenas de Detención Personalizadas", "Custom Stopping Strings": "Cadenas de Detención Personalizadas",
"JSON serialized array of strings": "Arreglo de cadenas serializado en JSON", "JSON serialized array of strings": "Arreglo de cadenas serializado en JSON",
"Replace Macro in Custom Stopping Strings": "Reemplazar macro en Cadenas de Detención Personalizadas", "Replace Macro in Stop Strings": "Reemplazar macro en Cadenas de Detención Personalizadas",
"Auto-Continue": "Autocontinuar", "Auto-Continue": "Autocontinuar",
"Allow for Chat Completion APIs": "Permitir para APIs de Completado de Chat", "Allow for Chat Completion APIs": "Permitir para APIs de Completado de Chat",
"Target length (tokens)": "Longitud objetivo (tokens)", "Target length (tokens)": "Longitud objetivo (tokens)",
@@ -558,7 +558,7 @@
"Delete a theme": "Eliminar un tema", "Delete a theme": "Eliminar un tema",
"Update a theme file": "Actualizar un archivo de tema", "Update a theme file": "Actualizar un archivo de tema",
"Save as a new theme": "Guardar como nuevo tema", "Save as a new theme": "Guardar como nuevo tema",
"Avatar Style": "Estilo de Avatar", "Avatar Style:": "Estilo de Avatar",
"Circle": "Círculo", "Circle": "Círculo",
"Square": "Cuadrado", "Square": "Cuadrado",
"Rectangle": "Rectángulo", "Rectangle": "Rectángulo",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Preferir Indicaciones en Tarjeta de Personaje", "Prefer Character Card Prompt": "Preferir Indicaciones en Tarjeta de Personaje",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Si está marcado y la tarjeta de personaje contiene una anulación de jailbreak (Instrucciones Post Historial), usar eso en su lugar", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Si está marcado y la tarjeta de personaje contiene una anulación de jailbreak (Instrucciones Post Historial), usar eso en su lugar",
"Prefer Character Card Jailbreak": "Preferir Jailbreak en Tarjeta de Personaje", "Prefer Character Card Jailbreak": "Preferir Jailbreak en Tarjeta de Personaje",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Evite recortar y cambiar el tamaño de las imágenes de personajes importados. Cuando esté desactivado, recorte/cambie el tamaño a 512x768.", "never_resize_avatars_tooltip": "Evite recortar y cambiar el tamaño de las imágenes de personajes importados. Cuando esté desactivado, recorte/cambie el tamaño a 512x768.",
"Never resize avatars": "Nunca redimensionar avatares", "Never resize avatars": "Nunca redimensionar avatares",
"Show actual file names on the disk, in the characters list display only": "Mostrar nombres de archivo reales en el disco, solo en la visualización de la lista de personajes", "Show actual file names on the disk, in the characters list display only": "Mostrar nombres de archivo reales en el disco, solo en la visualización de la lista de personajes",
"Show avatar filenames": "Mostrar nombres de archivo de avatares", "Show avatar filenames": "Mostrar nombres de archivo de avatares",
@@ -709,7 +709,7 @@
"Auto-swipe": "Deslizamiento automático", "Auto-swipe": "Deslizamiento automático",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Habilitar la función de deslizamiento automático. La configuración en esta sección solo tiene efecto cuando el deslizamiento automático está habilitado", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Habilitar la función de deslizamiento automático. La configuración en esta sección solo tiene efecto cuando el deslizamiento automático está habilitado",
"Minimum generated message length": "Longitud mínima del mensaje generado", "Minimum generated message length": "Longitud mínima del mensaje generado",
"If the generated message is shorter than this, trigger an auto-swipe": "Si el mensaje generado es más corto que esto, activar un deslizamiento automático", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Si el mensaje generado es más corto que esto, activar un deslizamiento automático",
"Blacklisted words": "Palabras prohibidas", "Blacklisted words": "Palabras prohibidas",
"words you dont want generated separated by comma ','": "palabras que no desea generar separadas por coma ','", "words you dont want generated separated by comma ','": "palabras que no desea generar separadas por coma ','",
"Blacklisted word count to swipe": "Número de palabras prohibidas para deslizar", "Blacklisted word count to swipe": "Número de palabras prohibidas para deslizar",
@@ -874,12 +874,12 @@
"Bulk_edit_characters": "Editar personajes masivamente", "Bulk_edit_characters": "Editar personajes masivamente",
"Bulk select all characters": "Seleccionar de forma masiva todos los personajes", "Bulk select all characters": "Seleccionar de forma masiva todos los personajes",
"Bulk delete characters": "Eliminar personajes masivamente", "Bulk delete characters": "Eliminar personajes masivamente",
"popup-button-save": "Ahorrar", "popup-button-save": "Guardar",
"popup-button-yes": "Sí", "popup-button-yes": "Sí",
"popup-button-no": "No", "popup-button-no": "No",
"popup-button-cancel": "Cancelar", "popup-button-cancel": "Cancelar",
"popup-button-import": "Importar", "popup-button-import": "Importar",
"Advanced Defininitions": "Definiciones avanzadas", "Advanced Definitions": "Definiciones avanzadas",
"Prompt Overrides": "Anulaciones rápidas", "Prompt Overrides": "Anulaciones rápidas",
"(For Chat Completion and Instruct Mode)": "(Para completar el chat y el modo de instrucción)", "(For Chat Completion and Instruct Mode)": "(Para completar el chat y el modo de instrucción)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Inserte {{original}} en cualquiera de las casillas para incluir las indicaciones predeterminadas respectivas de la configuración del sistema.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Inserte {{original}} en cualquiera de las casillas para incluir las indicaciones predeterminadas respectivas de la configuración del sistema.",
@@ -1019,7 +1019,7 @@
"This prompt cannot be overridden by character cards, even if overrides are preferred.": "Este mensaje no puede ser anulado por tarjetas de personaje, incluso si se prefieren las anulaciones.", "This prompt cannot be overridden by character cards, even if overrides are preferred.": "Este mensaje no puede ser anulado por tarjetas de personaje, incluso si se prefieren las anulaciones.",
"prompt_manager_forbid_overrides": "Prohibir anulaciones", "prompt_manager_forbid_overrides": "Prohibir anulaciones",
"reset": "reiniciar", "reset": "reiniciar",
"save": "ahorrar", "save": "guardar",
"This message is invisible for the AI": "Este mensaje es invisible para la IA", "This message is invisible for the AI": "Este mensaje es invisible para la IA",
"Message Actions": "Acciones de mensajes", "Message Actions": "Acciones de mensajes",
"Translate message": "Traducir mensaje", "Translate message": "Traducir mensaje",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "¡Ejecute la aplicación DrawThings con el interruptor API HTTP habilitado en la interfaz de usuario! Se debe poder acceder al servidor desde la máquina host de SillyTavern.", "sd_drawthings_auth_txt": "¡Ejecute la aplicación DrawThings con el interruptor API HTTP habilitado en la interfaz de usuario! Se debe poder acceder al servidor desde la máquina host de SillyTavern.",
"sd_vlad_url": "Ejemplo: {{vlad_url}}", "sd_vlad_url": "Ejemplo: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "Se debe poder acceder al servidor desde la máquina host de SillyTavern.", "The server must be accessible from the SillyTavern host machine.": "Se debe poder acceder al servidor desde la máquina host de SillyTavern.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Sugerencia: guarde una clave API en la configuración de API de Horde KoboldAI para usarla aquí.", "Hint: Save an API key in AI Horde API settings to use it here.": "Sugerencia: guarde una clave API en la configuración de API de AI Horde para usarla aquí.",
"Allow NSFW images from Horde": "Permitir imágenes NSFW de Horda", "Allow NSFW images from Horde": "Permitir imágenes NSFW de Horda",
"Sanitize prompts (recommended)": "Indicaciones para desinfectar (recomendado)", "Sanitize prompts (recommended)": "Indicaciones para desinfectar (recomendado)",
"Automatically adjust generation parameters to ensure free image generations.": "Ajuste automáticamente los parámetros de generación para garantizar generaciones de imágenes gratuitas.", "Automatically adjust generation parameters to ensure free image generations.": "Ajuste automáticamente los parámetros de generación para garantizar generaciones de imágenes gratuitas.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub Lorebook (enlace directo o ID)", "char_import_2": "Chub Lorebook (enlace directo o ID)",
"char_import_3": "Carácter de JanitorAI (enlace directo o UUID)", "char_import_3": "Carácter de JanitorAI (enlace directo o UUID)",
"char_import_4": "Carácter Pygmalion.chat (enlace directo o UUID)", "char_import_4": "Carácter Pygmalion.chat (enlace directo o UUID)",
"char_import_5": "Carácter AICharacterCard.com (enlace directo o ID)", "char_import_5": "Carácter AICharacterCards.com (enlace directo o ID)",
"char_import_6": "Enlace PNG directo (consulte", "char_import_6": "Enlace PNG directo (consulte",
"char_import_7": "para hosts permitidos)", "char_import_7": "para hosts permitidos)",
"char_import_8": "Personaje RisuRealm (Enlace directo)", "char_import_8": "Personaje RisuRealm (Enlace directo)",
@@ -1439,5 +1439,112 @@
"Still have questions?": "¿Todavía tienes preguntas?", "Still have questions?": "¿Todavía tienes preguntas?",
"Join the SillyTavern Discord": "Únete al Discord de SillyTavern", "Join the SillyTavern Discord": "Únete al Discord de SillyTavern",
"Post a GitHub issue": "Publicar un problema en GitHub", "Post a GitHub issue": "Publicar un problema en GitHub",
"Contact the developers": "Contactar a los desarrolladores" "Contact the developers": "Contactar a los desarrolladores",
"Prome (Visual Novel Extension)": "Prome (Extensión de Modo Waifu/Novela Visual)",
"Brought to you by": "Presentado por",
"and Prometheus.": "y Prometheus.",
"Enable Prome": "Iniciar Prome",
"Toggles Prome, VN Mode and other Prome features.": "Activa Prome, el modo VN y otras funciones de Prome.",
"Features marked with a": "Las funciones marcadas con un",
"require Prome to be enabled.": "requieren que Prome esté iniciado.",
"Sheld Configuration": "Configuración de interfaz (Sheld)",
"Hide Sheld (Message Box)": "Ocultar Sheld (cuadro de mensajes)",
"Hide the message box (sheld) in the ST UI.": "Ocultar el cuadro de mensajes (sheld) en la interfaz de usuario de SillyTavern.",
"Enable Traditional VN Mode": "Modo VN tradicional*",
"Only Show Last Message in Chat (Requires Prome to be enabled).": "Mostrar solo el último mensaje en el chat (Requiere que Prome esté iniciado).",
"Letterbox Configuration*": "Configuración de la franja negra*",
"Letterbox Mode": "Modo de franja negra",
"Select the letterbox mode for the Prome VN UI.": "Seleccione el modo de franja negra para la interfaz de usuario VN de Prome.",
"Horizontal Letterbox": "Franja negra horizontal",
"Vertical Letterbox": "Franja negra vertical",
"Letterbox Color": "Color de la franja negra",
"Select the color of the letterbox.": "Seleccione el color de la franja negra.",
"Letterbox Size": "Tamaño de la franja negra",
"Set the size of the letterbox.": "Establezca el tamaño de la franja negra.",
"Sprite Configuration": "Configuración de sprites",
"Emulate Character Card as Sprite": "[BETA] Emular tarjeta de personaje como sprite",
"Emulates the character card of a character to be a sprite. (Requires Prome to be enabled).": "Emula la tarjeta de personaje de un personaje para que sea un sprite. (Requiere que Prome esté iniciado).",
"Enable Sprite Shake": "[BETA] Sprite Shake",
"Shakes the character sprite when the character is speaking (Only works if Streaming is enabled in Preset Settings).": "Agita el sprite del personaje cuando el personaje está hablando (solo funciona si la transmisión está habilitada en la configuración preestablecida).",
"Enable Focus Mode": "Modo de enfoque",
"Focuses the current speaking character in chat. (Requires Prome to be enabled).": "Enfoca al personaje que está hablando en el chat. (Requiere que Prome esté iniciado).",
"Darken Unfocused Character Sprites": "Oscurecer sprites de personajes",
"Darkens non-speaking (unfocused) characters. (Requires Prome to be enabled).": "Oscurece a los personajes que no hablan (no enfocados). (Requiere que Prome esté iniciado).",
"Auto-Hide Sprites": "Ocultar sprites automáticamente",
"Auto-hides characters from the screen that haven't been in the conversation for a while up to X characters. (Requires Prome to be enabled).": "Oculta automáticamente a los personajes de la pantalla que no han estado en la conversación durante un tiempo hasta X personajes. (Requiere que Prome esté iniciado).",
"Max Visible Sprites": "Máximo de personajes visibles",
"Set the maximum number of visible sprites that appears in the VN screen.": "Establezca el número máximo de sprites visibles que aparecen en la pantalla VN.",
"Sprite Shadow Configuration": "Configuración de sombra de sprites",
"Enable Sprite Shadow": "Sombra de sprite",
"Adds a shadow to the character sprite.": "Agrega una sombra al sprite del personaje.",
"Shadow X Offset": "Desplazamiento X de la sombra",
"Set the X offset of the character shadow.": "Establezca el desplazamiento X de la sombra del personaje.",
"Shadow Y Offset": "Desplazamiento Y de la sombra",
"Set the Y offset of the character shadow.": "Establezca el desplazamiento Y de la sombra del personaje.",
"Shadow Blur": "Desenfoque de sombra",
"Set the blur of the character shadow.": "Establezca el desenfoque de la sombra del personaje.",
"Focus Mode Settings": "Configuración del modo de enfoque",
"Focus Mode Animation": "Animación de modo de enfoque",
"Select the animation for focus mode.": "Seleccione la animación para el modo de enfoque.",
"Focus Mode Animation Speed": "Velocidad de animación del modo de enfoque",
"Set the speed of the focus animation.": "Establezca la velocidad de la animación de enfoque.",
"User Sprite Configuration": "[BETA] Configuración de sprites de usuario",
"Enable User Sprite": "Sprites de usuario",
"Enables the ability to use a user sprite for your persona.": "Habilita la capacidad de usar un sprite de usuario para tu persona.",
"Sprite set": "Conjunto de sprites",
"Type the name of the sprite set to use for your persona. (Place your sprites in the 'characters' folder in SillyTavern).": "Escriba el nombre del conjunto de sprites que desea utilizar para su persona. (Coloque sus sprites en la carpeta 'characters' en SillyTavern).",
"Note: Create a sprite folder in the ": "Nota: Cree una carpeta de sprites en el ",
" folder of your user directory (typically 'data/default-user'). Place your expressions there.": " carpeta de su directorio de usuario (normalmente 'data/default-user'). Coloque sus expresiones allí.",
"Tint Configuration": "Configuración de tono",
"Enable Chat Tint": "Tinte de chat",
"Tints the chat background and/or character sprites.": "Tinta el fondo del chat y/o los sprites de personajes.",
"Share World Tint With Characters": "Compartir tinte mundial con personajes*",
"Applies the world tint to character sprites (Requires Prome to be enabled. This will override your character tint settings).": "Aplica el tinte mundial a los sprites de personajes (Requiere que Prome esté iniciado. Esto anulará la configuración de tinte de su personaje).",
"Tint Presets": "Preajustes de tinte",
"Select the tint preset to use for the Prome VN UI.": "Seleccione el preajuste de tinte que desea utilizar para la interfaz de usuario VN de Prome.",
"World Tint Settings": "Configuración de tinte mundial",
"Tints the world background.": "Tinta el fondo mundial.",
"Enable World Tint": "Tinte mundial",
"Set the strength of the world blur.": "Establezca la fuerza del desenfoque mundial.",
"Brightness": "Brillo",
"Set the brightness of the world.": "Establezca el brillo del mundo.",
"Contrast": "Contraste",
"Set the contrast of the world.": "Establezca el contraste del mundial.",
"Grayscale": "Escala de grises",
"Makes the world black and white.": "Hace que el mundo sea en blanco y negro.",
"Hue": "Matiz",
"Set the hue of the world tint.": "Establezca el matiz del tinte mundial.",
"Invert": "Invertir",
"Inverts the world colors.": "Invierte los colores del mundo.",
"Saturate": "Saturar",
"Saturates the world colors.": "Satura los colores del mundo.",
"Makes the world warmer in color.": "Hace que el mundo sea más cálido en color.",
"Character Tint Settings": "Configuración de tinte de sprites*",
"Enable Character Tint (Requires Prome to be enabled)": "Tinte de sprites (Requiere que Prome esté iniciado)",
"Set the strength of the character blur.": "Establezca la fuerza del desenfoque de personajes.",
"Set the brightness of the character.": "Establezca el brillo de personaje.",
"Set the contrast of the character.": "Establezca el contraste de personajes.",
"Makes the character black and white.": "Hace que el personaje sea en blanco y negro.",
"Set the hue of the character.": "Establezca el matiz del tinte de personajes.",
"Inverts the character colors.": "Invierte los colores del personaje.",
"Saturates the character colors.": "Satura los colores del personaje.",
"Makes the character warmer in color.": "Hace que el personaje sea más cálido en color.",
"Keybinds": "Atajos de teclado",
"Commands": "Comandos",
"Prome Keybinds": "Combinaciones de teclas de Prome",
"Hide/Show SillyTavern's Sheld (Message Box)": "Ocultar/Mostrar el estante de SillyTavern (cuadro de mensaje)",
"Prome Commands": "Comandos de Prome",
"Show/Hide the letterbox (black bars) in the VN UI": "Mostrar/Ocultar la franja negra (barras negras) en la interfaz VN",
"Toggles focus mode on character sprites": "Alterna el modo de enfoque en los sprites de personajes",
"Sets the focus mode animation": "Establece la animación del modo de enfoque",
"Toggles the defocus tint on non-speaking character sprites": "Alterna el tinte de desenfoque en los sprites de personajes que no hablan",
"Toggles the shake animation when a character speaks on character sprites": "Alterna la animación de sacudida cuando un personaje habla en los sprites de personajes",
"Toggles sprite shadows on character sprites": "Alterna las sombras de los sprites de personajes",
"Toggles world/character tint on the VN UI": "Alterna el tinte mundial/de personajes en la interfaz VN",
"Toggles world tint on the VN UI": "Alterna el tinte mundial en la interfaz VN",
"Toggles character tint on the VN UI": "Alterna el tinte de personajes en la interfaz VN",
"Toggles sharing world tint with character sprites (This will override Character Tint)": "Alterna el tinte mundial compartido con los sprites de personajes (esto anulará el tinte de personajes)",
"Sets the expression of the user sprite": "Establece la expresión del sprite de usuario",
"Sets the user sprite set to use for the user sprite": "Establece el conjunto de sprites de usuario para usar en el sprite de usuario",
"Toggles the user sprite on the VN UI": "Alterna el sprite de usuario en la interfaz VN"
} }

File diff suppressed because it is too large Load Diff

View File

@@ -267,7 +267,7 @@
"Text Completion": "Textaútfylling", "Text Completion": "Textaútfylling",
"Chat Completion": "Spjalllokun", "Chat Completion": "Spjalllokun",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "KoboldAI Hópur", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Forðastu að senda viðkvæm gögn til Hórdans.", "Avoid sending sensitive information to the Horde.": "Forðastu að senda viðkvæm gögn til Hórdans.",
"Review the Privacy statement": "Farið yfir Persónuverndarskýrsluna", "Review the Privacy statement": "Farið yfir Persónuverndarskýrsluna",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "aðskilið með kommum án bila milli", "separate with commas w/o space between": "aðskilið með kommum án bila milli",
"Custom Stopping Strings": "Eigin stopp-strengir", "Custom Stopping Strings": "Eigin stopp-strengir",
"JSON serialized array of strings": "JSON raðað fylki af strengjum", "JSON serialized array of strings": "JSON raðað fylki af strengjum",
"Replace Macro in Custom Stopping Strings": "Skiptu út í macro í sérsniðnum stoppa strengjum", "Replace Macro in Stop Strings": "Skiptu út í macro í sérsniðnum stoppa strengjum",
"Auto-Continue": "Sjálfvirk Forná", "Auto-Continue": "Sjálfvirk Forná",
"Allow for Chat Completion APIs": "Leyfa fyrir spjall Loka APIs", "Allow for Chat Completion APIs": "Leyfa fyrir spjall Loka APIs",
"Target length (tokens)": "Markaðarlengd (texti)", "Target length (tokens)": "Markaðarlengd (texti)",
@@ -558,7 +558,7 @@
"Delete a theme": "Eyða þema", "Delete a theme": "Eyða þema",
"Update a theme file": "Uppfæra þemu skrá", "Update a theme file": "Uppfæra þemu skrá",
"Save as a new theme": "Vista sem nýja þemu", "Save as a new theme": "Vista sem nýja þemu",
"Avatar Style": "Avatar Stíll", "Avatar Style:": "Avatar Stíll",
"Circle": "Hring", "Circle": "Hring",
"Square": "Reitur", "Square": "Reitur",
"Rectangle": "Ferhyrningur", "Rectangle": "Ferhyrningur",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Kosstu kvenkortu fyrirspurn", "Prefer Character Card Prompt": "Kosstu kvenkortu fyrirspurn",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Ef merkt er og kortið inniheldur fangabrotsskil, notaðu það í staðinn", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Ef merkt er og kortið inniheldur fangabrotsskil, notaðu það í staðinn",
"Prefer Character Card Jailbreak": "Kosstu kvenkortu fangabrot", "Prefer Character Card Jailbreak": "Kosstu kvenkortu fangabrot",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Forðastu að klippa og breyta stærð innfluttra stafamynda. Þegar slökkt er á því skaltu skera/breyta stærð í 512x768.", "never_resize_avatars_tooltip": "Forðastu að klippa og breyta stærð innfluttra stafamynda. Þegar slökkt er á því skaltu skera/breyta stærð í 512x768.",
"Never resize avatars": "Aldrei breyta stærðinni á merkjum", "Never resize avatars": "Aldrei breyta stærðinni á merkjum",
"Show actual file names on the disk, in the characters list display only": "Sýna raunveruleg nöfn skráa á diskinum, í lista yfir persónur sýna aðeins", "Show actual file names on the disk, in the characters list display only": "Sýna raunveruleg nöfn skráa á diskinum, í lista yfir persónur sýna aðeins",
"Show avatar filenames": "Sýna nöfn merkja", "Show avatar filenames": "Sýna nöfn merkja",
@@ -709,7 +709,7 @@
"Auto-swipe": "Sjálfvirkur sveip", "Auto-swipe": "Sjálfvirkur sveip",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Virkjaðu sjálfvirka sveiflugerð. Stillingar í þessum hluta hafa aðeins áhrif þegar sjálfvirkur sveiflugerð er virk", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Virkjaðu sjálfvirka sveiflugerð. Stillingar í þessum hluta hafa aðeins áhrif þegar sjálfvirkur sveiflugerð er virk",
"Minimum generated message length": "Lágmarks lengd á mynduðum skilaboðum", "Minimum generated message length": "Lágmarks lengd á mynduðum skilaboðum",
"If the generated message is shorter than this, trigger an auto-swipe": "Ef mynduðu skilaboðin eru styttri en þessi, kallaðu fram sjálfvirkar sveiflugerðar", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Ef mynduðu skilaboðin eru styttri en þessi, kallaðu fram sjálfvirkar sveiflugerðar",
"Blacklisted words": "Svört orð", "Blacklisted words": "Svört orð",
"words you dont want generated separated by comma ','": "orð sem þú vilt ekki að framleiða aðskilin með kommu ','", "words you dont want generated separated by comma ','": "orð sem þú vilt ekki að framleiða aðskilin með kommu ','",
"Blacklisted word count to swipe": "Fjöldi svörtra orða til að sveipa", "Blacklisted word count to swipe": "Fjöldi svörtra orða til að sveipa",
@@ -879,7 +879,7 @@
"popup-button-no": "Nei", "popup-button-no": "Nei",
"popup-button-cancel": "Hætta við", "popup-button-cancel": "Hætta við",
"popup-button-import": "Flytja inn", "popup-button-import": "Flytja inn",
"Advanced Defininitions": "Ítarleg skilgreiningar", "Advanced Definitions": "Ítarleg skilgreiningar",
"Prompt Overrides": "Hnekkja hvetjandi", "Prompt Overrides": "Hnekkja hvetjandi",
"(For Chat Completion and Instruct Mode)": "(Til að ljúka spjalli og leiðbeiningarham)", "(For Chat Completion and Instruct Mode)": "(Til að ljúka spjalli og leiðbeiningarham)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Settu inn {{original}} í hvora kassa til að innifela viðkomandi sjálfgefna framkallan frá kerfisstillingum.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Settu inn {{original}} í hvora kassa til að innifela viðkomandi sjálfgefna framkallan frá kerfisstillingum.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "keyrðu DrawThings app með HTTP API rofi virkt í notendaviðmótinu! Miðlarinn verður að vera aðgengilegur frá SillyTavern hýsingarvélinni.", "sd_drawthings_auth_txt": "keyrðu DrawThings app með HTTP API rofi virkt í notendaviðmótinu! Miðlarinn verður að vera aðgengilegur frá SillyTavern hýsingarvélinni.",
"sd_vlad_url": "Dæmi: {{vlad_url}}", "sd_vlad_url": "Dæmi: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "Miðlarinn verður að vera aðgengilegur frá SillyTavern hýsingarvélinni.", "The server must be accessible from the SillyTavern host machine.": "Miðlarinn verður að vera aðgengilegur frá SillyTavern hýsingarvélinni.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Ábending: Vistaðu API lykil í Horde KoboldAI API stillingum til að nota hann hér.", "Hint: Save an API key in AI Horde API settings to use it here.": "Ábending: Vistaðu API lykil í AI Horde API stillingum til að nota hann hér.",
"Allow NSFW images from Horde": "Leyfa NSFW myndir frá Horde", "Allow NSFW images from Horde": "Leyfa NSFW myndir frá Horde",
"Sanitize prompts (recommended)": "Hreinsunarleiðbeiningar (ráðlagt)", "Sanitize prompts (recommended)": "Hreinsunarleiðbeiningar (ráðlagt)",
"Automatically adjust generation parameters to ensure free image generations.": "Stilltu kynslóðarbreytur sjálfkrafa til að tryggja ókeypis myndmyndun.", "Automatically adjust generation parameters to ensure free image generations.": "Stilltu kynslóðarbreytur sjálfkrafa til að tryggja ókeypis myndmyndun.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub Lorebook (beinn hlekkur eða auðkenni)", "char_import_2": "Chub Lorebook (beinn hlekkur eða auðkenni)",
"char_import_3": "JanitorAI karakter (beinn hlekkur eða UUID)", "char_import_3": "JanitorAI karakter (beinn hlekkur eða UUID)",
"char_import_4": "Pygmalion.chat karakter (beinn hlekkur eða UUID)", "char_import_4": "Pygmalion.chat karakter (beinn hlekkur eða UUID)",
"char_import_5": "AICharacterCard.com Karakter (beinn hlekkur eða auðkenni)", "char_import_5": "AICharacterCards.com Karakter (beinn hlekkur eða auðkenni)",
"char_import_6": "Beinn PNG hlekkur (sjá", "char_import_6": "Beinn PNG hlekkur (sjá",
"char_import_7": "fyrir leyfilega gestgjafa)", "char_import_7": "fyrir leyfilega gestgjafa)",
"char_import_8": "RisuRealm karakter (beinn hlekkur)", "char_import_8": "RisuRealm karakter (beinn hlekkur)",

View File

@@ -267,7 +267,7 @@
"Text Completion": "Completamento del testo", "Text Completion": "Completamento del testo",
"Chat Completion": "Completamento della chat", "Chat Completion": "Completamento della chat",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "Orda di KoboldAI", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Evita di inviare informazioni sensibili all'Orda.", "Avoid sending sensitive information to the Horde.": "Evita di inviare informazioni sensibili all'Orda.",
"Review the Privacy statement": "Revisione della dichiarazione sulla privacy", "Review the Privacy statement": "Revisione della dichiarazione sulla privacy",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "separati con virgole senza spazio tra loro", "separate with commas w/o space between": "separati con virgole senza spazio tra loro",
"Custom Stopping Strings": "Stringhe di Stop Personalizzate", "Custom Stopping Strings": "Stringhe di Stop Personalizzate",
"JSON serialized array of strings": "Matrice serializzata JSON di stringhe", "JSON serialized array of strings": "Matrice serializzata JSON di stringhe",
"Replace Macro in Custom Stopping Strings": "Sostituisci Macro in Stringhe di Arresto Personalizzate", "Replace Macro in Stop Strings": "Sostituisci Macro in Stringhe di Arresto Personalizzate",
"Auto-Continue": "Auto-continua", "Auto-Continue": "Auto-continua",
"Allow for Chat Completion APIs": "Consenti per API di completamento chat", "Allow for Chat Completion APIs": "Consenti per API di completamento chat",
"Target length (tokens)": "Lunghezza obiettivo (token)", "Target length (tokens)": "Lunghezza obiettivo (token)",
@@ -558,7 +558,7 @@
"Delete a theme": "Elimina un tema", "Delete a theme": "Elimina un tema",
"Update a theme file": "Aggiorna un file di tema", "Update a theme file": "Aggiorna un file di tema",
"Save as a new theme": "Salva come nuovo tema", "Save as a new theme": "Salva come nuovo tema",
"Avatar Style": "Stile avatar", "Avatar Style:": "Stile avatar",
"Circle": "Cerchio", "Circle": "Cerchio",
"Square": "Quadrato", "Square": "Quadrato",
"Rectangle": "Rettangolo", "Rectangle": "Rettangolo",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Preferisci Prompt della Scheda Personaggio", "Prefer Character Card Prompt": "Preferisci Prompt della Scheda Personaggio",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Se selezionato e la scheda del personaggio contiene una sovrascrittura jailbreak (Istruzione Storico Post), usalo invece", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Se selezionato e la scheda del personaggio contiene una sovrascrittura jailbreak (Istruzione Storico Post), usalo invece",
"Prefer Character Card Jailbreak": "Preferisci Jailbreak della Scheda Personaggio", "Prefer Character Card Jailbreak": "Preferisci Jailbreak della Scheda Personaggio",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Evita di ritagliare e ridimensionare le immagini dei personaggi importati. Quando è disattivato, ritaglia/ridimensiona a 512x768.", "never_resize_avatars_tooltip": "Evita di ritagliare e ridimensionare le immagini dei personaggi importati. Quando è disattivato, ritaglia/ridimensiona a 512x768.",
"Never resize avatars": "Non ridimensionare mai gli avatar", "Never resize avatars": "Non ridimensionare mai gli avatar",
"Show actual file names on the disk, in the characters list display only": "Mostra i nomi file effettivi sul disco, solo nella visualizzazione dell'elenco dei personaggi", "Show actual file names on the disk, in the characters list display only": "Mostra i nomi file effettivi sul disco, solo nella visualizzazione dell'elenco dei personaggi",
"Show avatar filenames": "Mostra nomi file avatar", "Show avatar filenames": "Mostra nomi file avatar",
@@ -709,7 +709,7 @@
"Auto-swipe": "Auto-swipe", "Auto-swipe": "Auto-swipe",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Abilita la funzione di auto-swipe. Le impostazioni in questa sezione hanno effetto solo quando l'auto-swipe è abilitato", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Abilita la funzione di auto-swipe. Le impostazioni in questa sezione hanno effetto solo quando l'auto-swipe è abilitato",
"Minimum generated message length": "Lunghezza minima del messaggio generato", "Minimum generated message length": "Lunghezza minima del messaggio generato",
"If the generated message is shorter than this, trigger an auto-swipe": "Se il messaggio generato è più breve di questo, attiva un'automatica rimozione", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Se il messaggio generato è più breve di questo, attiva un'automatica rimozione",
"Blacklisted words": "Parole in blacklist", "Blacklisted words": "Parole in blacklist",
"words you dont want generated separated by comma ','": "parole che non vuoi generate separate da virgola ','", "words you dont want generated separated by comma ','": "parole che non vuoi generate separate da virgola ','",
"Blacklisted word count to swipe": "Numero di parole in blacklist per attivare un'automatica rimozione", "Blacklisted word count to swipe": "Numero di parole in blacklist per attivare un'automatica rimozione",
@@ -879,7 +879,7 @@
"popup-button-no": "NO", "popup-button-no": "NO",
"popup-button-cancel": "Annulla", "popup-button-cancel": "Annulla",
"popup-button-import": "Importare", "popup-button-import": "Importare",
"Advanced Defininitions": "Definizioni avanzate", "Advanced Definitions": "Definizioni avanzate",
"Prompt Overrides": "Sostituzioni richieste", "Prompt Overrides": "Sostituzioni richieste",
"(For Chat Completion and Instruct Mode)": "(Per il completamento della chat e la modalità istruzione)", "(For Chat Completion and Instruct Mode)": "(Per il completamento della chat e la modalità istruzione)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Inserisci {{originale}} in uno dei due riquadri per includere il prompt predefinito corrispondente dalle impostazioni di sistema.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Inserisci {{originale}} in uno dei due riquadri per includere il prompt predefinito corrispondente dalle impostazioni di sistema.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "esegui l'app DrawThings con lo switch API HTTP abilitato nell'interfaccia utente! Il server deve essere accessibile dalla macchina host SillyTavern.", "sd_drawthings_auth_txt": "esegui l'app DrawThings con lo switch API HTTP abilitato nell'interfaccia utente! Il server deve essere accessibile dalla macchina host SillyTavern.",
"sd_vlad_url": "Esempio: {{vlad_url}}", "sd_vlad_url": "Esempio: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "Il server deve essere accessibile dalla macchina host SillyTavern.", "The server must be accessible from the SillyTavern host machine.": "Il server deve essere accessibile dalla macchina host SillyTavern.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Suggerimento: salva una chiave API nelle impostazioni API Horde KoboldAI per usarla qui.", "Hint: Save an API key in AI Horde API settings to use it here.": "Suggerimento: salva una chiave API nelle impostazioni API AI Horde per usarla qui.",
"Allow NSFW images from Horde": "Consenti immagini NSFW da Horde", "Allow NSFW images from Horde": "Consenti immagini NSFW da Horde",
"Sanitize prompts (recommended)": "Messaggi di disinfezione (consigliato)", "Sanitize prompts (recommended)": "Messaggi di disinfezione (consigliato)",
"Automatically adjust generation parameters to ensure free image generations.": "Regola automaticamente i parametri di generazione per garantire generazioni di immagini gratuite.", "Automatically adjust generation parameters to ensure free image generations.": "Regola automaticamente i parametri di generazione per garantire generazioni di immagini gratuite.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Lorebook di Chub (collegamento diretto o ID)", "char_import_2": "Lorebook di Chub (collegamento diretto o ID)",
"char_import_3": "Carattere JanitorAI (collegamento diretto o UUID)", "char_import_3": "Carattere JanitorAI (collegamento diretto o UUID)",
"char_import_4": "Carattere Pygmalion.chat (collegamento diretto o UUID)", "char_import_4": "Carattere Pygmalion.chat (collegamento diretto o UUID)",
"char_import_5": "Carattere AICharacterCard.com (Link diretto o ID)", "char_import_5": "Carattere AICharacterCards.com (Link diretto o ID)",
"char_import_6": "Collegamento PNG diretto (fare riferimento a", "char_import_6": "Collegamento PNG diretto (fare riferimento a",
"char_import_7": "per gli host consentiti)", "char_import_7": "per gli host consentiti)",
"char_import_8": "Personaggio RisuRealm (collegamento diretto)", "char_import_8": "Personaggio RisuRealm (collegamento diretto)",

View File

@@ -267,7 +267,7 @@
"Text Completion": "テキスト補完", "Text Completion": "テキスト補完",
"Chat Completion": "チャット完了", "Chat Completion": "チャット完了",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "KoboldAI Horde", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Hordeに機密情報を送信しないでください。", "Avoid sending sensitive information to the Horde.": "Hordeに機密情報を送信しないでください。",
"Review the Privacy statement": "プライバシー声明を確認する", "Review the Privacy statement": "プライバシー声明を確認する",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "間にスペースのないカンマで区切ります", "separate with commas w/o space between": "間にスペースのないカンマで区切ります",
"Custom Stopping Strings": "カスタム停止文字列", "Custom Stopping Strings": "カスタム停止文字列",
"JSON serialized array of strings": "文字列のJSONシリアル化配列", "JSON serialized array of strings": "文字列のJSONシリアル化配列",
"Replace Macro in Custom Stopping Strings": "カスタム停止文字列内のマクロを置換する", "Replace Macro in Stop Strings": "カスタム停止文字列内のマクロを置換する",
"Auto-Continue": "自動継続", "Auto-Continue": "自動継続",
"Allow for Chat Completion APIs": "チャット補完APIを許可", "Allow for Chat Completion APIs": "チャット補完APIを許可",
"Target length (tokens)": "ターゲット長さ(トークン)", "Target length (tokens)": "ターゲット長さ(トークン)",
@@ -558,7 +558,7 @@
"Delete a theme": "テーマを削除する", "Delete a theme": "テーマを削除する",
"Update a theme file": "テーマファイルを更新", "Update a theme file": "テーマファイルを更新",
"Save as a new theme": "新しいテーマとして保存", "Save as a new theme": "新しいテーマとして保存",
"Avatar Style": "アバタースタイル", "Avatar Style:": "アバタースタイル",
"Circle": "円", "Circle": "円",
"Square": "正方形", "Square": "正方形",
"Rectangle": "長方形", "Rectangle": "長方形",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "キャラクターカードのプロンプトを優先", "Prefer Character Card Prompt": "キャラクターカードのプロンプトを優先",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "チェックされていてキャラクターカードにジェイルブレイクオーバーライド(投稿履歴指示)が含まれている場合、それを代わりに使用します", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "チェックされていてキャラクターカードにジェイルブレイクオーバーライド(投稿履歴指示)が含まれている場合、それを代わりに使用します",
"Prefer Character Card Jailbreak": "キャラクターカードのJailbreakを優先", "Prefer Character Card Jailbreak": "キャラクターカードのJailbreakを優先",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "インポートした文字画像の切り取りやサイズ変更を避けます。オフにすると、512x768 に切り取り/サイズ変更されます。", "never_resize_avatars_tooltip": "インポートした文字画像の切り取りやサイズ変更を避けます。オフにすると、512x768 に切り取り/サイズ変更されます。",
"Never resize avatars": "アバターを常にリサイズしない", "Never resize avatars": "アバターを常にリサイズしない",
"Show actual file names on the disk, in the characters list display only": "ディスク上の実際のファイル名を表示します。キャラクターリストの表示にのみ", "Show actual file names on the disk, in the characters list display only": "ディスク上の実際のファイル名を表示します。キャラクターリストの表示にのみ",
"Show avatar filenames": "アバターのファイル名を表示", "Show avatar filenames": "アバターのファイル名を表示",
@@ -709,7 +709,7 @@
"Auto-swipe": "オートスワイプ", "Auto-swipe": "オートスワイプ",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "自動スワイプ機能を有効にします。このセクションの設定は、自動スワイプが有効になっている場合にのみ効果があります", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "自動スワイプ機能を有効にします。このセクションの設定は、自動スワイプが有効になっている場合にのみ効果があります",
"Minimum generated message length": "生成されたメッセージの最小長", "Minimum generated message length": "生成されたメッセージの最小長",
"If the generated message is shorter than this, trigger an auto-swipe": "生成されたメッセージがこれよりも短い場合、自動スワイプをトリガーします", "If the generated message is shorter than these many characters, trigger an auto-swipe": "生成されたメッセージがこれよりも短い場合、自動スワイプをトリガーします",
"Blacklisted words": "ブラックリストされた単語", "Blacklisted words": "ブラックリストされた単語",
"words you dont want generated separated by comma ','": "コンマ ',' で区切られた生成したくない単語", "words you dont want generated separated by comma ','": "コンマ ',' で区切られた生成したくない単語",
"Blacklisted word count to swipe": "スワイプするブラックリストされた単語の数", "Blacklisted word count to swipe": "スワイプするブラックリストされた単語の数",
@@ -879,7 +879,7 @@
"popup-button-no": "いいえ", "popup-button-no": "いいえ",
"popup-button-cancel": "キャンセル", "popup-button-cancel": "キャンセル",
"popup-button-import": "インポート", "popup-button-import": "インポート",
"Advanced Defininitions": "高度な定義", "Advanced Definitions": "高度な定義",
"Prompt Overrides": "プロンプトのオーバーライド", "Prompt Overrides": "プロンプトのオーバーライド",
"(For Chat Completion and Instruct Mode)": "(チャット補完と指示モード用)", "(For Chat Completion and Instruct Mode)": "(チャット補完と指示モード用)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "システム設定からの対応するデフォルトのプロンプトを含めるには、どちらかのボックスに{{original}}を挿入します。", "Insert {{original}} into either box to include the respective default prompt from system settings.": "システム設定からの対応するデフォルトのプロンプトを含めるには、どちらかのボックスに{{original}}を挿入します。",
@@ -1274,6 +1274,8 @@
"sd_Raw_Last_Message": "生の最後のメッセージ", "sd_Raw_Last_Message": "生の最後のメッセージ",
"sd_Background": "背景", "sd_Background": "背景",
"Image Generation": "画像生成", "Image Generation": "画像生成",
"Stop Image Generation": "画像生成を停止",
"Generate Caption": "画像説明を生成",
"sd_refine_mode": "プロンプトを生成 API に送信する前に手動で編集できるようにする", "sd_refine_mode": "プロンプトを生成 API に送信する前に手動で編集できるようにする",
"sd_refine_mode_txt": "生成前にプロンプ​​トを編集する", "sd_refine_mode_txt": "生成前にプロンプ​​トを編集する",
"sd_interactive_mode": "「猫の写真を送ってください」のようなメッセージを送信するときに、画像を自動的に生成します。", "sd_interactive_mode": "「猫の写真を送ってください」のようなメッセージを送信するときに、画像を自動的に生成します。",
@@ -1295,7 +1297,7 @@
"sd_drawthings_auth_txt": "UI で HTTP API スイッチを有効にして DrawThings アプリを実行します。サーバーは SillyTavern ホスト マシンからアクセスできる必要があります。", "sd_drawthings_auth_txt": "UI で HTTP API スイッチを有効にして DrawThings アプリを実行します。サーバーは SillyTavern ホスト マシンからアクセスできる必要があります。",
"sd_vlad_url": "例: {{vlad_url}}", "sd_vlad_url": "例: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "サーバーは SillyTavern ホスト マシンからアクセスできる必要があります。", "The server must be accessible from the SillyTavern host machine.": "サーバーは SillyTavern ホスト マシンからアクセスできる必要があります。",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "ヒント: ここで使用するには、Horde KoboldAI API 設定に API キーを保存してください。", "Hint: Save an API key in AI Horde API settings to use it here.": "ヒント: ここで使用するには、AI Horde API 設定に API キーを保存してください。",
"Allow NSFW images from Horde": "HordeからのNSFW画像を許可する", "Allow NSFW images from Horde": "HordeからのNSFW画像を許可する",
"Sanitize prompts (recommended)": "サニタイズプロンプト(推奨)", "Sanitize prompts (recommended)": "サニタイズプロンプト(推奨)",
"Automatically adjust generation parameters to ensure free image generations.": "生成パラメータを自動的に調整して、自由な画像生成を保証します。", "Automatically adjust generation parameters to ensure free image generations.": "生成パラメータを自動的に調整して、自由な画像生成を保証します。",
@@ -1376,7 +1378,7 @@
"char_import_2": "Chub ロアブック (直接リンクまたは ID)", "char_import_2": "Chub ロアブック (直接リンクまたは ID)",
"char_import_3": "JanitorAI キャラクター (直接リンクまたは UUID)", "char_import_3": "JanitorAI キャラクター (直接リンクまたは UUID)",
"char_import_4": "Pygmalion.chat キャラクター (直接リンクまたは UUID)", "char_import_4": "Pygmalion.chat キャラクター (直接リンクまたは UUID)",
"char_import_5": "AICharacterCard.com キャラクター (直接リンクまたは ID)", "char_import_5": "AICharacterCards.com キャラクター (直接リンクまたは ID)",
"char_import_6": "直接PNGリンク参照", "char_import_6": "直接PNGリンク参照",
"char_import_7": "許可されたホストの場合)", "char_import_7": "許可されたホストの場合)",
"char_import_8": "RisuRealm キャラクター (直接リンク)", "char_import_8": "RisuRealm キャラクター (直接リンク)",
@@ -1439,5 +1441,8 @@
"Still have questions?": "まだ質問がありますか?", "Still have questions?": "まだ質問がありますか?",
"Join the SillyTavern Discord": "SillyTavernのDiscordに参加", "Join the SillyTavern Discord": "SillyTavernのDiscordに参加",
"Post a GitHub issue": "GitHubの問題を投稿", "Post a GitHub issue": "GitHubの問題を投稿",
"Contact the developers": "開発者に連絡" "Contact the developers": "開発者に連絡",
"Stop Inspecting": "検査を停止",
"Inspect Prompts": "プロンプトを検査",
"Toggle prompt inspection": "プロンプト検査の切り替え"
} }

View File

@@ -211,7 +211,7 @@
"Sampler Priority": "샘플러 우선 순위", "Sampler Priority": "샘플러 우선 순위",
"Ooba only. Determines the order of samplers.": "Ooba 전용. 샘플러의 순서를 결정합니다.", "Ooba only. Determines the order of samplers.": "Ooba 전용. 샘플러의 순서를 결정합니다.",
"Character Names Behavior": "캐릭터 이름 동작", "Character Names Behavior": "캐릭터 이름 동작",
"[title]character_names_none": "캐릭터 이름 접두사를 추가하지 않습니다. 그룹 채팅에서는 좋지 않을 수 있으므로, 이 설정을 선택할 때는 주의해야 합니다.", "character_names_none": "캐릭터 이름 접두사를 추가하지 않습니다. 그룹 채팅에서는 좋지 않을 수 있으므로, 이 설정을 선택할 때는 주의해야 합니다.",
"Helps the model to associate messages with characters.": "모델이 메시지를 캐릭터와 연관시키는 데 도움이 됩니다.", "Helps the model to associate messages with characters.": "모델이 메시지를 캐릭터와 연관시키는 데 도움이 됩니다.",
"None": "없음", "None": "없음",
"None (not injected)": "없음 (삽입되지 않음)", "None (not injected)": "없음 (삽입되지 않음)",
@@ -269,7 +269,7 @@
"Text Completion": "Text Completion", "Text Completion": "Text Completion",
"Chat Completion": "Chat Completion", "Chat Completion": "Chat Completion",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "KoboldAI Horde", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "민감한 정보를 Horde에 보내지 않도록 합니다.", "Avoid sending sensitive information to the Horde.": "민감한 정보를 Horde에 보내지 않도록 합니다.",
"Review the Privacy statement": "개인 정보 보호 정책 검토", "Review the Privacy statement": "개인 정보 보호 정책 검토",
@@ -404,7 +404,7 @@
"Custom API Key": "커스텀 API 키", "Custom API Key": "커스텀 API 키",
"Available Models": "사용 가능한 모델", "Available Models": "사용 가능한 모델",
"Prompt Post-Processing": "신속한 후처리", "Prompt Post-Processing": "신속한 후처리",
"[title]API Connections;[no_connection_text]api_no_connection": "연결이 되지 않았습니다...", "api_no_connection": "연결이 되지 않았습니다...",
"Applies additional processing to the prompt before sending it to the API.": "API로 보내기 전에 프롬프트에 추가 처리를 적용합니다.", "Applies additional processing to the prompt before sending it to the API.": "API로 보내기 전에 프롬프트에 추가 처리를 적용합니다.",
"Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "짧은 테스트 메시지를 보내어 API 연결을 확인합니다. 이에 대해 유료 크레딧이 지불될 수 있음을 인식하세요!", "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "짧은 테스트 메시지를 보내어 API 연결을 확인합니다. 이에 대해 유료 크레딧이 지불될 수 있음을 인식하세요!",
"Test Message": "테스트 메시지", "Test Message": "테스트 메시지",
@@ -492,7 +492,7 @@
"separate with commas w/o space between": "쉼표로 구분 (공백 없이)", "separate with commas w/o space between": "쉼표로 구분 (공백 없이)",
"Custom Stopping Strings": "사용자 정의 중지 문자열", "Custom Stopping Strings": "사용자 정의 중지 문자열",
"JSON serialized array of strings": "문자열의 JSON 직렬화된 배열", "JSON serialized array of strings": "문자열의 JSON 직렬화된 배열",
"Replace Macro in Custom Stopping Strings": "사용자 정의 중단 문자열에서 매크로 교체", "Replace Macro in Stop Strings": "사용자 정의 중단 문자열에서 매크로 교체",
"Auto-Continue": "자동 계속하기", "Auto-Continue": "자동 계속하기",
"Allow for Chat Completion APIs": "채팅 완성 API 허용", "Allow for Chat Completion APIs": "채팅 완성 API 허용",
"Target length (tokens)": "대상 길이 (토큰)", "Target length (tokens)": "대상 길이 (토큰)",
@@ -568,7 +568,7 @@
"Delete a theme": "테마 삭제", "Delete a theme": "테마 삭제",
"Update a theme file": "테마 파일 업데이트", "Update a theme file": "테마 파일 업데이트",
"Save as a new theme": "새 테마로 저장", "Save as a new theme": "새 테마로 저장",
"Avatar Style": "캐릭터 프로필 스타일", "Avatar Style:": "캐릭터 프로필 스타일",
"Circle": "원", "Circle": "원",
"Square": "정사각형", "Square": "정사각형",
"Rectangle": "사각형", "Rectangle": "사각형",
@@ -625,7 +625,7 @@
"Single-row message input area. Mobile only, no effect on PC": "한 줄짜리 메시지 입력 영역. 모바일 전용, PC에는 영향 없음", "Single-row message input area. Mobile only, no effect on PC": "한 줄짜리 메시지 입력 영역. 모바일 전용, PC에는 영향 없음",
"Compact Input Area (Mobile)": "조그마한 입력 영역 (모바일)", "Compact Input Area (Mobile)": "조그마한 입력 영역 (모바일)",
"Swipe # for All Messages": "모든 스와이프 메시지에 대해 번호 매기기", "Swipe # for All Messages": "모든 스와이프 메시지에 대해 번호 매기기",
"[title]Display swipe numbers for all messages, not just the last.": "마지막 메시지만이 아니라 모든 메시지에 대한 스와이프 번호를 표시합니다.", "Display swipe numbers for all messages, not just the last.": "마지막 메시지만이 아니라 모든 메시지에 대한 스와이프 번호를 표시합니다.",
"In the Character Management panel, show quick selection buttons for favorited characters": "캐릭터 관리 패널에서 즐겨찾는 캐릭터에 대한 빠른 선택 버튼을 표시합니다", "In the Character Management panel, show quick selection buttons for favorited characters": "캐릭터 관리 패널에서 즐겨찾는 캐릭터에 대한 빠른 선택 버튼을 표시합니다",
"Characters Hotswap": "캐릭터 핫스왑", "Characters Hotswap": "캐릭터 핫스왑",
"Enable magnification for zoomed avatar display.": "마우스 포인터를 아바타 위에 올려두면 아바타가 확대 됩니다.", "Enable magnification for zoomed avatar display.": "마우스 포인터를 아바타 위에 올려두면 아바타가 확대 됩니다.",
@@ -646,7 +646,7 @@
"Prefer Character Card Prompt": "캐릭터 카드 프롬프트 선호", "Prefer Character Card Prompt": "캐릭터 카드 프롬프트 선호",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "선택되어 있고 캐릭터 카드에 (Post-History 지시)탈옥 재정의가 포함 된 경우, 그것을 대신 사용합니다.", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "선택되어 있고 캐릭터 카드에 (Post-History 지시)탈옥 재정의가 포함 된 경우, 그것을 대신 사용합니다.",
"Prefer Character Card Jailbreak": "캐릭터 카드 탈옥 선호", "Prefer Character Card Jailbreak": "캐릭터 카드 탈옥 선호",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "가져온 캐릭터 이미지를 자르거나 크기를 조정하지 마세요. 꺼져 있으면 512x768로 자르거나 크기를 조정합니다.", "never_resize_avatars_tooltip": "가져온 캐릭터 이미지를 자르거나 크기를 조정하지 마세요. 꺼져 있으면 512x768로 자르거나 크기를 조정합니다.",
"Never resize avatars": "아바타 크기 변경하지 않음", "Never resize avatars": "아바타 크기 변경하지 않음",
"Show actual file names on the disk, in the characters list display only": "실제 파일 이름을 디스크에 표시하며 캐릭터 목록 디스플레이에만", "Show actual file names on the disk, in the characters list display only": "실제 파일 이름을 디스크에 표시하며 캐릭터 목록 디스플레이에만",
"Show avatar filenames": "아바타 파일 이름 표시", "Show avatar filenames": "아바타 파일 이름 표시",
@@ -724,7 +724,7 @@
"Auto-swipe": "자동 스와이프", "Auto-swipe": "자동 스와이프",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "자동 스와이프 기능을 활성화합니다. 이 섹션의 설정은 자동 스와이프가 활성화되었을 때만 영향을 미칩니다", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "자동 스와이프 기능을 활성화합니다. 이 섹션의 설정은 자동 스와이프가 활성화되었을 때만 영향을 미칩니다",
"Minimum generated message length": "생성된 메시지 최소 길이", "Minimum generated message length": "생성된 메시지 최소 길이",
"If the generated message is shorter than this, trigger an auto-swipe": "생성된 메시지가이보다 짧으면 자동 스와이프를 트리거합니다", "If the generated message is shorter than these many characters, trigger an auto-swipe": "생성된 메시지가이보다 짧으면 자동 스와이프를 트리거합니다",
"Blacklisted words": "금지어", "Blacklisted words": "금지어",
"words you dont want generated separated by comma ','": "쉼표로 구분된 생성하지 않으려는 단어", "words you dont want generated separated by comma ','": "쉼표로 구분된 생성하지 않으려는 단어",
"Blacklisted word count to swipe": "스와이프할 금지어 개수", "Blacklisted word count to swipe": "스와이프할 금지어 개수",
@@ -895,7 +895,7 @@
"popup-button-no": "아니요", "popup-button-no": "아니요",
"popup-button-cancel": "취소", "popup-button-cancel": "취소",
"popup-button-import": "불러오기", "popup-button-import": "불러오기",
"Advanced Defininitions": "고급 정의", "Advanced Definitions": "고급 정의",
"Prompt Overrides": "프롬프트 무시", "Prompt Overrides": "프롬프트 무시",
"(For Chat Completion and Instruct Mode)": "(채팅 완료 및 지시 모드의 경우)", "(For Chat Completion and Instruct Mode)": "(채팅 완료 및 지시 모드의 경우)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "{{original}}를 해당 상자에 넣어 시스템 설정의 기본 프롬프트를 포함합니다.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "{{original}}를 해당 상자에 넣어 시스템 설정의 기본 프롬프트를 포함합니다.",
@@ -1312,7 +1312,7 @@
"sd_drawthings_auth_txt": "UI에서 HTTP API 스위치가 활성화된 상태에서 DrawThings 앱을 실행하세요! SillyTavern 호스트 시스템에서 서버에 액세스할 수 있어야 합니다.", "sd_drawthings_auth_txt": "UI에서 HTTP API 스위치가 활성화된 상태에서 DrawThings 앱을 실행하세요! SillyTavern 호스트 시스템에서 서버에 액세스할 수 있어야 합니다.",
"sd_vlad_url": "예: {{vlad_url}}", "sd_vlad_url": "예: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "SillyTavern 호스트 시스템에서 서버에 액세스할 수 있어야 합니다.", "The server must be accessible from the SillyTavern host machine.": "SillyTavern 호스트 시스템에서 서버에 액세스할 수 있어야 합니다.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "힌트: 여기에서 사용하려면 Horde KoboldAI API 설정에 API 키를 저장하세요.", "Hint: Save an API key in AI Horde API settings to use it here.": "힌트: 여기에서 사용하려면 AI Horde API 설정에 API 키를 저장하세요.",
"Allow NSFW images from Horde": "Horde의 NSFW 이미지 허용", "Allow NSFW images from Horde": "Horde의 NSFW 이미지 허용",
"Sanitize prompts (recommended)": "프롬프트 삭제(권장)", "Sanitize prompts (recommended)": "프롬프트 삭제(권장)",
"Automatically adjust generation parameters to ensure free image generations.": "무료 이미지 생성을 보장하기 위해 생성 매개변수를 자동으로 조정합니다.", "Automatically adjust generation parameters to ensure free image generations.": "무료 이미지 생성을 보장하기 위해 생성 매개변수를 자동으로 조정합니다.",
@@ -1395,7 +1395,7 @@
"char_import_2": "Chub Lorebook(직접 링크 또는 ID)", "char_import_2": "Chub Lorebook(직접 링크 또는 ID)",
"char_import_3": "JanitorAI 캐릭터(직접 링크 또는 UUID)", "char_import_3": "JanitorAI 캐릭터(직접 링크 또는 UUID)",
"char_import_4": "Pygmalion.chat 문자(직접 링크 또는 UUID)", "char_import_4": "Pygmalion.chat 문자(직접 링크 또는 UUID)",
"char_import_5": "AICharacterCard.com 캐릭터(직접 링크 또는 ID)", "char_import_5": "AICharacterCards.com 캐릭터(직접 링크 또는 ID)",
"char_import_6": "직접 PNG 링크(참조", "char_import_6": "직접 PNG 링크(참조",
"char_import_7": "허용된 호스트의 경우)", "char_import_7": "허용된 호스트의 경우)",
"char_import_8": "RisuRealm 캐릭터 (직접링크)", "char_import_8": "RisuRealm 캐릭터 (직접링크)",
@@ -1467,7 +1467,6 @@
"menu within": "내의 메뉴", "menu within": "내의 메뉴",
"Translate text to English before classification": "분류 전에 텍스트를 영어로 번역합니다.", "Translate text to English before classification": "분류 전에 텍스트를 영어로 번역합니다.",
"Show default images (emojis) if sprite missing": "해당하는 스프라이트가 없으면 기본 이미지 (이모지들)을 표시합니다.", "Show default images (emojis) if sprite missing": "해당하는 스프라이트가 없으면 기본 이미지 (이모지들)을 표시합니다.",
"Image Type - talkinghead (extras)": "이미지 유형 - 토킹 헤드 (부가 사항)",
"Classifier API": "분류를 위한 API", "Classifier API": "분류를 위한 API",
"Select the API for classifying expressions.": "감정 이미지들을 분류할 API를 선택하세요.", "Select the API for classifying expressions.": "감정 이미지들을 분류할 API를 선택하세요.",
"Local": "로컬", "Local": "로컬",
@@ -1538,7 +1537,7 @@
"Only apply color as accent": "색상은 오직 강조로써만 적용됩니다", "Only apply color as accent": "색상은 오직 강조로써만 적용됩니다",
"qr--colorClear": "색상 지우기", "qr--colorClear": "색상 지우기",
"Color": "색상", "Color": "색상",
"[title]world_button_title": "캐릭터 로어. 클릭하여 로드하세요. Shift를 클릭하면 '월드 인포 링크' 팝업이 열립니다.", "world_button_title": "캐릭터 로어. 클릭하여 로드하세요. Shift를 클릭하면 '월드 인포 링크' 팝업이 열립니다.",
"Select TTS Provider": "TTS 공급자 선택", "Select TTS Provider": "TTS 공급자 선택",
"tts_enabled": "활성화", "tts_enabled": "활성화",
"Narrate user messages": "사용자 메시지 나레이션", "Narrate user messages": "사용자 메시지 나레이션",
@@ -1583,15 +1582,15 @@
"Prompt Content": "프롬프트 내용", "Prompt Content": "프롬프트 내용",
"Instruct Sequences": "지시 시퀀스", "Instruct Sequences": "지시 시퀀스",
"Prefer Character Card Instructions": "캐릭터 카드의 지시사항을 선호", "Prefer Character Card Instructions": "캐릭터 카드의 지시사항을 선호",
"[title]If checked and the character card contains a Post-History Instructions override, use that instead": "활성화 된 경우, 캐릭터 카드에 Post-History 지시 무시 항목이 포함되어 있으면, 카드 지시사항의 내용으로 대신 사용합니다.", "If checked and the character card contains a Post-History Instructions override, use that instead": "활성화 된 경우, 캐릭터 카드에 Post-History 지시 무시 항목이 포함되어 있으면, 카드 지시사항의 내용으로 대신 사용합니다.",
"Auto-select Input Text": "입력 텍스트 자동 선택", "Auto-select Input Text": "입력 텍스트 자동 선택",
"[title]Enable auto-select of input text in some text fields when clicking/selecting them. Applies to popup input textboxes, and possible other custom input fields.": "일부 텍스트 필드를 클릭하거나 선택할 때 자동으로 입력된 텍스트가 선택되도록 설정합니다. 팝업 입력창과 기타 커스텀 입력 필드에 적용됩니다.", "Enable auto-select of input text in some text fields when clicking/selecting them. Applies to popup input textboxes, and possible other custom input fields.": "일부 텍스트 필드를 클릭하거나 선택할 때 자동으로 입력된 텍스트가 선택되도록 설정합니다. 팝업 입력창과 기타 커스텀 입력 필드에 적용됩니다.",
"Markdown Hotkeys": "마크다운 입력 단축키", "Markdown Hotkeys": "마크다운 입력 단축키",
"[title]markdown_hotkeys_desc": "특정 텍스트 입력창에서 마크다운 형식 문자를 입력하기 위한 단축키를 활성화합니다. '/help hotkeys'를 참고하세요.", "markdown_hotkeys_desc": "특정 텍스트 입력창에서 마크다운 형식 문자를 입력하기 위한 단축키를 활성화합니다. '/help hotkeys'를 참고하세요.",
"Show group chat queue": "그룹 채팅 대기열 표시", "Show group chat queue": "그룹 채팅 대기열 표시",
"[title]In group chat, highlight the character(s) that are currently queued to generate responses and the order in which they will respond.": "그룹 채팅에서 응답을 생성하기 위해 현재 대기 중인 캐릭터와 응답할 순서를 강조 표시합니다.", "In group chat, highlight the character(s) that are currently queued to generate responses and the order in which they will respond.": "그룹 채팅에서 응답을 생성하기 위해 현재 대기 중인 캐릭터와 응답할 순서를 강조 표시합니다.",
"Quick 'Impersonate' button": "빠른 '사칭' 버튼", "Quick 'Impersonate' button": "빠른 '사칭' 버튼",
"[title]Show a button in the input area to ask the AI to impersonate your character for a single message": "입력 영역에 AI에게 한 메시지 동안 당신의 캐릭터 연기를 사칭하도록 요청하는 버튼을 표시합니다.", "Show a button in the input area to ask the AI to impersonate your character for a single message": "입력 영역에 AI에게 한 메시지 동안 당신의 캐릭터 연기를 사칭하도록 요청하는 버튼을 표시합니다.",
"Injection Template": "삽입 템플릿", "Injection Template": "삽입 템플릿",
"Query messages": "쿼리 메시지 수", "Query messages": "쿼리 메시지 수",
"Score threshold": "점수 임계값", "Score threshold": "점수 임계값",
@@ -1614,7 +1613,7 @@
"Ask": "묻기", "Ask": "묻기",
"tag_import_none": "불러오지 않음", "tag_import_none": "불러오지 않음",
"tag_import_all": "전부", "tag_import_all": "전부",
"Existing": "기존 태그 참조", "tag_import_existing": "기존 태그 참조",
"You can add more": "원한다면", "You can add more": "원한다면",
"or_welcome": "또는", "or_welcome": "또는",
"from other websites": "를 통해 다른 웹사이트들로부터 불러올 수 있습니다.", "from other websites": "를 통해 다른 웹사이트들로부터 불러올 수 있습니다.",
@@ -1623,4 +1622,4 @@
"Master Import": "마스터 불러오기", "Master Import": "마스터 불러오기",
"Master Export": "마스터 내보내기", "Master Export": "마스터 내보내기",
"Chat Quick Reply Sets": "채팅 빠른 답장 세트들" "Chat Quick Reply Sets": "채팅 빠른 답장 세트들"
} }

View File

@@ -267,7 +267,7 @@
"Text Completion": "Tekstvoltooiing", "Text Completion": "Tekstvoltooiing",
"Chat Completion": "Chat-voltooiing", "Chat Completion": "Chat-voltooiing",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "KoboldAI Horde", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Vermijd het verzenden van gevoelige informatie naar de Horde.", "Avoid sending sensitive information to the Horde.": "Vermijd het verzenden van gevoelige informatie naar de Horde.",
"Review the Privacy statement": "Bekijk de privacyverklaring", "Review the Privacy statement": "Bekijk de privacyverklaring",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "gescheiden met komma's zonder spatie ertussen", "separate with commas w/o space between": "gescheiden met komma's zonder spatie ertussen",
"Custom Stopping Strings": "Aangepaste Stopreeksen", "Custom Stopping Strings": "Aangepaste Stopreeksen",
"JSON serialized array of strings": "JSON geserialiseerde reeks van strings", "JSON serialized array of strings": "JSON geserialiseerde reeks van strings",
"Replace Macro in Custom Stopping Strings": "Macro vervangen in aangepaste stopreeksen", "Replace Macro in Stop Strings": "Macro vervangen in aangepaste stopreeksen",
"Auto-Continue": "Automatisch doorgaan", "Auto-Continue": "Automatisch doorgaan",
"Allow for Chat Completion APIs": "Chatvervolledigings-API's toestaan", "Allow for Chat Completion APIs": "Chatvervolledigings-API's toestaan",
"Target length (tokens)": "Doellengte (tokens)", "Target length (tokens)": "Doellengte (tokens)",
@@ -558,7 +558,7 @@
"Delete a theme": "Verwijder een thema", "Delete a theme": "Verwijder een thema",
"Update a theme file": "Werk een themabestand bij", "Update a theme file": "Werk een themabestand bij",
"Save as a new theme": "Opslaan als nieuw thema", "Save as a new theme": "Opslaan als nieuw thema",
"Avatar Style": "Avatarstijl", "Avatar Style:": "Avatarstijl",
"Circle": "Cirkel", "Circle": "Cirkel",
"Square": "Vierkant", "Square": "Vierkant",
"Rectangle": "Rechthoek", "Rectangle": "Rechthoek",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Voorkeur karakterkaart prompt", "Prefer Character Card Prompt": "Voorkeur karakterkaart prompt",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Als aangevinkt en de karakterkaart bevat een jailbreak-override (Post History Instruction), gebruik die in plaats daarvan", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Als aangevinkt en de karakterkaart bevat een jailbreak-override (Post History Instruction), gebruik die in plaats daarvan",
"Prefer Character Card Jailbreak": "Voorkeur karakterkaart jailbreak", "Prefer Character Card Jailbreak": "Voorkeur karakterkaart jailbreak",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Vermijd het bijsnijden en vergroten/verkleinen van geïmporteerde karakterafbeeldingen. Indien uitgeschakeld, bijsnijden/formaat wijzigen naar 512 x 768.", "never_resize_avatars_tooltip": "Vermijd het bijsnijden en vergroten/verkleinen van geïmporteerde karakterafbeeldingen. Indien uitgeschakeld, bijsnijden/formaat wijzigen naar 512 x 768.",
"Never resize avatars": "Avatars nooit verkleinen", "Never resize avatars": "Avatars nooit verkleinen",
"Show actual file names on the disk, in the characters list display only": "Toon de werkelijke bestandsnamen op de schijf, alleen in de weergave van de lijst met personages", "Show actual file names on the disk, in the characters list display only": "Toon de werkelijke bestandsnamen op de schijf, alleen in de weergave van de lijst met personages",
"Show avatar filenames": "Toon avatar bestandsnamen", "Show avatar filenames": "Toon avatar bestandsnamen",
@@ -709,7 +709,7 @@
"Auto-swipe": "Automatisch vegen", "Auto-swipe": "Automatisch vegen",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Schakel de automatische-vegen functie in. Instellingen in dit gedeelte hebben alleen effect wanneer automatisch vegen is ingeschakeld", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Schakel de automatische-vegen functie in. Instellingen in dit gedeelte hebben alleen effect wanneer automatisch vegen is ingeschakeld",
"Minimum generated message length": "Minimale gegenereerde berichtlengte", "Minimum generated message length": "Minimale gegenereerde berichtlengte",
"If the generated message is shorter than this, trigger an auto-swipe": "Als het gegenereerde bericht korter is dan dit, activeer dan een automatische veeg", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Als het gegenereerde bericht korter is dan dit, activeer dan een automatische veeg",
"Blacklisted words": "Verboden woorden", "Blacklisted words": "Verboden woorden",
"words you dont want generated separated by comma ','": "woorden die je niet gegenereerd wilt hebben gescheiden door komma ','", "words you dont want generated separated by comma ','": "woorden die je niet gegenereerd wilt hebben gescheiden door komma ','",
"Blacklisted word count to swipe": "Aantal verboden woorden om te vegen", "Blacklisted word count to swipe": "Aantal verboden woorden om te vegen",
@@ -879,7 +879,7 @@
"popup-button-no": "Nee", "popup-button-no": "Nee",
"popup-button-cancel": "Annuleren", "popup-button-cancel": "Annuleren",
"popup-button-import": "Importeren", "popup-button-import": "Importeren",
"Advanced Defininitions": "Geavanceerde definities", "Advanced Definitions": "Geavanceerde definities",
"Prompt Overrides": "Prompt-overschrijvingen", "Prompt Overrides": "Prompt-overschrijvingen",
"(For Chat Completion and Instruct Mode)": "(Voor voltooiing van chat en instructiemodus)", "(For Chat Completion and Instruct Mode)": "(Voor voltooiing van chat en instructiemodus)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Voeg {{original}} in in elk vak in om de respectievelijke standaardprompt vanuit systeeminstellingen op te nemen.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Voeg {{original}} in in elk vak in om de respectievelijke standaardprompt vanuit systeeminstellingen op te nemen.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "voer de DrawThings-app uit met HTTP API-switch ingeschakeld in de gebruikersinterface! De server moet toegankelijk zijn vanaf de SillyTavern-hostmachine.", "sd_drawthings_auth_txt": "voer de DrawThings-app uit met HTTP API-switch ingeschakeld in de gebruikersinterface! De server moet toegankelijk zijn vanaf de SillyTavern-hostmachine.",
"sd_vlad_url": "Voorbeeld: {{vlad_url}}", "sd_vlad_url": "Voorbeeld: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "De server moet toegankelijk zijn vanaf de SillyTavern-hostmachine.", "The server must be accessible from the SillyTavern host machine.": "De server moet toegankelijk zijn vanaf de SillyTavern-hostmachine.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Tip: sla een API-sleutel op in de Horde KoboldAI API-instellingen om deze hier te gebruiken.", "Hint: Save an API key in AI Horde API settings to use it here.": "Tip: sla een API-sleutel op in de AI Horde API-instellingen om deze hier te gebruiken.",
"Allow NSFW images from Horde": "Sta NSFW-afbeeldingen van Horde toe", "Allow NSFW images from Horde": "Sta NSFW-afbeeldingen van Horde toe",
"Sanitize prompts (recommended)": "Ontsmettingsmeldingen (aanbevolen)", "Sanitize prompts (recommended)": "Ontsmettingsmeldingen (aanbevolen)",
"Automatically adjust generation parameters to ensure free image generations.": "Pas de generatieparameters automatisch aan om vrije beeldgeneraties te garanderen.", "Automatically adjust generation parameters to ensure free image generations.": "Pas de generatieparameters automatisch aan om vrije beeldgeneraties te garanderen.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub Lorebook (directe link of ID)", "char_import_2": "Chub Lorebook (directe link of ID)",
"char_import_3": "JanitorAI-personage (directe link of UUID)", "char_import_3": "JanitorAI-personage (directe link of UUID)",
"char_import_4": "Pygmalion.chat-teken (directe link of UUID)", "char_import_4": "Pygmalion.chat-teken (directe link of UUID)",
"char_import_5": "AICharacterCard.com-teken (directe link of ID)", "char_import_5": "AICharacterCards.com-teken (directe link of ID)",
"char_import_6": "Directe PNG-link (zie", "char_import_6": "Directe PNG-link (zie",
"char_import_7": "voor toegestane hosts)", "char_import_7": "voor toegestane hosts)",
"char_import_8": "RisuRealm-personage (directe link)", "char_import_8": "RisuRealm-personage (directe link)",

View File

@@ -267,7 +267,7 @@
"Text Completion": "Conclusão de texto", "Text Completion": "Conclusão de texto",
"Chat Completion": "Conclusão do bate-papo", "Chat Completion": "Conclusão do bate-papo",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "Horda KoboldAI", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Evite enviar informações sensíveis para a Horda.", "Avoid sending sensitive information to the Horde.": "Evite enviar informações sensíveis para a Horda.",
"Review the Privacy statement": "Reveja a declaração de privacidade", "Review the Privacy statement": "Reveja a declaração de privacidade",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "separe com vírgulas sem espaço entre", "separate with commas w/o space between": "separe com vírgulas sem espaço entre",
"Custom Stopping Strings": "Cadeias de parada personalizadas", "Custom Stopping Strings": "Cadeias de parada personalizadas",
"JSON serialized array of strings": "Matriz de strings serializada em JSON", "JSON serialized array of strings": "Matriz de strings serializada em JSON",
"Replace Macro in Custom Stopping Strings": "Substituir Macro em Strings de Parada Personalizadas", "Replace Macro in Stop Strings": "Substituir Macro em Strings de Parada Personalizadas",
"Auto-Continue": "Auto-Continuar", "Auto-Continue": "Auto-Continuar",
"Allow for Chat Completion APIs": "Permitir APIs de Completar Chat", "Allow for Chat Completion APIs": "Permitir APIs de Completar Chat",
"Target length (tokens)": "Comprimento alvo (tokens)", "Target length (tokens)": "Comprimento alvo (tokens)",
@@ -558,7 +558,7 @@
"Delete a theme": "Excluir um tema", "Delete a theme": "Excluir um tema",
"Update a theme file": "Atualizar um arquivo de tema", "Update a theme file": "Atualizar um arquivo de tema",
"Save as a new theme": "Salvar como um novo tema", "Save as a new theme": "Salvar como um novo tema",
"Avatar Style": "Estilo de Avatar", "Avatar Style:": "Estilo de Avatar",
"Circle": "Círculo", "Circle": "Círculo",
"Square": "Quadrado", "Square": "Quadrado",
"Rectangle": "Retângulo", "Rectangle": "Retângulo",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Preferir Prompt do Cartão de Personagem", "Prefer Character Card Prompt": "Preferir Prompt do Cartão de Personagem",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Se marcado e o cartão de personagem contiver uma substituição de jailbreak (Instrução de Histórico de Postagens), use isso em vez disso", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Se marcado e o cartão de personagem contiver uma substituição de jailbreak (Instrução de Histórico de Postagens), use isso em vez disso",
"Prefer Character Card Jailbreak": "Preferir Jailbreak do Cartão de Personagem", "Prefer Character Card Jailbreak": "Preferir Jailbreak do Cartão de Personagem",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Evite cortar e redimensionar imagens de personagens importados. Quando desativado, corte/redimensione para 512x768.", "never_resize_avatars_tooltip": "Evite cortar e redimensionar imagens de personagens importados. Quando desativado, corte/redimensione para 512x768.",
"Never resize avatars": "Nunca redimensionar avatares", "Never resize avatars": "Nunca redimensionar avatares",
"Show actual file names on the disk, in the characters list display only": "Mostrar nomes de arquivo reais no disco, apenas na exibição da lista de personagens", "Show actual file names on the disk, in the characters list display only": "Mostrar nomes de arquivo reais no disco, apenas na exibição da lista de personagens",
"Show avatar filenames": "Mostrar nomes de arquivo de avatar", "Show avatar filenames": "Mostrar nomes de arquivo de avatar",
@@ -709,7 +709,7 @@
"Auto-swipe": "Auto-swipe", "Auto-swipe": "Auto-swipe",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Ativar a função de auto-swipe. As configurações nesta seção só têm efeito quando o auto-swipe está ativado", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Ativar a função de auto-swipe. As configurações nesta seção só têm efeito quando o auto-swipe está ativado",
"Minimum generated message length": "Comprimento mínimo da mensagem gerada", "Minimum generated message length": "Comprimento mínimo da mensagem gerada",
"If the generated message is shorter than this, trigger an auto-swipe": "Se a mensagem gerada for mais curta que isso, acione um auto-swipe", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Se a mensagem gerada for mais curta que isso, acione um auto-swipe",
"Blacklisted words": "Palavras proibidas", "Blacklisted words": "Palavras proibidas",
"words you dont want generated separated by comma ','": "palavras que você não quer geradas separadas por vírgula ','", "words you dont want generated separated by comma ','": "palavras que você não quer geradas separadas por vírgula ','",
"Blacklisted word count to swipe": "Contagem de palavras proibidas para swipe", "Blacklisted word count to swipe": "Contagem de palavras proibidas para swipe",
@@ -879,7 +879,7 @@
"popup-button-no": "Não", "popup-button-no": "Não",
"popup-button-cancel": "Cancelar", "popup-button-cancel": "Cancelar",
"popup-button-import": "Importar", "popup-button-import": "Importar",
"Advanced Defininitions": "Definições Avançadas", "Advanced Definitions": "Definições Avançadas",
"Prompt Overrides": "Substituições de prompt", "Prompt Overrides": "Substituições de prompt",
"(For Chat Completion and Instruct Mode)": "(Para conclusão de bate-papo e modo de instrução)", "(For Chat Completion and Instruct Mode)": "(Para conclusão de bate-papo e modo de instrução)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Insira {{original}} em qualquer caixa para incluir o prompt padrão respectivo das configurações do sistema.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Insira {{original}} em qualquer caixa para incluir o prompt padrão respectivo das configurações do sistema.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "execute o aplicativo DrawThings com a opção HTTP API habilitada na IU! O servidor deve estar acessível a partir da máquina host SillyTavern.", "sd_drawthings_auth_txt": "execute o aplicativo DrawThings com a opção HTTP API habilitada na IU! O servidor deve estar acessível a partir da máquina host SillyTavern.",
"sd_vlad_url": "Exemplo: {{vlad_url}}", "sd_vlad_url": "Exemplo: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "O servidor deve estar acessível a partir da máquina host SillyTavern.", "The server must be accessible from the SillyTavern host machine.": "O servidor deve estar acessível a partir da máquina host SillyTavern.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Dica: salve uma chave de API nas configurações da API Horde KoboldAI para usá-la aqui.", "Hint: Save an API key in AI Horde API settings to use it here.": "Dica: salve uma chave de API nas configurações da API AI Horde para usá-la aqui.",
"Allow NSFW images from Horde": "Permitir imagens NSFW da Horda", "Allow NSFW images from Horde": "Permitir imagens NSFW da Horda",
"Sanitize prompts (recommended)": "Solicitações de higienização (recomendado)", "Sanitize prompts (recommended)": "Solicitações de higienização (recomendado)",
"Automatically adjust generation parameters to ensure free image generations.": "Ajuste automaticamente os parâmetros de geração para garantir gerações de imagens livres.", "Automatically adjust generation parameters to ensure free image generations.": "Ajuste automaticamente os parâmetros de geração para garantir gerações de imagens livres.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub Lorebook (link direto ou ID)", "char_import_2": "Chub Lorebook (link direto ou ID)",
"char_import_3": "Personagem JanitorAI (Link Direto ou UUID)", "char_import_3": "Personagem JanitorAI (Link Direto ou UUID)",
"char_import_4": "Caractere Pygmalion.chat (Link Direto ou UUID)", "char_import_4": "Caractere Pygmalion.chat (Link Direto ou UUID)",
"char_import_5": "Personagem AICharacterCard.com (link direto ou ID)", "char_import_5": "Personagem AICharacterCards.com (link direto ou ID)",
"char_import_6": "Link PNG direto (consulte", "char_import_6": "Link PNG direto (consulte",
"char_import_7": "para hosts permitidos)", "char_import_7": "para hosts permitidos)",
"char_import_8": "Personagem RisuRealm (link direto)", "char_import_8": "Personagem RisuRealm (link direto)",

View File

@@ -161,7 +161,7 @@
"View hidden API keys": "Посмотреть скрытые API-ключи", "View hidden API keys": "Посмотреть скрытые API-ключи",
"Advanced Formatting": "Расширенное форматирование", "Advanced Formatting": "Расширенное форматирование",
"Context Template": "Шаблон контекста", "Context Template": "Шаблон контекста",
"Replace Macro in Custom Stopping Strings": "Заменять макросы в пользовательских стоп-строках", "Replace Macro in Stop Strings": "Заменять макросы в пользовательских стоп-строках",
"Story String": "Строка истории", "Story String": "Строка истории",
"Example Separator": "Разделитель примеров сообщений", "Example Separator": "Разделитель примеров сообщений",
"Chat Start": "Начало чата", "Chat Start": "Начало чата",
@@ -195,12 +195,12 @@
"Yes": "Да", "Yes": "Да",
"No": "Нет", "No": "Нет",
"Context %": "Процент контекста", "Context %": "Процент контекста",
"Budget Cap": "Бюджетный лимит", "Budget Cap": "Лимит бюджета",
"(0 = disabled)": "(0 = отключено)", "(0 = disabled)": "(0 = отключено)",
"None": "Отсутствует", "None": "Отсутствует",
"User Settings": "Настройки пользователя", "User Settings": "Настройки пользователя",
"UI Language": "Язык интерфейса", "UI Language": "Язык интерфейса",
"Avatar Style": "Аватарки", "Avatar Style:": "Аватарки",
"Circle": "Круглые", "Circle": "Круглые",
"Rectangle": "Прямоугольные", "Rectangle": "Прямоугольные",
"Square": "Квадратные", "Square": "Квадратные",
@@ -265,7 +265,7 @@
"Current Members": "Текущие участники", "Current Members": "Текущие участники",
"Delete": "Удалить", "Delete": "Удалить",
"Cancel": "Отменить", "Cancel": "Отменить",
"Advanced Defininitions": "Расширенное описание", "Advanced Definitions": "Расширенное описание",
"Personality summary": "Резюме по личности", "Personality summary": "Резюме по личности",
"Scenario": "Сценарий", "Scenario": "Сценарий",
"Talkativeness": "Разговорчивость", "Talkativeness": "Разговорчивость",
@@ -294,12 +294,12 @@
"Avoid sending sensitive information to the Horde.": "Избегайте отправки личной информации Horde", "Avoid sending sensitive information to the Horde.": "Избегайте отправки личной информации Horde",
"Review the Privacy statement": "Ознакомиться с заявлением о конфиденциальности", "Review the Privacy statement": "Ознакомиться с заявлением о конфиденциальности",
"Trusted workers only": "Только доверенные рабочие машины", "Trusted workers only": "Только доверенные рабочие машины",
"For privacy reasons, your API key will be hidden after you reload the page.": "По причинам безопасности ваш API-ключ будет скрыт после перезагрузки страницы.", "For privacy reasons, your API key will be hidden after you reload the page.": "Из соображений безопасности ваш API-ключ будет скрыт после перезагрузки страницы.",
"-- Horde models not loaded --": "--Модель Horde не загружена--", "-- Horde models not loaded --": "--Модель Horde не загружена--",
"Example: http://127.0.0.1:5000/api ": "Пример: http://127.0.0.1:5000/api", "Example: http://127.0.0.1:5000/api ": "Пример: http://127.0.0.1:5000/api",
"No connection...": "Нет соединения...", "No connection...": "Нет соединения...",
"Get your NovelAI API Key": "Получите свой API-ключ для NovelAI", "Get your NovelAI API Key": "Получите свой API-ключ для NovelAI",
"KoboldAI Horde": "KoboldAI Horde", "AI Horde": "AI Horde",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"OpenAI API key": "Ключ для API OpenAI", "OpenAI API key": "Ключ для API OpenAI",
"Trim spaces": "Обрезать пробелы", "Trim spaces": "Обрезать пробелы",
@@ -331,7 +331,6 @@
"UID ↘": "UID ↘", "UID ↘": "UID ↘",
"Trigger% ↗": "Триггер% ↗", "Trigger% ↗": "Триггер% ↗",
"Trigger% ↘": "Триггер% ↘", "Trigger% ↘": "Триггер% ↘",
"Order:": "Порядок:",
"Depth:": "Глубина:", "Depth:": "Глубина:",
"Character Lore First": "Сначала лор персонажа", "Character Lore First": "Сначала лор персонажа",
"Global Lore First": "Сначала глобальный лор", "Global Lore First": "Сначала глобальный лор",
@@ -347,7 +346,7 @@
"After Char Defs": "↓Перс.", "After Char Defs": "↓Перс.",
"Before AN": "↑АЗ", "Before AN": "↑АЗ",
"After AN": "↓АЗ", "After AN": "↓АЗ",
"Order": "Порядок:", "Order": "Очерёдность:",
"Update a theme file": "Обновить файл темы", "Update a theme file": "Обновить файл темы",
"Save as a new theme": "Сохранить как новую тему", "Save as a new theme": "Сохранить как новую тему",
"Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных запрещённых слов, при котором срабатывает авто-свайп.", "Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных запрещённых слов, при котором срабатывает авто-свайп.",
@@ -427,7 +426,7 @@
"Requests logprobs from the API for the Token Probabilities feature": "Запросить логпробы из API для функции Token Probabilities.", "Requests logprobs from the API for the Token Probabilities feature": "Запросить логпробы из API для функции Token Probabilities.",
"Automatically reject and re-generate AI message based on configurable criteria": "Автоматическое отклонение и повторная генерация сообщений AI на основе настраиваемых критериев.", "Automatically reject and re-generate AI message based on configurable criteria": "Автоматическое отклонение и повторная генерация сообщений AI на основе настраиваемых критериев.",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить авто-свайп. Настройки в этом разделе действуют только при включенном авто-свайпе.", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить авто-свайп. Настройки в этом разделе действуют только при включенном авто-свайпе.",
"If the generated message is shorter than this, trigger an auto-swipe": "Если сгенерированное сообщение короче этого значения, срабатывает авто-свайп.", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Если сгенерированное сообщение короче этого значения, срабатывает авто-свайп.",
"Reload and redraw the currently open chat": "Перезагрузить и перерисовать открытый в данный момент чат.", "Reload and redraw the currently open chat": "Перезагрузить и перерисовать открытый в данный момент чат.",
"Auto-Expand Message Actions": "Развернуть действия", "Auto-Expand Message Actions": "Развернуть действия",
"Persona Management": "Управление персоной", "Persona Management": "Управление персоной",
@@ -497,7 +496,7 @@
"What this keyword should mean to the AI, sent verbatim": "Что это ключевое слово должно означать для ИИ, отправляется дословно", "What this keyword should mean to the AI, sent verbatim": "Что это ключевое слово должно означать для ИИ, отправляется дословно",
"Filter to Character(s)": "Фильтр по персонажу(ам)", "Filter to Character(s)": "Фильтр по персонажу(ам)",
"Character Exclusion": "Исключить персонажей", "Character Exclusion": "Исключить персонажей",
"Inclusion Group": "Включить персонажей", "Inclusion Group": "Группа записей",
"Only one entry with the same label will be activated": "Будет активна только одна запись с одинаковой меткой", "Only one entry with the same label will be activated": "Будет активна только одна запись с одинаковой меткой",
"-- Characters not found --": "-- Персонажей не найдено --", "-- Characters not found --": "-- Персонажей не найдено --",
"(This will be the first message from the character that starts every chat)": "(Это будет первое сообщение от персонажа, когда вы начинаете новый чат)", "(This will be the first message from the character that starts every chat)": "(Это будет первое сообщение от персонажа, когда вы начинаете новый чат)",
@@ -541,7 +540,7 @@
"NOT ANY": "НЕ ЛЮБОЙ", "NOT ANY": "НЕ ЛЮБОЙ",
"Optional Filter": "Дополнительный фильтр", "Optional Filter": "Дополнительный фильтр",
"New Entry": "Новая запись", "New Entry": "Новая запись",
"Fill empty Memo/Titles with Keywords": "Заполните пустые Заметки/Названия ключевыми словами", "Fill empty Memo/Titles with Keywords": "Заполнить пустые названия ключевыми словами",
"AI Response Formatting": "Формат ответа ИИ", "AI Response Formatting": "Формат ответа ИИ",
"Change Background Image": "Изменить фон", "Change Background Image": "Изменить фон",
"Extensions": "Расширения", "Extensions": "Расширения",
@@ -576,10 +575,10 @@
"Characters sorting order": "Порядок сортировки персонажей", "Characters sorting order": "Порядок сортировки персонажей",
"Remove": "Убрать", "Remove": "Убрать",
"Select a World Info file for": "Выбрать файл с миром для", "Select a World Info file for": "Выбрать файл с миром для",
"Primary Lorebook": "Основного лорбука", "Primary Lorebook": "Основной лорбук",
"A selected World Info will be bound to this character as its own Lorebook.": "Информация о мире будет привязана к персонажу как его собственный лорбук", "A selected World Info will be bound to this character as its own Lorebook.": "Информация о мире будет привязана к персонажу как его собственный лорбук.",
"When generating an AI reply, it will be combined with the entries from a global World Info selector.": "Когда ИИ генерирует ответ, он будет совмещён с записями из глобально выбранного мира", "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "Когда ИИ генерирует ответ, он будет совмещён с записями из глобально выбранного мира.",
"Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "При экспорте персонажа вместе с ним также выгрузится выбранный лорбук в виде JSON", "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "При экспорте персонажа вместе с ним также выгрузится выбранный лорбук в виде JSON.",
"Additional Lorebooks": "Вспомогательные лорбуки", "Additional Lorebooks": "Вспомогательные лорбуки",
"Associate one or more auxillary Lorebooks with this character.": "Привязать к этому персонажу один или больше вспомогательных лорбуков", "Associate one or more auxillary Lorebooks with this character.": "Привязать к этому персонажу один или больше вспомогательных лорбуков",
"NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: эти выборы необязательные и не будут сохранены при экспорте персонажа!", "NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: эти выборы необязательные и не будут сохранены при экспорте персонажа!",
@@ -594,7 +593,7 @@
"Prompt": "Промпт", "Prompt": "Промпт",
"Copy": "Скопировать", "Copy": "Скопировать",
"Confirm": "Подтвердить", "Confirm": "Подтвердить",
"Copy this message": "Скопировать сообщение", "Copy this message": "Продублировать сообщение",
"Delete this message": "Удалить сообщение", "Delete this message": "Удалить сообщение",
"Move message up": "Переместить сообщение вверх", "Move message up": "Переместить сообщение вверх",
"Move message down": "Переместить сообщение вниз", "Move message down": "Переместить сообщение вниз",
@@ -613,7 +612,7 @@
"Ask AI to write your message for you": "Попросить ИИ написать сообщение за вас", "Ask AI to write your message for you": "Попросить ИИ написать сообщение за вас",
"Continue the last message": "Продолжить текущее сообщение", "Continue the last message": "Продолжить текущее сообщение",
"Bind user name to that avatar": "Закрепить имя за этим аватаром", "Bind user name to that avatar": "Закрепить имя за этим аватаром",
"Select this as default persona for the new chats.": "Выберать эту Персону в качестве персоны по умолчанию для новых чатов.", "Select this as default persona for the new chats.": "Выбирать эту персону по умолчанию для всех новых чатов.",
"Change persona image": "Сменить аватар персоны", "Change persona image": "Сменить аватар персоны",
"Delete persona": "Удалить персону", "Delete persona": "Удалить персону",
"Reduced Motion": "Сокращение анимаций", "Reduced Motion": "Сокращение анимаций",
@@ -628,7 +627,7 @@
"UI Theme": "Тема UI", "UI Theme": "Тема UI",
"This message is invisible for the AI": "Это сообщение невидимо для ИИ", "This message is invisible for the AI": "Это сообщение невидимо для ИИ",
"Sampler Priority": "Приоритет сэмплеров", "Sampler Priority": "Приоритет сэмплеров",
"Ooba only. Determines the order of samplers.": "Только Ooba. Определяет порядок сэмплеров.", "Ooba only. Determines the order of samplers.": "Только oobabooga. Определяет порядок сэмплеров.",
"Load default order": "Загрузить стандартный порядок", "Load default order": "Загрузить стандартный порядок",
"Max Tokens Second": "Макс. кол-во токенов в секунду", "Max Tokens Second": "Макс. кол-во токенов в секунду",
"CFG": "CFG", "CFG": "CFG",
@@ -641,7 +640,7 @@
"Token Probabilities": "Вероятности токенов", "Token Probabilities": "Вероятности токенов",
"Close chat": "Закрыть чат", "Close chat": "Закрыть чат",
"Manage chat files": "Все чаты", "Manage chat files": "Все чаты",
"Import Extension From Git Repo": "Импортировать расширение из Git Repository", "Import Extension From Git Repo": "Импортировать расширение из Git-репозитория.",
"Install extension": "Установить расширение", "Install extension": "Установить расширение",
"Manage extensions": "Управление расширениями", "Manage extensions": "Управление расширениями",
"Tokens persona description": "Токенов", "Tokens persona description": "Токенов",
@@ -967,7 +966,7 @@
"char_import_2": "Лорбук с Chub (прямая ссылка или ID)", "char_import_2": "Лорбук с Chub (прямая ссылка или ID)",
"char_import_3": "Персонаж с JanitorAI (прямая ссылка или UUID)", "char_import_3": "Персонаж с JanitorAI (прямая ссылка или UUID)",
"char_import_4": "Персонаж с Pygmalion.chat (прямая ссылка или UUID)", "char_import_4": "Персонаж с Pygmalion.chat (прямая ссылка или UUID)",
"char_import_5": "Персонаж с AICharacterCard.com (прямая ссылка или ID)", "char_import_5": "Персонаж с AICharacterCards.com (прямая ссылка или ID)",
"char_import_6": "Прямая ссылка на PNG-файл (чтобы узнать список разрешённых хостов, загляните в", "char_import_6": "Прямая ссылка на PNG-файл (чтобы узнать список разрешённых хостов, загляните в",
"char_import_7": ")", "char_import_7": ")",
"Grammar String": "Грамматика", "Grammar String": "Грамматика",
@@ -996,7 +995,7 @@
"Set your custom avatar.": "Установить аватарку", "Set your custom avatar.": "Установить аватарку",
"Remove your custom avatar.": "Сбросить аватарку", "Remove your custom avatar.": "Сбросить аватарку",
"Make a Snapshot": "Сделать снимок", "Make a Snapshot": "Сделать снимок",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Не менять размер картинок у импортируемых персонажей. При отключении все картинки будут приводиться к размеру 512х768", "never_resize_avatars_tooltip": "Не менять размер картинок у импортируемых персонажей. При отключении все картинки будут приводиться к размеру 512х768",
"Char List Subheader": "Доп. заголовок в списке персонажей", "Char List Subheader": "Доп. заголовок в списке персонажей",
"# Messages to Load": "Сколько сообщений загружать", "# Messages to Load": "Сколько сообщений загружать",
"(0 = All)": "(0 = все)", "(0 = All)": "(0 = все)",
@@ -1123,16 +1122,15 @@
"help_hotkeys_0": "Горячие клавиши", "help_hotkeys_0": "Горячие клавиши",
"You can browse a list of bundled characters in the": "Комплектных персонажей можно найти в меню", "You can browse a list of bundled characters in the": "Комплектных персонажей можно найти в меню",
"Download Extensions & Assets": "Загрузить расширения и ресурсы", "Download Extensions & Assets": "Загрузить расширения и ресурсы",
"menu within": нутри этих кубиков", "menu within": меню",
"Assets URL": "URL с описанием ресурсов", "Assets URL": "URL с описанием ресурсов",
"Custom (OpenAI-compatible)": "Кастомный (совместимый с OpenAI)", "Custom (OpenAI-compatible)": "Кастомный (совместимый с OpenAI)",
"Custom Endpoint (Base URL)": "Кастомный эндпоинт (базовый URL)", "Custom Endpoint (Base URL)": "Кастомный эндпоинт (базовый URL)",
"Example: http://localhost:1234/v1": "Пример: http://localhost:1234/v1", "Example: http://localhost:1234/v1": "Пример: http://localhost:1234/v1",
"at the end of the URL!": "!",
"Custom API Key": "Ключ от кастомного API", "Custom API Key": "Ключ от кастомного API",
"(Optional)": "(необязательно)", "(Optional)": "(необязательно)",
"Enter a Model ID": "Введите идентификатор модели", "Enter a Model ID": "Введите идентификатор модели",
"Example: gpt-3.5-turbo": "Пример: gpt-3.5-turbo", "Example: gpt-4o": "Пример: gpt-4o",
"Available Models": "Доступные модели", "Available Models": "Доступные модели",
"Prompt Post-Processing": "Постобработка промпта", "Prompt Post-Processing": "Постобработка промпта",
"Applies additional processing to the prompt before sending it to the API.": "Позволяет обработать промпт перед отправкой в API.", "Applies additional processing to the prompt before sending it to the API.": "Позволяет обработать промпт перед отправкой в API.",
@@ -1342,7 +1340,7 @@
"Chat Lorebook": "Chat Lorebook for", "Chat Lorebook": "Chat Lorebook for",
"chat_world_template_txt": "A selected World Info will be bound to this chat. When generating an AI reply,\n it will be combined with the entries from global and character lorebooks.", "chat_world_template_txt": "A selected World Info will be bound to this chat. When generating an AI reply,\n it will be combined with the entries from global and character lorebooks.",
"Use tag as folder": "Tag as folder", "Use tag as folder": "Tag as folder",
"WI Entry Status:🔵 Constant🟢 Normal🔗 Vectorized❌ Disabled": "Статус записи:\n 🔵 Постоянная\n 🟢 Обычная\n 🔗 Векторизованная\n ❌ Отключена", "WI Entry Status:🔵 Constant🟢 Normal🔗 Vectorized": "Статус записи:\n 🔵 Постоянная\n 🟢 Обычная\n 🔗 Векторизованная",
"WI_Entry_Status_Constant": "Постоянная", "WI_Entry_Status_Constant": "Постоянная",
"WI_Entry_Status_Normal": "Обычная", "WI_Entry_Status_Normal": "Обычная",
"WI_Entry_Status_Vectorized": "Векторизованная", "WI_Entry_Status_Vectorized": "Векторизованная",
@@ -1366,13 +1364,7 @@
"Can be used to automatically activate Quick Replies": "Can be used to automatically activate Quick Replies", "Can be used to automatically activate Quick Replies": "Can be used to automatically activate Quick Replies",
"Automation ID": "Automation ID", "Automation ID": "Automation ID",
"( None )": "( None )", "( None )": "( None )",
"Delay until recursion (this entry can only be activated on recursive checking)": "Delay until recursion (this entry can only be activated on recursive checking)",
"Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\rSupports multiple comma-separated groups.\r\rDocumentation: World Info - Inclusion Group",
"Prioritize this entry: When checked, this entry is prioritized out of all selections.If multiple are prioritized, the one with the highest 'Order' is chosen.": "Prioritize this entry: When checked, this entry is prioritized out of all selections.\rIf multiple are prioritized, the one with the highest 'Order' is chosen.\r",
"A relative likelihood of entry activation within the group": "A relative likelihood of entry activation within the group",
"Group Weight": "Group Weight",
"Add Memo": "Add Memo", "Add Memo": "Add Memo",
"close": "close",
"reset": "reset", "reset": "reset",
"save": "save", "save": "save",
"Open checkpoint chat": "Открыть чат из чекпоинта", "Open checkpoint chat": "Открыть чат из чекпоинта",
@@ -1461,7 +1453,7 @@
"sd_drawthings_auth_txt": "run DrawThings app with HTTP API switch enabled in the UI! The server must be accessible from the SillyTavern host machine.", "sd_drawthings_auth_txt": "run DrawThings app with HTTP API switch enabled in the UI! The server must be accessible from the SillyTavern host machine.",
"sd_vlad_url": "Example: {{vlad_url}}", "sd_vlad_url": "Example: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "The server must be accessible from the SillyTavern host machine.", "The server must be accessible from the SillyTavern host machine.": "The server must be accessible from the SillyTavern host machine.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Hint: Save an API key in Horde KoboldAI API settings to use it here.", "Hint: Save an API key in AI Horde API settings to use it here.": "Hint: Save an API key in AI Horde API settings to use it here.",
"Allow NSFW images from Horde": "Разрешить NSFW-картинки в Horde", "Allow NSFW images from Horde": "Разрешить NSFW-картинки в Horde",
"Sanitize prompts (recommended)": "Sanitize prompts (recommended)", "Sanitize prompts (recommended)": "Sanitize prompts (recommended)",
"Automatically adjust generation parameters to ensure free image generations.": "Automatically adjust generation parameters to ensure free image generations.", "Automatically adjust generation parameters to ensure free image generations.": "Automatically adjust generation parameters to ensure free image generations.",
@@ -1629,7 +1621,7 @@
"Defines on importing cards which action should be chosen for importing its listed tags. 'Ask' will always display the dialog.": "Выберите, какие действия следует предпринять по отношению к тегам импортируемой карточки. При выборе опции \"Спрашивать\" вы будете решать это индивидуально для каждой карточки.", "Defines on importing cards which action should be chosen for importing its listed tags. 'Ask' will always display the dialog.": "Выберите, какие действия следует предпринять по отношению к тегам импортируемой карточки. При выборе опции \"Спрашивать\" вы будете решать это индивидуально для каждой карточки.",
"Ask": "Спрашивать", "Ask": "Спрашивать",
"tag_import_all": "Все", "tag_import_all": "Все",
"Existing": "Только существующие", "tag_import_existing": "Только существующие",
"tag_import_none": "Не импортировать", "tag_import_none": "Не импортировать",
"Using a proxy that you're not running yourself is a risk to your data privacy.": "Помните, что используя чужую прокси, вы подвергаете риску конфиденциальность своих данных.", "Using a proxy that you're not running yourself is a risk to your data privacy.": "Помните, что используя чужую прокси, вы подвергаете риску конфиденциальность своих данных.",
"ANY support requests will be REFUSED if you are using a proxy.": "НЕ РАССЧИТЫВАЙТЕ на нашу поддержку, если используете прокси.", "ANY support requests will be REFUSED if you are using a proxy.": "НЕ РАССЧИТЫВАЙТЕ на нашу поддержку, если используете прокси.",
@@ -1950,7 +1942,7 @@
"and connect to an": "и подключитесь к", "and connect to an": "и подключитесь к",
"You can add more": "Можете добавить больше", "You can add more": "Можете добавить больше",
"from other websites": "с других сайтов.", "from other websites": "с других сайтов.",
"Go to the": "Загляните в", "Go to the": "Заходите в",
"to install additional features.": ", чтобы установить разные дополнительные ресурсы.", "to install additional features.": ", чтобы установить разные дополнительные ресурсы.",
"or_welcome": "; также доступен", "or_welcome": "; также доступен",
"Claude API Key": "Ключ от API Claude", "Claude API Key": "Ключ от API Claude",
@@ -1965,7 +1957,7 @@
"Save": "Сохранить", "Save": "Сохранить",
"Chat Lorebook": "Лорбук для чата", "Chat Lorebook": "Лорбук для чата",
"chat_world_template_txt": "Выбранный мир будет привязан к этому чату. Будет добавляться в промпт наряду с глобальным лорбуком и лором персонажа.", "chat_world_template_txt": "Выбранный мир будет привязан к этому чату. Будет добавляться в промпт наряду с глобальным лорбуком и лором персонажа.",
"world_button_title": "Лор персонажа\n\nНажмите, чтобы загрузить\nShift + клик, чтобы открыть диалог привязки мира", "world_button_title": "Лор персонажа\n\nНажмите, чтобы загрузить\nShift + ЛКМ, чтобы открыть диалог привязки мира",
"No auxillary Lorebooks set. Click here to select.": "Вспомогательный лорбук не выбран. Нажмите, чтобы выбрать.", "No auxillary Lorebooks set. Click here to select.": "Вспомогательный лорбук не выбран. Нажмите, чтобы выбрать.",
"ext_regex_user_input_desc": "Отправленные вами сообщения.", "ext_regex_user_input_desc": "Отправленные вами сообщения.",
"ext_regex_ai_input_desc": "Полученные от API ответы.", "ext_regex_ai_input_desc": "Полученные от API ответы.",
@@ -2035,5 +2027,181 @@
"tags_sorting_desc": "Автоматически сортировать теги по алфавиту после создания или переименования одного из них.\nПри выключении новые теги будут просто добавляться в конец.\n\nЕсли вручную перетащить один из тегов на другое место, автосортировка отключится.", "tags_sorting_desc": "Автоматически сортировать теги по алфавиту после создания или переименования одного из них.\nПри выключении новые теги будут просто добавляться в конец.\n\nЕсли вручную перетащить один из тегов на другое место, автосортировка отключится.",
"Imported tags:": "Импортируемые теги:", "Imported tags:": "Импортируемые теги:",
"Importing Tags": "Импорт тегов", "Importing Tags": "Импорт тегов",
"Couldn't import tags:": "Не удалось импортировать теги:" "Couldn't import tags:": "Не удалось импортировать теги:",
"Allow fallback models": "Разрешить fallback-модели",
"Allow fallback providers": "Разрешить fallback-провайдеров",
"To use instruct formatting, switch to OpenRouter under Text Completion API.": "Переключитесь на OpenRouter в Text Completion API, чтобы использовать форматирование Instruct-режима.",
"Select providers. No selection = all providers.": "Выберите провайдера. Нет выбранного = выбраны все.",
"Model Providers": "Провайдеры моделей",
"Select a model": "Выберите модель",
"Search models...": "Искать по моделям...",
"[Currently loaded]": "[Загруженная сейчас]",
"Search providers...": "Искать по провайдерам...",
"Automatically chooses an alternative provider if chosen providers can't serve your request.": "Автоматически переключаться на другого провайдера, если текущий не может обслужить запрос.",
"Example: 127.0.0.1:8000": "Пример: 127.0.0.1:8000",
"Edit a connection profile": "Редактировать профиль соединения",
"System Prompt Name": "Название системного промпта",
"Use System Prompt": "Использовать системный промпт",
"Hint:": "Подсказка:",
"Click on the setting name to omit it from the profile.": "Нажмите на название настройки, чтобы исключить её из профиля",
"Included settings:": "Сохранённые параметры:",
"Server URL": "Адрес сервера",
"NanoGPT API Key": "Ключ от API NanoGPT",
"NanoGPT Model": "Модель NanoGPT",
"Use extension settings": "Использовать настройки из расширения",
"DeepSeek API Key": "Ключ от API DeepSeek",
"DeepSeek Model": "Модель DeepSeek",
"prompt_post_processing_merge": "Объединять идущие подряд сообщения с одной ролью",
"prompt_post_processing_semi": "Semi-strict (чередовать роли)",
"prompt_post_processing_strict": "Strict (чередовать роли, сначала пользователь)",
"Select Horde models": "Выбрать модель из Horde",
"Model ID (optional)": "Идентификатор модели (необязательно)",
"Derive context size from backend": "Использовать бэкенд для определения размера контекста",
"Rename current preset": "Переименовать пресет",
"No Worlds active. Click here to select.": "Нет активных миров. Нажмите, чтобы выбрать.",
"Title/Memo": "Название",
"Strategy": "Статус",
"Position": "Позиция",
"Trigger %": "% срабатывания",
"Use global": "Глоб. настройка",
"Whole Words": "Целые слова",
"Non-recursable (will not be activated by another)": "Не рекурсивная (не активируется другими)",
"Delay until recursion (can only be activated on recursive checking)": "Рекурсивная (активируется только рекурсией)",
"Toggle entry's active state.": "Вкл/выкл запись.",
"Prioritize": "Важная",
"Prioritize this entry: When checked, this entry is prioritized out of all selections.If multiple are prioritized, the one with the highest 'Order' is chosen.": "Важная запись получает приоритет среди всех выбранных. Если важных записей несколько, выбирается та, у которой выше \"Очерёдность\".",
"Group Weight": "Вес в группе",
"A relative likelihood of entry activation within the group": "Относительная вероятность активации записи в рамках группы",
"Sticky": "Липучка",
"Sticky entries will stay active for N messages after being triggered.": "Запись-\"липучка\" останется активной в течение N сообщений после срабатывания.",
"Cooldown": "Кулдаун",
"Entries with a cooldown can't be activated N messages after being triggered.": "Запись с заданным кулдауном не активируется следующие N сообщений после срабатывания.",
"Delay": "Задержка",
"Entries with a delay can't be activated until there are N messages present in the chat.": "Запись с заданной задержкой может активироваться только после того, как в чате наберётся N сообщений.",
"Non-sticky": "Нет",
"No cooldown": "Нет",
"No delay": "Нет",
"Filter to Characters or Tags": "Фильтровать по персонажам или тегам",
"Switch to plaintext mode": "Вкл/выкл режим чистого текста",
"Exclude": "Режим исключения",
"Switch the Character/Tags filter around to exclude the listed characters and tags from matching for this entry": "Инвертировать логику: для выбранных в фильтре персонажей/тегов данная запись активна НЕ БУДЕТ",
"Apply current sorting as Order": "Настроить Очерёдность в соответствии с текущей сортировкой",
"Create a new World Info": "Создать новый мир",
"Enter a name for the new file:": "Название нового файла:",
"Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Если сразу несколько записей из одной группы окажутся активированными, по факту сработает только одна. Одна запись может входить в несколько групп, отделяются запятыми. Раздел в документации: World Info - Inclusion Group",
"Valid World Info file name is required": "Требуется корректное имя для файла мира",
"World Info file has an invalid format": "Файл мира имеет неизвестный формат",
"World Info file has no entries": "В файле нет ни одной записи",
"Character not found.": "Персонаж не найден",
"Open a chat to get a name of the chat-bound lorebook": "Чтобы получить название привязанного к чату лорбука, требуется открыть чат.",
"File is not valid: ${0}": "Файл повреждён или имеет неизвестный формат: ${0}",
"The world with ${0} is invalid or corrupted.": "Мир ${0} повреждён или имеет неизвестный формат.",
"Deactivated all worlds": "Все миры отключены",
"No world found named: ${0}": "Не найдено мира с название ${0}",
"Activated world: ${0}": "Мир ${0} включён",
"Deactivated world: ${0}": "Мир ${0} отключён",
"World was not active: ${0}": "Мир ${0} не включён",
"The world '${0}' has been imported and linked to the character successfully.": "Мир ${0} успешно импортирован и привязан к персонажу.",
"World/Lorebook imported": "Мир/лорбук импортирован",
"Are you sure you want to import '${0}'?": "Вы точно хотите импортировать '${0}'?",
"It will overwrite the World/Lorebook with the same name.": "Существующий мир с таким же названием будет перезаписан.",
"Automatically 'continue' a response if the model stopped before reaching a certain amount of tokens.": "Автоматически \"продолжать\" ответ, если он оказался короче, чем целевая длина (в токенах).",
"None (not injected)": "Никуда",
"ext_sum_injection_position_none": "Пересказ не будет вставляться в промпт. Однако его по-прежнему можно будет вставить с помощью макроса {{summary}}",
"ext_sum_include_wi_scan": "Учитывать при сканировании лорбуком",
"ext_sum_include_wi_scan_desc": "Учитывать актуальный пересказ при сканировании промпта лорбуком.",
"ext_sum_force_tip": "Отправить запрос на создание пересказа прямо сейчас.",
"ext_sum_restore_tip": "Откатиться к предыдущему пересказу; используйте несколько раз, чтобы очистить историю пересказов для чата",
"Built-in Extensions:": "Комплектные расширения:",
"Installed Extensions:": "Установленные расширения:",
"Loading third-party extensions... Please wait...": "Загрузка сторонних расширений... Пожалуйста, подождите...",
"The page will be reloaded shortly...": "Страница будет перезагружена...",
"Extensions state changed": "Изменено состояние расширения",
"Error loading extensions. See browser console for details.": "Не удалось загрузить расширения. Подробности см. в консоли браузера.",
"You don't have permission to update global extensions.": "Отсутствуют права на обновление глобальных расширений.",
"Extension update failed": "Не удалось обновить расширение",
"Extension ${0} updated to ${1}": "Расширение ${0} обновлено до ${1}",
"Reload the page to apply updates": "Чтобы изменения вступили в силу, обновите страницу",
"You don't have permission to delete global extensions.": "Отсутствуют права на удаление глобальных расширений.",
"Are you sure you want to delete ${0}?": "Вы точно хотите удалить ${0}?",
"You don't have permission to move extensions.": "Отсутствуют права на перемещение расширений.",
"Are you sure you want to move ${0} to your local extensions? This will make it available only for you.": "Вы точно хотите сделать ${0} локальным расширением? После этого оно будет доступно только вам.",
"Are you sure you want to move ${0} to the global extensions? This will make it available for all users.": "Вы точно хотите сделать ${0} глобальным расширением? После этого оно будет доступно всем пользователям.",
"Extension ${0} moved.": "Расширение ${0} перемещено.",
"Extension ${0} deleted": "Расширение ${0} удалено.",
"Please wait...": "Пожалуйста, подождите...",
"Installing extension": "Идёт установка расширения",
"Extension installation failed": "Не удалось установить расширение",
"Extension '${0}' by ${1} (version ${2}) has been installed successfully!": "Расширение ${0} от автора ${1} (версия ${2}) успешно установлено!",
"Extension installation successful": "Расширение установлено",
"Extension updates available": "Доступных обновлений расширений",
"Auto-updating extensions. This may take several minutes.": "Запущено автоматическое обновление расширений. Это может занять несколько минут.",
"Install just for me": "Установить только мне",
"Install": "Установить",
"Install for all users": "Установить для всех пользователей",
"Modules provided by your Extras API:": "Модули из Extras API:",
"Not connected to the API!": "Нет соединения с API!",
"ext_type_system": "Это комплектное расширение. Его нельзя удалить, а обновляется оно вместе со всей системой.",
"Update all": "Обновить все",
"Close": "Закрыть",
"Optional modules:": "Необязательные модули:",
"Sort: Display Name": "Сортировать: по названию",
"Sort: Loading Order": "Сортировать: в порядке загрузки",
"Click to toggle": "Нажмите, чтобы включить или выключить",
"Loading Asset List": "Загрузить список ресурсов",
"Don't ask again for this URL": "Запомнить выбор для этого адреса",
"Are you sure you want to connect to the following url?": "Вы точно хотите подключиться к этому адресу?",
"All": "Всё",
"Characters": "Персонажи",
"Ambient sounds": "Звуковой эмбиент",
"Blip sounds": "Звуки уведомлений",
"Background music": "Фоновая музыка",
"Search": "Поиск",
"extension_install_1": "Чтобы загружать расширения из этого списка, у вас должен быть установлен ",
"extension_install_2": ".",
"extension_install_3": "Нажмите на иконку ",
"extension_install_4": ", чтобы перейти в репозиторий расширения и получить более подробную информацию о нём.",
"Extension repo/guide:": "Репозиторий расширения:",
"Preview in browser": "Предпросмотр",
"Adds a function tool": "Частично или полностью работает через вызов функций",
"Tool": "Функции",
"Move extension": "Переместить расширение",
"ext_type_local": "Это локальное расширение, доступно только вам",
"ext_type_global": "Это глобальное расширение, доступно всем пользователям",
"Move": "Переместить",
"Enter the Git URL of the extension to install": "Введите Git-адрес расширения",
"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.": "помните, что используя расширения от сторонних авторов, вы можете подвергать систему опасности. Устанавливайте расширения только от проверенных разработчиков. Мы не несём ответственности за любой ущерб, причинённый сторонними расширениями.",
"Disclaimer:": "Внимание:",
"Example:": "Пример:",
"context_derived": "Считывать из метаданных модели (по возможности)",
"instruct_derived": "Считывать из метаданных модели (по возможности)",
"Confirm token parsing with": "Чтобы убедиться в правильности выделения токенов, используйте",
"Reasoning Effort": "Рассуждения",
"Constrains effort on reasoning for reasoning models.": "Регулирует объём внутренних рассуждений модели (reasoning), для моделей которые поддерживают эту возможность.\nНа данный момент поддерживаются три значения: Подробные, Обычные, Поверхностные.\nПри менее подробном рассуждении ответ получается быстрее, а также экономятся токены, уходящие на рассуждения.",
"openai_reasoning_effort_low": "Поверхностные",
"openai_reasoning_effort_medium": "Обычные",
"openai_reasoning_effort_high": "Подробные",
"Persona Lore Alt+Click to open the lorebook": "Лорбук данной персоны\nAlt + ЛКМ чтобы открыть лорбук",
"Persona Lorebook for": "Лорбук для персоны",
"persona_world_template_txt": "Выбранная Информация о мире будет привязана к этой персоне. Информация будет добавляться в каждом промпте вместе с глобальным лорбуком и лорбуками персонажа и чата.",
"Global list": "Глобальный список",
"Preset-specific list": "Список для данного пресета",
"Banned tokens/strings are being sent in the request.": "Запрещённые токены и строки отсылаются в запросе.",
"Banned tokens/strings are NOT being sent in the request.": "Запрещённые токены и строки НЕ отсылаются в запросе.",
"Add a reasoning block": "Добавить блок рассуждений",
"Create a copy of this message?": "Продублировать это сообщение?",
"Max Recursion Steps": "Макс. глубина рекурсии",
"0 = unlimited, 1 = scans once and doesn't recurse, 2 = scans once and recurses once, etc": "0 = неограничено, 1 = сканировать единожды, 2 = сканировать единожды и сделать один повторный проход, и т.д.\n(неактивно при указанном мин. числе активаций)",
"(disabled when max recursion steps are used)": "(неактивно при указанной макс. глубине рекурсии)",
"Enter a valid API URL": "Введите корректный адрес API",
"No Ollama model selected.": "Не выбрана модель Ollama",
"Background Fitting": "Способ подгонки фона под разрешение",
"Chat Lore Alt+Click to open the lorebook": "Лорбук данного чата\nAlt + ЛКМ чтобы открыть лорбук",
"Token Counter": "Подсчитать токены",
"Type / paste in the box below to see the number of tokens in the text.": "Введите или вставьте текст в окошко ниже, чтобы подсчитать количество токенов в нём.",
"Selected tokenizer:": "Выбранный токенайзер:",
"Input:": "Входные данные:",
"Tokenized text:": "Токенизированный текст:",
"Token IDs:": "Идентификаторы токенов:",
"Tokens:": "Токенов:"
} }

View File

@@ -267,7 +267,7 @@
"Text Completion": "Завершення тексту", "Text Completion": "Завершення тексту",
"Chat Completion": "Завершення чату", "Chat Completion": "Завершення чату",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "KoboldAI Horde", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Уникайте надсилання чутливої інформації в Horde.", "Avoid sending sensitive information to the Horde.": "Уникайте надсилання чутливої інформації в Horde.",
"Review the Privacy statement": "Перегляньте заяву про конфіденційність", "Review the Privacy statement": "Перегляньте заяву про конфіденційність",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "розділяйте комами без пропусків між ними", "separate with commas w/o space between": "розділяйте комами без пропусків між ними",
"Custom Stopping Strings": "Власні рядки зупинки", "Custom Stopping Strings": "Власні рядки зупинки",
"JSON serialized array of strings": "JSON-серіалізований масив рядків", "JSON serialized array of strings": "JSON-серіалізований масив рядків",
"Replace Macro in Custom Stopping Strings": "Замінювати макроси у власних рядках зупинки", "Replace Macro in Stop Strings": "Замінювати макроси у власних рядках зупинки",
"Auto-Continue": "Автоматичне продовження", "Auto-Continue": "Автоматичне продовження",
"Allow for Chat Completion APIs": "Дозволити для Chat Completion API", "Allow for Chat Completion APIs": "Дозволити для Chat Completion API",
"Target length (tokens)": "Цільова довжина (токени)", "Target length (tokens)": "Цільова довжина (токени)",
@@ -558,7 +558,7 @@
"Delete a theme": "Видалити тему", "Delete a theme": "Видалити тему",
"Update a theme file": "Оновити файл теми", "Update a theme file": "Оновити файл теми",
"Save as a new theme": "Зберегти як нову тему", "Save as a new theme": "Зберегти як нову тему",
"Avatar Style": "Стиль аватара", "Avatar Style:": "Стиль аватара",
"Circle": "Коло", "Circle": "Коло",
"Square": "Квадрат", "Square": "Квадрат",
"Rectangle": "Прямокутник", "Rectangle": "Прямокутник",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Перевага запиту персонажа", "Prefer Character Card Prompt": "Перевага запиту персонажа",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Якщо відмічено і картка персонажа містить заміну джейлбрейку (Інструкцію), використовуйте її замість цього", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Якщо відмічено і картка персонажа містить заміну джейлбрейку (Інструкцію), використовуйте її замість цього",
"Prefer Character Card Jailbreak": "Перевага джейлбрейку персонажа", "Prefer Character Card Jailbreak": "Перевага джейлбрейку персонажа",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Уникайте обрізання та зміни розміру імпортованих зображень символів. Коли вимкнено, обрізати/змінити розмір до 512x768.", "never_resize_avatars_tooltip": "Уникайте обрізання та зміни розміру імпортованих зображень символів. Коли вимкнено, обрізати/змінити розмір до 512x768.",
"Never resize avatars": "Ніколи не змінювати розмір аватарів", "Never resize avatars": "Ніколи не змінювати розмір аватарів",
"Show actual file names on the disk, in the characters list display only": "Показувати фактичні назви файлів на диску, тільки у відображенні списку персонажів", "Show actual file names on the disk, in the characters list display only": "Показувати фактичні назви файлів на диску, тільки у відображенні списку персонажів",
"Show avatar filenames": "Показувати імена файлів аватарів", "Show avatar filenames": "Показувати імена файлів аватарів",
@@ -709,7 +709,7 @@
"Auto-swipe": "Автоматичний змах", "Auto-swipe": "Автоматичний змах",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Вмикає функцію автоматичного змаху. Налаштування в цьому розділі діють лише тоді, коли увімкнено автоматичний змах", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Вмикає функцію автоматичного змаху. Налаштування в цьому розділі діють лише тоді, коли увімкнено автоматичний змах",
"Minimum generated message length": "Мінімальна довжина згенерованого повідомлення", "Minimum generated message length": "Мінімальна довжина згенерованого повідомлення",
"If the generated message is shorter than this, trigger an auto-swipe": "Якщо згенероване повідомлення коротше за це, викликайте автоматичний змаху", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Якщо згенероване повідомлення коротше за це, викликайте автоматичний змаху",
"Blacklisted words": "Список заборонених слів", "Blacklisted words": "Список заборонених слів",
"words you dont want generated separated by comma ','": "слова, які ви не хочете генерувати, розділені комою ','", "words you dont want generated separated by comma ','": "слова, які ви не хочете генерувати, розділені комою ','",
"Blacklisted word count to swipe": "Кількість заборонених слів для змаху", "Blacklisted word count to swipe": "Кількість заборонених слів для змаху",
@@ -879,7 +879,7 @@
"popup-button-no": "Немає", "popup-button-no": "Немає",
"popup-button-cancel": "Скасувати", "popup-button-cancel": "Скасувати",
"popup-button-import": "Імпорт", "popup-button-import": "Імпорт",
"Advanced Defininitions": "Розширені визначення", "Advanced Definitions": "Розширені визначення",
"Prompt Overrides": "Перевизначення підказок", "Prompt Overrides": "Перевизначення підказок",
"(For Chat Completion and Instruct Mode)": "(Для завершення чату та режиму інструктажу)", "(For Chat Completion and Instruct Mode)": "(Для завершення чату та режиму інструктажу)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Вставте {{original}} в будь-яке поле, щоб включити відповідний запит з налаштувань системи.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Вставте {{original}} в будь-яке поле, щоб включити відповідний запит з налаштувань системи.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "запустіть програму DrawThings із увімкненим перемикачем HTTP API в інтерфейсі користувача! Сервер має бути доступним із хост-машини SillyTavern.", "sd_drawthings_auth_txt": "запустіть програму DrawThings із увімкненим перемикачем HTTP API в інтерфейсі користувача! Сервер має бути доступним із хост-машини SillyTavern.",
"sd_vlad_url": "Приклад: {{vlad_url}}", "sd_vlad_url": "Приклад: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "Сервер має бути доступним із хост-машини SillyTavern.", "The server must be accessible from the SillyTavern host machine.": "Сервер має бути доступним із хост-машини SillyTavern.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Підказка: збережіть ключ API в налаштуваннях Horde KoboldAI API, щоб використовувати його тут.", "Hint: Save an API key in AI Horde API settings to use it here.": "Підказка: збережіть ключ API в налаштуваннях AI Horde API, щоб використовувати його тут.",
"Allow NSFW images from Horde": "Дозволити зображення NSFW від Horde", "Allow NSFW images from Horde": "Дозволити зображення NSFW від Horde",
"Sanitize prompts (recommended)": "Очистити підказки (рекомендовано)", "Sanitize prompts (recommended)": "Очистити підказки (рекомендовано)",
"Automatically adjust generation parameters to ensure free image generations.": "Автоматично налаштовуйте параметри генерації, щоб забезпечити вільне створення зображень.", "Automatically adjust generation parameters to ensure free image generations.": "Автоматично налаштовуйте параметри генерації, щоб забезпечити вільне створення зображень.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub Lorebook (пряме посилання або ID)", "char_import_2": "Chub Lorebook (пряме посилання або ID)",
"char_import_3": "Символ JanitorAI (пряме посилання або UUID)", "char_import_3": "Символ JanitorAI (пряме посилання або UUID)",
"char_import_4": "Символ Pygmalion.chat (пряме посилання або UUID)", "char_import_4": "Символ Pygmalion.chat (пряме посилання або UUID)",
"char_import_5": "Символ AICharacterCard.com (пряме посилання або ідентифікатор)", "char_import_5": "Символ AICharacterCards.com (пряме посилання або ідентифікатор)",
"char_import_6": "Пряме посилання на PNG (див", "char_import_6": "Пряме посилання на PNG (див",
"char_import_7": "для дозволених хостів)", "char_import_7": "для дозволених хостів)",
"char_import_8": "Персонаж RisuRealm (пряме посилання)", "char_import_8": "Персонаж RisuRealm (пряме посилання)",

View File

@@ -267,7 +267,7 @@
"Text Completion": "Text Completion", "Text Completion": "Text Completion",
"Chat Completion": "Chat Completion", "Chat Completion": "Chat Completion",
"NovelAI": "NovelAI", "NovelAI": "NovelAI",
"KoboldAI Horde": "KoboldAI Horde", "AI Horde": "AI Horde",
"KoboldAI": "KoboldAI", "KoboldAI": "KoboldAI",
"Avoid sending sensitive information to the Horde.": "Tránh gửi thông tin nhạy cảm cho Horde.", "Avoid sending sensitive information to the Horde.": "Tránh gửi thông tin nhạy cảm cho Horde.",
"Review the Privacy statement": "Xem lại Chính sách bảo mật", "Review the Privacy statement": "Xem lại Chính sách bảo mật",
@@ -482,7 +482,7 @@
"separate with commas w/o space between": "phân tách bằng dấu phẩy không có khoảng trắng giữa", "separate with commas w/o space between": "phân tách bằng dấu phẩy không có khoảng trắng giữa",
"Custom Stopping Strings": "Chuỗi dừng tùy chỉnh", "Custom Stopping Strings": "Chuỗi dừng tùy chỉnh",
"JSON serialized array of strings": "Mảng chuỗi được tuần tự hóa JSON", "JSON serialized array of strings": "Mảng chuỗi được tuần tự hóa JSON",
"Replace Macro in Custom Stopping Strings": "Thay thế Macro trong Chuỗi Dừng Tùy chỉnh", "Replace Macro in Stop Strings": "Thay thế Macro trong Chuỗi Dừng Tùy chỉnh",
"Auto-Continue": "Tự động Tiếp tục", "Auto-Continue": "Tự động Tiếp tục",
"Allow for Chat Completion APIs": "Cho phép các API hoàn thành Trò chuyện", "Allow for Chat Completion APIs": "Cho phép các API hoàn thành Trò chuyện",
"Target length (tokens)": "Độ dài mục tiêu (token)", "Target length (tokens)": "Độ dài mục tiêu (token)",
@@ -558,7 +558,7 @@
"Delete a theme": "Xóa một chủ đề", "Delete a theme": "Xóa một chủ đề",
"Update a theme file": "Cập nhật một tập tin chủ đề", "Update a theme file": "Cập nhật một tập tin chủ đề",
"Save as a new theme": "Lưu dưới dạng chủ đề mới", "Save as a new theme": "Lưu dưới dạng chủ đề mới",
"Avatar Style": "Kiểu hình đại diện", "Avatar Style:": "Kiểu hình đại diện",
"Circle": "Hình tròn", "Circle": "Hình tròn",
"Square": "Hình vuông", "Square": "Hình vuông",
"Rectangle": "Hình chữ nhật", "Rectangle": "Hình chữ nhật",
@@ -633,7 +633,7 @@
"Prefer Character Card Prompt": "Ưu tiên Gợi ý từ Card", "Prefer Character Card Prompt": "Ưu tiên Gợi ý từ Card",
"If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Nếu được kiểm tra và thẻ nhân vật chứa một lệnh phá vỡ giam giữ (Hướng dẫn Lịch sử Bài viết), hãy sử dụng thay vào đó", "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Nếu được kiểm tra và thẻ nhân vật chứa một lệnh phá vỡ giam giữ (Hướng dẫn Lịch sử Bài viết), hãy sử dụng thay vào đó",
"Prefer Character Card Jailbreak": "Ưu tiên Jailbreak từ Card", "Prefer Character Card Jailbreak": "Ưu tiên Jailbreak từ Card",
"Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Tránh cắt xén và thay đổi kích thước hình ảnh ký tự đã nhập. Khi tắt, hãy cắt/thay đổi kích thước thành 512x768.", "never_resize_avatars_tooltip": "Tránh cắt xén và thay đổi kích thước hình ảnh ký tự đã nhập. Khi tắt, hãy cắt/thay đổi kích thước thành 512x768.",
"Never resize avatars": "Không bao giờ thay đổi kích thước hình đại diện", "Never resize avatars": "Không bao giờ thay đổi kích thước hình đại diện",
"Show actual file names on the disk, in the characters list display only": "Hiển thị tên tệp thực tế trên đĩa, chỉ trong danh sách nhân vật", "Show actual file names on the disk, in the characters list display only": "Hiển thị tên tệp thực tế trên đĩa, chỉ trong danh sách nhân vật",
"Show avatar filenames": "Hiển thị tên tệp hình đại diện", "Show avatar filenames": "Hiển thị tên tệp hình đại diện",
@@ -709,7 +709,7 @@
"Auto-swipe": "Tự động vuốt", "Auto-swipe": "Tự động vuốt",
"Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Bật chức năng tự động vuốt. Các cài đặt trong phần này chỉ có tác dụng khi tự động vuốt được bật", "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Bật chức năng tự động vuốt. Các cài đặt trong phần này chỉ có tác dụng khi tự động vuốt được bật",
"Minimum generated message length": "Độ dài tối thiểu của tin nhắn được tạo", "Minimum generated message length": "Độ dài tối thiểu của tin nhắn được tạo",
"If the generated message is shorter than this, trigger an auto-swipe": "Nếu tin nhắn được tạo ra ngắn hơn điều này, kích hoạt tự động vuốt", "If the generated message is shorter than these many characters, trigger an auto-swipe": "Nếu tin nhắn được tạo ra ngắn hơn điều này, kích hoạt tự động vuốt",
"Blacklisted words": "Từ trong danh sách đen", "Blacklisted words": "Từ trong danh sách đen",
"words you dont want generated separated by comma ','": "các từ bạn không muốn được tạo ra được phân tách bằng dấu phẩy ','", "words you dont want generated separated by comma ','": "các từ bạn không muốn được tạo ra được phân tách bằng dấu phẩy ','",
"Blacklisted word count to swipe": "Số từ trong danh sách đen để vuốt", "Blacklisted word count to swipe": "Số từ trong danh sách đen để vuốt",
@@ -879,7 +879,7 @@
"popup-button-no": "KHÔNG", "popup-button-no": "KHÔNG",
"popup-button-cancel": "Hủy", "popup-button-cancel": "Hủy",
"popup-button-import": "Nhập", "popup-button-import": "Nhập",
"Advanced Defininitions": "Các Định nghĩa Nâng cao", "Advanced Definitions": "Các Định nghĩa Nâng cao",
"Prompt Overrides": "Ghi đè Prompt", "Prompt Overrides": "Ghi đè Prompt",
"(For Chat Completion and Instruct Mode)": "(Đối với chế độ hoàn thành trò chuyện và hướng dẫn)", "(For Chat Completion and Instruct Mode)": "(Đối với chế độ hoàn thành trò chuyện và hướng dẫn)",
"Insert {{original}} into either box to include the respective default prompt from system settings.": "Chèn {{original}} vào bất kỳ hộp nào để bao gồm Prompt mặc định tương ứng từ cài đặt hệ thống.", "Insert {{original}} into either box to include the respective default prompt from system settings.": "Chèn {{original}} vào bất kỳ hộp nào để bao gồm Prompt mặc định tương ứng từ cài đặt hệ thống.",
@@ -1295,7 +1295,7 @@
"sd_drawthings_auth_txt": "chạy ứng dụng DrawThings với tính năng chuyển đổi API HTTP được bật trong giao diện người dùng! Máy chủ phải có thể truy cập được từ máy chủ SillyTavern.", "sd_drawthings_auth_txt": "chạy ứng dụng DrawThings với tính năng chuyển đổi API HTTP được bật trong giao diện người dùng! Máy chủ phải có thể truy cập được từ máy chủ SillyTavern.",
"sd_vlad_url": "Ví dụ: {{vlad_url}}", "sd_vlad_url": "Ví dụ: {{vlad_url}}",
"The server must be accessible from the SillyTavern host machine.": "Máy chủ phải có thể truy cập được từ máy chủ SillyTavern.", "The server must be accessible from the SillyTavern host machine.": "Máy chủ phải có thể truy cập được từ máy chủ SillyTavern.",
"Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Gợi ý: Lưu khóa API trong cài đặt API Horde KoboldAI để sử dụng tại đây.", "Hint: Save an API key in AI Horde API settings to use it here.": "Gợi ý: Lưu khóa API trong cài đặt API AI Horde để sử dụng tại đây.",
"Allow NSFW images from Horde": "Cho phép hình ảnh NSFW từ Horde", "Allow NSFW images from Horde": "Cho phép hình ảnh NSFW từ Horde",
"Sanitize prompts (recommended)": "Nhắc nhở vệ sinh (khuyến nghị)", "Sanitize prompts (recommended)": "Nhắc nhở vệ sinh (khuyến nghị)",
"Automatically adjust generation parameters to ensure free image generations.": "Tự động điều chỉnh các thông số tạo để đảm bảo tạo ra hình ảnh miễn phí.", "Automatically adjust generation parameters to ensure free image generations.": "Tự động điều chỉnh các thông số tạo để đảm bảo tạo ra hình ảnh miễn phí.",
@@ -1376,7 +1376,7 @@
"char_import_2": "Chub (Nhập URL trực tiếp hoặc ID)", "char_import_2": "Chub (Nhập URL trực tiếp hoặc ID)",
"char_import_3": "JanitorAI (Nhập URL trực tiếp hoặc UUID)", "char_import_3": "JanitorAI (Nhập URL trực tiếp hoặc UUID)",
"char_import_4": "Pygmalion.chat (Nhập URL trực tiếp hoặc UUID)", "char_import_4": "Pygmalion.chat (Nhập URL trực tiếp hoặc UUID)",
"char_import_5": "AICharacterCard.com (Nhập URL trực tiếp hoặc ID)", "char_import_5": "AICharacterCards.com (Nhập URL trực tiếp hoặc ID)",
"char_import_6": "Nhập PNG trực tiếp (tham khảo", "char_import_6": "Nhập PNG trực tiếp (tham khảo",
"char_import_7": "đối với các máy chủ được phép)", "char_import_7": "đối với các máy chủ được phép)",
"char_import_8": "RisuRealm (URL trực tiếp)", "char_import_8": "RisuRealm (URL trực tiếp)",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -395,7 +395,7 @@ class BulkEditOverlay {
/** /**
* @typedef {object} LastSelected - An object noting the last selected character and its state. * @typedef {object} LastSelected - An object noting the last selected character and its state.
* @property {string} [characterId] - The character id of the last selected character. * @property {number} [characterId] - The character id of the last selected character.
* @property {boolean} [select] - The selected state of the last selected character. <c>true</c> if it was selected, <c>false</c> if it was deselected. * @property {boolean} [select] - The selected state of the last selected character. <c>true</c> if it was selected, <c>false</c> if it was deselected.
*/ */
@@ -672,10 +672,10 @@ class BulkEditOverlay {
* @param {HTMLElement} currentCharacter - The html element of the currently toggled character * @param {HTMLElement} currentCharacter - The html element of the currently toggled character
*/ */
handleShiftClick = (currentCharacter) => { handleShiftClick = (currentCharacter) => {
const characterId = currentCharacter.getAttribute('chid'); const characterId = Number(currentCharacter.getAttribute('data-chid'));
const select = !this.selectedCharacters.includes(characterId); const select = !this.selectedCharacters.includes(characterId);
if (this.lastSelected.characterId && this.lastSelected.select !== undefined) { if (this.lastSelected.characterId >= 0 && this.lastSelected.select !== undefined) {
// Only if select state and the last select state match we execute the range select // Only if select state and the last select state match we execute the range select
if (select === this.lastSelected.select) { if (select === this.lastSelected.select) {
this.toggleCharactersInRange(currentCharacter, select); this.toggleCharactersInRange(currentCharacter, select);
@@ -691,7 +691,7 @@ class BulkEditOverlay {
* @param {boolean} [param1.markState] - Whether the toggle of this character should be remembered as the last done toggle * @param {boolean} [param1.markState] - Whether the toggle of this character should be remembered as the last done toggle
*/ */
toggleSingleCharacter = (character, { markState = true } = {}) => { toggleSingleCharacter = (character, { markState = true } = {}) => {
const characterId = character.getAttribute('chid'); const characterId = Number(character.getAttribute('data-chid'));
const select = !this.selectedCharacters.includes(characterId); const select = !this.selectedCharacters.includes(characterId);
const legacyBulkEditCheckbox = character.querySelector('.' + BulkEditOverlay.legacySelectedClass); const legacyBulkEditCheckbox = character.querySelector('.' + BulkEditOverlay.legacySelectedClass);
@@ -699,11 +699,11 @@ class BulkEditOverlay {
if (select) { if (select) {
character.classList.add(BulkEditOverlay.selectedClass); character.classList.add(BulkEditOverlay.selectedClass);
if (legacyBulkEditCheckbox) legacyBulkEditCheckbox.checked = true; if (legacyBulkEditCheckbox) legacyBulkEditCheckbox.checked = true;
this.#selectedCharacters.push(String(characterId)); this.#selectedCharacters.push(characterId);
} else { } else {
character.classList.remove(BulkEditOverlay.selectedClass); character.classList.remove(BulkEditOverlay.selectedClass);
if (legacyBulkEditCheckbox) legacyBulkEditCheckbox.checked = false; if (legacyBulkEditCheckbox) legacyBulkEditCheckbox.checked = false;
this.#selectedCharacters = this.#selectedCharacters.filter(item => String(characterId) !== item); this.#selectedCharacters = this.#selectedCharacters.filter(item => characterId !== item);
} }
this.updateSelectedCount(); this.updateSelectedCount();
@@ -732,15 +732,15 @@ class BulkEditOverlay {
* @param {boolean} select - <c>true</c> if the characters in the range are to be selected, <c>false</c> if deselected * @param {boolean} select - <c>true</c> if the characters in the range are to be selected, <c>false</c> if deselected
*/ */
toggleCharactersInRange = (currentCharacter, select) => { toggleCharactersInRange = (currentCharacter, select) => {
const currentCharacterId = currentCharacter.getAttribute('chid'); const currentCharacterId = Number(currentCharacter.getAttribute('data-chid'));
const characters = Array.from(document.querySelectorAll('#' + BulkEditOverlay.containerId + ' .' + BulkEditOverlay.characterClass)); const characters = Array.from(document.querySelectorAll('#' + BulkEditOverlay.containerId + ' .' + BulkEditOverlay.characterClass));
const startIndex = characters.findIndex(c => c.getAttribute('chid') === this.lastSelected.characterId); const startIndex = characters.findIndex(c => Number(c.getAttribute('data-chid')) === Number(this.lastSelected.characterId));
const endIndex = characters.findIndex(c => c.getAttribute('chid') === currentCharacterId); const endIndex = characters.findIndex(c => Number(c.getAttribute('data-chid')) === currentCharacterId);
for (let i = Math.min(startIndex, endIndex); i <= Math.max(startIndex, endIndex); i++) { for (let i = Math.min(startIndex, endIndex); i <= Math.max(startIndex, endIndex); i++) {
const character = characters[i]; const character = characters[i];
const characterId = character.getAttribute('chid'); const characterId = Number(character.getAttribute('data-chid'));
const isCharacterSelected = this.selectedCharacters.includes(characterId); const isCharacterSelected = this.selectedCharacters.includes(characterId);
// Only toggle the character if it wasn't on the state we have are toggling towards. // Only toggle the character if it wasn't on the state we have are toggling towards.

View File

@@ -11,6 +11,7 @@ import { debounce_timeout } from './constants.js';
import { renderTemplateAsync } from './templates.js'; import { renderTemplateAsync } from './templates.js';
import { Popup } from './popup.js'; import { Popup } from './popup.js';
import { t } from './i18n.js'; import { t } from './i18n.js';
import { isMobile } from './RossAscends-mods.js';
function debouncePromise(func, delay) { function debouncePromise(func, delay) {
let timeoutId; let timeoutId;
@@ -1208,7 +1209,7 @@ class PromptManager {
const forbidOverridesBlock = document.getElementById(this.configuration.prefix + 'prompt_manager_forbid_overrides_block'); const forbidOverridesBlock = document.getElementById(this.configuration.prefix + 'prompt_manager_forbid_overrides_block');
nameField.value = prompt.name ?? ''; nameField.value = prompt.name ?? '';
roleField.value = prompt.role ?? 'system'; roleField.value = prompt.role || 'system';
promptField.value = prompt.content ?? ''; promptField.value = prompt.content ?? '';
promptField.disabled = prompt.marker ?? false; promptField.disabled = prompt.marker ?? false;
injectionPositionField.value = prompt.injection_position ?? INJECTION_POSITION.RELATIVE; injectionPositionField.value = prompt.injection_position ?? INJECTION_POSITION.RELATIVE;
@@ -1518,7 +1519,7 @@ class PromptManager {
let detachSpanHtml = ''; let detachSpanHtml = '';
if (this.isPromptDeletionAllowed(prompt)) { if (this.isPromptDeletionAllowed(prompt)) {
detachSpanHtml = ` detachSpanHtml = `
<span title="Remove" class="prompt-manager-detach-action caution fa-solid fa-chain-broken"></span> <span title="Remove" class="prompt-manager-detach-action caution fa-solid fa-chain-broken fa-xs"></span>
`; `;
} else { } else {
detachSpanHtml = '<span class="fa-solid"></span>'; detachSpanHtml = '<span class="fa-solid"></span>';
@@ -1527,7 +1528,7 @@ class PromptManager {
let editSpanHtml = ''; let editSpanHtml = '';
if (this.isPromptEditAllowed(prompt)) { if (this.isPromptEditAllowed(prompt)) {
editSpanHtml = ` editSpanHtml = `
<span title="edit" class="prompt-manager-edit-action fa-solid fa-pencil"></span> <span title="edit" class="prompt-manager-edit-action fa-solid fa-pencil fa-xs"></span>
`; `;
} else { } else {
editSpanHtml = '<span class="fa-solid"></span>'; editSpanHtml = '<span class="fa-solid"></span>';
@@ -1550,16 +1551,28 @@ class PromptManager {
const isInjectionPrompt = prompt.injection_position === INJECTION_POSITION.ABSOLUTE; const isInjectionPrompt = prompt.injection_position === INJECTION_POSITION.ABSOLUTE;
const isOverriddenPrompt = Array.isArray(this.overriddenPrompts) && this.overriddenPrompts.includes(prompt.identifier); const isOverriddenPrompt = Array.isArray(this.overriddenPrompts) && this.overriddenPrompts.includes(prompt.identifier);
const importantClass = isImportantPrompt ? `${prefix}prompt_manager_important` : ''; const importantClass = isImportantPrompt ? `${prefix}prompt_manager_important` : '';
const iconLookup = prompt.role === 'system' && (prompt.marker || prompt.system_prompt) ? '' : prompt.role;
//add role icons to the right of prompt name
const promptRoles = {
assistant: { roleIcon: 'fa-robot', roleTitle: 'Prompt will be sent as Assistant' },
user: { roleIcon: 'fa-user', roleTitle: 'Prompt will be sent as User' },
};
const roleIcon = promptRoles[iconLookup]?.roleIcon || '';
const roleTitle = promptRoles[iconLookup]?.roleTitle || '';
listItemHtml += ` listItemHtml += `
<li class="${prefix}prompt_manager_prompt ${draggableClass} ${enabledClass} ${markerClass} ${importantClass}" data-pm-identifier="${prompt.identifier}"> <li class="${prefix}prompt_manager_prompt ${draggableClass} ${enabledClass} ${markerClass} ${importantClass}" data-pm-identifier="${escapeHtml(prompt.identifier)}">
<span class="drag-handle">☰</span>
<span class="${prefix}prompt_manager_prompt_name" data-pm-name="${encodedName}"> <span class="${prefix}prompt_manager_prompt_name" data-pm-name="${encodedName}">
${isMarkerPrompt ? '<span class="fa-fw fa-solid fa-thumb-tack" title="Marker"></span>' : ''} ${isMarkerPrompt ? '<span class="fa-fw fa-solid fa-thumb-tack" title="Marker"></span>' : ''}
${isSystemPrompt ? '<span class="fa-fw fa-solid fa-square-poll-horizontal" title="Global Prompt"></span>' : ''} ${isSystemPrompt ? '<span class="fa-fw fa-solid fa-square-poll-horizontal" title="Global Prompt"></span>' : ''}
${isImportantPrompt ? '<span class="fa-fw fa-solid fa-star" title="Important Prompt"></span>' : ''} ${isImportantPrompt ? '<span class="fa-fw fa-solid fa-star" title="Important Prompt"></span>' : ''}
${isUserPrompt ? '<span class="fa-fw fa-solid fa-user" title="User Prompt"></span>' : ''} ${isUserPrompt ? '<span class="fa-fw fa-solid fa-asterisk" title="Preset Prompt"></span>' : ''}
${isInjectionPrompt ? '<span class="fa-fw fa-solid fa-syringe" title="In-Chat Injection"></span>' : ''} ${isInjectionPrompt ? '<span class="fa-fw fa-solid fa-syringe" title="In-Chat Injection"></span>' : ''}
${this.isPromptInspectionAllowed(prompt) ? `<a title="${encodedName}" class="prompt-manager-inspect-action">${encodedName}</a>` : `<span title="${encodedName}">${encodedName}</span>`} ${this.isPromptInspectionAllowed(prompt) ? `<a title="${encodedName}" class="prompt-manager-inspect-action">${encodedName}</a>` : `<span title="${encodedName}">${encodedName}</span>`}
${isInjectionPrompt ? `<small class="prompt-manager-injection-depth">@ ${prompt.injection_depth}</small>` : ''} ${roleIcon ? `<span data-role="${escapeHtml(prompt.role)}" class="fa-xs fa-solid ${roleIcon}" title="${roleTitle}"></span>` : ''}
${isInjectionPrompt ? `<small class="prompt-manager-injection-depth">@ ${escapeHtml(prompt.injection_depth)}</small>` : ''}
${isOverriddenPrompt ? '<small class="fa-solid fa-address-card prompt-manager-overridden" title="Pulled from a character card"></small>' : ''} ${isOverriddenPrompt ? '<small class="fa-solid fa-address-card prompt-manager-overridden" title="Pulled from a character card"></small>' : ''}
</span> </span>
<span> <span>
@@ -1730,6 +1743,7 @@ class PromptManager {
makeDraggable() { makeDraggable() {
$(`#${this.configuration.prefix}prompt_manager_list`).sortable({ $(`#${this.configuration.prefix}prompt_manager_list`).sortable({
delay: this.configuration.sortableDelay, delay: this.configuration.sortableDelay,
handle: isMobile() ? '.drag-handle' : null,
items: `.${this.configuration.prefix}prompt_manager_prompt_draggable`, items: `.${this.configuration.prefix}prompt_manager_prompt_draggable`,
update: (event, ui) => { update: (event, ui) => {
const promptOrder = this.getPromptOrderForCharacter(this.activeCharacter); const promptOrder = this.getPromptOrderForCharacter(this.activeCharacter);

View File

@@ -1,4 +1,4 @@
import { DOMPurify, Bowser } from '../lib.js'; import { DOMPurify, Bowser, slideToggle } from '../lib.js';
import { import {
characters, characters,
@@ -19,6 +19,7 @@ import {
menu_type, menu_type,
substituteParams, substituteParams,
sendTextareaMessage, sendTextareaMessage,
getSlideToggleOptions,
} from '../script.js'; } from '../script.js';
import { import {
@@ -26,7 +27,6 @@ import {
send_on_enter_options, send_on_enter_options,
} from './power-user.js'; } from './power-user.js';
import { LoadLocal, SaveLocal, LoadLocalBool } from './f-localStorage.js';
import { selected_group, is_group_generating, openGroupById } from './group-chats.js'; import { selected_group, is_group_generating, openGroupById } from './group-chats.js';
import { getTagKeyForEntity, applyTagsOnCharacterSelect } from './tags.js'; import { getTagKeyForEntity, applyTagsOnCharacterSelect } from './tags.js';
import { import {
@@ -40,6 +40,8 @@ import { textgen_types, textgenerationwebui_settings as textgen_settings, getTex
import { debounce_timeout } from './constants.js'; import { debounce_timeout } from './constants.js';
import { Popup } from './popup.js'; import { Popup } from './popup.js';
import { accountStorage } from './util/AccountStorage.js';
import { getCurrentUserHandle } from './user.js';
var RPanelPin = document.getElementById('rm_button_panel_pin'); var RPanelPin = document.getElementById('rm_button_panel_pin');
var LPanelPin = document.getElementById('lm_button_panel_pin'); var LPanelPin = document.getElementById('lm_button_panel_pin');
@@ -278,17 +280,32 @@ async function RA_autoloadchat() {
// active character is the name, we should look it up in the character list and get the id // active character is the name, we should look it up in the character list and get the id
if (active_character !== null && active_character !== undefined) { if (active_character !== null && active_character !== undefined) {
const active_character_id = characters.findIndex(x => getTagKeyForEntity(x) === active_character); const active_character_id = characters.findIndex(x => getTagKeyForEntity(x) === active_character);
if (active_character_id !== null) { if (active_character_id !== -1) {
await selectCharacterById(String(active_character_id)); await selectCharacterById(active_character_id);
// Do a little tomfoolery to spoof the tag selector // Do a little tomfoolery to spoof the tag selector
const selectedCharElement = $(`#rm_print_characters_block .character_select[chid="${active_character_id}"]`); const selectedCharElement = $(`#rm_print_characters_block .character_select[chid="${active_character_id}"]`);
applyTagsOnCharacterSelect.call(selectedCharElement); applyTagsOnCharacterSelect.call(selectedCharElement);
} else {
setActiveCharacter(null);
saveSettingsDebounced();
console.warn(`Currently active character with ID ${active_character} not found. Resetting to no active character.`);
} }
} }
if (active_group !== null && active_group !== undefined) { if (active_group !== null && active_group !== undefined) {
await openGroupById(String(active_group)); if (active_character) {
console.warn('Active character and active group are both set. Only active character will be loaded. Resetting active group.');
setActiveGroup(null);
saveSettingsDebounced();
} else {
const result = await openGroupById(String(active_group));
if (!result) {
setActiveGroup(null);
saveSettingsDebounced();
console.warn(`Currently active group with ID ${active_group} not found. Resetting to no active group.`);
}
}
} }
// if the character list hadn't been loaded yet, try again. // if the character list hadn't been loaded yet, try again.
@@ -299,7 +316,10 @@ export async function favsToHotswap() {
const entities = getEntitiesList({ doFilter: false }); const entities = getEntitiesList({ doFilter: false });
const container = $('#right-nav-panel .hotswap'); const container = $('#right-nav-panel .hotswap');
const favs = entities.filter(x => x.item.fav || x.item.fav == 'true'); // Hard limit is required because even if all hotswaps don't fit the screen, their images would still be loaded
// 25 is roughly calculated as the maximum number of favs that can fit an ultrawide monitor with the default theme
const FAVS_LIMIT = 25;
const favs = entities.filter(x => x.item.fav || x.item.fav == 'true').slice(0, FAVS_LIMIT);
//helpful instruction message if no characters are favorited //helpful instruction message if no characters are favorited
if (favs.length == 0) { if (favs.length == 0) {
@@ -315,7 +335,7 @@ function RA_checkOnlineStatus() {
if (online_status == 'no_connection') { if (online_status == 'no_connection') {
const send_textarea = $('#send_textarea'); const send_textarea = $('#send_textarea');
send_textarea.attr('placeholder', send_textarea.attr('no_connection_text')); //Input bar placeholder tells users they are not connected send_textarea.attr('placeholder', send_textarea.attr('no_connection_text')); //Input bar placeholder tells users they are not connected
//$('#send_form').addClass('no-connection'); //entire input form area is red when not connected $('#send_form').addClass('no-connection');
$('#send_but').addClass('displayNone'); //send button is hidden when not connected; $('#send_but').addClass('displayNone'); //send button is hidden when not connected;
$('#mes_continue').addClass('displayNone'); //continue button is hidden when not connected; $('#mes_continue').addClass('displayNone'); //continue button is hidden when not connected;
$('#mes_impersonate').addClass('displayNone'); //continue button is hidden when not connected; $('#mes_impersonate').addClass('displayNone'); //continue button is hidden when not connected;
@@ -326,7 +346,7 @@ function RA_checkOnlineStatus() {
if (online_status !== undefined && online_status !== 'no_connection') { if (online_status !== undefined && online_status !== 'no_connection') {
const send_textarea = $('#send_textarea'); const send_textarea = $('#send_textarea');
send_textarea.attr('placeholder', send_textarea.attr('connected_text')); //on connect, placeholder tells user to type message send_textarea.attr('placeholder', send_textarea.attr('connected_text')); //on connect, placeholder tells user to type message
//$('#send_form').removeClass('no-connection'); $('#send_form').removeClass('no-connection');
$('#API-status-top').removeClass('fa-plug-circle-exclamation redOverlayGlow'); $('#API-status-top').removeClass('fa-plug-circle-exclamation redOverlayGlow');
$('#API-status-top').addClass('fa-plug'); $('#API-status-top').addClass('fa-plug');
connection_made = true; connection_made = true;
@@ -389,6 +409,7 @@ function RA_autoconnect(PrevApi) {
|| (secret_state[SECRET_KEYS.ZEROONEAI] && oai_settings.chat_completion_source == chat_completion_sources.ZEROONEAI) || (secret_state[SECRET_KEYS.ZEROONEAI] && oai_settings.chat_completion_source == chat_completion_sources.ZEROONEAI)
|| (secret_state[SECRET_KEYS.BLOCKENTROPY] && oai_settings.chat_completion_source == chat_completion_sources.BLOCKENTROPY) || (secret_state[SECRET_KEYS.BLOCKENTROPY] && oai_settings.chat_completion_source == chat_completion_sources.BLOCKENTROPY)
|| (secret_state[SECRET_KEYS.NANOGPT] && oai_settings.chat_completion_source == chat_completion_sources.NANOGPT) || (secret_state[SECRET_KEYS.NANOGPT] && oai_settings.chat_completion_source == chat_completion_sources.NANOGPT)
|| (secret_state[SECRET_KEYS.DEEPSEEK] && oai_settings.chat_completion_source == chat_completion_sources.DEEPSEEK)
|| (isValidUrl(oai_settings.custom_url) && oai_settings.chat_completion_source == chat_completion_sources.CUSTOM) || (isValidUrl(oai_settings.custom_url) && oai_settings.chat_completion_source == chat_completion_sources.CUSTOM)
) { ) {
$('#api_button_openai').trigger('click'); $('#api_button_openai').trigger('click');
@@ -407,32 +428,34 @@ function RA_autoconnect(PrevApi) {
function OpenNavPanels() { function OpenNavPanels() {
if (!isMobile()) { if (!isMobile()) {
//auto-open R nav if locked and previously open //auto-open R nav if locked and previously open
if (LoadLocalBool('NavLockOn') == true && LoadLocalBool('NavOpened') == true) { if (accountStorage.getItem('NavLockOn') == 'true' && accountStorage.getItem('NavOpened') == 'true') {
//console.log("RA -- clicking right nav to open"); //console.log("RA -- clicking right nav to open");
$('#rightNavDrawerIcon').click(); $('#rightNavDrawerIcon').click();
} }
//auto-open L nav if locked and previously open //auto-open L nav if locked and previously open
if (LoadLocalBool('LNavLockOn') == true && LoadLocalBool('LNavOpened') == true) { if (accountStorage.getItem('LNavLockOn') == 'true' && accountStorage.getItem('LNavOpened') == 'true') {
console.debug('RA -- clicking left nav to open'); console.debug('RA -- clicking left nav to open');
$('#leftNavDrawerIcon').click(); $('#leftNavDrawerIcon').click();
} }
//auto-open WI if locked and previously open //auto-open WI if locked and previously open
if (LoadLocalBool('WINavLockOn') == true && LoadLocalBool('WINavOpened') == true) { if (accountStorage.getItem('WINavLockOn') == 'true' && accountStorage.getItem('WINavOpened') == 'true') {
console.debug('RA -- clicking WI to open'); console.debug('RA -- clicking WI to open');
$('#WIDrawerIcon').click(); $('#WIDrawerIcon').click();
} }
} }
} }
const getUserInputKey = () => getCurrentUserHandle() + '_userInput';
function restoreUserInput() { function restoreUserInput() {
if (!power_user.restore_user_input) { if (!power_user.restore_user_input) {
console.debug('restoreUserInput disabled'); console.debug('restoreUserInput disabled');
return; return;
} }
const userInput = LoadLocal('userInput'); const userInput = localStorage.getItem(getUserInputKey());
if (userInput) { if (userInput) {
$('#send_textarea').val(userInput)[0].dispatchEvent(new Event('input', { bubbles: true })); $('#send_textarea').val(userInput)[0].dispatchEvent(new Event('input', { bubbles: true }));
} }
@@ -440,7 +463,8 @@ function restoreUserInput() {
function saveUserInput() { function saveUserInput() {
const userInput = String($('#send_textarea').val()); const userInput = String($('#send_textarea').val());
SaveLocal('userInput', userInput); localStorage.setItem(getUserInputKey(), userInput);
console.debug('User Input -- ', userInput);
} }
const saveUserInputDebounced = debounce(saveUserInput); const saveUserInputDebounced = debounce(saveUserInput);
@@ -737,7 +761,7 @@ export function initRossMods() {
//toggle pin class when lock toggle clicked //toggle pin class when lock toggle clicked
$(RPanelPin).on('click', function () { $(RPanelPin).on('click', function () {
SaveLocal('NavLockOn', $(RPanelPin).prop('checked')); accountStorage.setItem('NavLockOn', $(RPanelPin).prop('checked'));
if ($(RPanelPin).prop('checked') == true) { if ($(RPanelPin).prop('checked') == true) {
//console.log('adding pin class to right nav'); //console.log('adding pin class to right nav');
$(RightNavPanel).addClass('pinnedOpen'); $(RightNavPanel).addClass('pinnedOpen');
@@ -748,14 +772,14 @@ export function initRossMods() {
$(RightNavDrawerIcon).removeClass('drawerPinnedOpen'); $(RightNavDrawerIcon).removeClass('drawerPinnedOpen');
if ($(RightNavPanel).hasClass('openDrawer') && $('.openDrawer').length > 1) { if ($(RightNavPanel).hasClass('openDrawer') && $('.openDrawer').length > 1) {
$(RightNavPanel).slideToggle(200, 'swing'); slideToggle(RightNavPanel, getSlideToggleOptions());
$(RightNavDrawerIcon).toggleClass('openIcon closedIcon'); $(RightNavDrawerIcon).toggleClass('closedIcon openIcon');
$(RightNavPanel).toggleClass('openDrawer closedDrawer'); $(RightNavPanel).toggleClass('openDrawer closedDrawer');
} }
} }
}); });
$(LPanelPin).on('click', function () { $(LPanelPin).on('click', function () {
SaveLocal('LNavLockOn', $(LPanelPin).prop('checked')); accountStorage.setItem('LNavLockOn', $(LPanelPin).prop('checked'));
if ($(LPanelPin).prop('checked') == true) { if ($(LPanelPin).prop('checked') == true) {
//console.log('adding pin class to Left nav'); //console.log('adding pin class to Left nav');
$(LeftNavPanel).addClass('pinnedOpen'); $(LeftNavPanel).addClass('pinnedOpen');
@@ -766,15 +790,15 @@ export function initRossMods() {
$(LeftNavDrawerIcon).removeClass('drawerPinnedOpen'); $(LeftNavDrawerIcon).removeClass('drawerPinnedOpen');
if ($(LeftNavPanel).hasClass('openDrawer') && $('.openDrawer').length > 1) { if ($(LeftNavPanel).hasClass('openDrawer') && $('.openDrawer').length > 1) {
$(LeftNavPanel).slideToggle(200, 'swing'); slideToggle(LeftNavPanel, getSlideToggleOptions());
$(LeftNavDrawerIcon).toggleClass('openIcon closedIcon'); $(LeftNavDrawerIcon).toggleClass('closedIcon openIcon');
$(LeftNavPanel).toggleClass('openDrawer closedDrawer'); $(LeftNavPanel).toggleClass('openDrawer closedDrawer');
} }
} }
}); });
$(WIPanelPin).on('click', function () { $(WIPanelPin).on('click', function () {
SaveLocal('WINavLockOn', $(WIPanelPin).prop('checked')); accountStorage.setItem('WINavLockOn', $(WIPanelPin).prop('checked'));
if ($(WIPanelPin).prop('checked') == true) { if ($(WIPanelPin).prop('checked') == true) {
console.debug('adding pin class to WI'); console.debug('adding pin class to WI');
$(WorldInfo).addClass('pinnedOpen'); $(WorldInfo).addClass('pinnedOpen');
@@ -786,16 +810,16 @@ export function initRossMods() {
if ($(WorldInfo).hasClass('openDrawer') && $('.openDrawer').length > 1) { if ($(WorldInfo).hasClass('openDrawer') && $('.openDrawer').length > 1) {
console.debug('closing WI after lock removal'); console.debug('closing WI after lock removal');
$(WorldInfo).slideToggle(200, 'swing'); slideToggle(WorldInfo, getSlideToggleOptions());
$(WIDrawerIcon).toggleClass('openIcon closedIcon'); $(WIDrawerIcon).toggleClass('closedIcon openIcon');
$(WorldInfo).toggleClass('openDrawer closedDrawer'); $(WorldInfo).toggleClass('openDrawer closedDrawer');
} }
} }
}); });
// read the state of right Nav Lock and apply to rightnav classlist // read the state of right Nav Lock and apply to rightnav classlist
$(RPanelPin).prop('checked', LoadLocalBool('NavLockOn')); $(RPanelPin).prop('checked', accountStorage.getItem('NavLockOn') == 'true');
if (LoadLocalBool('NavLockOn') == true) { if (accountStorage.getItem('NavLockOn') == 'true') {
//console.log('setting pin class via local var'); //console.log('setting pin class via local var');
$(RightNavPanel).addClass('pinnedOpen'); $(RightNavPanel).addClass('pinnedOpen');
$(RightNavDrawerIcon).addClass('drawerPinnedOpen'); $(RightNavDrawerIcon).addClass('drawerPinnedOpen');
@@ -806,8 +830,8 @@ export function initRossMods() {
$(RightNavDrawerIcon).addClass('drawerPinnedOpen'); $(RightNavDrawerIcon).addClass('drawerPinnedOpen');
} }
// read the state of left Nav Lock and apply to leftnav classlist // read the state of left Nav Lock and apply to leftnav classlist
$(LPanelPin).prop('checked', LoadLocalBool('LNavLockOn')); $(LPanelPin).prop('checked', accountStorage.getItem('LNavLockOn') === 'true');
if (LoadLocalBool('LNavLockOn') == true) { if (accountStorage.getItem('LNavLockOn') == 'true') {
//console.log('setting pin class via local var'); //console.log('setting pin class via local var');
$(LeftNavPanel).addClass('pinnedOpen'); $(LeftNavPanel).addClass('pinnedOpen');
$(LeftNavDrawerIcon).addClass('drawerPinnedOpen'); $(LeftNavDrawerIcon).addClass('drawerPinnedOpen');
@@ -819,8 +843,8 @@ export function initRossMods() {
} }
// read the state of left Nav Lock and apply to leftnav classlist // read the state of left Nav Lock and apply to leftnav classlist
$(WIPanelPin).prop('checked', LoadLocalBool('WINavLockOn')); $(WIPanelPin).prop('checked', accountStorage.getItem('WINavLockOn') === 'true');
if (LoadLocalBool('WINavLockOn') == true) { if (accountStorage.getItem('WINavLockOn') == 'true') {
//console.log('setting pin class via local var'); //console.log('setting pin class via local var');
$(WorldInfo).addClass('pinnedOpen'); $(WorldInfo).addClass('pinnedOpen');
$(WIDrawerIcon).addClass('drawerPinnedOpen'); $(WIDrawerIcon).addClass('drawerPinnedOpen');
@@ -835,22 +859,22 @@ export function initRossMods() {
//save state of Right nav being open or closed //save state of Right nav being open or closed
$('#rightNavDrawerIcon').on('click', function () { $('#rightNavDrawerIcon').on('click', function () {
if (!$('#rightNavDrawerIcon').hasClass('openIcon')) { if (!$('#rightNavDrawerIcon').hasClass('openIcon')) {
SaveLocal('NavOpened', 'true'); accountStorage.setItem('NavOpened', 'true');
} else { SaveLocal('NavOpened', 'false'); } } else { accountStorage.setItem('NavOpened', 'false'); }
}); });
//save state of Left nav being open or closed //save state of Left nav being open or closed
$('#leftNavDrawerIcon').on('click', function () { $('#leftNavDrawerIcon').on('click', function () {
if (!$('#leftNavDrawerIcon').hasClass('openIcon')) { if (!$('#leftNavDrawerIcon').hasClass('openIcon')) {
SaveLocal('LNavOpened', 'true'); accountStorage.setItem('LNavOpened', 'true');
} else { SaveLocal('LNavOpened', 'false'); } } else { accountStorage.setItem('LNavOpened', 'false'); }
}); });
//save state of Left nav being open or closed //save state of Left nav being open or closed
$('#WorldInfo').on('click', function () { $('#WorldInfo').on('click', function () {
if (!$('#WorldInfo').hasClass('openIcon')) { if (!$('#WorldInfo').hasClass('openIcon')) {
SaveLocal('WINavOpened', 'true'); accountStorage.setItem('WINavOpened', 'true');
} else { SaveLocal('WINavOpened', 'false'); } } else { accountStorage.setItem('WINavOpened', 'false'); }
}); });
var chatbarInFocus = false; var chatbarInFocus = false;
@@ -866,27 +890,60 @@ export function initRossMods() {
OpenNavPanels(); OpenNavPanels();
}, 300); }, 300);
$(SelectedCharacterTab).click(function () { SaveLocal('SelectedNavTab', 'rm_button_selected_ch'); }); $(SelectedCharacterTab).click(function () { accountStorage.setItem('SelectedNavTab', 'rm_button_selected_ch'); });
$('#rm_button_characters').click(function () { SaveLocal('SelectedNavTab', 'rm_button_characters'); }); $('#rm_button_characters').click(function () { accountStorage.setItem('SelectedNavTab', 'rm_button_characters'); });
// when a char is selected from the list, save them as the auto-load character for next page load // when a char is selected from the list, save them as the auto-load character for next page load
// when a char is selected from the list, save their name as the auto-load character for next page load // when a char is selected from the list, save their name as the auto-load character for next page load
$(document).on('click', '.character_select', function () { $(document).on('click', '.character_select', function () {
const characterId = $(this).attr('chid') || $(this).data('id'); const characterId = $(this).attr('data-chid');
setActiveCharacter(characterId); setActiveCharacter(characterId);
setActiveGroup(null); setActiveGroup(null);
saveSettingsDebounced(); saveSettingsDebounced();
}); });
$(document).on('click', '.group_select', function () { $(document).on('click', '.group_select', function () {
const groupId = $(this).attr('chid') || $(this).attr('grid') || $(this).data('id'); const groupId = $(this).attr('data-chid') || $(this).attr('data-grid');
setActiveCharacter(null); setActiveCharacter(null);
setActiveGroup(groupId); setActiveGroup(groupId);
saveSettingsDebounced(); saveSettingsDebounced();
}); });
const cssAutofit = CSS.supports('field-sizing', 'content');
if (cssAutofit) {
let lastHeight = chatBlock.offsetHeight;
const chatBlockResizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
if (entry.target !== chatBlock) {
continue;
}
const threshold = 1;
const newHeight = chatBlock.offsetHeight;
const deltaHeight = newHeight - lastHeight;
const isScrollAtBottom = Math.abs(chatBlock.scrollHeight - chatBlock.scrollTop - newHeight) <= threshold;
if (!isScrollAtBottom && Math.abs(deltaHeight) > threshold) {
chatBlock.scrollTop -= deltaHeight;
}
lastHeight = newHeight;
}
});
chatBlockResizeObserver.observe(chatBlock);
}
sendTextArea.addEventListener('input', () => { sendTextArea.addEventListener('input', () => {
saveUserInputDebounced();
if (cssAutofit) {
// Unset modifications made with a manual resize
sendTextArea.style.height = 'auto';
return;
}
const hasContent = sendTextArea.value !== ''; const hasContent = sendTextArea.value !== '';
const fitsCurrentSize = sendTextArea.scrollHeight <= sendTextArea.offsetHeight; const fitsCurrentSize = sendTextArea.scrollHeight <= sendTextArea.offsetHeight;
const isScrollbarShown = sendTextArea.clientWidth < sendTextArea.offsetWidth; const isScrollbarShown = sendTextArea.clientWidth < sendTextArea.offsetWidth;
@@ -894,7 +951,6 @@ export function initRossMods() {
const needsDebounce = hasContent && (fitsCurrentSize || (isScrollbarShown && isHalfScreenHeight)); const needsDebounce = hasContent && (fitsCurrentSize || (isScrollbarShown && isHalfScreenHeight));
if (needsDebounce) autoFitSendTextAreaDebounced(); if (needsDebounce) autoFitSendTextAreaDebounced();
else autoFitSendTextArea(); else autoFitSendTextArea();
saveUserInputDebounced();
}); });
restoreUserInput(); restoreUserInput();
@@ -962,6 +1018,14 @@ export function initRossMods() {
return false; return false;
} }
function isModifiedKeyboardEvent(event) {
return (event instanceof KeyboardEvent &&
event.shiftKey ||
event.ctrlKey ||
event.altKey ||
event.metaKey);
}
$(document).on('keydown', async function (event) { $(document).on('keydown', async function (event) {
await processHotkeys(event.originalEvent); await processHotkeys(event.originalEvent);
}); });
@@ -1029,14 +1093,21 @@ export function initRossMods() {
// Ctrl+Enter for Regeneration Last Response. If editing, accept the edits instead // Ctrl+Enter for Regeneration Last Response. If editing, accept the edits instead
if (event.ctrlKey && event.key == 'Enter') { if (event.ctrlKey && event.key == 'Enter') {
const editMesDone = $('.mes_edit_done:visible'); const editMesDone = $('.mes_edit_done:visible');
const reasoningMesDone = $('.mes_reasoning_edit_done:visible');
if (editMesDone.length > 0) { if (editMesDone.length > 0) {
console.debug('Accepting edits with Ctrl+Enter'); console.debug('Accepting edits with Ctrl+Enter');
$('#send_textarea').focus(); $('#send_textarea').trigger('focus');
editMesDone.trigger('click'); editMesDone.trigger('click');
return; return;
} else if (is_send_press == false) { } else if (reasoningMesDone.length > 0) {
console.debug('Accepting edits with Ctrl+Enter');
$('#send_textarea').trigger('focus');
reasoningMesDone.trigger('click');
return;
}
else if (is_send_press == false) {
const skipConfirmKey = 'RegenerateWithCtrlEnter'; const skipConfirmKey = 'RegenerateWithCtrlEnter';
const skipConfirm = LoadLocalBool(skipConfirmKey); const skipConfirm = accountStorage.getItem(skipConfirmKey) === 'true';
function doRegenerate() { function doRegenerate() {
console.debug('Regenerating with Ctrl+Enter'); console.debug('Regenerating with Ctrl+Enter');
$('#option_regenerate').trigger('click'); $('#option_regenerate').trigger('click');
@@ -1048,13 +1119,15 @@ export function initRossMods() {
let regenerateWithCtrlEnter = false; let regenerateWithCtrlEnter = false;
const result = await Popup.show.confirm('Regenerate Message', 'Are you sure you want to regenerate the latest message?', { const result = await Popup.show.confirm('Regenerate Message', 'Are you sure you want to regenerate the latest message?', {
customInputs: [{ id: 'regenerateWithCtrlEnter', label: 'Don\'t ask again' }], customInputs: [{ id: 'regenerateWithCtrlEnter', label: 'Don\'t ask again' }],
onClose: (popup) => regenerateWithCtrlEnter = popup.inputResults.get('regenerateWithCtrlEnter') ?? false, onClose: (popup) => {
regenerateWithCtrlEnter = popup.inputResults.get('regenerateWithCtrlEnter') ?? false;
},
}); });
if (!result) { if (!result) {
return; return;
} }
SaveLocal(skipConfirmKey, regenerateWithCtrlEnter); accountStorage.setItem(skipConfirmKey, String(regenerateWithCtrlEnter));
doRegenerate(); doRegenerate();
} }
return; return;
@@ -1076,9 +1149,10 @@ export function initRossMods() {
$('#send_textarea').val() === '' && $('#send_textarea').val() === '' &&
$('#character_popup').css('display') === 'none' && $('#character_popup').css('display') === 'none' &&
$('#shadow_select_chat_popup').css('display') === 'none' && $('#shadow_select_chat_popup').css('display') === 'none' &&
!isInputElementInFocus() !isInputElementInFocus() &&
!isModifiedKeyboardEvent(event)
) { ) {
$('.swipe_left:last').click(); $('.swipe_left:last').trigger('click', { source: 'keyboard', repeated: event.repeat });
return; return;
} }
} }
@@ -1089,9 +1163,10 @@ export function initRossMods() {
$('#send_textarea').val() === '' && $('#send_textarea').val() === '' &&
$('#character_popup').css('display') === 'none' && $('#character_popup').css('display') === 'none' &&
$('#shadow_select_chat_popup').css('display') === 'none' && $('#shadow_select_chat_popup').css('display') === 'none' &&
!isInputElementInFocus() !isInputElementInFocus() &&
!isModifiedKeyboardEvent(event)
) { ) {
$('.swipe_right:last').click(); $('.swipe_right:last').trigger('click', { source: 'keyboard', repeated: event.repeat });
return; return;
} }
} }

View File

@@ -299,7 +299,7 @@ function loadSettings() {
$('#extension_floating_role').val(chat_metadata[metadata_keys.role]); $('#extension_floating_role').val(chat_metadata[metadata_keys.role]);
$(`input[name="extension_floating_position"][value="${chat_metadata[metadata_keys.position]}"]`).prop('checked', true); $(`input[name="extension_floating_position"][value="${chat_metadata[metadata_keys.position]}"]`).prop('checked', true);
if (extension_settings.note.chara && getContext().characterId) { if (extension_settings.note.chara && getContext().characterId !== undefined) {
const charaNote = extension_settings.note.chara.find((e) => e.name === getCharaFilename()); const charaNote = extension_settings.note.chara.find((e) => e.name === getCharaFilename());
$('#extension_floating_chara').val(charaNote ? charaNote.prompt : ''); $('#extension_floating_chara').val(charaNote ? charaNote.prompt : '');
@@ -389,49 +389,49 @@ export function setFloatingPrompt() {
} }
function onANMenuItemClick() { function onANMenuItemClick() {
if (selected_group || this_chid) { if (!selected_group && this_chid === undefined) {
//show AN if it's hidden
if ($('#floatingPrompt').css('display') !== 'flex') {
$('#floatingPrompt').addClass('resizing');
$('#floatingPrompt').css('display', 'flex');
$('#floatingPrompt').css('opacity', 0.0);
$('#floatingPrompt').transition({
opacity: 1.0,
duration: animation_duration,
}, async function () {
await delay(50);
$('#floatingPrompt').removeClass('resizing');
});
//auto-open the main AN inline drawer
if ($('#ANBlockToggle')
.siblings('.inline-drawer-content')
.css('display') !== 'block') {
$('#floatingPrompt').addClass('resizing');
$('#ANBlockToggle').click();
}
} else {
//hide AN if it's already displayed
$('#floatingPrompt').addClass('resizing');
$('#floatingPrompt').transition({
opacity: 0.0,
duration: animation_duration,
},
async function () {
await delay(50);
$('#floatingPrompt').removeClass('resizing');
});
setTimeout(function () {
$('#floatingPrompt').hide();
}, animation_duration);
}
//duplicate options menu close handler from script.js
//because this listener takes priority
$('#options').stop().fadeOut(animation_duration);
} else {
toastr.warning(t`Select a character before trying to use Author's Note`, '', { timeOut: 2000 }); toastr.warning(t`Select a character before trying to use Author's Note`, '', { timeOut: 2000 });
return;
} }
//show AN if it's hidden
if ($('#floatingPrompt').css('display') !== 'flex') {
$('#floatingPrompt').addClass('resizing');
$('#floatingPrompt').css('display', 'flex');
$('#floatingPrompt').css('opacity', 0.0);
$('#floatingPrompt').transition({
opacity: 1.0,
duration: animation_duration,
}, async function () {
await delay(50);
$('#floatingPrompt').removeClass('resizing');
});
//auto-open the main AN inline drawer
if ($('#ANBlockToggle')
.siblings('.inline-drawer-content')
.css('display') !== 'block') {
$('#floatingPrompt').addClass('resizing');
$('#ANBlockToggle').click();
}
} else {
//hide AN if it's already displayed
$('#floatingPrompt').addClass('resizing');
$('#floatingPrompt').transition({
opacity: 0.0,
duration: animation_duration,
}, async function () {
await delay(50);
$('#floatingPrompt').removeClass('resizing');
});
setTimeout(function () {
$('#floatingPrompt').hide();
}, animation_duration);
}
//duplicate options menu close handler from script.js
//because this listener takes priority
$('#options').stop().fadeOut(animation_duration);
} }
async function onChatChanged() { async function onChatChanged() {
@@ -440,13 +440,13 @@ async function onChatChanged() {
const context = getContext(); const context = getContext();
// Disable the chara note if in a group // Disable the chara note if in a group
$('#extension_floating_chara').prop('disabled', context.groupId ? true : false); $('#extension_floating_chara').prop('disabled', !!context.groupId);
const tokenCounter1 = chat_metadata[metadata_keys.prompt] ? await getTokenCountAsync(chat_metadata[metadata_keys.prompt]) : 0; const tokenCounter1 = chat_metadata[metadata_keys.prompt] ? await getTokenCountAsync(chat_metadata[metadata_keys.prompt]) : 0;
$('#extension_floating_prompt_token_counter').text(tokenCounter1); $('#extension_floating_prompt_token_counter').text(tokenCounter1);
let tokenCounter2; let tokenCounter2;
if (extension_settings.note.chara && context.characterId) { if (extension_settings.note.chara && context.characterId !== undefined) {
const charaNote = extension_settings.note.chara.find((e) => e.name === getCharaFilename()); const charaNote = extension_settings.note.chara.find((e) => e.name === getCharaFilename());
if (charaNote) { if (charaNote) {
@@ -566,7 +566,7 @@ export function initAuthorsNote() {
namedArgumentList: [], namedArgumentList: [],
unnamedArgumentList: [ unnamedArgumentList: [
new SlashCommandArgument( new SlashCommandArgument(
'position', [ARGUMENT_TYPE.STRING], false, false, null, ['system', 'user', 'assistant'], 'role', [ARGUMENT_TYPE.STRING], false, false, null, ['system', 'user', 'assistant'],
), ),
], ],
helpString: ` helpString: `

View File

@@ -12,6 +12,7 @@ const LIST_METADATA_KEY = 'chat_backgrounds';
export let background_settings = { export let background_settings = {
name: '__transparent.png', name: '__transparent.png',
url: generateUrlParameter('__transparent.png', false), url: generateUrlParameter('__transparent.png', false),
fitting: 'classic',
}; };
export function loadBackgroundSettings(settings) { export function loadBackgroundSettings(settings) {
@@ -19,7 +20,12 @@ export function loadBackgroundSettings(settings) {
if (!backgroundSettings || !backgroundSettings.name || !backgroundSettings.url) { if (!backgroundSettings || !backgroundSettings.name || !backgroundSettings.url) {
backgroundSettings = background_settings; backgroundSettings = background_settings;
} }
if (!backgroundSettings.fitting) {
backgroundSettings.fitting = 'classic';
}
setBackground(backgroundSettings.name, backgroundSettings.url); setBackground(backgroundSettings.name, backgroundSettings.url);
setFittingClass(backgroundSettings.fitting);
$('#background_fitting').val(backgroundSettings.fitting);
} }
/** /**
@@ -90,8 +96,13 @@ function highlightLockedBackground() {
}); });
} }
/**
* Locks the background for the current chat
* @param {Event} e Click event
* @returns {string} Empty string
*/
function onLockBackgroundClick(e) { function onLockBackgroundClick(e) {
e.stopPropagation(); e?.stopPropagation();
const chatName = getCurrentChatId(); const chatName = getCurrentChatId();
@@ -100,7 +111,7 @@ function onLockBackgroundClick(e) {
return ''; return '';
} }
const relativeBgImage = getUrlParameter(this); const relativeBgImage = getUrlParameter(this) ?? background_settings.url;
saveBackgroundMetadata(relativeBgImage); saveBackgroundMetadata(relativeBgImage);
setCustomBackground(); setCustomBackground();
@@ -108,8 +119,13 @@ function onLockBackgroundClick(e) {
return ''; return '';
} }
/**
* Locks the background for the current chat
* @param {Event} e Click event
* @returns {string} Empty string
*/
function onUnlockBackgroundClick(e) { function onUnlockBackgroundClick(e) {
e.stopPropagation(); e?.stopPropagation();
removeBackgroundMetadata(); removeBackgroundMetadata();
unsetCustomBackground(); unsetCustomBackground();
highlightLockedBackground(); highlightLockedBackground();
@@ -333,6 +349,14 @@ async function autoBackgroundCommand() {
const bestMatch = fuse.search(reply, { limit: 1 }); const bestMatch = fuse.search(reply, { limit: 1 });
if (bestMatch.length == 0) { if (bestMatch.length == 0) {
for (const option of options) {
if (String(reply).toLowerCase().includes(option.text.toLowerCase())) {
console.debug('Fallback choosing background:', option);
option.element.click();
return '';
}
}
toastr.warning('No match found. Please try again.'); toastr.warning('No match found. Please try again.');
return ''; return '';
} }
@@ -462,6 +486,18 @@ function highlightNewBackground(bg) {
flashHighlight(newBg); flashHighlight(newBg);
} }
/**
* Sets the fitting class for the background element
* @param {string} fitting Fitting type
*/
function setFittingClass(fitting) {
const backgrounds = $('#bg1, #bg_custom');
for (const option of ['cover', 'contain', 'stretch', 'center']) {
backgrounds.toggleClass(option, option === fitting);
}
background_settings.fitting = fitting;
}
function onBackgroundFilterInput() { function onBackgroundFilterInput() {
const filterValue = String($(this).val()).toLowerCase(); const filterValue = String($(this).val()).toLowerCase();
$('#bg_menu_content > div').each(function () { $('#bg_menu_content > div').each(function () {
@@ -487,12 +523,12 @@ export function initBackgrounds() {
$('#add_bg_button').on('change', onBackgroundUploadSelected); $('#add_bg_button').on('change', onBackgroundUploadSelected);
$('#bg-filter').on('input', onBackgroundFilterInput); $('#bg-filter').on('input', onBackgroundFilterInput);
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'lockbg', SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'lockbg',
callback: onLockBackgroundClick, callback: () => onLockBackgroundClick(new CustomEvent('click')),
aliases: ['bglock'], aliases: ['bglock'],
helpString: 'Locks a background for the currently selected chat', helpString: 'Locks a background for the currently selected chat',
})); }));
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'unlockbg', SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'unlockbg',
callback: onUnlockBackgroundClick, callback: () => onUnlockBackgroundClick(new CustomEvent('click')),
aliases: ['bgunlock'], aliases: ['bgunlock'],
helpString: 'Unlocks a background for the currently selected chat', helpString: 'Unlocks a background for the currently selected chat',
})); }));
@@ -502,4 +538,9 @@ export function initBackgrounds() {
helpString: 'Automatically changes the background based on the chat context using the AI request prompt', helpString: 'Automatically changes the background based on the chat context using the AI request prompt',
})); }));
$('#background_fitting').on('input', function () {
background_settings.fitting = String($(this).val());
setFittingClass(background_settings.fitting);
saveSettingsDebounced();
});
} }

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