Merge pull request #2446 from SillyTavern/staging Staging
Signed| @@ -8,3 +8,5 @@ Start.bat | |||
| 8 | cloudflared.exe | 8 | cloudflared.exe |
| 9 | access.log | 9 | access.log |
| 10 | /data | 10 | /data |
| 11 | /cache | ||
| 12 | .DS_Store | ||
| @@ -5,7 +5,7 @@ end_of_line = lf | |||
| 5 | insert_final_newline = true | 5 | insert_final_newline = true |
| 6 | trim_trailing_whitespace = true | 6 | trim_trailing_whitespace = true |
| 7 | 7 | ||
| 8 | [*.{js, conf, json}] | 8 | [*.{js, conf, json, css, less, html}] |
| 9 | charset = utf-8 | 9 | charset = utf-8 |
| 10 | indent_style = space | 10 | indent_style = space |
| 11 | indent_size = 4 | 11 | indent_size = 4 |
| @@ -1,7 +1,6 @@ | |||
| 1 | name: Update i18n data | 1 | name: Update i18n data |
| 2 | 2 | ||
| 3 | on: | 3 | on: workflow_dispatch |
| 4 | workflow_dispatch: | ||
| 5 | 4 | ||
| 6 | jobs: | 5 | jobs: |
| 7 | build: | 6 | build: |
| @@ -48,3 +48,4 @@ public/css/user.css | |||
| 48 | /plugins/ | 48 | /plugins/ |
| 49 | /data | 49 | /data |
| 50 | /default/scaffold | 50 | /default/scaffold |
| 51 | public/scripts/extensions/third-party | ||
| @@ -5,4 +5,6 @@ node_modules/ | |||
| 5 | secrets.json | 5 | secrets.json |
| 6 | /dist | 6 | /dist |
| 7 | /backups/ | 7 | /backups/ |
| 8 | /data | ||
| 9 | /cache | ||
| 8 | access.log | 10 | access.log |
| @@ -4,7 +4,8 @@ | |||
| 4 | // List of extensions which should be recommended for users of this workspace. | 4 | // List of extensions which should be recommended for users of this workspace. |
| 5 | "recommendations": [ | 5 | "recommendations": [ |
| 6 | "dbaeumer.vscode-eslint", | 6 | "dbaeumer.vscode-eslint", |
| 7 | "EditorConfig.EditorConfig" | 7 | "EditorConfig.EditorConfig", |
| 8 | "mrcrowl.easy-less" | ||
| 8 | ], | 9 | ], |
| 9 | // List of extensions recommended by VS Code that should not be recommended for users of this workspace. | 10 | // List of extensions recommended by VS Code that should not be recommended for users of this workspace. |
| 10 | "unwantedRecommendations": [] | 11 | "unwantedRecommendations": [] |
| @@ -12,6 +12,14 @@ | |||
| 12 | "type": "theme" | 12 | "type": "theme" |
| 13 | }, | 13 | }, |
| 14 | { | 14 | { |
| 15 | "filename": "themes/Celestial Macaron.json", | ||
| 16 | "type": "theme" | ||
| 17 | }, | ||
| 18 | { | ||
| 19 | "filename": "themes/Dark V 1.0.json", | ||
| 20 | "type": "theme" | ||
| 21 | }, | ||
| 22 | { | ||
| 15 | "filename": "backgrounds/__transparent.png", | 23 | "filename": "backgrounds/__transparent.png", |
| 16 | "type": "background" | 24 | "type": "background" |
| 17 | }, | 25 | }, |
| @@ -476,7 +484,11 @@ | |||
| 476 | "type": "context" | 484 | "type": "context" |
| 477 | }, | 485 | }, |
| 478 | { | 486 | { |
| 479 | "filename": "presets/context/DreamGen Role-Play V1.json", | 487 | "filename": "presets/context/DreamGen Role-Play V1 ChatML.json", |
| 488 | "type": "context" | ||
| 489 | }, | ||
| 490 | { | ||
| 491 | "filename": "presets/context/DreamGen Role-Play V1 Llama3.json", | ||
| 480 | "type": "context" | 492 | "type": "context" |
| 481 | }, | 493 | }, |
| 482 | { | 494 | { |
| @@ -556,7 +568,11 @@ | |||
| 556 | "type": "instruct" | 568 | "type": "instruct" |
| 557 | }, | 569 | }, |
| 558 | { | 570 | { |
| 559 | "filename": "presets/instruct/DreamGen Role-Play V1.json", | 571 | "filename": "presets/instruct/DreamGen Role-Play V1 ChatML.json", |
| 572 | "type": "instruct" | ||
| 573 | }, | ||
| 574 | { | ||
| 575 | "filename": "presets/instruct/DreamGen Role-Play V1 Llama3.json", | ||
| 560 | "type": "instruct" | 576 | "type": "instruct" |
| 561 | }, | 577 | }, |
| 562 | { | 578 | { |
| @@ -8,5 +8,5 @@ | |||
| 8 | "trim_sentences": true, | 8 | "trim_sentences": true, |
| 9 | "include_newline": false, | 9 | "include_newline": false, |
| 10 | "single_line": false, | 10 | "single_line": false, |
| 11 | "name": "DreamGen Role-Play V1" | 11 | "name": "DreamGen Role-Play V1 ChatML" |
| 12 | } | 12 | } |
| 12 | \ No newline at end of file | 12 | \ No newline at end of file |
| @@ -0,0 +1,12 @@ | |||
| 1 | { | ||
| 2 | "story_string": "<|start_header_id|>system<|end_header_id|>\n\n{{#if system}}{{system}}\n\n\n{{/if}}## Overall plot description:\n\n{{#if scenario}}{{scenario}}{{else}}Conversation between {{char}} and {{user}}.{{/if}}{{#if wiBefore}}\n\n{{wiBefore}}{{/if}}\n\n\n## Characters:\n\n### {{char}}\n\n{{#if description}}{{description}}\n\n{{/if}}{{#if personality}}{{personality}}\n\n{{/if}}### {{user}}\n\n{{#if persona}}{{persona}}{{else}}{{user}} is the protagonist of the role-play.{{/if}}{{#if wiAfter}}\n\n{{wiAfter}}{{/if}}{{#if mesExamples}}\n\n{{mesExamples}}{{/if}}", | ||
| 3 | "example_separator": "<|eot_id|>\n<|start_header_id|>user<|end_header_id|>\n\nWrite an example narrative / conversation that is not part of the main story.", | ||
| 4 | "chat_start": "<|eot_id|>\n<|start_header_id|>user<|end_header_id|>\n\nStart the role-play between {{char}} and {{user}}.", | ||
| 5 | "use_stop_strings": false, | ||
| 6 | "allow_jailbreak": false, | ||
| 7 | "always_force_name2": false, | ||
| 8 | "trim_sentences": true, | ||
| 9 | "include_newline": false, | ||
| 10 | "single_line": false, | ||
| 11 | "name": "DreamGen Role-Play V1 Llama3" | ||
| 12 | } | ||
| \ No newline at end of file | 12 | \ No newline at end of file | |
| @@ -20,5 +20,5 @@ | |||
| 20 | "user_alignment_message": "", | 20 | "user_alignment_message": "", |
| 21 | "system_same_as_user": true, | 21 | "system_same_as_user": true, |
| 22 | "last_system_sequence": "", | 22 | "last_system_sequence": "", |
| 23 | "name": "DreamGen Role-Play V1" | 23 | "name": "DreamGen Role-Play V1 ChatML" |
| 24 | } | 24 | } |
| @@ -0,0 +1,18 @@ | |||
| 1 | { | ||
| 2 | "system_prompt": "You are an intelligent, skilled, versatile writer.\n\nYour task is to write a role-play based on the information below.", | ||
| 3 | "input_sequence": "<|eot_id|>\n<|start_header_id|>writer character: {{user}}<|end_header_id|>\n\n", | ||
| 4 | "output_sequence": "<|eot_id|>\n<|start_header_id|>writer character: {{char}}<|end_header_id|>\n\n", | ||
| 5 | "first_output_sequence": "", | ||
| 6 | "last_output_sequence": "", | ||
| 7 | "system_sequence_prefix": "", | ||
| 8 | "system_sequence_suffix": "", | ||
| 9 | "stop_sequence": "", | ||
| 10 | "separator_sequence": "", | ||
| 11 | "wrap": false, | ||
| 12 | "macro": true, | ||
| 13 | "names": false, | ||
| 14 | "names_force_groups": false, | ||
| 15 | "activation_regex": "", | ||
| 16 | "skip_examples": false, | ||
| 17 | "name": "DreamGen Role-Play V1 Llama3" | ||
| 18 | } | ||
| \ No newline at end of file | 18 | \ No newline at end of file | |
| @@ -1,7 +1,7 @@ | |||
| 1 | { | 1 | { |
| 2 | "name": "Cappuccino", | 2 | "name": "Cappuccino", |
| 3 | "blur_strength": 3, | 3 | "blur_strength": 3, |
| 4 | "main_text_color": "rgba(255, 255, 255, 1)", | 4 | "main_text_color": "rgba(235, 235, 235, 1)", |
| 5 | "italics_text_color": "rgba(230, 210, 190, 1)", | 5 | "italics_text_color": "rgba(230, 210, 190, 1)", |
| 6 | "underline_text_color": "rgba(205, 180, 160, 1)", | 6 | "underline_text_color": "rgba(205, 180, 160, 1)", |
| 7 | "quote_text_color": "rgba(165, 140, 115, 1)", | 7 | "quote_text_color": "rgba(165, 140, 115, 1)", |
| @@ -0,0 +1,37 @@ | |||
| 1 | { | ||
| 2 | "name": "Celestial Macaron", | ||
| 3 | "blur_strength": 10, | ||
| 4 | "main_text_color": "rgba(229, 175, 162, 1)", | ||
| 5 | "italics_text_color": "rgba(146, 147, 161, 1)", | ||
| 6 | "underline_text_color": "rgba(157, 215, 198, 1)", | ||
| 7 | "quote_text_color": "rgba(197, 202, 206, 1)", | ||
| 8 | "blur_tint_color": "rgba(23, 36, 55, 0.9)", | ||
| 9 | "chat_tint_color": "rgba(18, 26, 40, 0.9)", | ||
| 10 | "user_mes_blur_tint_color": "rgba(51, 67, 90, 0.7)", | ||
| 11 | "bot_mes_blur_tint_color": "rgba(23, 36, 55, 0.75)", | ||
| 12 | "shadow_color": "rgba(0, 0, 0, 0.3)", | ||
| 13 | "shadow_width": 1, | ||
| 14 | "border_color": "rgba(60, 74, 110, 0.93)", | ||
| 15 | "font_scale": 1, | ||
| 16 | "fast_ui_mode": false, | ||
| 17 | "waifuMode": false, | ||
| 18 | "avatar_style": 0, | ||
| 19 | "chat_display": 1, | ||
| 20 | "noShadows": true, | ||
| 21 | "chat_width": 58, | ||
| 22 | "timer_enabled": true, | ||
| 23 | "timestamps_enabled": true, | ||
| 24 | "timestamp_model_icon": false, | ||
| 25 | "mesIDDisplay_enabled": true, | ||
| 26 | "hideChatAvatars_enabled": false, | ||
| 27 | "message_token_count_enabled": true, | ||
| 28 | "expand_message_actions": true, | ||
| 29 | "enableZenSliders": false, | ||
| 30 | "enableLabMode": false, | ||
| 31 | "hotswap_enabled": true, | ||
| 32 | "custom_css": "", | ||
| 33 | "bogus_folders": true, | ||
| 34 | "zoomed_avatar_magnification": false, | ||
| 35 | "reduced_motion": false, | ||
| 36 | "compact_input_area": true | ||
| 37 | } | ||
| \ No newline at end of file | 37 | \ No newline at end of file | |
| @@ -0,0 +1,37 @@ | |||
| 1 | { | ||
| 2 | "name": "Dark V 1.0", | ||
| 3 | "blur_strength": 13, | ||
| 4 | "main_text_color": "rgba(207, 207, 197, 1)", | ||
| 5 | "italics_text_color": "rgba(145, 145, 145, 1)", | ||
| 6 | "underline_text_color": "rgba(145, 145, 145, 1)", | ||
| 7 | "quote_text_color": "rgba(198, 193, 151, 1)", | ||
| 8 | "blur_tint_color": "rgba(29, 33, 40, 0.9)", | ||
| 9 | "chat_tint_color": "rgba(29, 33, 40, 0.9)", | ||
| 10 | "user_mes_blur_tint_color": "rgba(29, 33, 40, 0.9)", | ||
| 11 | "bot_mes_blur_tint_color": "rgba(29, 33, 40, 0.9)", | ||
| 12 | "shadow_color": "rgba(0, 0, 0, 0.9)", | ||
| 13 | "shadow_width": 2, | ||
| 14 | "border_color": "rgba(0, 0, 0, 1)", | ||
| 15 | "font_scale": 1, | ||
| 16 | "fast_ui_mode": false, | ||
| 17 | "waifuMode": false, | ||
| 18 | "avatar_style": 0, | ||
| 19 | "chat_display": 0, | ||
| 20 | "noShadows": false, | ||
| 21 | "chat_width": 55, | ||
| 22 | "timer_enabled": false, | ||
| 23 | "timestamps_enabled": false, | ||
| 24 | "timestamp_model_icon": false, | ||
| 25 | "mesIDDisplay_enabled": false, | ||
| 26 | "hideChatAvatars_enabled": false, | ||
| 27 | "message_token_count_enabled": false, | ||
| 28 | "expand_message_actions": false, | ||
| 29 | "enableZenSliders": false, | ||
| 30 | "enableLabMode": false, | ||
| 31 | "hotswap_enabled": true, | ||
| 32 | "custom_css": "", | ||
| 33 | "bogus_folders": true, | ||
| 34 | "zoomed_avatar_magnification": true, | ||
| 35 | "reduced_motion": true, | ||
| 36 | "compact_input_area": false | ||
| 37 | } | ||
| \ No newline at end of file | 37 | \ No newline at end of file | |
| @@ -15,6 +15,11 @@ | |||
| 15 | "**/node_modules/*", | 15 | "**/node_modules/*", |
| 16 | "public/lib", | 16 | "public/lib", |
| 17 | "backups/*", | 17 | "backups/*", |
| 18 | "data/*" | 18 | "data/*", |
| 19 | "**/dist/*", | ||
| 20 | "dist/*", | ||
| 21 | "cache/*", | ||
| 22 | "src/tokenizers/*", | ||
| 23 | "docker/*", | ||
| 19 | ] | 24 | ] |
| 20 | } | 25 | } |
| @@ -1,12 +1,12 @@ | |||
| 1 | { | 1 | { |
| 2 | "name": "sillytavern", | 2 | "name": "sillytavern", |
| 3 | "version": "1.12.1", | 3 | "version": "1.12.2", |
| 4 | "lockfileVersion": 3, | 4 | "lockfileVersion": 3, |
| 5 | "requires": true, | 5 | "requires": true, |
| 6 | "packages": { | 6 | "packages": { |
| 7 | "": { | 7 | "": { |
| 8 | "name": "sillytavern", | 8 | "name": "sillytavern", |
| 9 | "version": "1.12.1", | 9 | "version": "1.12.2", |
| 10 | "hasInstallScript": true, | 10 | "hasInstallScript": true, |
| 11 | "license": "AGPL-3.0", | 11 | "license": "AGPL-3.0", |
| 12 | "dependencies": { | 12 | "dependencies": { |
| @@ -70,7 +70,7 @@ | |||
| 70 | "type": "git", | 70 | "type": "git", |
| 71 | "url": "https://github.com/SillyTavern/SillyTavern.git" | 71 | "url": "https://github.com/SillyTavern/SillyTavern.git" |
| 72 | }, | 72 | }, |
| 73 | "version": "1.12.1", | 73 | "version": "1.12.2", |
| 74 | "scripts": { | 74 | "scripts": { |
| 75 | "start": "node server.js", | 75 | "start": "node server.js", |
| 76 | "start:no-csrf": "node server.js --disableCsrf", | 76 | "start:no-csrf": "node server.js --disableCsrf", |
| @@ -0,0 +1,122 @@ | |||
| 1 | /* Fade animations with opacity */ | ||
| 2 | @keyframes fade-in { | ||
| 3 | 0% { | ||
| 4 | opacity: 0; | ||
| 5 | } | ||
| 6 | |||
| 7 | 100% { | ||
| 8 | opacity: 1; | ||
| 9 | } | ||
| 10 | } | ||
| 11 | |||
| 12 | @keyframes fade-out { | ||
| 13 | 0% { | ||
| 14 | opacity: 1; | ||
| 15 | } | ||
| 16 | |||
| 17 | 100% { | ||
| 18 | opacity: 0; | ||
| 19 | } | ||
| 20 | } | ||
| 21 | |||
| 22 | /* Pop animations with opacity and vertical scaling */ | ||
| 23 | @keyframes pop-in { | ||
| 24 | 0% { | ||
| 25 | opacity: 0; | ||
| 26 | transform: scaleY(0); | ||
| 27 | } | ||
| 28 | |||
| 29 | /* Make the scaling faster on pop-in, otherwise it looks a bit weird */ | ||
| 30 | 33% { | ||
| 31 | transform: scaleY(1); | ||
| 32 | } | ||
| 33 | |||
| 34 | 100% { | ||
| 35 | opacity: 1; | ||
| 36 | transform: scaleY(1); | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | @keyframes pop-out { | ||
| 41 | 0% { | ||
| 42 | opacity: 1; | ||
| 43 | transform: scaleY(1); | ||
| 44 | } | ||
| 45 | |||
| 46 | 100% { | ||
| 47 | opacity: 0; | ||
| 48 | transform: scaleY(0); | ||
| 49 | } | ||
| 50 | } | ||
| 51 | |||
| 52 | /* Flashing for highlighting animation */ | ||
| 53 | @keyframes flash { | ||
| 54 | |||
| 55 | 20%, | ||
| 56 | 60%, | ||
| 57 | 100% { | ||
| 58 | opacity: 1; | ||
| 59 | } | ||
| 60 | |||
| 61 | 0%, | ||
| 62 | 40%, | ||
| 63 | 80% { | ||
| 64 | opacity: 0.2; | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | /* Pulsing highlight, slightly resizing the element */ | ||
| 69 | @keyframes pulse { | ||
| 70 | from { | ||
| 71 | transform: scale(1); | ||
| 72 | filter: brightness(1.1); | ||
| 73 | } | ||
| 74 | |||
| 75 | to { | ||
| 76 | transform: scale(1.01); | ||
| 77 | filter: brightness(1.3); | ||
| 78 | } | ||
| 79 | } | ||
| 80 | |||
| 81 | /* Ellipsis animation */ | ||
| 82 | @keyframes ellipsis { | ||
| 83 | 0% { | ||
| 84 | content: "" | ||
| 85 | } | ||
| 86 | |||
| 87 | 25% { | ||
| 88 | content: "." | ||
| 89 | } | ||
| 90 | |||
| 91 | 50% { | ||
| 92 | content: ".." | ||
| 93 | } | ||
| 94 | |||
| 95 | 75% { | ||
| 96 | content: "..." | ||
| 97 | } | ||
| 98 | } | ||
| 99 | |||
| 100 | /* HEINOUS */ | ||
| 101 | @keyframes infinite-spinning { | ||
| 102 | from { | ||
| 103 | transform: rotate(0deg); | ||
| 104 | } | ||
| 105 | |||
| 106 | to { | ||
| 107 | transform: rotate(360deg); | ||
| 108 | } | ||
| 109 | } | ||
| 110 | |||
| 111 | /* STscript animation */ | ||
| 112 | @keyframes script_progress_pulse { | ||
| 113 | |||
| 114 | 0%, | ||
| 115 | 100% { | ||
| 116 | border-top-color: var(--progColor); | ||
| 117 | } | ||
| 118 | |||
| 119 | 50% { | ||
| 120 | border-top-color: var(--progFlashColor); | ||
| 121 | } | ||
| 122 | } | ||
| @@ -36,7 +36,6 @@ label[for="extensions_autoconnect"] { | |||
| 36 | 36 | ||
| 37 | .extensions_info { | 37 | .extensions_info { |
| 38 | text-align: left; | 38 | text-align: left; |
| 39 | margin: 0 1em; | ||
| 40 | } | 39 | } |
| 41 | 40 | ||
| 42 | .extensions_info h3 { | 41 | .extensions_info h3 { |
| @@ -97,114 +96,11 @@ input.extension_missing[type="checkbox"] { | |||
| 97 | flex-direction: column; | 96 | flex-direction: column; |
| 98 | } | 97 | } |
| 99 | 98 | ||
| 100 | /** LEFT COLUMN **/ | 99 | /* Fixes order of settings for extensions */ |
| 101 | /* Must be always on top */ | 100 | .extension_container { |
| 102 | #extensions_settings>#assets_ui { | 101 | display: contents; |
| 103 | order: -1; | ||
| 104 | } | ||
| 105 | |||
| 106 | #extensions_settings>.expression_settings { | ||
| 107 | order: 2; | ||
| 108 | } | ||
| 109 | |||
| 110 | #extensions_settings>.background_settings { | ||
| 111 | order: 3; | ||
| 112 | } | ||
| 113 | |||
| 114 | #extensions_settings>.sd_settings { | ||
| 115 | order: 4; | ||
| 116 | } | ||
| 117 | |||
| 118 | #extensions_settings>#tts_settings { | ||
| 119 | order: 5; | ||
| 120 | } | ||
| 121 | |||
| 122 | #extensions_settings>#rvc_settings { | ||
| 123 | order: 6; | ||
| 124 | } | ||
| 125 | |||
| 126 | #extensions_settings>.objective-settings { | ||
| 127 | order: 7; | ||
| 128 | } | ||
| 129 | |||
| 130 | #extensions_settings>#speech_recognition_settings { | ||
| 131 | order: 8; | ||
| 132 | } | ||
| 133 | |||
| 134 | #extensions_settings>#audio_settings { | ||
| 135 | order: 9; | ||
| 136 | } | ||
| 137 | |||
| 138 | /** RIGHT COLUMN **/ | ||
| 139 | #extensions_settings2>.translation_settings { | ||
| 140 | order: 1; | ||
| 141 | } | ||
| 142 | |||
| 143 | #extensions_settings2>.caption_settings { | ||
| 144 | order: 2; | ||
| 145 | } | ||
| 146 | |||
| 147 | #extensions_settings2>.quickReplySettings { | ||
| 148 | order: 3; | ||
| 149 | } | ||
| 150 | |||
| 151 | #extensions_settings2>.idle-settings { | ||
| 152 | order: 4; | ||
| 153 | } | ||
| 154 | |||
| 155 | #extensions_settings2>#memory_settings { | ||
| 156 | order: 5; | ||
| 157 | } | ||
| 158 | |||
| 159 | #extensions_settings2>.hypebot_settings { | ||
| 160 | order: 6; | ||
| 161 | } | ||
| 162 | |||
| 163 | #extensions_settings2>.regex_settings { | ||
| 164 | order: 7; | ||
| 165 | } | ||
| 166 | |||
| 167 | #extensions_settings2>.vectors_settings { | ||
| 168 | order: 8; | ||
| 169 | } | ||
| 170 | |||
| 171 | #extensions_settings2>.chromadb_settings { | ||
| 172 | order: 9; | ||
| 173 | } | ||
| 174 | |||
| 175 | #extensions_settings2>.randomizer_settings { | ||
| 176 | order: 10; | ||
| 177 | } | ||
| 178 | |||
| 179 | /** WAND MENU **/ | ||
| 180 | #extensionsMenu>#ttsExtensionMenuItem { | ||
| 181 | order: 1; | ||
| 182 | } | ||
| 183 | |||
| 184 | #extensionsMenu>#sd_gen { | ||
| 185 | order: 2; | ||
| 186 | } | ||
| 187 | |||
| 188 | #extensionsMenu>#send_picture { | ||
| 189 | order: 3; | ||
| 190 | } | ||
| 191 | |||
| 192 | #extensionsMenu>#token_counter { | ||
| 193 | order: 4; | ||
| 194 | } | ||
| 195 | |||
| 196 | #extensionsMenu>#objective-task-manual-check-menu-item { | ||
| 197 | order: 5; | ||
| 198 | } | ||
| 199 | |||
| 200 | #extensionsMenu>#roll_dice { | ||
| 201 | order: 6; | ||
| 202 | } | ||
| 203 | |||
| 204 | #extensionsMenu>#translate_chat { | ||
| 205 | order: 7; | ||
| 206 | } | 102 | } |
| 207 | 103 | ||
| 208 | #extensionsMenu>#translate_input_message { | 104 | #extensionsMenu>div.extension_container:empty { |
| 209 | order: 8; | 105 | display: none; |
| 210 | } | 106 | } |
| @@ -98,7 +98,7 @@ | |||
| 98 | font-weight: bold; | 98 | font-weight: bold; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | .logprobs_top_candidate:not([disabled]):hover, .logprobs_top_candidate:not([disabled]):focus { | 101 | .logprobs_top_candidate:not([disabled]):hover { |
| 102 | background-color: rgba(0, 0, 0, 0.3); | 102 | background-color: rgba(0, 0, 0, 0.3); |
| 103 | } | 103 | } |
| 104 | 104 | ||
| @@ -0,0 +1,8 @@ | |||
| 1 | /* iPhone copium land */ | ||
| 2 | @media screen and (max-width: 1000px) { | ||
| 3 | .ios .popup .popup-body { | ||
| 4 | height: fit-content; | ||
| 5 | max-height: 90vh; | ||
| 6 | max-height: 90svh; | ||
| 7 | } | ||
| 8 | } | ||
| @@ -0,0 +1,175 @@ | |||
| 1 | @import url('./popup-safari-fix.css'); | ||
| 2 | |||
| 3 | dialog { | ||
| 4 | color: var(--SmartThemeBodyColor); | ||
| 5 | } | ||
| 6 | |||
| 7 | /* Closed state of the dialog */ | ||
| 8 | .popup { | ||
| 9 | width: 500px; | ||
| 10 | text-align: center; | ||
| 11 | box-shadow: 0px 0px 14px var(--black70a); | ||
| 12 | border: 1px solid var(--SmartThemeBorderColor); | ||
| 13 | padding: 4px 14px; | ||
| 14 | background-color: var(--SmartThemeBlurTintColor); | ||
| 15 | border-radius: 10px; | ||
| 16 | display: flex; | ||
| 17 | flex-direction: column; | ||
| 18 | |||
| 19 | max-height: calc(100svh - 2em); | ||
| 20 | max-width: calc(100svw - 2em); | ||
| 21 | min-height: fit-content; | ||
| 22 | |||
| 23 | /* Overflow visible so elements (like toasts) can appear outside of the dialog. '.popup-body' is hiding overflow for the real content. */ | ||
| 24 | overflow: visible; | ||
| 25 | |||
| 26 | /* Fix weird animation issue with font-scaling during popup open */ | ||
| 27 | backface-visibility: hidden; | ||
| 28 | transform: translateZ(0); | ||
| 29 | -webkit-font-smoothing: subpixel-antialiased; | ||
| 30 | } | ||
| 31 | |||
| 32 | .popup .popup-body { | ||
| 33 | display: flex; | ||
| 34 | flex-direction: column; | ||
| 35 | overflow: hidden; | ||
| 36 | width: 100%; | ||
| 37 | height: 100%; | ||
| 38 | padding: 1px; | ||
| 39 | } | ||
| 40 | |||
| 41 | .popup .popup-content { | ||
| 42 | margin-top: 10px; | ||
| 43 | padding: 0 8px; | ||
| 44 | overflow: hidden; | ||
| 45 | flex-grow: 1; | ||
| 46 | } | ||
| 47 | |||
| 48 | .popup .popup-content h3:first-child { | ||
| 49 | /* No double spacing for the first heading needed, the .popup-content already has margin */ | ||
| 50 | margin-top: 0px; | ||
| 51 | } | ||
| 52 | |||
| 53 | .popup.vertical_scrolling_dialogue_popup .popup-content { | ||
| 54 | overflow-y: auto; | ||
| 55 | } | ||
| 56 | |||
| 57 | .popup.horizontal_scrolling_dialogue_popup .popup-content { | ||
| 58 | overflow-x: auto; | ||
| 59 | } | ||
| 60 | |||
| 61 | /* Opening animation */ | ||
| 62 | .popup[opening] { | ||
| 63 | animation: pop-in var(--animation-duration-slow) ease-in-out; | ||
| 64 | } | ||
| 65 | |||
| 66 | .popup[opening]::backdrop { | ||
| 67 | animation: fade-in var(--animation-duration-slow) ease-in-out; | ||
| 68 | } | ||
| 69 | |||
| 70 | /* Open state of the dialog */ | ||
| 71 | .popup[open] { | ||
| 72 | color: var(--SmartThemeBodyColor); | ||
| 73 | } | ||
| 74 | |||
| 75 | .popup[open]::backdrop { | ||
| 76 | backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); | ||
| 77 | -webkit-backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); | ||
| 78 | background-color: var(--black30a); | ||
| 79 | } | ||
| 80 | |||
| 81 | body.no-blur .popup[open]::backdrop { | ||
| 82 | backdrop-filter: none; | ||
| 83 | -webkit-backdrop-filter: none; | ||
| 84 | } | ||
| 85 | |||
| 86 | /* Closing animation */ | ||
| 87 | .popup[closing] { | ||
| 88 | animation: pop-out var(--animation-duration-slow) ease-in-out; | ||
| 89 | } | ||
| 90 | |||
| 91 | .popup[closing]::backdrop { | ||
| 92 | animation: fade-out var(--animation-duration-slow) ease-in-out; | ||
| 93 | } | ||
| 94 | |||
| 95 | .popup #toast-container { | ||
| 96 | /* Fix toastr in dialogs by actually placing it at the top of the screen via transform */ | ||
| 97 | height: 100svh; | ||
| 98 | top: calc(50% + var(--topBarBlockSize)); | ||
| 99 | left: 50%; | ||
| 100 | transform: translate(-50%, -50%); | ||
| 101 | |||
| 102 | /* Fix text align, popups are centered by default. toasts should not. */ | ||
| 103 | text-align: left; | ||
| 104 | } | ||
| 105 | |||
| 106 | .popup-crop-wrap { | ||
| 107 | margin: 10px auto; | ||
| 108 | max-height: 75vh; | ||
| 109 | max-height: 75svh; | ||
| 110 | max-width: 100%; | ||
| 111 | } | ||
| 112 | |||
| 113 | .popup-crop-wrap img { | ||
| 114 | max-width: 100%; | ||
| 115 | /* This rule is very important, please do not ignore this! */ | ||
| 116 | } | ||
| 117 | |||
| 118 | .popup-inputs { | ||
| 119 | margin-top: 10px; | ||
| 120 | font-size: smaller; | ||
| 121 | opacity: 0.7; | ||
| 122 | } | ||
| 123 | |||
| 124 | .popup-input { | ||
| 125 | margin-top: 10px; | ||
| 126 | } | ||
| 127 | |||
| 128 | .popup-controls { | ||
| 129 | margin-top: 10px; | ||
| 130 | display: flex; | ||
| 131 | align-self: center; | ||
| 132 | gap: 20px; | ||
| 133 | } | ||
| 134 | |||
| 135 | .menu_button.menu_button_default { | ||
| 136 | box-shadow: 0 0 5px var(--white20a); | ||
| 137 | } | ||
| 138 | |||
| 139 | .menu_button.popup-button-ok { | ||
| 140 | background-color: var(--crimson70a); | ||
| 141 | } | ||
| 142 | |||
| 143 | .menu_button.popup-button-ok:hover { | ||
| 144 | background-color: var(--crimson-hover); | ||
| 145 | } | ||
| 146 | |||
| 147 | .popup-controls .menu_button { | ||
| 148 | /* Popup buttons should not scale to smallest size, otherwise they will always break to multiline if multiple words */ | ||
| 149 | width: unset; | ||
| 150 | |||
| 151 | /* Fix weird animation issue with fonts on brightness filter */ | ||
| 152 | backface-visibility: hidden; | ||
| 153 | transform: translateZ(0); | ||
| 154 | -webkit-font-smoothing: subpixel-antialiased; | ||
| 155 | } | ||
| 156 | |||
| 157 | .popup-controls .menu_button:hover:focus-visible { | ||
| 158 | filter: brightness(1.3) saturate(1.3); | ||
| 159 | } | ||
| 160 | |||
| 161 | .popup .popup-button-close { | ||
| 162 | position: absolute; | ||
| 163 | top: -6px; | ||
| 164 | right: -6px; | ||
| 165 | width: 24px; | ||
| 166 | height: 24px; | ||
| 167 | font-size: 20px; | ||
| 168 | padding: 2px 3px 3px 2px; | ||
| 169 | |||
| 170 | filter: brightness(0.8); | ||
| 171 | |||
| 172 | /* Fix weird animation issue with font-scaling during popup open */ | ||
| 173 | backface-visibility: hidden; | ||
| 174 | } | ||
| 175 | |||
| @@ -23,6 +23,14 @@ | |||
| 23 | opacity: 0.8; | 23 | opacity: 0.8; |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | .select2-selection--single .select2-selection__placeholder { | ||
| 27 | color: var(--SmartThemeEmColor); | ||
| 28 | } | ||
| 29 | |||
| 30 | .select2-container--classic .select2-selection--single .select2-selection__placeholder { | ||
| 31 | color: var(--SmartThemeEmColor); | ||
| 32 | } | ||
| 33 | |||
| 26 | .select2-container .select2-selection--single .select2-selection__rendered { | 34 | .select2-container .select2-selection--single .select2-selection__rendered { |
| 27 | color: var(--SmartThemeBodyColor); | 35 | color: var(--SmartThemeBodyColor); |
| 28 | line-height: revert; | 36 | line-height: revert; |
| @@ -49,7 +57,7 @@ | |||
| 49 | color: var(--SmartThemeBodyColor); | 57 | color: var(--SmartThemeBodyColor); |
| 50 | border: 1px solid var(--SmartThemeBorderColor); | 58 | border: 1px solid var(--SmartThemeBorderColor); |
| 51 | border-radius: 7px; | 59 | border-radius: 7px; |
| 52 | font-family: "Noto Sans", "Noto Color Emoji", sans-serif; | 60 | font-family: var(--mainFontFamily); |
| 53 | padding: 3px 5px; | 61 | padding: 3px 5px; |
| 54 | } | 62 | } |
| 55 | 63 | ||
| @@ -77,7 +85,7 @@ | |||
| 77 | color: var(--SmartThemeBodyColor); | 85 | color: var(--SmartThemeBodyColor); |
| 78 | border: 1px solid var(--SmartThemeBorderColor); | 86 | border: 1px solid var(--SmartThemeBorderColor); |
| 79 | border-radius: 7px; | 87 | border-radius: 7px; |
| 80 | font-family: "Noto Sans", "Noto Color Emoji", sans-serif; | 88 | font-family: var(--mainFontFamily); |
| 81 | padding: 3px 5px; | 89 | padding: 3px 5px; |
| 82 | } | 90 | } |
| 83 | 91 | ||
| @@ -173,8 +181,9 @@ | |||
| 173 | } | 181 | } |
| 174 | 182 | ||
| 175 | .select2-selection__choice__display { | 183 | .select2-selection__choice__display { |
| 176 | /* Fix weird alignment on the left side */ | 184 | /* Fix weird alignment of the inside block */ |
| 177 | margin-left: 1px; | 185 | margin-left: 3px; |
| 186 | margin-right: 1px; | ||
| 178 | } | 187 | } |
| 179 | 188 | ||
| 180 | /* Styling for choice remove icon */ | 189 | /* Styling for choice remove icon */ |
| @@ -194,6 +203,7 @@ span.select2.select2-container .select2-selection__choice__remove:hover { | |||
| 194 | .select2_choice_clickable+span.select2-container .select2-selection__choice__display { | 203 | .select2_choice_clickable+span.select2-container .select2-selection__choice__display { |
| 195 | cursor: pointer; | 204 | cursor: pointer; |
| 196 | } | 205 | } |
| 206 | |||
| 197 | .select2_choice_clickable_buttonstyle+span.select2-container .select2-selection__choice__display { | 207 | .select2_choice_clickable_buttonstyle+span.select2-container .select2-selection__choice__display { |
| 198 | cursor: pointer; | 208 | cursor: pointer; |
| 199 | transition: background-color 0.3s; | 209 | transition: background-color 0.3s; |
| @@ -211,7 +221,9 @@ span.select2.select2-container .select2-selection__choice__remove:hover { | |||
| 211 | .select2_multi_sameline+span.select2-container .select2-selection--multiple { | 221 | .select2_multi_sameline+span.select2-container .select2-selection--multiple { |
| 212 | display: flex; | 222 | display: flex; |
| 213 | flex-wrap: wrap; | 223 | flex-wrap: wrap; |
| 214 | }.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search--inline { | 224 | } |
| 225 | |||
| 226 | .select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search--inline { | ||
| 215 | /* Allow search placeholder to take up all space if needed */ | 227 | /* Allow search placeholder to take up all space if needed */ |
| 216 | flex-grow: 1; | 228 | flex-grow: 1; |
| 217 | } | 229 | } |
| @@ -220,7 +220,7 @@ | |||
| 220 | } | 220 | } |
| 221 | 221 | ||
| 222 | .monospace { | 222 | .monospace { |
| 223 | font-family: monospace; | 223 | font-family: var(--monoFontFamily); |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | .expander { | 226 | .expander { |
| @@ -292,6 +292,14 @@ | |||
| 292 | flex-wrap: nowrap; | 292 | flex-wrap: nowrap; |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | .inline-flex { | ||
| 296 | display: inline-flex; | ||
| 297 | } | ||
| 298 | |||
| 299 | .inline-block { | ||
| 300 | display: inline-block; | ||
| 301 | } | ||
| 302 | |||
| 295 | .alignitemscenter, | 303 | .alignitemscenter, |
| 296 | .alignItemsCenter { | 304 | .alignItemsCenter { |
| 297 | align-items: center; | 305 | align-items: center; |
| @@ -348,6 +356,10 @@ | |||
| 348 | margin-right: 5px; | 356 | margin-right: 5px; |
| 349 | } | 357 | } |
| 350 | 358 | ||
| 359 | .margin-r2 { | ||
| 360 | margin-right: 2px; | ||
| 361 | } | ||
| 362 | |||
| 351 | .flex0 { | 363 | .flex0 { |
| 352 | flex: 0; | 364 | flex: 0; |
| 353 | } | 365 | } |
| @@ -14,7 +14,7 @@ | |||
| 14 | display: flex; | 14 | display: flex; |
| 15 | flex-direction: row; | 15 | flex-direction: row; |
| 16 | align-items: center; | 16 | align-items: center; |
| 17 | gap: 10px; | 17 | gap: 6px; |
| 18 | margin-bottom: 5px; | 18 | margin-bottom: 5px; |
| 19 | } | 19 | } |
| 20 | 20 | ||
| @@ -27,8 +27,19 @@ | |||
| 27 | flex: 1; | 27 | flex: 1; |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | .tag_view_color_picker { | ||
| 31 | position: relative; | ||
| 32 | } | ||
| 33 | |||
| 34 | .tag_view_color_picker .link_icon { | ||
| 35 | position: absolute; | ||
| 36 | top: 50%; | ||
| 37 | right: 0px; | ||
| 38 | opacity: 0.5; | ||
| 39 | } | ||
| 40 | |||
| 30 | .tag_delete { | 41 | .tag_delete { |
| 31 | padding-right: 0; | 42 | padding: 2px 4px; |
| 32 | color: var(--SmartThemeBodyColor) !important; | 43 | color: var(--SmartThemeBodyColor) !important; |
| 33 | } | 44 | } |
| 34 | 45 | ||
| @@ -108,6 +119,14 @@ | |||
| 108 | opacity: 0.6; | 119 | opacity: 0.6; |
| 109 | } | 120 | } |
| 110 | 121 | ||
| 122 | #tagList .tag:has(.tag_remove:hover) { | ||
| 123 | opacity: 1; | ||
| 124 | } | ||
| 125 | |||
| 126 | #tagList .tag:has(.tag_remove:hover) .tag_name { | ||
| 127 | opacity: 0.6; | ||
| 128 | } | ||
| 129 | |||
| 111 | .tags.tags_inline { | 130 | .tags.tags_inline { |
| 112 | opacity: 0.6; | 131 | opacity: 0.6; |
| 113 | column-gap: 0.2rem; | 132 | column-gap: 0.2rem; |
| @@ -0,0 +1,59 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | <svg | ||
| 3 | width="363.44339" | ||
| 4 | height="375.68854" | ||
| 5 | viewBox="0 0 363.44339 375.68854" | ||
| 6 | version="1.1" | ||
| 7 | id="svg2" | ||
| 8 | sodipodi:docname="Yi_logo_icon_dark.svg" | ||
| 9 | inkscape:version="1.3 (0e150ed, 2023-07-21)" | ||
| 10 | xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| 11 | xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| 12 | xmlns="http://www.w3.org/2000/svg" | ||
| 13 | xmlns:svg="http://www.w3.org/2000/svg"> | ||
| 14 | <defs | ||
| 15 | id="defs2" /> | ||
| 16 | <sodipodi:namedview | ||
| 17 | id="namedview2" | ||
| 18 | pagecolor="#ffffff" | ||
| 19 | bordercolor="#000000" | ||
| 20 | borderopacity="0.25" | ||
| 21 | inkscape:showpageshadow="2" | ||
| 22 | inkscape:pageopacity="0.0" | ||
| 23 | inkscape:pagecheckerboard="0" | ||
| 24 | inkscape:deskcolor="#d1d1d1" | ||
| 25 | inkscape:zoom="1.1073359" | ||
| 26 | inkscape:cx="192.35355" | ||
| 27 | inkscape:cy="196.86889" | ||
| 28 | inkscape:window-width="1512" | ||
| 29 | inkscape:window-height="857" | ||
| 30 | inkscape:window-x="0" | ||
| 31 | inkscape:window-y="38" | ||
| 32 | inkscape:window-maximized="1" | ||
| 33 | inkscape:current-layer="svg2" /> | ||
| 34 | <rect | ||
| 35 | x="287.14771" | ||
| 36 | y="224.04056" | ||
| 37 | width="42.3862" | ||
| 38 | height="151.64799" | ||
| 39 | rx="21.1931" | ||
| 40 | id="rect1" /> | ||
| 41 | <path | ||
| 42 | fill-rule="evenodd" | ||
| 43 | clip-rule="evenodd" | ||
| 44 | d="m 299.41969,17.362538 c -8.916,-7.5830004 -22.291,-6.503 -29.874,2.414 l -118.432,139.253002 c -3.056,3.593 -4.705,7.911 -5.001,12.281 -0.166,1.069 -0.252,2.164 -0.252,3.279 v 178.022 c 0,11.705 9.488,21.193 21.193,21.193 11.705,0 21.193,-9.488 21.193,-21.193 v -171.819 l 113.587,-133.556002 c 7.583,-8.916 6.502,-22.291 -2.414,-29.874 z" | ||
| 45 | id="path1" /> | ||
| 46 | <rect | ||
| 47 | x="-18.236605" | ||
| 48 | y="8.6596518" | ||
| 49 | width="42.3862" | ||
| 50 | height="174.745" | ||
| 51 | rx="21.1931" | ||
| 52 | transform="rotate(-39.3441)" | ||
| 53 | id="rect2" /> | ||
| 54 | <circle | ||
| 55 | cx="337.54071" | ||
| 56 | cy="163.28656" | ||
| 57 | r="25.9027" | ||
| 58 | id="circle2" /> | ||
| 59 | </svg> | ||
| @@ -0,0 +1,39 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | <svg | ||
| 3 | class="logo" | ||
| 4 | width="36" | ||
| 5 | height="30.9767" | ||
| 6 | viewBox="0 0 36 30.9767" | ||
| 7 | version="1.1" | ||
| 8 | id="svg2" | ||
| 9 | sodipodi:docname="featherless.svg" | ||
| 10 | inkscape:version="1.3 (0e150ed, 2023-07-21)" | ||
| 11 | xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| 12 | xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| 13 | xmlns="http://www.w3.org/2000/svg" | ||
| 14 | xmlns:svg="http://www.w3.org/2000/svg"> | ||
| 15 | <defs | ||
| 16 | id="defs2" /> | ||
| 17 | <sodipodi:namedview | ||
| 18 | id="namedview2" | ||
| 19 | pagecolor="#ffffff" | ||
| 20 | bordercolor="#000000" | ||
| 21 | borderopacity="0.25" | ||
| 22 | inkscape:showpageshadow="2" | ||
| 23 | inkscape:pageopacity="0.0" | ||
| 24 | inkscape:pagecheckerboard="0" | ||
| 25 | inkscape:deskcolor="#d1d1d1" | ||
| 26 | inkscape:zoom="4.0920245" | ||
| 27 | inkscape:cx="75.268366" | ||
| 28 | inkscape:cy="15.151424" | ||
| 29 | inkscape:window-width="1512" | ||
| 30 | inkscape:window-height="857" | ||
| 31 | inkscape:window-x="0" | ||
| 32 | inkscape:window-y="38" | ||
| 33 | inkscape:window-maximized="1" | ||
| 34 | inkscape:current-layer="svg2" /> | ||
| 35 | <path | ||
| 36 | d="M 34.0866,1.68482 C 32.2902,0.5825 29.863,0 27.0672,0 22.7842,0 18.0653,1.35865 13.8276,3.72206 L 13.7979,3.71083 c 0,0 -0.0042,0.02261 -0.0065,0.0334 C 12.5086,4.4617 11.2656,5.2629 10.0981,6.15731 3.22112,11.4248 1.29519,17.6748 2.92004,21.0156 1.14142,24.0728 0.0457,27.2332 0,30.9767 3.41949,24.421 5.4719,19.108 16.6146,10.1637 13.4309,10.8501 7.9281,14.1057 4.2271,19.0459 3.87793,16.156 6.1477,11.4895 11.2033,7.6174 11.8435,7.127 12.5092,6.66864 13.1886,6.23374 12.6577,7.8934 12.8269,7.4806 11.7254,9.8076 c 1.6289,-1.551 2.7014,-2.5081 4.3096,-5.16615 2.088,-1.03181 4.2598,-1.80301 6.4132,-2.2691 -0.3563,1.18836 -1.0345,3.20231 -1.9527,4.79455 0,0 2.3303,-0.50255 4.2563,-0.38902 -1.0523,1.16802 -1.9991,2.43152 -2.9592,3.72332 -1.3149,1.7684 -2.6742,3.5971 -4.4148,5.2993 -0.2095,0.2049 -0.4098,0.3907 -0.6129,0.5825 -2.6747,-0.2576 -4.4414,0.7485 -6.0966,2.5259 1.3054,-0.6123 3.059,-1.1165 4.1583,-0.813 -2.0258,1.662 -5.216,3.8529 -7.8373,3.6725 -0.4971,0.7611 -0.5285,0.7844 -1.0749,1.7038 4.252,1.0648 9.5926,-3.2817 12.7354,-6.3561 1.8428,-1.803 3.2466,-3.6904 4.6036,-5.5149 2.7947,-3.7585 5.2082,-7.0038 10.5619,-8.2388 L 36,2.85877 Z" | ||
| 37 | class="logo-mark" | ||
| 38 | id="path1"/> | ||
| 39 | </svg> | ||
| @@ -0,0 +1,40 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | <svg | ||
| 3 | width="88.001465mm" | ||
| 4 | height="81.280983mm" | ||
| 5 | version="1.1" | ||
| 6 | id="svg9" | ||
| 7 | sodipodi:docname="huggingface.svg" | ||
| 8 | inkscape:version="1.3 (0e150ed, 2023-07-21)" | ||
| 9 | viewBox="0 0 88.001465 81.280983" | ||
| 10 | xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| 11 | xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| 12 | xmlns="http://www.w3.org/2000/svg" | ||
| 13 | xmlns:svg="http://www.w3.org/2000/svg"> | ||
| 14 | <defs | ||
| 15 | id="defs9" /> | ||
| 16 | <sodipodi:namedview | ||
| 17 | id="namedview9" | ||
| 18 | pagecolor="#ffffff" | ||
| 19 | bordercolor="#000000" | ||
| 20 | borderopacity="0.25" | ||
| 21 | inkscape:showpageshadow="2" | ||
| 22 | inkscape:pageopacity="0.0" | ||
| 23 | inkscape:pagecheckerboard="0" | ||
| 24 | inkscape:deskcolor="#d1d1d1" | ||
| 25 | inkscape:zoom="0.68605868" | ||
| 26 | inkscape:cx="424.16197" | ||
| 27 | inkscape:cy="154.50573" | ||
| 28 | inkscape:window-width="1512" | ||
| 29 | inkscape:window-height="857" | ||
| 30 | inkscape:window-x="0" | ||
| 31 | inkscape:window-y="38" | ||
| 32 | inkscape:window-maximized="1" | ||
| 33 | inkscape:current-layer="svg9" | ||
| 34 | inkscape:clip-to-page="false" | ||
| 35 | inkscape:document-units="mm" /> | ||
| 36 | <path | ||
| 37 | id="path2-9" | ||
| 38 | style="display:inline;" | ||
| 39 | d="M 40.855186,0.10840487 A 38.75,38.75 0 0 0 5.0016702,38.750983 a 38.75,38.75 0 0 0 1.7871095,11.589844 7.1,7.1 0 0 1 1.871094,0.291015 5.97,5.97 0 0 1 1.330078,-3.761718 c 0.02089,-0.02502 0.04515,-0.04576 0.06641,-0.07031 a 34.75,34.75 0 0 1 -1.0547201,-8.048831 34.750014,34.750014 0 0 1 69.5000291,0 34.75,34.75 0 0 1 -0.957032,7.630859 c 0.163358,0.152193 0.321565,0.31255 0.466797,0.488282 a 5.97,5.97 0 0 1 1.330078,3.761718 7.1,7.1 0 0 1 1.337891,-0.207031 A 38.75,38.75 0 0 0 82.501671,38.750983 38.75,38.75 0 0 0 40.855186,0.10840487 Z M 48.015342,73.165045 a 34.75,34.75 0 0 1 -8.044921,0.03906 c -0.396448,0.901178 -0.898324,1.811009 -1.529297,2.736328 -0.233308,0.342701 -0.489288,0.664577 -0.75586,0.974609 a 38.75,38.75 0 0 0 12.574219,-0.06641 c -0.245421,-0.290144 -0.482504,-0.589875 -0.699219,-0.908203 -0.639915,-0.938432 -1.14623,-1.86177 -1.544922,-2.775391 z M 73.940733,45.000983 c 1.62,0 3.07,0.66 4.07,1.87 a 5.97,5.97 0 0 1 1.33,3.76 7.1,7.1 0 0 1 1.95,-0.3 c 1.55,0 2.95,0.59 3.94,1.66 a 5.8,5.8 0 0 1 0.8,7 5.3,5.3 0 0 1 1.78,2.82 c 0.24,0.9 0.48,2.8 -0.8,4.74 a 5.22,5.22 0 0 1 0.37,5.02 c -1.02,2.32 -3.57,4.14 -8.51,6.1 -3.08,1.22 -5.9,2 -5.92,2.01 a 44.33,44.33 0 0 1 -10.93,1.6 c -5.86,0 -10.05,-1.8 -12.46,-5.34 -3.88,-5.69 -3.33,-10.9 1.7,-15.92 2.78,-2.78 4.63,-6.87 5.01,-7.77 0.78,-2.66 2.83,-5.62 6.24,-5.62 a 5.7,5.7 0 0 1 4.6,2.46 c 1,-1.26 1.98,-2.25 2.87,-2.82 a 7.4,7.4 0 0 1 3.96,-1.27 z m 0,4 c -0.51,0 -1.13,0.22 -1.82,0.65 -2.13,1.36 -6.25,8.43 -7.76,11.18 a 2.43,2.43 0 0 1 -2.14,1.31 c -1.54,0 -2.75,-1.53 -0.14,-3.48 3.91,-2.93 2.54,-7.72 0.67,-8.01 a 1.54,1.54 0 0 0 -0.24,-0.02 c -1.7,0 -2.45,2.93 -2.45,2.93 0,0 -2.2,5.52 -5.97,9.3 -3.78,3.77 -3.98,6.8 -1.22,10.83 1.87,2.75 5.47,3.58 9.15,3.58 3.82,0 7.73,-0.9 9.93,-1.46 0.1,-0.03 13.45,-3.8 11.76,-7 -0.29,-0.54 -0.75,-0.76 -1.34,-0.76 -2.38,0 -6.71,3.54 -8.57,3.54 -0.42,0 -0.71,-0.17 -0.83,-0.6 -0.8,-2.85 12.05,-4.05 10.97,-8.17 -0.19,-0.73 -0.7,-1.02 -1.44,-1.02 -3.14,0 -10.2,5.53 -11.68,5.53 -0.1,0 -0.19,-0.03 -0.23,-0.1 -0.74,-1.2 -0.34,-2.04 4.88,-5.2 5.23,-3.16 8.9,-5.06 6.8,-7.33 -0.23,-0.26 -0.57,-0.38 -0.98,-0.38 -3.18,0 -10.67,6.82 -10.67,6.82 0,0 -2.02,2.1 -3.24,2.1 a 0.74,0.74 0 0 1 -0.68,-0.38 c -0.87,-1.46 8.05,-8.22 8.55,-11.01 0.34,-1.9 -0.24,-2.85 -1.31,-2.85 z m -6.69,-15 a 3.25,3.25 0 1 0 0,-6.5 3.25,3.25 0 0 0 0,6.5 z m -46.5,0 a 3.25,3.25 0 1 0 0,-6.5 3.25,3.25 0 0 0 0,6.5 z m -6.69,11 c -1.62,0 -3.06,0.66 -4.0700003,1.87 a 5.97,5.97 0 0 0 -1.33,3.76 7.1,7.1 0 0 0 -1.94,-0.3 c -1.55,0 -2.95,0.59 -3.94,1.66 a 5.8,5.8 0 0 0 -0.8,7 5.3,5.3 0 0 0 -1.79000004,2.82 c -0.24,0.9 -0.48,2.8 0.8,4.74 a 5.22,5.22 0 0 0 -0.37,5.02 c 1.02000004,2.32 3.57000004,4.14 8.52000004,6.1 3.0700003,1.22 5.8900003,2 5.9100003,2.01 a 44.33,44.33 0 0 0 10.93,1.6 c 5.86,0 10.05,-1.8 12.46,-5.34 3.88,-5.69 3.33,-10.9 -1.7,-15.92 -2.77,-2.78 -4.62,-6.87 -5,-7.77 -0.78,-2.66 -2.84,-5.62 -6.25,-5.62 a 5.7,5.7 0 0 0 -4.6,2.46 c -1,-1.26 -1.98,-2.25 -2.86,-2.82 a 7.4,7.4 0 0 0 -3.97,-1.27 z m 0,4 c 0.51,0 1.14,0.22 1.82,0.65 2.14,1.36 6.25,8.43 7.76,11.18 0.5,0.92 1.37,1.31 2.14,1.31 1.55,0 2.75,-1.53 0.15,-3.48 -3.92,-2.93 -2.55,-7.72 -0.68,-8.01 0.08,-0.02 0.17,-0.02 0.24,-0.02 1.7,0 2.45,2.93 2.45,2.93 0,0 2.2,5.52 5.98,9.3 3.77,3.77 3.97,6.8 1.22,10.83 -1.88,2.75 -5.47,3.58 -9.16,3.58 -3.81,0 -7.73,-0.9 -9.92,-1.46 -0.11,-0.03 -13.4500003,-3.8 -11.7600003,-7 0.28,-0.54 0.75,-0.76 1.34,-0.76 2.38,0 6.7000003,3.54 8.5700003,3.54 0.41,0 0.7,-0.17 0.83,-0.6 0.79,-2.85 -12.0600003,-4.05 -10.9800003,-8.17 0.2,-0.73 0.71,-1.02 1.44,-1.02 3.14,0 10.2000003,5.53 11.6800003,5.53 0.11,0 0.2,-0.03 0.24,-0.1 0.74,-1.2 0.33,-2.04 -4.9,-5.2 -5.2100003,-3.16 -8.8800003,-5.06 -6.8000003,-7.33 0.24,-0.26 0.58,-0.38 1,-0.38 3.17,0 10.6600003,6.82 10.6600003,6.82 0,0 2.02,2.1 3.25,2.1 0.28,0 0.52,-0.1 0.68,-0.38 0.86,-1.46 -8.06,-8.22 -8.56,-11.01 -0.34,-1.9 0.24,-2.85 1.31,-2.85 z m 21.91,2 a 8.7,8.7 0 0 1 5.3,-4.49 c 0.4,-0.12 0.81,0.57 1.24,1.28 0.4,0.68 0.82,1.37 1.24,1.37 0.45,0 0.9,-0.68 1.33,-1.35 0.45,-0.7 0.89,-1.38 1.32,-1.25 a 8.61,8.61 0 0 1 5,4.17 c 3.73,-2.94 5.1,-7.74 5.1,-10.7 0,-2.34 -1.57,-1.6 -4.09,-0.36 l -0.14,0.07 c -2.31,1.15 -5.39,2.67 -8.77,2.67 -3.38,0 -6.45,-1.52 -8.77,-2.67 -2.6,-1.29 -4.23,-2.1 -4.23,0.29 0,3.05 1.46,8.06 5.47,10.97 z m 19.07,-21.7 c 1.28,0.44 1.78,3.06 3.07,2.38 a 5,5 0 1 0 -6.76,-2.07 c 0.61,1.15 2.55,-0.72 3.7,-0.32 z m -23.55,0 c -1.28,0.44 -1.79,3.06 -3.07,2.38 a 5,5 0 1 1 6.76,-2.07 c -0.61,1.15 -2.56,-0.72 -3.7,-0.32 z" /> | ||
| 40 | </svg> | ||
| @@ -0,0 +1,6 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> | ||
| 3 | <path d="M13.3252 3.05011L8.66765 20.4323L10.5995 20.9499L15.257 3.56775L13.3252 3.05011Z" /> | ||
| 4 | <path d="M7.61222 18.3608L8.97161 16.9124L8.9711 16.8933L3.87681 12.1121L8.66724 7.00798L7.20892 5.63928L1.0498 12.2017L7.61222 18.3608Z" /> | ||
| 5 | <path d="M16.3883 18.3608L15.0289 16.9124L15.0294 16.8933L20.1237 12.1121L15.3333 7.00798L16.7916 5.63928L22.9507 12.2017L16.3883 18.3608Z" /> | ||
| 6 | </svg> | ||
| @@ -18,6 +18,7 @@ | |||
| 18 | <link rel="preload" as="style" href="style.css"> | 18 | <link rel="preload" as="style" href="style.css"> |
| 19 | <link rel="manifest" crossorigin="use-credentials" href="manifest.json"> | 19 | <link rel="manifest" crossorigin="use-credentials" href="manifest.json"> |
| 20 | <link href="webfonts/NotoSans/stylesheet.css" rel="stylesheet"> | 20 | <link href="webfonts/NotoSans/stylesheet.css" rel="stylesheet"> |
| 21 | <link href="webfonts/NotoSansMono/stylesheet.css" rel="stylesheet"> | ||
| 21 | <link href="css/fontawesome.min.css" rel="stylesheet"> | 22 | <link href="css/fontawesome.min.css" rel="stylesheet"> |
| 22 | <link href="css/solid.min.css" rel="stylesheet"> | 23 | <link href="css/solid.min.css" rel="stylesheet"> |
| 23 | <link href="css/brands.min.css" rel="stylesheet"> | 24 | <link href="css/brands.min.css" rel="stylesheet"> |
| @@ -32,7 +33,6 @@ | |||
| 32 | <link rel="apple-touch-icon" sizes="144x144" href="img/apple-icon-144x144.png" /> | 33 | <link rel="apple-touch-icon" sizes="144x144" href="img/apple-icon-144x144.png" /> |
| 33 | <link rel="stylesheet" type="text/css" href="style.css"> | 34 | <link rel="stylesheet" type="text/css" href="style.css"> |
| 34 | <link rel="stylesheet" type="text/css" href="css/st-tailwind.css"> | 35 | <link rel="stylesheet" type="text/css" href="css/st-tailwind.css"> |
| 35 | <link rel="stylesheet" type="text/css" href="css/tags.css"> | ||
| 36 | <link rel="stylesheet" type="text/css" href="css/rm-groups.css"> | 36 | <link rel="stylesheet" type="text/css" href="css/rm-groups.css"> |
| 37 | <link rel="stylesheet" type="text/css" href="css/group-avatars.css"> | 37 | <link rel="stylesheet" type="text/css" href="css/group-avatars.css"> |
| 38 | <link rel="stylesheet" type="text/css" href="css/toggle-dependent.css"> | 38 | <link rel="stylesheet" type="text/css" href="css/toggle-dependent.css"> |
| @@ -72,8 +72,8 @@ | |||
| 72 | <div id="lm_button_panel_pin_div" title="Locked = AI Configuration panel will stay open" data-i18n="[title]AI Configuration panel will stay open"> | 72 | <div id="lm_button_panel_pin_div" title="Locked = AI Configuration panel will stay open" data-i18n="[title]AI Configuration panel will stay open"> |
| 73 | <input type="checkbox" id="lm_button_panel_pin"> | 73 | <input type="checkbox" id="lm_button_panel_pin"> |
| 74 | <label for="lm_button_panel_pin"> | 74 | <label for="lm_button_panel_pin"> |
| 75 | <div class="unchecked fa-solid fa-unlock "></div> | 75 | <div class="unchecked fa-solid fa-unlock right_menu_button"></div> |
| 76 | <div class="checked fa-solid fa-lock "></div> | 76 | <div class="checked fa-solid fa-lock right_menu_button"></div> |
| 77 | </label> | 77 | </label> |
| 78 | </div> | 78 | </div> |
| 79 | <div id="clickSlidersTips" data-i18n="clickslidertips" class="toggle-description wide100p editable-slider-notification"> | 79 | <div id="clickSlidersTips" data-i18n="clickslidertips" class="toggle-description wide100p editable-slider-notification"> |
| @@ -423,7 +423,7 @@ | |||
| 423 | </span> | 423 | </span> |
| 424 | </div> | 424 | </div> |
| 425 | </div> | 425 | </div> |
| 426 | <div class="range-block" data-source="openai,claude,windowai,openrouter,ai21,scale,makersuite,mistralai,custom,cohere,perplexity,groq"> | 426 | <div class="range-block" data-source="openai,claude,windowai,openrouter,ai21,scale,makersuite,mistralai,custom,cohere,perplexity,groq,01ai"> |
| 427 | <div class="range-block-title" data-i18n="Temperature"> | 427 | <div class="range-block-title" data-i18n="Temperature"> |
| 428 | Temperature | 428 | Temperature |
| 429 | </div> | 429 | </div> |
| @@ -488,7 +488,7 @@ | |||
| 488 | </div> | 488 | </div> |
| 489 | </div> | 489 | </div> |
| 490 | </div> | 490 | </div> |
| 491 | <div data-newbie-hidden class="range-block" data-source="openai,claude,openrouter,ai21,scale,makersuite,mistralai,custom,cohere,perplexity,groq"> | 491 | <div data-newbie-hidden class="range-block" data-source="openai,claude,openrouter,ai21,scale,makersuite,mistralai,custom,cohere,perplexity,groq,01ai"> |
| 492 | <div class="range-block-title" data-i18n="Top P"> | 492 | <div class="range-block-title" data-i18n="Top P"> |
| 493 | Top P | 493 | Top P |
| 494 | </div> | 494 | </div> |
| @@ -1141,7 +1141,7 @@ | |||
| 1141 | <div class="fa-solid fa-circle-info opacity50p" title="Customize displayed samplers or add custom samplers." data-i18n="[title]Customize displayed samplers or add custom samplers."></div> | 1141 | <div class="fa-solid fa-circle-info opacity50p" title="Customize displayed samplers or add custom samplers." data-i18n="[title]Customize displayed samplers or add custom samplers."></div> |
| 1142 | </small> | 1142 | </small> |
| 1143 | </div> | 1143 | </div> |
| 1144 | <div data-newbie-hidden data-tg-type="mancer, vllm, aphrodite, tabby" class="flex-container flexFlowColumn alignitemscenter flexBasis100p flexGrow flexShrink gap0"> | 1144 | <div data-newbie-hidden data-tg-type="mancer, vllm, aphrodite, tabby, infermaticai" class="flex-container flexFlowColumn alignitemscenter flexBasis100p flexGrow flexShrink gap0"> |
| 1145 | <small data-i18n="Multiple swipes per generation">Multiple swipes per generation</small> | 1145 | <small data-i18n="Multiple swipes per generation">Multiple swipes per generation</small> |
| 1146 | <input type="number" id="n_textgenerationwebui" class="text_pole textAlignCenter" min="1" value="1" step="1" /> | 1146 | <input type="number" id="n_textgenerationwebui" class="text_pole textAlignCenter" min="1" value="1" step="1" /> |
| 1147 | </div> | 1147 | </div> |
| @@ -1263,7 +1263,7 @@ | |||
| 1263 | <input class="neo-range-slider" type="range" id="skew_textgenerationwebui" name="volume" min="-5" max="5" step="0.01" /> | 1263 | <input class="neo-range-slider" type="range" id="skew_textgenerationwebui" name="volume" min="-5" max="5" step="0.01" /> |
| 1264 | <input class="neo-range-input" type="number" min="-5" max="5" step="0.01" data-for="skew_textgenerationwebui" id="skew_counter_textgenerationwebui"> | 1264 | <input class="neo-range-input" type="number" min="-5" max="5" step="0.01" data-for="skew_textgenerationwebui" id="skew_counter_textgenerationwebui"> |
| 1265 | </div> | 1265 | </div> |
| 1266 | <div data-newbie-hidden data-tg-type="mancer, ooba, tabby, dreamgen" class="alignitemscenter flex-container flexFlowColumn flexBasis30p flexGrow flexShrink gap0"> | 1266 | <div data-newbie-hidden data-tg-type="mancer, ooba, tabby, dreamgen, infermaticai" class="alignitemscenter flex-container flexFlowColumn flexBasis30p flexGrow flexShrink gap0"> |
| 1267 | <small data-i18n="Min Length">Min Length</small> | 1267 | <small data-i18n="Min Length">Min Length</small> |
| 1268 | <input class="neo-range-slider" type="range" id="min_length_textgenerationwebui" name="volume" min="0" max="2000" step="1" /> | 1268 | <input class="neo-range-slider" type="range" id="min_length_textgenerationwebui" name="volume" min="0" max="2000" step="1" /> |
| 1269 | <input class="neo-range-input" type="number" min="0" max="2000" step="1" data-for="min_length_textgenerationwebui" id="min_length_counter_textgenerationwebui"> | 1269 | <input class="neo-range-input" type="number" min="0" max="2000" step="1" data-for="min_length_textgenerationwebui" id="min_length_counter_textgenerationwebui"> |
| @@ -1446,7 +1446,7 @@ | |||
| 1446 | <div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ban the eos_token. This forces the model to never end the generation prematurely" title="Ban the eos_token. This forces the model to never end the generation prematurely."></div> | 1446 | <div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ban the eos_token. This forces the model to never end the generation prematurely" title="Ban the eos_token. This forces the model to never end the generation prematurely."></div> |
| 1447 | </label> | 1447 | </label> |
| 1448 | </label> | 1448 | </label> |
| 1449 | <label data-tg-type="vllm, aphrodite" class="checkbox_label" for="ignore_eos_token_textgenerationwebui"> | 1449 | <label data-tg-type="vllm, aphrodite, infermaticai" class="checkbox_label" for="ignore_eos_token_textgenerationwebui"> |
| 1450 | <input type="checkbox" id="ignore_eos_token_textgenerationwebui" /> | 1450 | <input type="checkbox" id="ignore_eos_token_textgenerationwebui" /> |
| 1451 | <small data-i18n="Ignore EOS Token">Ignore EOS Token | 1451 | <small data-i18n="Ignore EOS Token">Ignore EOS Token |
| 1452 | <div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ignore the EOS Token even if it generates." title="Ignore the EOS Token even if it generates."></div> | 1452 | <div class="fa-solid fa-circle-info opacity50p " data-i18n="[title]Ignore the EOS Token even if it generates." title="Ignore the EOS Token even if it generates."></div> |
| @@ -1471,13 +1471,13 @@ | |||
| 1471 | </label> | 1471 | </label> |
| 1472 | </label> | 1472 | </label> |
| 1473 | 1473 | ||
| 1474 | <label data-tg-type="vllm, aphrodite" class="checkbox_label" for="spaces_between_special_tokens_textgenerationwebui"> | 1474 | <label data-tg-type="vllm, aphrodite, infermaticai" class="checkbox_label" for="spaces_between_special_tokens_textgenerationwebui"> |
| 1475 | <input type="checkbox" id="spaces_between_special_tokens_textgenerationwebui" /> | 1475 | <input type="checkbox" id="spaces_between_special_tokens_textgenerationwebui" /> |
| 1476 | <small data-i18n="Spaces Between Special Tokens">Spaces Between Special Tokens</small> | 1476 | <small data-i18n="Spaces Between Special Tokens">Spaces Between Special Tokens</small> |
| 1477 | </label> | 1477 | </label> |
| 1478 | </div> | 1478 | </div> |
| 1479 | </div> | 1479 | </div> |
| 1480 | <div data-tg-type="mancer, ooba, koboldcpp, vllm, aphrodite, llamacpp, ollama" data-newbie-hidden class="flex-container flexFlowColumn alignitemscenter flexBasis48p flexGrow flexShrink gap0"> | 1480 | <div data-tg-type="mancer, ooba, koboldcpp, vllm, aphrodite, llamacpp, ollama, infermaticai, huggingface" data-newbie-hidden class="flex-container flexFlowColumn alignitemscenter flexBasis48p flexGrow flexShrink gap0"> |
| 1481 | <small data-i18n="Seed" class="textAlignCenter">Seed</small> | 1481 | <small data-i18n="Seed" class="textAlignCenter">Seed</small> |
| 1482 | <input type="number" id="seed_textgenerationwebui" class="text_pole textAlignCenter" min="-1" value="-1" maxlength="100" /> | 1482 | <input type="number" id="seed_textgenerationwebui" class="text_pole textAlignCenter" min="-1" value="-1" maxlength="100" /> |
| 1483 | </div> | 1483 | </div> |
| @@ -1753,8 +1753,8 @@ | |||
| 1753 | <input id="openai_function_calling" type="checkbox" /> | 1753 | <input id="openai_function_calling" type="checkbox" /> |
| 1754 | <span data-i18n="Enable function calling">Enable function calling</span> | 1754 | <span data-i18n="Enable function calling">Enable function calling</span> |
| 1755 | <div class="flexBasis100p toggle-description justifyLeft"> | 1755 | <div class="flexBasis100p toggle-description justifyLeft"> |
| 1756 | Allows using <a href="https://platform.openai.com/docs/guides/function-calling" target="_blank">function tools</a>. | 1756 | <span data-i18n="enable_functions_desc_1">Allows using </span><a href="https://platform.openai.com/docs/guides/function-calling" target="_blank" data-i18n="enable_functions_desc_2">function tools</a>. |
| 1757 | Can be utilized by various extensions to provide additional functionality. | 1757 | <span data-i18n="enable_functions_desc_3">Can be utilized by various extensions to provide additional functionality.</span> |
| 1758 | </div> | 1758 | </div> |
| 1759 | </label> | 1759 | </label> |
| 1760 | </div> | 1760 | </div> |
| @@ -1863,7 +1863,7 @@ | |||
| 1863 | <div id="openai_logit_bias_new_entry" class="menu_button wide100p flex-container justifyCenter" data-i18n="Add bias entry"> | 1863 | <div id="openai_logit_bias_new_entry" class="menu_button wide100p flex-container justifyCenter" data-i18n="Add bias entry"> |
| 1864 | Add bias entry | 1864 | Add bias entry |
| 1865 | </div> | 1865 | </div> |
| 1866 | <div class="openai_logit_bias_list"></div> | 1866 | <div class="openai_logit_bias_list" no_items_text="No items" data-i18n="[no_items_text]openai_logit_bias_no_items"></div> |
| 1867 | <div class="m-t-1"> | 1867 | <div class="m-t-1"> |
| 1868 | <small> | 1868 | <small> |
| 1869 | <i class="fa-solid fa-lightbulb"></i> | 1869 | <i class="fa-solid fa-lightbulb"></i> |
| @@ -1887,7 +1887,7 @@ | |||
| 1887 | </div> | 1887 | </div> |
| 1888 | <div id="sys-settings-button" class="drawer"> | 1888 | <div id="sys-settings-button" class="drawer"> |
| 1889 | <div class="drawer-toggle drawer-header"> | 1889 | <div class="drawer-toggle drawer-header"> |
| 1890 | <div id="API-status-top" class="drawer-icon fa-solid fa-plug-circle-exclamation closedIcon" title="API Connections" data-i18n="[title]API Connections"></div> | 1890 | <div id="API-status-top" class="drawer-icon fa-solid fa-plug-circle-exclamation closedIcon" title="API Connections" data-i18n="[title]API Connections;[no_connection_text]api_no_connection" no_connection_text="No connection..."></div> |
| 1891 | </div> | 1891 | </div> |
| 1892 | <div id="rm_api_block" class="drawer-content closedDrawer"> | 1892 | <div id="rm_api_block" class="drawer-content closedDrawer"> |
| 1893 | <h3 class="margin0" id="title_api">API</h3> | 1893 | <h3 class="margin0" id="title_api">API</h3> |
| @@ -2029,6 +2029,8 @@ | |||
| 2029 | <option value="ooba" data-i18n="Default (completions compatible)">Default [OpenAI /completions compatible: oobabooga, LM Studio, etc.]</option> | 2029 | <option value="ooba" data-i18n="Default (completions compatible)">Default [OpenAI /completions compatible: oobabooga, LM Studio, etc.]</option> |
| 2030 | <option value="aphrodite">Aphrodite</option> | 2030 | <option value="aphrodite">Aphrodite</option> |
| 2031 | <option value="dreamgen">DreamGen</option> | 2031 | <option value="dreamgen">DreamGen</option> |
| 2032 | <option value="featherless">Featherless</option> | ||
| 2033 | <option value="huggingface">HuggingFace (Inference Endpoint)</option> | ||
| 2032 | <option value="infermaticai">InfermaticAI</option> | 2034 | <option value="infermaticai">InfermaticAI</option> |
| 2033 | <option value="koboldcpp">KoboldCpp</option> | 2035 | <option value="koboldcpp">KoboldCpp</option> |
| 2034 | <option value="llamacpp">llama.cpp</option> | 2036 | <option value="llamacpp">llama.cpp</option> |
| @@ -2182,6 +2184,27 @@ | |||
| 2182 | </div> | 2184 | </div> |
| 2183 | <input id="custom_model_textgenerationwebui" class="text_pole wide100p" maxlength="500" placeholder="Custom model (optional)" data-i18n="[placeholder]Custom model (optional)" type="text"> | 2185 | <input id="custom_model_textgenerationwebui" class="text_pole wide100p" maxlength="500" placeholder="Custom model (optional)" data-i18n="[placeholder]Custom model (optional)" type="text"> |
| 2184 | </div> | 2186 | </div> |
| 2187 | <div data-tg-type="featherless" class="flex-container flexFlowColumn"> | ||
| 2188 | <div class="flex-container flexFlowColumn"> | ||
| 2189 | <a href="https://featherless.ai/models/" target="_blank" rel="noopener noreferrer"> | ||
| 2190 | featherless.ai | ||
| 2191 | </a> | ||
| 2192 | </div> | ||
| 2193 | <h4 data-i18n="API key (optional)">API key</h4> | ||
| 2194 | <div class="flex-container"> | ||
| 2195 | <input id="api_key_featherless" name="api_key_featherless" class="text_pole flex1 wide100p" maxlength="500" size="35" type="text" autocomplete="off"> | ||
| 2196 | <div title="Clear your API key" data-i18n="[title]Clear your API key" class="menu_button fa-solid fa-circle-xmark clear-api-key" data-key="api_key_featherless"> | ||
| 2197 | </div> | ||
| 2198 | </div> | ||
| 2199 | <div data-for="api_key_featherless" class="neutral_warning" data-i18n="For privacy reasons, your API key will be hidden after you reload the page."> | ||
| 2200 | For privacy reasons, your API key will be hidden after you reload the page. | ||
| 2201 | </div> | ||
| 2202 | <select id="featherless_model"> | ||
| 2203 | <option data-i18n="-- Connect to the API --"> | ||
| 2204 | -- Connect to the API -- | ||
| 2205 | </option> | ||
| 2206 | </select> | ||
| 2207 | </div> | ||
| 2185 | <div data-tg-type="vllm"> | 2208 | <div data-tg-type="vllm"> |
| 2186 | <div class="flex-container flexFlowColumn"> | 2209 | <div class="flex-container flexFlowColumn"> |
| 2187 | <a href="https://github.com/vllm-project/vllm" target="_blank" data-i18n="vllm-project/vllm"> | 2210 | <a href="https://github.com/vllm-project/vllm" target="_blank" data-i18n="vllm-project/vllm"> |
| @@ -2211,6 +2234,22 @@ | |||
| 2211 | </select> | 2234 | </select> |
| 2212 | </div> | 2235 | </div> |
| 2213 | </div> | 2236 | </div> |
| 2237 | <div data-tg-type="huggingface"> | ||
| 2238 | <h4 data-i18n="HuggingFace Token">HuggingFace Token</h4> | ||
| 2239 | <div class="flex-container"> | ||
| 2240 | <input id="api_key_huggingface" name="api_key_huggingface" class="text_pole flex1 wide100p" maxlength="500" size="35" type="text" autocomplete="off"> | ||
| 2241 | <div title="Clear your API key" data-i18n="[title]Clear your API key" class="menu_button fa-solid fa-circle-xmark clear-api-key" data-key="api_key_huggingface"> | ||
| 2242 | </div> | ||
| 2243 | </div> | ||
| 2244 | <div data-for="api_key_huggingface" class="neutral_warning" data-i18n="For privacy reasons, your API key will be hidden after you reload the page."> | ||
| 2245 | For privacy reasons, your API key will be hidden after you reload the page. | ||
| 2246 | </div> | ||
| 2247 | <div class="flex1"> | ||
| 2248 | <h4 data-i18n="Endpoint URL">Endpoint URL</h4> | ||
| 2249 | <small data-i18n="Example: https://****.endpoints.huggingface.cloud">Example: https://****.endpoints.huggingface.cloud</small> | ||
| 2250 | <input id="huggingface_api_url_text" class="text_pole wide100p" maxlength="500" value="" autocomplete="off" data-server-history="huggingface"> | ||
| 2251 | </div> | ||
| 2252 | </div> | ||
| 2214 | 2253 | ||
| 2215 | <div data-tg-type="aphrodite"> | 2254 | <div data-tg-type="aphrodite"> |
| 2216 | <div class="flex-container flexFlowColumn"> | 2255 | <div class="flex-container flexFlowColumn"> |
| @@ -2332,7 +2371,7 @@ | |||
| 2332 | </div> | 2371 | </div> |
| 2333 | </div> | 2372 | </div> |
| 2334 | <div class="flex-container"> | 2373 | <div class="flex-container"> |
| 2335 | <div id="api_button_textgenerationwebui" class="api_button menu_button" type="submit" data-i18n="Connect" data-server-connect="ooba_blocking,vllm,aphrodite,tabby,koboldcpp,ollama,llamacpp">Connect</div> | 2374 | <div id="api_button_textgenerationwebui" class="api_button menu_button" type="submit" data-i18n="Connect" data-server-connect="ooba_blocking,vllm,aphrodite,tabby,koboldcpp,ollama,llamacpp,huggingface">Connect</div> |
| 2336 | <div data-tg-type="openrouter" class="menu_button menu_button_icon openrouter_authorize" title="Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai" data-i18n="Authorize;[title]Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai">Authorize</div> | 2375 | <div data-tg-type="openrouter" class="menu_button menu_button_icon openrouter_authorize" title="Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai" data-i18n="Authorize;[title]Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai">Authorize</div> |
| 2337 | <div class="api_loading menu_button" data-i18n="Cancel">Cancel</div> | 2376 | <div class="api_loading menu_button" data-i18n="Cancel">Cancel</div> |
| 2338 | </div> | 2377 | </div> |
| @@ -2357,9 +2396,10 @@ | |||
| 2357 | <select id="chat_completion_source"> | 2396 | <select id="chat_completion_source"> |
| 2358 | <optgroup> | 2397 | <optgroup> |
| 2359 | <option value="openai">OpenAI</option> | 2398 | <option value="openai">OpenAI</option> |
| 2360 | <option value="custom">Custom (OpenAI-compatible)</option> | 2399 | <option value="custom" data-i18n="Custom (OpenAI-compatible)">Custom (OpenAI-compatible)</option> |
| 2361 | </optgroup> | 2400 | </optgroup> |
| 2362 | <optgroup> | 2401 | <optgroup> |
| 2402 | <option value="01ai">01.AI (Yi)</option> | ||
| 2363 | <option value="ai21">AI21</option> | 2403 | <option value="ai21">AI21</option> |
| 2364 | <option value="claude">Claude</option> | 2404 | <option value="claude">Claude</option> |
| 2365 | <option value="cohere">Cohere</option> | 2405 | <option value="cohere">Cohere</option> |
| @@ -2551,6 +2591,7 @@ | |||
| 2551 | <h4 data-i18n="Claude Model">Claude Model</h4> | 2591 | <h4 data-i18n="Claude Model">Claude Model</h4> |
| 2552 | <select id="model_claude_select"> | 2592 | <select id="model_claude_select"> |
| 2553 | <optgroup label="Versions"> | 2593 | <optgroup label="Versions"> |
| 2594 | <option value="claude-3-5-sonnet-20240620">claude-3-5-sonnet-20240620</option> | ||
| 2554 | <option value="claude-3-opus-20240229">claude-3-opus-20240229</option> | 2595 | <option value="claude-3-opus-20240229">claude-3-opus-20240229</option> |
| 2555 | <option value="claude-3-sonnet-20240229">claude-3-sonnet-20240229</option> | 2596 | <option value="claude-3-sonnet-20240229">claude-3-sonnet-20240229</option> |
| 2556 | <option value="claude-3-haiku-20240307">claude-3-haiku-20240307</option> | 2597 | <option value="claude-3-haiku-20240307">claude-3-haiku-20240307</option> |
| @@ -2856,16 +2897,16 @@ | |||
| 2856 | <form id="custom_form" data-source="custom"> | 2897 | <form id="custom_form" data-source="custom"> |
| 2857 | <h4 data-i18n="Custom Endpoint (Base URL)">Custom Endpoint (Base URL)</h4> | 2898 | <h4 data-i18n="Custom Endpoint (Base URL)">Custom Endpoint (Base URL)</h4> |
| 2858 | <div class="flex-container"> | 2899 | <div class="flex-container"> |
| 2859 | <input id="custom_api_url_text" class="text_pole wide100p" maxlength="5000" value="" autocomplete="off" placeholder="Example: http://localhost:1234/v1"> | 2900 | <input id="custom_api_url_text" class="text_pole wide100p" maxlength="5000" value="" autocomplete="off" data-i18n="[placeholder]Example: http://localhost:1234/v1" placeholder="Example: http://localhost:1234/v1"> |
| 2860 | </div> | 2901 | </div> |
| 2861 | <div> | 2902 | <div> |
| 2862 | <small> | 2903 | <small> |
| 2863 | Doesn't work? Try adding <code>/v1</code> at the end of the URL! | 2904 | <span data-i18n="Doesn't work? Try adding">Doesn't work? Try adding</span> <code>/v1</code> <span data-i18n="at the end of the URL!">at the end of the URL!</span> |
| 2864 | </small> | 2905 | </small> |
| 2865 | </div> | 2906 | </div> |
| 2866 | <h4> | 2907 | <h4> |
| 2867 | <span data-i18n="Custom API Key">Custom API Key</span> | 2908 | <span data-i18n="Custom API Key">Custom API Key</span> |
| 2868 | <small>(Optional)</small> | 2909 | <small data-i18n="(Optional)">(Optional)</small> |
| 2869 | </h4> | 2910 | </h4> |
| 2870 | <div class="flex-container"> | 2911 | <div class="flex-container"> |
| 2871 | <input id="api_key_custom" name="api_key_custom" class="text_pole flex1" maxlength="5000" value="" type="text" autocomplete="off"> | 2912 | <input id="api_key_custom" name="api_key_custom" class="text_pole flex1" maxlength="5000" value="" type="text" autocomplete="off"> |
| @@ -2874,24 +2915,42 @@ | |||
| 2874 | <div data-for="api_key_custom" class="neutral_warning" data-i18n="For privacy reasons, your API key will be hidden after you reload the page."> | 2915 | <div data-for="api_key_custom" class="neutral_warning" data-i18n="For privacy reasons, your API key will be hidden after you reload the page."> |
| 2875 | For privacy reasons, your API key will be hidden after you reload the page. | 2916 | For privacy reasons, your API key will be hidden after you reload the page. |
| 2876 | </div> | 2917 | </div> |
| 2877 | <h4>Enter a Model ID</h4> | 2918 | <h4 data-i18n="Enter a Model ID">Enter a Model ID</h4> |
| 2878 | <div class="flex-container"> | 2919 | <div class="flex-container"> |
| 2879 | <input id="custom_model_id" class="text_pole wide100p" maxlength="500" value="" autocomplete="off" placeholder="Example: gpt-3.5-turbo"> | 2920 | <input list="model_custom_select_fill" id="custom_model_id" class="text_pole wide100p" maxlength="500" value="" autocomplete="off" data-i18n="[placeholder]Example: gpt-3.5-turbo" placeholder="Example: gpt-3.5-turbo"> |
| 2921 | <datalist id="model_custom_select_fill" class="text_pole model_custom_select"></datalist> | ||
| 2880 | </div> | 2922 | </div> |
| 2881 | <h4 data-i18n="Available Models">Available Models</h4> | 2923 | <h4 data-i18n="Available Models">Available Models</h4> |
| 2882 | <div class="flex-container"> | 2924 | <div class="flex-container"> |
| 2883 | <select id="model_custom_select" class="text_pole"></select> | 2925 | <select id="model_custom_select" class="text_pole model_custom_select"></select> |
| 2884 | </div> | 2926 | </div> |
| 2885 | <h4 data-i18n="Prompt Post-Processing">Prompt Post-Processing</h4> | 2927 | <h4 data-i18n="Prompt Post-Processing">Prompt Post-Processing</h4> |
| 2886 | <select id="custom_prompt_post_processing" class="text_pole" title="Applies additional processing to the prompt before sending it to the API." data-i18n="[title]Applies additional processing to the prompt before sending it to the API."> | 2928 | <select id="custom_prompt_post_processing" class="text_pole" title="Applies additional processing to the prompt before sending it to the API." data-i18n="[title]Applies additional processing to the prompt before sending it to the API."> |
| 2887 | <option value="">None</option> | 2929 | <option data-i18n="prompt_post_processing_none" value="">None</option> |
| 2888 | <option value="claude">Claude</option> | 2930 | <option value="claude">Claude</option> |
| 2889 | </select> | 2931 | </select> |
| 2890 | </form> | 2932 | </form> |
| 2933 | <div id="01ai_form" data-source="01ai"> | ||
| 2934 | <h4> | ||
| 2935 | <a data-i18n="01.AI API Key" href="https://platform.01.ai/" target="_blank" rel="noopener noreferrer"> | ||
| 2936 | 01.AI API Key | ||
| 2937 | </a> | ||
| 2938 | </h4> | ||
| 2939 | <div class="flex-container"> | ||
| 2940 | <input id="api_key_01ai" name="api_key_01ai" class="text_pole flex1" maxlength="500" value="" type="text" autocomplete="off"> | ||
| 2941 | <div title="Clear your API key" data-i18n="[title]Clear your API key" class="menu_button fa-solid fa-circle-xmark clear-api-key" data-key="api_key_01ai"></div> | ||
| 2942 | </div> | ||
| 2943 | <div data-for="api_key_01ai" class="neutral_warning" data-i18n="For privacy reasons, your API key will be hidden after you reload the page."> | ||
| 2944 | For privacy reasons, your API key will be hidden after you reload the page. | ||
| 2945 | </div> | ||
| 2946 | <h4 data-i18n="01.AI Model">01.AI Model</h4> | ||
| 2947 | <select id="model_01ai_select"> | ||
| 2948 | </select> | ||
| 2949 | </div> | ||
| 2891 | <div class="flex-container flex"> | 2950 | <div class="flex-container flex"> |
| 2892 | <div id="api_button_openai" class="api_button menu_button menu_button_icon" type="submit" data-i18n="Connect">Connect</div> | 2951 | <div id="api_button_openai" class="api_button menu_button menu_button_icon" type="submit" data-i18n="Connect">Connect</div> |
| 2893 | <div class="api_loading menu_button" data-i18n="Cancel">Cancel</div> | 2952 | <div class="api_loading menu_button" data-i18n="Cancel">Cancel</div> |
| 2894 | <div data-source="custom" id="customize_additional_parameters" class="menu_button menu_button_icon">Additional Parameters</div> | 2953 | <div data-source="custom" id="customize_additional_parameters" class="menu_button menu_button_icon" data-i18n="Additional Parameters">Additional Parameters</div> |
| 2895 | <div data-source="openrouter" class="menu_button menu_button_icon openrouter_authorize" title="Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai" data-i18n="Authorize;[title]Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai">Authorize</div> | 2954 | <div data-source="openrouter" class="menu_button menu_button_icon openrouter_authorize" title="Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai" data-i18n="Authorize;[title]Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai">Authorize</div> |
| 2896 | <div id="test_api_button" class="menu_button menu_button_icon" title="Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!" data-i18n="[title]Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!"><span data-i18n="Test Message">Test Message</span></div> | 2955 | <div id="test_api_button" class="menu_button menu_button_icon" title="Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!" data-i18n="[title]Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!"><span data-i18n="Test Message">Test Message</span></div> |
| 2897 | </div> | 2956 | </div> |
| @@ -3747,95 +3806,6 @@ | |||
| 3747 | <input class="neo-range-slider" type="range" id="shadow_width" name="shadow_width" min="0" max="5" step="1"> | 3806 | <input class="neo-range-slider" type="range" id="shadow_width" name="shadow_width" min="0" max="5" step="1"> |
| 3748 | <input class="neo-range-input" type="number" min="0" max="5" step="1" data-for="shadow_width" id="shadow_width_counter"> | 3807 | <input class="neo-range-input" type="number" min="0" max="5" step="1" data-for="shadow_width" id="shadow_width_counter"> |
| 3749 | </div> | 3808 | </div> |
| 3750 | |||
| 3751 | |||
| 3752 | |||
| 3753 | <!-- <div data-newbie-hidden class="range-block"> | ||
| 3754 | <label for="compact_input_area" class="range-block-title"> | ||
| 3755 | <span data-i18n="Chat Width (PC)"> | ||
| 3756 | Chat Width | ||
| 3757 | </span> | ||
| 3758 | <i class="fa-solid fa-desktop"></i> | ||
| 3759 | </label> | ||
| 3760 | <div class="range-block-range-and-counter"> | ||
| 3761 | <div class="range-block-range"> | ||
| 3762 | <input id="chat_width_slider" class="wide100p" type="range" min="25" max="100" step="1" value="50"> | ||
| 3763 | </div> | ||
| 3764 | <div class="range-block-counter"> | ||
| 3765 | <input type="number" min="25" max="100" step="1" value="50" data-for="chat_width_slider" id="chat_width_slider_counter"> | ||
| 3766 | </div> | ||
| 3767 | </div> | ||
| 3768 | </div> --> | ||
| 3769 | |||
| 3770 | <!-- <div id="font-scale-block" class="range-block"> | ||
| 3771 | <div class="range-block-title" data-i18n="Font Scale"> | ||
| 3772 | Font Scale | ||
| 3773 | </div> | ||
| 3774 | <div class="range-block-range-and-counter"> | ||
| 3775 | <div class="range-block-range"> | ||
| 3776 | <input type="range" id="font_scale" name="font_scale" min="0.8" max="1.2" step="0.01"> | ||
| 3777 | </div> | ||
| 3778 | <div class="range-block-counter"> | ||
| 3779 | <input type="number" min="0.8" max="1.2" step="0.01" data-for="font_scale" id="font_scale_counter"> | ||
| 3780 | </div> | ||
| 3781 | </div> | ||
| 3782 | </div> --> | ||
| 3783 | <!-- <div id="blur-strength-block" class="range-block"> | ||
| 3784 | <div class="range-block-title" data-i18n="Blur Strength"> | ||
| 3785 | Blur Strength | ||
| 3786 | </div> | ||
| 3787 | <div class="range-block-range-and-counter"> | ||
| 3788 | <div class="range-block-range"> | ||
| 3789 | <input type="range" id="blur_strength" name="blur_strength" min="0" max="30" step="1"> | ||
| 3790 | </div> | ||
| 3791 | <div class="range-block-counter"> | ||
| 3792 | <input type="number" min="0" max="30" step="1" data-for="blur_strength" id="blur_strength_counter"> | ||
| 3793 | </div> | ||
| 3794 | </div> | ||
| 3795 | </div> --> | ||
| 3796 | <!-- <div id="shadow-width-block" class="range-block"> | ||
| 3797 | <div class="range-block-title" data-i18n="Text Shadow Width"> | ||
| 3798 | Text Shadow Width | ||
| 3799 | </div> | ||
| 3800 | <div class="range-block-range-and-counter"> | ||
| 3801 | <div class="range-block-range"> | ||
| 3802 | <input type="range" id="shadow_width" name="shadow_width" min="0" max="5" step="1"> | ||
| 3803 | </div> | ||
| 3804 | <div class="range-block-counter"> | ||
| 3805 | <input type="number" min="0" max="5" step="1" data-for="shadow_width" id="shadow_width_counter"> | ||
| 3806 | </div> | ||
| 3807 | </div> | ||
| 3808 | </div> --> | ||
| 3809 | <!-- <div id="chat-truncation-block" class="range-block"> | ||
| 3810 | <label for="compact_input_area" class="range-block-title"> | ||
| 3811 | <span data-i18n="Chat Truncation"> | ||
| 3812 | Chat Truncation | ||
| 3813 | </span> | ||
| 3814 | <small data-i18n="(0 = unlimited)">(0 = unlimited)</small> | ||
| 3815 | </label> | ||
| 3816 | <div class="range-block-range-and-counter"> | ||
| 3817 | <div class="range-block-range"> | ||
| 3818 | <input type="range" id="chat_truncation" name="chat_truncation" min="0" max="1000" step="25"> | ||
| 3819 | </div> | ||
| 3820 | <div class="range-block-counter"> | ||
| 3821 | <input type="number" min="0" max="1000" step="1" data-for="chat_truncation" id="chat_truncation_counter"> | ||
| 3822 | </div> | ||
| 3823 | </div> | ||
| 3824 | </div> --> | ||
| 3825 | <!-- <div id="streaming-fps" class="range-block"> | ||
| 3826 | <div class="range-block-title" data-i18n="Streaming FPS"> | ||
| 3827 | Streaming FPS | ||
| 3828 | </div> | ||
| 3829 | <div class="range-block-range-and-counter"> | ||
| 3830 | <div class="range-block-range"> | ||
| 3831 | <input type="range" id="streaming_fps" name="streaming_fps" min="5" max="100" step="5"> | ||
| 3832 | </div> | ||
| 3833 | <div class="range-block-counter"> | ||
| 3834 | <input type="number" min="5" max="100" step="1" data-for="streaming_fps" id="streaming_fps_counter"> | ||
| 3835 | </div> | ||
| 3836 | </div> | ||
| 3837 | </div> --> | ||
| 3838 | |||
| 3839 | </div> | 3809 | </div> |
| 3840 | <hr> | 3810 | <hr> |
| 3841 | <div name="themeToggles"> | 3811 | <div name="themeToggles"> |
| @@ -3922,13 +3892,22 @@ | |||
| 3922 | <h4 data-i18n="Character Handling"> | 3892 | <h4 data-i18n="Character Handling"> |
| 3923 | Character Handling | 3893 | Character Handling |
| 3924 | </h4> | 3894 | </h4> |
| 3925 | <div title="If set in the advanced character definitions, this field will be displayed in the characters list." data-i18n="[title]If set in the advanced character definitions, this field will be displayed in the characters list."> | 3895 | <div class="flex-container alignitemscenter" title="If set in the advanced character definitions, this field will be displayed in the characters list." data-i18n="[title]If set in the advanced character definitions, this field will be displayed in the characters list."> |
| 3926 | <label for="aux_field"><small data-i18n="Char List Subheader">Char List Subheader</small></label> | 3896 | <label for="aux_field"><small data-i18n="Char List Subheader">Char List Subheader</small></label> |
| 3927 | <select id="aux_field"> | 3897 | <select id="aux_field" class="widthNatural flex1 margin0"> |
| 3928 | <option data-i18n="Character Version" value="character_version">Character Version</option> | 3898 | <option data-i18n="Character Version" value="character_version">Character Version</option> |
| 3929 | <option data-i18n="Created by" value="creator">Created by</option> | 3899 | <option data-i18n="Created by" value="creator">Created by</option> |
| 3930 | </select> | 3900 | </select> |
| 3931 | </div> | 3901 | </div> |
| 3902 | <div data-newbie-hidden class="flex-container alignitemscenter" title="Defines on importing cards which action should be chosen for importing its listed tags. 'Ask' will always display the dialog." data-i18n="[title]Defines on importing cards which action should be chosen for importing its listed tags. 'Ask' will always display the dialog."> | ||
| 3903 | <label for="tag_import_setting"><small data-i18n="Import Card Tags">Import Card Tags</small></label> | ||
| 3904 | <select id="tag_import_setting" class="widthNatural flex1 margin0"> | ||
| 3905 | <option data-i18n="Ask" value="1">Ask</option> | ||
| 3906 | <option data-i18n="None" value="2">None</option> | ||
| 3907 | <option data-i18n="All" value="3">All</option> | ||
| 3908 | <option data-i18n="Existing" value="4">Existing</option> | ||
| 3909 | </select> | ||
| 3910 | </div> | ||
| 3932 | <label data-newbie-hidden class="checkbox_label" for="fuzzy_search_checkbox" title="Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring." data-i18n="[title]Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring"> | 3911 | <label data-newbie-hidden class="checkbox_label" for="fuzzy_search_checkbox" title="Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring." data-i18n="[title]Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring"> |
| 3933 | <input id="fuzzy_search_checkbox" type="checkbox" /> | 3912 | <input id="fuzzy_search_checkbox" type="checkbox" /> |
| 3934 | <small data-i18n="Advanced Character Search">Advanced Character Search</small> | 3913 | <small data-i18n="Advanced Character Search">Advanced Character Search</small> |
| @@ -3949,10 +3928,6 @@ | |||
| 3949 | <input id="show_card_avatar_urls" type="checkbox" /> | 3928 | <input id="show_card_avatar_urls" type="checkbox" /> |
| 3950 | <small data-i18n="Show avatar filenames">Show avatar filenames</small> | 3929 | <small data-i18n="Show avatar filenames">Show avatar filenames</small> |
| 3951 | </label> | 3930 | </label> |
| 3952 | <label data-newbie-hidden class="checkbox_label" for="import_card_tags" title="Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored." data-i18n="[title]Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored"> | ||
| 3953 | <input id="import_card_tags" type="checkbox" /> | ||
| 3954 | <small data-i18n="Import Card Tags">Import Card Tags</small> | ||
| 3955 | </label> | ||
| 3956 | <label data-newbie-hidden class="checkbox_label" for="spoiler_free_mode" title="Hide character definitions from the editor panel behind a spoiler button." data-i18n="[title]Hide character definitions from the editor panel behind a spoiler button"> | 3931 | <label data-newbie-hidden class="checkbox_label" for="spoiler_free_mode" title="Hide character definitions from the editor panel behind a spoiler button." data-i18n="[title]Hide character definitions from the editor panel behind a spoiler button"> |
| 3957 | <input id="spoiler_free_mode" type="checkbox" /> | 3932 | <input id="spoiler_free_mode" type="checkbox" /> |
| 3958 | <small data-i18n="Spoiler Free Mode">Spoiler Free Mode</small> | 3933 | <small data-i18n="Spoiler Free Mode">Spoiler Free Mode</small> |
| @@ -4246,7 +4221,7 @@ | |||
| 4246 | <div name="STscriptToggles"> | 4221 | <div name="STscriptToggles"> |
| 4247 | <h4 data-i18n="STscript Settings">STscript Settings</h4> | 4222 | <h4 data-i18n="STscript Settings">STscript Settings</h4> |
| 4248 | <div title="Sets default flags for the STscript parser." data-i18n="[title]Sets default flags for the STscript parser."> | 4223 | <div title="Sets default flags for the STscript parser." data-i18n="[title]Sets default flags for the STscript parser."> |
| 4249 | <label data-i18n="Parser Flags"><small>Parser Flags</small></label> | 4224 | <label><small data-i18n="Parser Flags">Parser Flags</small></label> |
| 4250 | <label class="checkbox_label" title="Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well." data-i18n="[title]Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well."> | 4225 | <label class="checkbox_label" title="Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well." data-i18n="[title]Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well."> |
| 4251 | <input id="stscript_parser_flag_strict_escaping" type="checkbox" /> | 4226 | <input id="stscript_parser_flag_strict_escaping" type="checkbox" /> |
| 4252 | <span data-i18n="STRICT_ESCAPING"><small>STRICT_ESCAPING</small></span> | 4227 | <span data-i18n="STRICT_ESCAPING"><small>STRICT_ESCAPING</small></span> |
| @@ -4327,8 +4302,33 @@ | |||
| 4327 | </div> | 4302 | </div> |
| 4328 | </div> | 4303 | </div> |
| 4329 | <div id="extensions_settings" class="flex1 wide50p"> | 4304 | <div id="extensions_settings" class="flex1 wide50p"> |
| 4305 | <div id="assets_container" class="extension_container"></div> | ||
| 4306 | <div id="expressions_container" class="extension_container"></div> | ||
| 4307 | <div id="sd_container" class="extension_container"></div> | ||
| 4308 | <div id="tts_container" class="extension_container"></div> | ||
| 4309 | <div id="rvc_container" class="extension_container"></div> | ||
| 4310 | <div id="stt_container" class="extension_container"></div> | ||
| 4311 | <div id="audio_container" class="extension_container"></div> | ||
| 4312 | <div id="silence_container" class="extension_container"></div> | ||
| 4313 | <div id="objective_container" class="extension_container"></div> | ||
| 4314 | <div id="blip_container" class="extension_container"></div> | ||
| 4315 | <div id="live2d_container" class="extension_container"></div> | ||
| 4316 | <div id="vrm_container" class="extension_container"></div> | ||
| 4317 | <div id="timelines_container" class="extension_container"></div> | ||
| 4330 | </div> | 4318 | </div> |
| 4331 | <div id="extensions_settings2" class="flex1 wide50p"> | 4319 | <div id="extensions_settings2" class="flex1 wide50p"> |
| 4320 | <div id="websearch_container" class="extension_container"></div> | ||
| 4321 | <div id="emulatorjs_container" class="extension_container"></div> | ||
| 4322 | <div id="qr_container" class="extension_container"></div> | ||
| 4323 | <div id="translation_container" class="extension_container"></div> | ||
| 4324 | <div id="caption_container" class="extension_container"></div> | ||
| 4325 | <div id="idle_container" class="extension_container"></div> | ||
| 4326 | <div id="summarize_container" class="extension_container"></div> | ||
| 4327 | <div id="hypebot_container" class="extension_container"></div> | ||
| 4328 | <div id="regex_container" class="extension_container"></div> | ||
| 4329 | <div id="vectors_container" class="extension_container"></div> | ||
| 4330 | <div id="randomizer_container" class="extension_container"></div> | ||
| 4331 | <div id="chromadb_container" class="extension_container"></div> | ||
| 4332 | </div> | 4332 | </div> |
| 4333 | <hr class="wide100p margin0"> | 4333 | <hr class="wide100p margin0"> |
| 4334 | <div class="alignitemscenter flex-container justifyCenter wide100p" style="justify-content: space-between;"> | 4334 | <div class="alignitemscenter flex-container justifyCenter wide100p" style="justify-content: space-between;"> |
| @@ -4475,14 +4475,14 @@ | |||
| 4475 | <div id="rm_button_panel_pin_div" class="alignitemsflexstart" title="Locked = Character Management panel will stay open" data-i18n="[title]Locked = Character Management panel will stay open"> | 4475 | <div id="rm_button_panel_pin_div" class="alignitemsflexstart" title="Locked = Character Management panel will stay open" data-i18n="[title]Locked = Character Management panel will stay open"> |
| 4476 | <input type="checkbox" id="rm_button_panel_pin"> | 4476 | <input type="checkbox" id="rm_button_panel_pin"> |
| 4477 | <label for="rm_button_panel_pin"> | 4477 | <label for="rm_button_panel_pin"> |
| 4478 | <div class="fa-solid unchecked fa-unlock" alt=""></div> | 4478 | <div class="fa-solid unchecked fa-unlock right_menu_button" alt=""></div> |
| 4479 | <div class="fa-solid checked fa-lock" alt=""></div> | 4479 | <div class="fa-solid checked fa-lock right_menu_button" alt=""></div> |
| 4480 | </label> | 4480 | </label> |
| 4481 | </div> | 4481 | </div> |
| 4482 | <div class="right_menu_button fa-solid fa-list-ul" id="rm_button_characters" title="Select/Create Characters" data-i18n="[title]Select/Create Characters"></div> | 4482 | <div class="right_menu_button fa-solid fa-list-ul" id="rm_button_characters" title="Select/Create Characters" data-i18n="[title]Select/Create Characters"></div> |
| 4483 | </div> | 4483 | </div> |
| 4484 | <div id="HotSwapWrapper" class="alignitemscenter flex-container margin0auto wide100p"> | 4484 | <div id="HotSwapWrapper" class="alignitemscenter flex-container margin0auto wide100p"> |
| 4485 | <div class="hotswap avatars_inline flex-container expander" data-i18n="[no_favs]Favorite characters to add them to HotSwaps" no_favs="Favorite characters to add them to HotSwaps"></div> | 4485 | <div class="hotswap avatars_inline flex-container scroll-reset-container expander" data-i18n="[no_favs]Favorite characters to add them to HotSwaps" no_favs="Favorite characters to add them to HotSwaps"></div> |
| 4486 | </div> | 4486 | </div> |
| 4487 | </div> | 4487 | </div> |
| 4488 | <hr> | 4488 | <hr> |
| @@ -4490,7 +4490,7 @@ | |||
| 4490 | <div id="rm_PinAndTabs"> | 4490 | <div id="rm_PinAndTabs"> |
| 4491 | <div id="right-nav-panel-tabs" class=""> | 4491 | <div id="right-nav-panel-tabs" class=""> |
| 4492 | <div id="rm_button_selected_ch"> | 4492 | <div id="rm_button_selected_ch"> |
| 4493 | <h2></h2> | 4493 | <h2 class="interactable"></h2> |
| 4494 | </div> | 4494 | </div> |
| 4495 | <div id="result_info" class="flex-container" style="display: none;"> | 4495 | <div id="result_info" class="flex-container" style="display: none;"> |
| 4496 | <div id="result_info_text" title="Token counts may be inaccurate and provided just for reference." data-i18n="[title]Token counts may be inaccurate and provided just for reference."> | 4496 | <div id="result_info_text" title="Token counts may be inaccurate and provided just for reference." data-i18n="[title]Token counts may be inaccurate and provided just for reference."> |
| @@ -4714,7 +4714,7 @@ | |||
| 4714 | <div class="flex1 flexGap5" title="Inserted before each part of the joined fields." data-i18n="[title]Inserted before each part of the joined fields."> | 4714 | <div class="flex1 flexGap5" title="Inserted before each part of the joined fields." data-i18n="[title]Inserted before each part of the joined fields."> |
| 4715 | <label for="rm_group_generation_mode_join_prefix" class="flexnowrap width100p whitespacenowrap"> | 4715 | <label for="rm_group_generation_mode_join_prefix" class="flexnowrap width100p whitespacenowrap"> |
| 4716 | <span data-i18n="Join Prefix">Join Prefix</span> | 4716 | <span data-i18n="Join Prefix">Join Prefix</span> |
| 4717 | <div class="fa-solid fa-circle-info opacity50p" data-i18n="[title]When 'Join character cards' is selected, all respective fields of the characters are being joined together. This means that in the story string for example all character descriptions will be joined to one big text. If you want those fields to be separated, you can define a prefix or suffix here. This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)" title="When 'Join character cards' is selected, all respective fields of the characters are being joined together. This means that in the story string for example all character descriptions will be joined to one big text. If you want those fields to be separated, you can define a prefix or suffix here. This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)"> | 4717 | <div class="fa-solid fa-circle-info opacity50p" data-i18n="[title]When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)" title="When 'Join character cards' is selected, all respective fields of the characters are being joined together. This means that in the story string for example all character descriptions will be joined to one big text. If you want those fields to be separated, you can define a prefix or suffix here. This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)"> |
| 4718 | </div> | 4718 | </div> |
| 4719 | </label> | 4719 | </label> |
| 4720 | <textarea id="rm_group_generation_mode_join_prefix" class="text_pole wide100p textarea_compact autoSetHeight" maxlength="2000" placeholder="—" rows="1"></textarea> | 4720 | <textarea id="rm_group_generation_mode_join_prefix" class="text_pole wide100p textarea_compact autoSetHeight" maxlength="2000" placeholder="—" rows="1"></textarea> |
| @@ -4722,7 +4722,7 @@ | |||
| 4722 | <div class="flex1 flexGap5" title="Inserted after each part of the joined fields." data-i18n="[title]Inserted after each part of the joined fields."> | 4722 | <div class="flex1 flexGap5" title="Inserted after each part of the joined fields." data-i18n="[title]Inserted after each part of the joined fields."> |
| 4723 | <label for="rm_group_generation_mode_join_suffix" class="flexnowrap width100p whitespacenowrap"> | 4723 | <label for="rm_group_generation_mode_join_suffix" class="flexnowrap width100p whitespacenowrap"> |
| 4724 | <span data-i18n="Join Suffix">Join Suffix</span> | 4724 | <span data-i18n="Join Suffix">Join Suffix</span> |
| 4725 | <div class="fa-solid fa-circle-info opacity50p" data-i18n="[title]When 'Join character cards' is selected, all respective fields of the characters are being joined together. This means that in the story string for example all character descriptions will be joined to one big text. If you want those fields to be separated, you can define a prefix or suffix here. This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)" title="When 'Join character cards' is selected, all respective fields of the characters are being joined together. This means that in the story string for example all character descriptions will be joined to one big text. If you want those fields to be separated, you can define a prefix or suffix here. This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)"> | 4725 | <div class="fa-solid fa-circle-info opacity50p" data-i18n="[title]When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)" title="When 'Join character cards' is selected, all respective fields of the characters are being joined together. This means that in the story string for example all character descriptions will be joined to one big text. If you want those fields to be separated, you can define a prefix or suffix here. This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)"> |
| 4726 | </div> | 4726 | </div> |
| 4727 | </label> | 4727 | </label> |
| 4728 | <textarea id="rm_group_generation_mode_join_suffix" class="text_pole wide100p textarea_compact autoSetHeight" maxlength="2000" placeholder="—" rows="1"></textarea> | 4728 | <textarea id="rm_group_generation_mode_join_suffix" class="text_pole wide100p textarea_compact autoSetHeight" maxlength="2000" placeholder="—" rows="1"></textarea> |
| @@ -4841,21 +4841,24 @@ | |||
| 4841 | </div> | 4841 | </div> |
| 4842 | </div> | 4842 | </div> |
| 4843 | <!-- various fullscreen popups --> | 4843 | <!-- various fullscreen popups --> |
| 4844 | <template id="shadow_popup_template" data-i18n="[popup_text_save]popup_text_save;[popup_text_yes]popup_text_yes;[popup_text_no]popup_text_no;[popup_text_cancel]popup_text_cancel;[popup_text_import]popup_text_import" popup_text_save="Save" popup_text_yes="Yes" popup_text_no="No" popup_text_cancel="Cancel" popup_text_import="Import"> <!-- localization data holder for popups --> | 4844 | <template id="popup_template" data-i18n="[popup-button-save]popup-button-save;[popup-button-yes]popup-button-yes;[popup-button-no]popup-button-no;[popup-button-cancel]popup-button-cancel;[popup-button-import]popup-button-import;[popup-button-crop]popup-button-crop" popup-button-save="Save" popup-button-yes="Yes" popup-button-no="No" popup-button-cancel="Cancel" popup-button-import="Import" popup-button-crop="Crop"> <!-- localization data holder for popups --> |
| 4845 | <div class="shadow_popup"> | 4845 | <dialog class="popup"> |
| 4846 | <div class="dialogue_popup"> | 4846 | <div class="popup-body"> |
| 4847 | <div class="dialogue_popup_holder"> | 4847 | <div class="popup-content"> |
| 4848 | <div class="dialogue_popup_text"> | 4848 | <h3 class="popup-header">text</h3> |
| 4849 | <h3 class="margin0">text</h3> | ||
| 4850 | </div> | ||
| 4851 | <textarea class="dialogue_popup_input text_pole" rows="1"></textarea> | ||
| 4852 | <div class="dialogue_popup_controls"> | ||
| 4853 | <div class="dialogue_popup_ok menu_button" data-i18n="Delete">Delete</div> | ||
| 4854 | <div class="dialogue_popup_cancel menu_button" data-i18n="Cancel">Cancel</div> | ||
| 4855 | </div> | 4849 | </div> |
| 4850 | <div class="popup-crop-wrap"> | ||
| 4851 | <img class="popup-crop-image" src=""> | ||
| 4856 | </div> | 4852 | </div> |
| 4853 | <textarea class="popup-input text_pole result-control" rows="1" data-result="1" data-result-event="submit"></textarea> | ||
| 4854 | <div class="popup-inputs"></div> | ||
| 4855 | <div class="popup-controls"> | ||
| 4856 | <div class="popup-button-ok menu_button result-control" data-result="1" data-i18n="Delete">Delete</div> | ||
| 4857 | <div class="popup-button-cancel menu_button result-control" data-result="0" data-i18n="Cancel">Cancel</div> | ||
| 4857 | </div> | 4858 | </div> |
| 4858 | </div> | 4859 | </div> |
| 4860 | <div class="popup-button-close right_menu_button fa-solid fa-circle-xmark" data-result="0" title="Close popup" data-i18n="[title]Close popup"></div> | ||
| 4861 | </dialog> | ||
| 4859 | </template> | 4862 | </template> |
| 4860 | <div id="shadow_popup"> | 4863 | <div id="shadow_popup"> |
| 4861 | <div id="dialogue_popup"> | 4864 | <div id="dialogue_popup"> |
| @@ -4865,15 +4868,15 @@ | |||
| 4865 | </div> | 4868 | </div> |
| 4866 | <textarea id="dialogue_popup_input" class="text_pole" rows="1"></textarea> | 4869 | <textarea id="dialogue_popup_input" class="text_pole" rows="1"></textarea> |
| 4867 | <div id="dialogue_popup_controls"> | 4870 | <div id="dialogue_popup_controls"> |
| 4868 | <div id="dialogue_popup_ok" class="menu_button" data-i18n="Delete">Delete</div> | 4871 | <div id="dialogue_popup_ok" class="menu_button" data-i18n="Delete" data-result="1">Delete</div> |
| 4869 | <div id="dialogue_popup_cancel" class="menu_button" data-i18n="Cancel">Cancel</div> | 4872 | <div id="dialogue_popup_cancel" class="menu_button" data-i18n="Cancel" data-result="0">Cancel</div> |
| 4870 | </div> | 4873 | </div> |
| 4871 | </div> | 4874 | </div> |
| 4872 | </div> | 4875 | </div> |
| 4873 | </div> | 4876 | </div> |
| 4874 | <div id="character_popup" class="flex-container flexFlowColumn flexNoGap"> | 4877 | <div id="character_popup" class="flex-container flexFlowColumn flexNoGap"> |
| 4875 | <div id="character_popup_text"> | 4878 | <div id="character_popup_text"> |
| 4876 | <h3 id="character_popup_text_h3" class="margin0"></h3> <span data-i18n="Advanced Defininitions">- Advanced | 4879 | <h3 id="character_popup-button-h3" class="margin0"></h3> <span data-i18n="Advanced Defininitions">- Advanced |
| 4877 | Definitions</span> | 4880 | Definitions</span> |
| 4878 | </div> | 4881 | </div> |
| 4879 | <hr class="margin-bot-10px"> | 4882 | <hr class="margin-bot-10px"> |
| @@ -5192,8 +5195,8 @@ | |||
| 5192 | <div title="Tag as folder" class="tag_as_folder fa-solid fa-folder-open right_menu_button" data-i18n="[title]Use tag as folder"> | 5195 | <div title="Tag as folder" class="tag_as_folder fa-solid fa-folder-open right_menu_button" data-i18n="[title]Use tag as folder"> |
| 5193 | <span class="tag_folder_indicator"></span> | 5196 | <span class="tag_folder_indicator"></span> |
| 5194 | </div> | 5197 | </div> |
| 5195 | <div class="tagColorPickerHolder"></div> | 5198 | <div class="tag_view_color_picker" data-value="color"></div> |
| 5196 | <div class="tagColorPicker2Holder"></div> | 5199 | <div class="tag_view_color_picker" data-value="color2"></div> |
| 5197 | <div class="tag_view_name" contenteditable="true"></div> | 5200 | <div class="tag_view_name" contenteditable="true"></div> |
| 5198 | <div class="tag_view_counter"><span class="tag_view_counter_value"></span> entries</div> | 5201 | <div class="tag_view_counter"><span class="tag_view_counter_value"></span> entries</div> |
| 5199 | <div title="Delete tag" class="tag_delete fa-solid fa-trash-can right_menu_button" data-i18n="[title]Delete tag"></div> | 5202 | <div title="Delete tag" class="tag_delete fa-solid fa-trash-can right_menu_button" data-i18n="[title]Delete tag"></div> |
| @@ -5393,37 +5396,17 @@ | |||
| 5393 | <div class="flex-container wide100p flexGap10"> | 5396 | <div class="flex-container wide100p flexGap10"> |
| 5394 | <div class="flex4 flex-container flexFlowColumn flexNoGap"> | 5397 | <div class="flex4 flex-container flexFlowColumn flexNoGap"> |
| 5395 | <div class="flex-container justifySpaceBetween"> | 5398 | <div class="flex-container justifySpaceBetween"> |
| 5396 | <small for="characterFilter" data-i18n="Filter to Character(s)"> | ||
| 5397 | Filter to Character(s) | ||
| 5398 | </small> | ||
| 5399 | <label class="checkbox_label flexNoGap margin-r5" for="character_exclusion"> | ||
| 5400 | <input type="checkbox" name="character_exclusion" /> | ||
| 5401 | <span> | ||
| 5402 | <small data-i18n="Character Exclusion">Character Exclusion</small> | ||
| 5403 | </span> | ||
| 5404 | </label> | ||
| 5405 | </div> | ||
| 5406 | <div class="range-block-range"> | ||
| 5407 | <select name="characterFilter" class="select2_multi_sameline" multiple> | ||
| 5408 | <option value=""> | ||
| 5409 | <span data-i18n="-- Characters not found --">-- Characters not found --</span> | ||
| 5410 | </option> | ||
| 5411 | </select> | ||
| 5412 | </div> | ||
| 5413 | </div> | ||
| 5414 | <div class="flex3 flex-container flexFlowColumn flexNoGap"> | ||
| 5415 | <div class="flex-container justifySpaceBetween"> | ||
| 5416 | <small for="group"> | 5399 | <small for="group"> |
| 5417 | <span data-i18n="Inclusion Group">Inclusion Group</span> | 5400 | <span data-i18n="Inclusion Group">Inclusion Group</span> |
| 5418 | <a href="https://docs.sillytavern.app/usage/core-concepts/worldinfo/#inclusion-group" class="notes-link" target="_blank" title="Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered. Supports multiple comma-separated groups. Documentation: World Info - Inclusion Group" data-i18n="[title]Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered. Documentation: World Info - Inclusion Group"> | 5401 | <a href="https://docs.sillytavern.app/usage/core-concepts/worldinfo/#inclusion-group" class="notes-link" target="_blank" title="Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered. Supports multiple comma-separated groups. Documentation: World Info - Inclusion Group" data-i18n="[title]Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group"> |
| 5419 | <span class="fa-solid fa-circle-question note-link-span"></span> | 5402 | <span class="fa-solid fa-circle-question note-link-span"></span> |
| 5420 | </a> | 5403 | </a> |
| 5421 | </small> | 5404 | </small> |
| 5422 | <label class="checkbox_label flexNoGap margin-r5" for="groupOverride"> | 5405 | <label class="checkbox_label flexNoGap margin-r5" for="groupOverride"> |
| 5423 | <input type="checkbox" name="groupOverride" /> | 5406 | <input type="checkbox" name="groupOverride" /> |
| 5424 | <span> | 5407 | <span> |
| 5425 | <small data-i18n="Prioritize Inclusion" title="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. " data-i18n="[title]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."> | 5408 | <small title="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. " data-i18n="[title]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."> |
| 5426 | Prioritize Inclusion | 5409 | <span data-i18n="Prioritize">Prioritize</span> |
| 5427 | <div class="fa-solid fa-circle-info opacity50p"></div> | 5410 | <div class="fa-solid fa-circle-info opacity50p"></div> |
| 5428 | </small> | 5411 | </small> |
| 5429 | </span> | 5412 | </span> |
| @@ -5433,7 +5416,7 @@ | |||
| 5433 | <input type="text" class="text_pole margin0" name="group" rows="1" data-i18n="[placeholder]Only one entry with the same label will be activated" placeholder="Only one entry with the same label will be activated"> | 5416 | <input type="text" class="text_pole margin0" name="group" rows="1" data-i18n="[placeholder]Only one entry with the same label will be activated" placeholder="Only one entry with the same label will be activated"> |
| 5434 | </div> | 5417 | </div> |
| 5435 | </div> | 5418 | </div> |
| 5436 | <div class="flex1 flex-container flexFlowColumn flexNoGap" data-i18n="[title]A relative likelihood of entry activation within the group" title="A relative likelihood of entry activation within the group"> | 5419 | <div class="flex2 flex-container flexFlowColumn flexNoGap" data-i18n="[title]A relative likelihood of entry activation within the group" title="A relative likelihood of entry activation within the group"> |
| 5437 | <div class="flex-container justifySpaceBetween marginBot5"> | 5420 | <div class="flex-container justifySpaceBetween marginBot5"> |
| 5438 | <small for="groupWeight" data-i18n="Group Weight"> | 5421 | <small for="groupWeight" data-i18n="Group Weight"> |
| 5439 | Group Weight | 5422 | Group Weight |
| @@ -5443,6 +5426,67 @@ | |||
| 5443 | <input type="number" class="text_pole margin0" name="groupWeight" rows="1" placeholder="100" min="1" max="999999"> | 5426 | <input type="number" class="text_pole margin0" name="groupWeight" rows="1" placeholder="100" min="1" max="999999"> |
| 5444 | </div> | 5427 | </div> |
| 5445 | </div> | 5428 | </div> |
| 5429 | <div class="flex2 flex-container flexFlowColumn flexNoGap" data-i18n="[title]Sticky entries will stay active for N messages after being triggered." title="Sticky entries will stay active for N messages after being triggered."> | ||
| 5430 | <div class="flex-container justifySpaceBetween marginBot5"> | ||
| 5431 | <small class="flex-container alignItemsBaseline" for="sticky" data-i18n="Sticky"> | ||
| 5432 | <span data-i18n="Sticky"> | ||
| 5433 | Sticky | ||
| 5434 | </span> | ||
| 5435 | <i class="fa-solid fa-comments fa-xs"></i> | ||
| 5436 | </small> | ||
| 5437 | </div> | ||
| 5438 | <div class="range-block-range"> | ||
| 5439 | <input class="text_pole margin0" name="sticky" type="number" placeholder="Non-sticky" min="0" max="999999"> | ||
| 5440 | </div> | ||
| 5441 | </div> | ||
| 5442 | <div class="flex2 flex-container flexFlowColumn flexNoGap" data-i18n="[title]Entries with a cooldown can't be activated N messages after being triggered." title="Entries with a cooldown can't be activated N messages after being triggered."> | ||
| 5443 | <div class="flex-container justifySpaceBetween marginBot5"> | ||
| 5444 | <small class="flex-container alignItemsBaseline" for="cooldown" data-i18n="Cooldown"> | ||
| 5445 | <span data-i18n="Cooldown"> | ||
| 5446 | Cooldown | ||
| 5447 | </span> | ||
| 5448 | <i class="fa-solid fa-comments fa-xs"></i> | ||
| 5449 | </small> | ||
| 5450 | </div> | ||
| 5451 | <div class="range-block-range"> | ||
| 5452 | <input class="text_pole margin0" name="cooldown" type="number" placeholder="No cooldown" min="0" max="999999"> | ||
| 5453 | </div> | ||
| 5454 | </div> | ||
| 5455 | <div class="flex2 flex-container flexFlowColumn flexNoGap" data-i18n="[title]Entries with a delay can't be activated until there are N messages present in the chat." title="Entries with a delay can't be activated until there are N messages present in the chat."> | ||
| 5456 | <div class="flex-container justifySpaceBetween marginBot5"> | ||
| 5457 | <small class="flex-container alignItemsBaseline" for="delay" data-i18n="Delay"> | ||
| 5458 | <span data-i18n="Delay"> | ||
| 5459 | Delay | ||
| 5460 | </span> | ||
| 5461 | <i class="fa-solid fa-comments fa-xs"></i> | ||
| 5462 | </small> | ||
| 5463 | </div> | ||
| 5464 | <div class="range-block-range"> | ||
| 5465 | <input class="text_pole margin0" name="delay" type="number" placeholder="No delay" min="0" max="999999"> | ||
| 5466 | </div> | ||
| 5467 | </div> | ||
| 5468 | </div> | ||
| 5469 | <div class="flex-container wide100p flexGap10"> | ||
| 5470 | <div class="flex4 flex-container flexFlowColumn flexNoGap"> | ||
| 5471 | <div class="flex-container justifySpaceBetween"> | ||
| 5472 | <small for="characterFilter" data-i18n="Filter to Character(s)"> | ||
| 5473 | Filter to Character(s) | ||
| 5474 | </small> | ||
| 5475 | <label class="checkbox_label flexNoGap margin-r5" for="character_exclusion"> | ||
| 5476 | <input type="checkbox" name="character_exclusion" /> | ||
| 5477 | <span> | ||
| 5478 | <small data-i18n="Character Exclusion">Character Exclusion</small> | ||
| 5479 | </span> | ||
| 5480 | </label> | ||
| 5481 | </div> | ||
| 5482 | <div class="range-block-range"> | ||
| 5483 | <select name="characterFilter" class="select2_multi_sameline" multiple> | ||
| 5484 | <option value=""> | ||
| 5485 | <span data-i18n="-- Characters not found --">-- Characters not found --</span> | ||
| 5486 | </option> | ||
| 5487 | </select> | ||
| 5488 | </div> | ||
| 5489 | </div> | ||
| 5446 | </div> | 5490 | </div> |
| 5447 | <div name="WIEntryBottomControls" class="flex-container flex1 justifySpaceBetween world_entry_form_horizontal"> | 5491 | <div name="WIEntryBottomControls" class="flex-container flex1 justifySpaceBetween world_entry_form_horizontal"> |
| 5448 | <div class="flex-container flexFlowColumn flexNoGap wi-enter-footer-text "> | 5492 | <div class="flex-container flexFlowColumn flexNoGap wi-enter-footer-text "> |
| @@ -5466,7 +5510,7 @@ | |||
| 5466 | </div> | 5510 | </div> |
| 5467 | </div> | 5511 | </div> |
| 5468 | <div id="character_template" class="template_element"> | 5512 | <div id="character_template" class="template_element"> |
| 5469 | <div class="character_select flex-container wide100p alignitemsflexstart" chid="" id=""> | 5513 | <div class="character_select entity_block flex-container wide100p alignitemsflexstart" chid="" id=""> |
| 5470 | <div class="avatar" title=""> | 5514 | <div class="avatar" title=""> |
| 5471 | <img src=""> | 5515 | <img src=""> |
| 5472 | </div> | 5516 | </div> |
| @@ -5498,7 +5542,6 @@ | |||
| 5498 | </form> | 5542 | </form> |
| 5499 | </div> | 5543 | </div> |
| 5500 | </div> | 5544 | </div> |
| 5501 | </div> | ||
| 5502 | <div id="logit_bias_template" class="template_element"> | 5545 | <div id="logit_bias_template" class="template_element"> |
| 5503 | <div class="logit_bias_form"> | 5546 | <div class="logit_bias_form"> |
| 5504 | <input class="logit_bias_text text_pole" data-i18n="[placeholder]Type here..." placeholder="type here..." /> | 5547 | <input class="logit_bias_text text_pole" data-i18n="[placeholder]Type here..." placeholder="type here..." /> |
| @@ -5616,21 +5659,21 @@ | |||
| 5616 | </div> | 5659 | </div> |
| 5617 | </div> | 5660 | </div> |
| 5618 | <div class="mes_buttons"> | 5661 | <div class="mes_buttons"> |
| 5619 | <div title="Message Actions" class="extraMesButtonsHint fa-solid fa-ellipsis" data-i18n="[title]Message Actions"></div> | 5662 | <div title="Message Actions" class="mes_button extraMesButtonsHint fa-solid fa-ellipsis" data-i18n="[title]Message Actions"></div> |
| 5620 | <div class="extraMesButtons"> | 5663 | <div class="extraMesButtons"> |
| 5621 | <div title="Translate message" class="mes_translate fa-solid fa-language" data-i18n="[title]Translate message"></div> | 5664 | <div title="Translate message" class="mes_button mes_translate fa-solid fa-language" data-i18n="[title]Translate message"></div> |
| 5622 | <div title="Generate Image" class="sd_message_gen fa-solid fa-paintbrush" data-i18n="[title]Generate Image"></div> | 5665 | <div title="Generate Image" class="mes_button sd_message_gen fa-solid fa-paintbrush" data-i18n="[title]Generate Image"></div> |
| 5623 | <div title="Narrate" class="mes_narrate fa-solid fa-bullhorn" data-i18n="[title]Narrate"></div> | 5666 | <div title="Narrate" class="mes_button mes_narrate fa-solid fa-bullhorn" data-i18n="[title]Narrate"></div> |
| 5624 | <div title="Prompt" class="mes_prompt fa-solid fa-square-poll-horizontal " data-i18n="[title]Prompt" style="display: none;"></div> | 5667 | <div title="Prompt" class="mes_button mes_prompt fa-solid fa-square-poll-horizontal " data-i18n="[title]Prompt" style="display: none;"></div> |
| 5625 | <div title="Exclude message from prompts" class="mes_hide fa-solid fa-eye" data-i18n="[title]Exclude message from prompts"></div> | 5668 | <div title="Exclude message from prompts" class="mes_button mes_hide fa-solid fa-eye" data-i18n="[title]Exclude message from prompts"></div> |
| 5626 | <div title="Include message in prompts" class="mes_unhide fa-solid fa-eye-slash" data-i18n="[title]Include message in prompts"></div> | 5669 | <div title="Include message in prompts" class="mes_button mes_unhide fa-solid fa-eye-slash" data-i18n="[title]Include message in prompts"></div> |
| 5627 | <div title="Embed file or image" class="mes_embed fa-solid fa-paperclip" data-i18n="[title]Embed file or image"></div> | 5670 | <div title="Embed file or image" class="mes_button mes_embed fa-solid fa-paperclip" data-i18n="[title]Embed file or image"></div> |
| 5628 | <div title="Create checkpoint" class="mes_create_bookmark fa-regular fa-solid fa-flag-checkered" data-i18n="[title]Create checkpoint"></div> | 5671 | <div title="Create checkpoint" class="mes_button mes_create_bookmark fa-regular fa-solid fa-flag-checkered" data-i18n="[title]Create checkpoint"></div> |
| 5629 | <div title="Create branch" class="mes_create_branch fa-regular fa-code-branch" data-i18n="[title]Create Branch"></div> | 5672 | <div title="Create branch" class="mes_button mes_create_branch fa-regular fa-code-branch" data-i18n="[title]Create Branch"></div> |
| 5630 | <div title="Copy" class="mes_copy fa-solid fa-copy " data-i18n="[title]Copy"></div> | 5673 | <div title="Copy" class="mes_button mes_copy fa-solid fa-copy " data-i18n="[title]Copy"></div> |
| 5631 | </div> | 5674 | </div> |
| 5632 | <div title="Open checkpoint chat" class="mes_bookmark fa-solid fa-flag" data-i18n="[title]Open checkpoint chat"></div> | 5675 | <div title="Open checkpoint chat" class="mes_button mes_bookmark fa-solid fa-flag" data-i18n="[title]Open checkpoint chat"></div> |
| 5633 | <div title="Edit" class="mes_edit fa-solid fa-pencil " data-i18n="[title]Edit"></div> | 5676 | <div title="Edit" class="mes_button mes_edit fa-solid fa-pencil " data-i18n="[title]Edit"></div> |
| 5634 | </div> | 5677 | </div> |
| 5635 | <div class="mes_edit_buttons"> | 5678 | <div class="mes_edit_buttons"> |
| 5636 | <div class="mes_edit_done menu_button fa-solid fa-check" title="Confirm" data-i18n="[title]Confirm"></div> | 5679 | <div class="mes_edit_done menu_button fa-solid fa-check" title="Confirm" data-i18n="[title]Confirm"></div> |
| @@ -5643,10 +5686,11 @@ | |||
| 5643 | <div class="mes_edit_cancel menu_button fa-solid fa-xmark" title="Cancel" data-i18n="[title]Cancel"></div> | 5686 | <div class="mes_edit_cancel menu_button fa-solid fa-xmark" title="Cancel" data-i18n="[title]Cancel"></div> |
| 5644 | </div> | 5687 | </div> |
| 5645 | </div> | 5688 | </div> |
| 5646 | <div class=mes_text></div> | 5689 | <div class="mes_text"></div> |
| 5647 | <div class="mes_img_container"> | 5690 | <div class="mes_img_container"> |
| 5648 | <div class="mes_img_controls"> | 5691 | <div class="mes_img_controls"> |
| 5649 | <div title="Enlarge" class="right_menu_button fa-lg fa-solid fa-magnifying-glass mes_img_enlarge" data-i18n="[title]Enlarge"></div> | 5692 | <div title="Enlarge" class="right_menu_button fa-lg fa-solid fa-magnifying-glass mes_img_enlarge" data-i18n="[title]Enlarge"></div> |
| 5693 | <div title="Caption" class="right_menu_button fa-lg fa-solid fa-envelope-open-text mes_img_caption" data-i18n="[title]Caption"></div> | ||
| 5650 | <div title="Delete" class="right_menu_button fa-lg fa-solid fa-trash-can mes_img_delete" data-i18n="[title]Delete"></div> | 5694 | <div title="Delete" class="right_menu_button fa-lg fa-solid fa-trash-can mes_img_delete" data-i18n="[title]Delete"></div> |
| 5651 | </div> | 5695 | </div> |
| 5652 | <img class="mes_img" src="" /> | 5696 | <img class="mes_img" src="" /> |
| @@ -5768,7 +5812,7 @@ | |||
| 5768 | </div> | 5812 | </div> |
| 5769 | </div> | 5813 | </div> |
| 5770 | <div id="group_list_template" class="template_element"> | 5814 | <div id="group_list_template" class="template_element"> |
| 5771 | <div class="group_select flex-container wide100p alignitemsflexstart"> | 5815 | <div class="group_select entity_block flex-container wide100p alignitemsflexstart"> |
| 5772 | <div class="avatar"> | 5816 | <div class="avatar"> |
| 5773 | <img src=""> | 5817 | <img src=""> |
| 5774 | </div> | 5818 | </div> |
| @@ -5786,7 +5830,7 @@ | |||
| 5786 | </div> | 5830 | </div> |
| 5787 | </div> | 5831 | </div> |
| 5788 | <div id="bogus_folder_template" class="template_element"> | 5832 | <div id="bogus_folder_template" class="template_element"> |
| 5789 | <div class="bogus_folder_select flex-container wide100p alignitemsflexstart"> | 5833 | <div class="bogus_folder_select entity_block flex-container wide100p alignitemsflexstart"> |
| 5790 | <div class="avatar flex alignitemscenter textAlignCenter"> | 5834 | <div class="avatar flex alignitemscenter textAlignCenter"> |
| 5791 | <i class="bogus_folder_icon fa-solid fa-xl"></i> | 5835 | <i class="bogus_folder_icon fa-solid fa-xl"></i> |
| 5792 | </div> | 5836 | </div> |
| @@ -5832,8 +5876,8 @@ | |||
| 5832 | </small> | 5876 | </small> |
| 5833 | <hr> | 5877 | <hr> |
| 5834 | <div class="alternate_greetings_list flexFlowColumn flex-container wide100p"> | 5878 | <div class="alternate_greetings_list flexFlowColumn flex-container wide100p"> |
| 5835 | <strong class="alternate_grettings_hint margin-bot-10px" data-i18n="Alternate Greetings Hint"> | 5879 | <strong class="alternate_grettings_hint margin-bot-10px"> |
| 5836 | Click the <i class="fa-solid fa-plus"></i> button to get started! | 5880 | <span data-i18n="alternate_greetings_hint_1">Click the</span> <i class="fa-solid fa-plus"></i> <span data-i18n="alternate_greetings_hint_2">button to get started!</span> |
| 5837 | </strong> | 5881 | </strong> |
| 5838 | </div> | 5882 | </div> |
| 5839 | </div> | 5883 | </div> |
| @@ -5841,38 +5885,13 @@ | |||
| 5841 | <div id="alternate_greeting_form_template" class="template_element"> | 5885 | <div id="alternate_greeting_form_template" class="template_element"> |
| 5842 | <div class="alternate_greeting"> | 5886 | <div class="alternate_greeting"> |
| 5843 | <div class="title_restorable"> | 5887 | <div class="title_restorable"> |
| 5844 | <strong>Alternate Greeting #<span class="greeting_index"></span></strong> | 5888 | <strong><span data-i18n="Alternate Greeting #">Alternate Greeting #</span><span class="greeting_index"></span></strong> |
| 5845 | <div class="menu_button fa-solid fa-trash-alt delete_alternate_greeting"></div> | 5889 | <div class="menu_button fa-solid fa-trash-alt delete_alternate_greeting"></div> |
| 5846 | </div> | 5890 | </div> |
| 5847 | <textarea name="alternate_greetings" data-i18n="[placeholder](This will be the first message from the character that starts every chat)" placeholder="(This will be the first message from the character that starts every chat)" class="text_pole textarea_compact alternate_greeting_text" maxlength="50000" value="" autocomplete="off" rows="16"></textarea> | 5891 | <textarea name="alternate_greetings" data-i18n="[placeholder](This will be the first message from the character that starts every chat)" placeholder="(This will be the first message from the character that starts every chat)" class="text_pole textarea_compact alternate_greeting_text" maxlength="50000" value="" autocomplete="off" rows="16"></textarea> |
| 5848 | </div> | 5892 | </div> |
| 5849 | </div> | 5893 | </div> |
| 5850 | <div id="forbid_media_override_template" class="template_element"> | 5894 | |
| 5851 | <div class="forbid_media_override flex-container flexFlowColumn"> | ||
| 5852 | <h4 data-i18n="Forbid Media Override explanation" class="margin0"> | ||
| 5853 | Ability of the current character/group to use external media in chats. | ||
| 5854 | </h4> | ||
| 5855 | <small data-i18n="Forbid Media Override subtitle" class="marginBot5"> | ||
| 5856 | Media: images, videos, audio. External: not hosted on the local server. | ||
| 5857 | </small> | ||
| 5858 | <label class="checkbox_label" for="forbid_media_override_global"> | ||
| 5859 | <input type="radio" id="forbid_media_override_global" name="forbid_media_override" /> | ||
| 5860 | <span> | ||
| 5861 | <span data-i18n="Use global setting">Use global setting</span> | ||
| 5862 | <b class="forbid_media_global_state_forbidden">(forbidden)</b> | ||
| 5863 | <b class="forbid_media_global_state_allowed">(allowed)</b> | ||
| 5864 | </span> | ||
| 5865 | </label> | ||
| 5866 | <label class="checkbox_label" for="forbid_media_override_forbidden"> | ||
| 5867 | <input type="radio" id="forbid_media_override_forbidden" name="forbid_media_override" /> | ||
| 5868 | <span data-i18n="Always forbidden">Always forbidden</span> | ||
| 5869 | </label> | ||
| 5870 | <label class="checkbox_label" for="forbid_media_override_allowed"> | ||
| 5871 | <input type="radio" id="forbid_media_override_allowed" name="forbid_media_override" /> | ||
| 5872 | <span data-i18n="Always allowed">Always allowed</span> | ||
| 5873 | </label> | ||
| 5874 | </div> | ||
| 5875 | </div> | ||
| 5876 | <!-- chat and input bar --> | 5895 | <!-- chat and input bar --> |
| 5877 | <div id="typing_indicator_template" class="template_element"> | 5896 | <div id="typing_indicator_template" class="template_element"> |
| 5878 | <div class="typing_indicator"><span class="typing_indicator_name">CHAR</span> is typing</div> | 5897 | <div class="typing_indicator"><span class="typing_indicator_name">CHAR</span> is typing</div> |
| @@ -6250,7 +6269,7 @@ | |||
| 6250 | </form> | 6269 | </form> |
| 6251 | <div id="nonQRFormItems"> | 6270 | <div id="nonQRFormItems"> |
| 6252 | <div id="leftSendForm" class="alignContentCenter"> | 6271 | <div id="leftSendForm" class="alignContentCenter"> |
| 6253 | <div id="options_button" class="fa-solid fa-bars"></div> | 6272 | <div id="options_button" class="fa-solid fa-bars interactable"></div> |
| 6254 | </div> | 6273 | </div> |
| 6255 | <textarea id="send_textarea" name="text" data-i18n="[no_connection_text]Not connected to API!;[connected_text]Type a message, or /? for help" placeholder="Not connected to API!" no_connection_text="Not connected to API!" connected_text="Type a message, or /? for help"></textarea> | 6274 | <textarea id="send_textarea" name="text" data-i18n="[no_connection_text]Not connected to API!;[connected_text]Type a message, or /? for help" placeholder="Not connected to API!" no_connection_text="Not connected to API!" connected_text="Type a message, or /? for help"></textarea> |
| 6256 | <div id="rightSendForm" class="alignContentCenter"> | 6275 | <div id="rightSendForm" class="alignContentCenter"> |
| @@ -6266,8 +6285,8 @@ | |||
| 6266 | <div id="mes_stop" title="Abort request" class="mes_stop" data-i18n="[title]Abort request"> | 6285 | <div id="mes_stop" title="Abort request" class="mes_stop" data-i18n="[title]Abort request"> |
| 6267 | <i class="fa-solid fa-circle-stop"></i> | 6286 | <i class="fa-solid fa-circle-stop"></i> |
| 6268 | </div> | 6287 | </div> |
| 6269 | <div id="mes_continue" class="fa-fw fa-solid fa-arrow-right displayNone" title="Continue the last message" data-i18n="[title]Continue the last message"></div> | 6288 | <div id="mes_continue" class="fa-fw fa-solid fa-arrow-right interactable displayNone" title="Continue the last message" data-i18n="[title]Continue the last message"></div> |
| 6270 | <div id="send_but" class="fa-solid fa-paper-plane displayNone" title="Send a message" data-i18n="[title]Send a message"></div> | 6289 | <div id="send_but" class="fa-solid fa-paper-plane interactable displayNone" title="Send a message" data-i18n="[title]Send a message"></div> |
| 6271 | </div> | 6290 | </div> |
| 6272 | </div> | 6291 | </div> |
| 6273 | </div> | 6292 | </div> |
| @@ -6364,9 +6383,6 @@ | |||
| 6364 | </div> | 6383 | </div> |
| 6365 | </div> | 6384 | </div> |
| 6366 | </template> | 6385 | </template> |
| 6367 | <div id="rawPromptPopup" class="list-group"> | ||
| 6368 | <div id="rawPromptWrapper" class="tokenItemizingSubclass"></div> | ||
| 6369 | </div> | ||
| 6370 | <div id="user_avatar_template" class="template_element"> | 6386 | <div id="user_avatar_template" class="template_element"> |
| 6371 | <div class="avatar-container"> | 6387 | <div class="avatar-container"> |
| 6372 | <div imgfile="" class="avatar"> | 6388 | <div imgfile="" class="avatar"> |
| @@ -6432,15 +6448,6 @@ | |||
| 6432 | <script type="module" src="scripts/server-history.js"></script> | 6448 | <script type="module" src="scripts/server-history.js"></script> |
| 6433 | <script type="module" src="script.js"></script> | 6449 | <script type="module" src="script.js"></script> |
| 6434 | <script> | 6450 | <script> |
| 6435 | // Configure toast library: | ||
| 6436 | toastr.options.escapeHtml = true; // Prevent raw HTML inserts | ||
| 6437 | toastr.options.timeOut = 4000; // How long the toast will display without user interaction | ||
| 6438 | toastr.options.extendedTimeOut = 10000; // How long the toast will display after a user hovers over it | ||
| 6439 | toastr.options.progressBar = true; // Visually indicate how long before a toast expires. | ||
| 6440 | toastr.options.closeButton = true; // enable a close button | ||
| 6441 | toastr.options.positionClass = "toast-top-center"; // Where to position the toast container | ||
| 6442 | </script> | ||
| 6443 | <script> | ||
| 6444 | window.addEventListener('load', (event) => { | 6451 | window.addEventListener('load', (event) => { |
| 6445 | const documentHeight = () => { | 6452 | const documentHeight = () => { |
| 6446 | const doc = document.documentElement; | 6453 | const doc = document.documentElement; |
| @@ -3,6 +3,7 @@ | |||
| 3 | "checkJs": true, | 3 | "checkJs": true, |
| 4 | "target": "ESNext", | 4 | "target": "ESNext", |
| 5 | "module": "ESNext", | 5 | "module": "ESNext", |
| 6 | "moduleResolution": "node", | ||
| 6 | "allowUmdGlobalAccess": true, | 7 | "allowUmdGlobalAccess": true, |
| 7 | "allowSyntheticDefaultImports": true | 8 | "allowSyntheticDefaultImports": true |
| 8 | }, | 9 | }, |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "انضم إلى بطاقات الشخصيات (بما في ذلك البطاقات الصامتة)", | 853 | "Join character cards (include muted)": "انضم إلى بطاقات الشخصيات (بما في ذلك البطاقات الصامتة)", |
| 854 | "Inserted before each part of the joined fields.": "تم إدراجه قبل كل جزء من الحقول المرتبطة.", | 854 | "Inserted before each part of the joined fields.": "تم إدراجه قبل كل جزء من الحقول المرتبطة.", |
| 855 | "Join Prefix": "الانضمام إلى البادئة", | 855 | "Join Prefix": "الانضمام إلى البادئة", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "عند تحديد \"الانضمام إلى بطاقات الأحرف\"، يتم ضم كافة الحقول الخاصة بالأحرف معًا.\rوهذا يعني أنه في سلسلة القصة على سبيل المثال، سيتم دمج جميع أوصاف الشخصيات في نص واحد كبير.\rإذا كنت تريد فصل هذه الحقول، فيمكنك تحديد بادئة أو لاحقة هنا.\r\rتدعم هذه القيمة وحدات الماكرو العادية وستستبدل أيضًا {{char}} باسم الحرف ذي الصلة و<FIELDNAME> باسم الجزء (على سبيل المثال: الوصف، والشخصية، والسيناريو، وما إلى ذلك)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "عند تحديد \"الانضمام إلى بطاقات الأحرف\"، يتم ضم كافة الحقول الخاصة بالأحرف معًا.\rوهذا يعني أنه في سلسلة القصة على سبيل المثال، سيتم دمج جميع أوصاف الشخصيات في نص واحد كبير.\rإذا كنت تريد فصل هذه الحقول، فيمكنك تحديد بادئة أو لاحقة هنا.\r\rتدعم هذه القيمة وحدات الماكرو العادية وستستبدل أيضًا {{char}} باسم الحرف ذي الصلة و<FIELDNAME> باسم الجزء (على سبيل المثال: الوصف، والشخصية، والسيناريو، وما إلى ذلك)", |
| 857 | "Inserted after each part of the joined fields.": "يتم إدراجه بعد كل جزء من الحقول المرتبطة.", | 857 | "Inserted after each part of the joined fields.": "يتم إدراجه بعد كل جزء من الحقول المرتبطة.", |
| 858 | "Join Suffix": "انضم إلى لاحقة", | 858 | "Join Suffix": "انضم إلى لاحقة", |
| 859 | "Set a group chat scenario": "تعيين سيناريو للمحادثة الجماعية", | 859 | "Set a group chat scenario": "تعيين سيناريو للمحادثة الجماعية", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "تحرير الشخصيات جميعها", | 885 | "Bulk_edit_characters": "تحرير الشخصيات جميعها", |
| 886 | "Bulk select all characters": "تحديد كافة الشخصيات بالجملة", | 886 | "Bulk select all characters": "تحديد كافة الشخصيات بالجملة", |
| 887 | "Bulk delete characters": "حذف الشخصيات جميعها", | 887 | "Bulk delete characters": "حذف الشخصيات جميعها", |
| 888 | "popup_text_save": "يحفظ", | 888 | "popup-button-save": "يحفظ", |
| 889 | "popup_text_yes": "نعم", | 889 | "popup-button-yes": "نعم", |
| 890 | "popup_text_no": "لا", | 890 | "popup-button-no": "لا", |
| 891 | "popup_text_cancel": "يلغي", | 891 | "popup-button-cancel": "يلغي", |
| 892 | "popup_text_import": "يستورد", | 892 | "popup-button-import": "يستورد", |
| 893 | "Advanced Defininitions": "تعريفات متقدمة", | 893 | "Advanced Defininitions": "تعريفات متقدمة", |
| 894 | "Prompt Overrides": "التجاوزات السريعة", | 894 | "Prompt Overrides": "التجاوزات السريعة", |
| 895 | "(For Chat Completion and Instruct Mode)": "(لاستكمال الدردشة ووضع التعليمات)", | 895 | "(For Chat Completion and Instruct Mode)": "(لاستكمال الدردشة ووضع التعليمات)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "استبعاد الشخصيات", | 1005 | "Character Exclusion": "استبعاد الشخصيات", |
| 1006 | "-- Characters not found --": "-- الشخصيات غير موجودة --", | 1006 | "-- Characters not found --": "-- الشخصيات غير موجودة --", |
| 1007 | "Inclusion Group": "مجموعة الإدراج", | 1007 | "Inclusion Group": "مجموعة الإدراج", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "تضمن مجموعات التضمين تنشيط إدخال واحد فقط من المجموعة في المرة الواحدة، إذا تم تشغيل عدة إدخالات.\rيدعم مجموعات متعددة مفصولة بفواصل.\r\rالتوثيق: معلومات العالم - مجموعة الإدماج", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "تضمن مجموعات التضمين تنشيط إدخال واحد فقط من المجموعة في المرة الواحدة، إذا تم تشغيل عدة إدخالات.\rيدعم مجموعات متعددة مفصولة بفواصل.\r\rالتوثيق: معلومات العالم - مجموعة الإدماج", |
| 1009 | "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إذا تم تحديد الأولوية لأكثر من مجموعة، فسيتم اختيار \"الترتيب\" الأعلى.", | 1009 | "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.": "إعطاء الأولوية لهذا الإدخال: عند تحديده، يتم إعطاء الأولوية لهذا الإدخال من بين جميع التحديدات.\rإذا تم تحديد الأولوية لأكثر من مجموعة، فسيتم اختيار \"الترتيب\" الأعلى.", |
| 1010 | "Only one entry with the same label will be activated": "سيتم تنشيط مدخل واحد فقط بنفس العلامة", | 1010 | "Only one entry with the same label will be activated": "سيتم تنشيط مدخل واحد فقط بنفس العلامة", |
| 1011 | "A relative likelihood of entry activation within the group": "احتمال نسبي لتفعيل الدخول داخل المجموعة", | 1011 | "A relative likelihood of entry activation within the group": "احتمال نسبي لتفعيل الدخول داخل المجموعة", |
| 1012 | "Group Weight": "وزن المجموعة", | 1012 | "Group Weight": "وزن المجموعة", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "إعادة تعيين الرمز:", | 1436 | "Reset Code:": "إعادة تعيين الرمز:", |
| 1437 | "Want to update?": "هل ترغب في التحديث؟", | 1437 | "Want to update?": "هل ترغب في التحديث؟", |
| 1438 | "How to start chatting?": "كيف تبدأ في المحادثة؟", | 1438 | "How to start chatting?": "كيف تبدأ في المحادثة؟", |
| 1439 | "Click ": "انقر", | 1439 | "Click _space": "انقر", |
| 1440 | "and select a": "وحدد أ", | 1440 | "and select a": "وحدد أ", |
| 1441 | "Chat API": "واجهة برمجة تطبيقات الدردشة", | 1441 | "Chat API": "واجهة برمجة تطبيقات الدردشة", |
| 1442 | "and pick a character.": "واختر شخصية.", | 1442 | "and pick a character.": "واختر شخصية.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Charakterkarten beitreten (auch stummgeschaltet)", | 853 | "Join character cards (include muted)": "Charakterkarten beitreten (auch stummgeschaltet)", |
| 854 | "Inserted before each part of the joined fields.": "Wird vor jedem Teil der verbundenen Felder eingefügt.", | 854 | "Inserted before each part of the joined fields.": "Wird vor jedem Teil der verbundenen Felder eingefügt.", |
| 855 | "Join Prefix": "Präfix beitreten", | 855 | "Join Prefix": "Präfix beitreten", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Wenn „Charakterkarten zusammenfügen“ ausgewählt ist, werden alle entsprechenden Felder der Charaktere zusammengefügt. Das bedeutet, dass im Story-String beispielsweise alle Charakterbeschreibungen zu einem großen Text zusammengefügt werden. Wenn Sie möchten, dass diese Felder getrennt werden, können Sie hier ein Präfix oder Suffix definieren. Dieser Wert unterstützt normale Makros und ersetzt außerdem {{char}} durch den Namen des entsprechenden Charakters und <FIELDNAME> durch den Namen des Teils (z. B.: Beschreibung, Persönlichkeit, Szenario usw.).", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Wenn „Charakterkarten zusammenfügen“ ausgewählt ist, werden alle entsprechenden Felder der Charaktere zusammengefügt. Das bedeutet, dass im Story-String beispielsweise alle Charakterbeschreibungen zu einem großen Text zusammengefügt werden. Wenn Sie möchten, dass diese Felder getrennt werden, können Sie hier ein Präfix oder Suffix definieren. Dieser Wert unterstützt normale Makros und ersetzt außerdem {{char}} durch den Namen des entsprechenden Charakters und <FIELDNAME> durch den Namen des Teils (z. B.: Beschreibung, Persönlichkeit, Szenario usw.).", |
| 857 | "Inserted after each part of the joined fields.": "Wird nach jedem Teil der verbundenen Felder eingefügt.", | 857 | "Inserted after each part of the joined fields.": "Wird nach jedem Teil der verbundenen Felder eingefügt.", |
| 858 | "Join Suffix": "Join-Suffix", | 858 | "Join Suffix": "Join-Suffix", |
| 859 | "Set a group chat scenario": "Setze ein Gruppenchat-Szenario", | 859 | "Set a group chat scenario": "Setze ein Gruppenchat-Szenario", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Massenbearbeitung von Charakteren", | 885 | "Bulk_edit_characters": "Massenbearbeitung von Charakteren", |
| 886 | "Bulk select all characters": "Massenauswahl aller Zeichen", | 886 | "Bulk select all characters": "Massenauswahl aller Zeichen", |
| 887 | "Bulk delete characters": "Massenlöschung von Charakteren", | 887 | "Bulk delete characters": "Massenlöschung von Charakteren", |
| 888 | "popup_text_save": "Speichern", | 888 | "popup-button-save": "Speichern", |
| 889 | "popup_text_yes": "Ja", | 889 | "popup-button-yes": "Ja", |
| 890 | "popup_text_no": "NEIN", | 890 | "popup-button-no": "NEIN", |
| 891 | "popup_text_cancel": "Stornieren", | 891 | "popup-button-cancel": "Stornieren", |
| 892 | "popup_text_import": "Importieren", | 892 | "popup-button-import": "Importieren", |
| 893 | "Advanced Defininitions": "Erweiterte Definitionen", | 893 | "Advanced Defininitions": "Erweiterte Definitionen", |
| 894 | "Prompt Overrides": "Eingabeaufforderungsüberschreibungen", | 894 | "Prompt Overrides": "Eingabeaufforderungsüberschreibungen", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Für Chat-Abschluss und Anweisungsmodus)", | 895 | "(For Chat Completion and Instruct Mode)": "(Für Chat-Abschluss und Anweisungsmodus)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Charakterausschluss", | 1005 | "Character Exclusion": "Charakterausschluss", |
| 1006 | "-- Characters not found --": "-- Charaktere nicht gefunden --", | 1006 | "-- Characters not found --": "-- Charaktere nicht gefunden --", |
| 1007 | "Inclusion Group": "Einschlussgruppe", | 1007 | "Inclusion Group": "Einschlussgruppe", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Inklusionsgruppen stellen sicher, dass immer nur ein Eintrag aus einer Gruppe aktiviert wird, wenn mehrere ausgelöst werden. Unterstützt mehrere durch Kommas getrennte Gruppen. Dokumentation: World Info - Inclusion Group", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Inklusionsgruppen stellen sicher, dass immer nur ein Eintrag aus einer Gruppe aktiviert wird, wenn mehrere ausgelöst werden. Unterstützt mehrere durch Kommas getrennte Gruppen. Dokumentation: World Info - Inclusion Group", |
| 1009 | "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.": "Diesen Eintrag priorisieren: Wenn diese Option aktiviert ist, wird dieser Eintrag aus allen Auswahlen priorisiert. Wenn mehrere priorisiert sind, wird der Eintrag mit der höchsten „Reihenfolge“ ausgewählt.", | 1009 | "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.": "Diesen Eintrag priorisieren: Wenn diese Option aktiviert ist, wird dieser Eintrag aus allen Auswahlen priorisiert. Wenn mehrere priorisiert sind, wird der Eintrag mit der höchsten „Reihenfolge“ ausgewählt.", |
| 1010 | "Only one entry with the same label will be activated": "Nur ein Eintrag mit demselben Label wird aktiviert", | 1010 | "Only one entry with the same label will be activated": "Nur ein Eintrag mit demselben Label wird aktiviert", |
| 1011 | "A relative likelihood of entry activation within the group": "Eine relative Wahrscheinlichkeit der Eintrittsaktivierung innerhalb der Gruppe", | 1011 | "A relative likelihood of entry activation within the group": "Eine relative Wahrscheinlichkeit der Eintrittsaktivierung innerhalb der Gruppe", |
| 1012 | "Group Weight": "Gruppengewicht", | 1012 | "Group Weight": "Gruppengewicht", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Code zurücksetzen:", | 1436 | "Reset Code:": "Code zurücksetzen:", |
| 1437 | "Want to update?": "Möchten Sie aktualisieren?", | 1437 | "Want to update?": "Möchten Sie aktualisieren?", |
| 1438 | "How to start chatting?": "Wie fange ich an zu chatten?", | 1438 | "How to start chatting?": "Wie fange ich an zu chatten?", |
| 1439 | "Click ": "Klicken", | 1439 | "Click _space": "Klicken", |
| 1440 | "and select a": "und wähle eine", | 1440 | "and select a": "und wähle eine", |
| 1441 | "Chat API": "Chat-API", | 1441 | "Chat API": "Chat-API", |
| 1442 | "and pick a character.": "und wähle einen Charakter aus.", | 1442 | "and pick a character.": "und wähle einen Charakter aus.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Unirse a tarjetas de personajes (incluidas silenciadas)", | 853 | "Join character cards (include muted)": "Unirse a tarjetas de personajes (incluidas silenciadas)", |
| 854 | "Inserted before each part of the joined fields.": "Insertado antes de cada parte de los campos unidos.", | 854 | "Inserted before each part of the joined fields.": "Insertado antes de cada parte de los campos unidos.", |
| 855 | "Join Prefix": "Unirse al prefijo", | 855 | "Join Prefix": "Unirse al prefijo", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Cuando se selecciona 'Unir tarjetas de personajes', todos los campos respectivos de los personajes se unen.\rEsto significa que en la cadena de la historia, por ejemplo, todas las descripciones de los personajes se unirán en un texto grande.\rSi desea que esos campos estén separados, puede definir un prefijo o sufijo aquí.\r\rEste valor admite macros normales y también reemplazará {{char}} con el nombre del personaje relevante y <FIELDNAME> con el nombre de la parte (por ejemplo: descripción, personalidad, escenario, etc.)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Cuando se selecciona 'Unir tarjetas de personajes', todos los campos respectivos de los personajes se unen.\rEsto significa que en la cadena de la historia, por ejemplo, todas las descripciones de los personajes se unirán en un texto grande.\rSi desea que esos campos estén separados, puede definir un prefijo o sufijo aquí.\r\rEste valor admite macros normales y también reemplazará {{char}} con el nombre del personaje relevante y <FIELDNAME> con el nombre de la parte (por ejemplo: descripción, personalidad, escenario, etc.)", |
| 857 | "Inserted after each part of the joined fields.": "Insertado después de cada parte de los campos unidos.", | 857 | "Inserted after each part of the joined fields.": "Insertado después de cada parte de los campos unidos.", |
| 858 | "Join Suffix": "Unirse al sufijo", | 858 | "Join Suffix": "Unirse al sufijo", |
| 859 | "Set a group chat scenario": "Establecer un escenario de chat grupal", | 859 | "Set a group chat scenario": "Establecer un escenario de chat grupal", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Editar personajes masivamente", | 885 | "Bulk_edit_characters": "Editar personajes masivamente", |
| 886 | "Bulk select all characters": "Seleccionar de forma masiva todos los personajes", | 886 | "Bulk select all characters": "Seleccionar de forma masiva todos los personajes", |
| 887 | "Bulk delete characters": "Eliminar personajes masivamente", | 887 | "Bulk delete characters": "Eliminar personajes masivamente", |
| 888 | "popup_text_save": "Ahorrar", | 888 | "popup-button-save": "Ahorrar", |
| 889 | "popup_text_yes": "Sí", | 889 | "popup-button-yes": "Sí", |
| 890 | "popup_text_no": "No", | 890 | "popup-button-no": "No", |
| 891 | "popup_text_cancel": "Cancelar", | 891 | "popup-button-cancel": "Cancelar", |
| 892 | "popup_text_import": "Importar", | 892 | "popup-button-import": "Importar", |
| 893 | "Advanced Defininitions": "Definiciones avanzadas", | 893 | "Advanced Defininitions": "Definiciones avanzadas", |
| 894 | "Prompt Overrides": "Anulaciones rápidas", | 894 | "Prompt Overrides": "Anulaciones rápidas", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Para completar el chat y el modo de instrucción)", | 895 | "(For Chat Completion and Instruct Mode)": "(Para completar el chat y el modo de instrucción)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Exclusión de Personaje", | 1005 | "Character Exclusion": "Exclusión de Personaje", |
| 1006 | "-- Characters not found --": "-- Personajes no encontrados --", | 1006 | "-- Characters not found --": "-- Personajes no encontrados --", |
| 1007 | "Inclusion Group": "Grupo de Inclusión", | 1007 | "Inclusion Group": "Grupo de Inclusión", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Los grupos de inclusión garantizan que solo se active una entrada de un grupo a la vez, si se activan varias.\rAdmite múltiples grupos separados por comas.\r\rDocumentación: World Info - Grupo de Inclusión", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Los grupos de inclusión garantizan que solo se active una entrada de un grupo a la vez, si se activan varias.\rAdmite múltiples grupos separados por comas.\r\rDocumentación: World Info - Grupo de Inclusión", |
| 1009 | "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.": "Priorizar esta entrada: cuando está marcada, esta entrada tiene prioridad entre todas las selecciones.\rSi se priorizan varios, se elige el que tenga el 'Orden' más alto.", | 1009 | "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.": "Priorizar esta entrada: cuando está marcada, esta entrada tiene prioridad entre todas las selecciones.\rSi se priorizan varios, se elige el que tenga el 'Orden' más alto.", |
| 1010 | "Only one entry with the same label will be activated": "Solo se activará una entrada con la misma etiqueta", | 1010 | "Only one entry with the same label will be activated": "Solo se activará una entrada con la misma etiqueta", |
| 1011 | "A relative likelihood of entry activation within the group": "Una probabilidad relativa de activación de entrada dentro del grupo.", | 1011 | "A relative likelihood of entry activation within the group": "Una probabilidad relativa de activación de entrada dentro del grupo.", |
| 1012 | "Group Weight": "Peso del grupo", | 1012 | "Group Weight": "Peso del grupo", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Restablecer Código:", | 1436 | "Reset Code:": "Restablecer Código:", |
| 1437 | "Want to update?": "¿Quieres actualizar?", | 1437 | "Want to update?": "¿Quieres actualizar?", |
| 1438 | "How to start chatting?": "¿Cómo empezar a chatear?", | 1438 | "How to start chatting?": "¿Cómo empezar a chatear?", |
| 1439 | "Click ": "Hacer clic", | 1439 | "Click _space": "Hacer clic", |
| 1440 | "and select a": "y selecciona una", | 1440 | "and select a": "y selecciona una", |
| 1441 | "Chat API": " API de chat", | 1441 | "Chat API": " API de chat", |
| 1442 | "and pick a character.": "y elige un personaje.", | 1442 | "and pick a character.": "y elige un personaje.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Rejoignez les cartes de personnage (y compris en sourdine)", | 853 | "Join character cards (include muted)": "Rejoignez les cartes de personnage (y compris en sourdine)", |
| 854 | "Inserted before each part of the joined fields.": "Inséré avant chaque partie des champs joints.", | 854 | "Inserted before each part of the joined fields.": "Inséré avant chaque partie des champs joints.", |
| 855 | "Join Prefix": "Rejoindre le préfixe", | 855 | "Join Prefix": "Rejoindre le préfixe", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Lorsque « Rejoindre les cartes de personnage » est sélectionné, tous les champs respectifs des personnages sont réunis.\rCela signifie que dans la chaîne d'histoire, par exemple, toutes les descriptions des personnages seront réunies en un seul grand texte.\rSi vous souhaitez que ces champs soient séparés, vous pouvez définir ici un préfixe ou un suffixe.\r\rCette valeur prend en charge les macros normales et remplacera également {{char}} par le nom du caractère concerné et <FIELDNAME> par le nom de la pièce (par exemple : description, personnalité, scénario, etc.)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Lorsque « Rejoindre les cartes de personnage » est sélectionné, tous les champs respectifs des personnages sont réunis.\rCela signifie que dans la chaîne d'histoire, par exemple, toutes les descriptions des personnages seront réunies en un seul grand texte.\rSi vous souhaitez que ces champs soient séparés, vous pouvez définir ici un préfixe ou un suffixe.\r\rCette valeur prend en charge les macros normales et remplacera également {{char}} par le nom du caractère concerné et <FIELDNAME> par le nom de la pièce (par exemple : description, personnalité, scénario, etc.)", |
| 857 | "Inserted after each part of the joined fields.": "Inséré après chaque partie des champs joints.", | 857 | "Inserted after each part of the joined fields.": "Inséré après chaque partie des champs joints.", |
| 858 | "Join Suffix": "Rejoindre le suffixe", | 858 | "Join Suffix": "Rejoindre le suffixe", |
| 859 | "Set a group chat scenario": "Définir un scénario de discussion de groupe", | 859 | "Set a group chat scenario": "Définir un scénario de discussion de groupe", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Édition en masse des personnages", | 885 | "Bulk_edit_characters": "Édition en masse des personnages", |
| 886 | "Bulk select all characters": "Sélection groupée de tous les caractères", | 886 | "Bulk select all characters": "Sélection groupée de tous les caractères", |
| 887 | "Bulk delete characters": "Suppression en masse des personnages", | 887 | "Bulk delete characters": "Suppression en masse des personnages", |
| 888 | "popup_text_save": "Sauvegarder", | 888 | "popup-button-save": "Sauvegarder", |
| 889 | "popup_text_yes": "Oui", | 889 | "popup-button-yes": "Oui", |
| 890 | "popup_text_no": "Non", | 890 | "popup-button-no": "Non", |
| 891 | "popup_text_cancel": "Annuler", | 891 | "popup-button-cancel": "Annuler", |
| 892 | "popup_text_import": "Importer", | 892 | "popup-button-import": "Importer", |
| 893 | "Advanced Defininitions": "Définitions avancées", | 893 | "Advanced Defininitions": "Définitions avancées", |
| 894 | "Prompt Overrides": "Remplacements d'invite", | 894 | "Prompt Overrides": "Remplacements d'invite", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Pour l'achèvement du chat et le mode instruction)", | 895 | "(For Chat Completion and Instruct Mode)": "(Pour l'achèvement du chat et le mode instruction)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Exclusion de personnage", | 1005 | "Character Exclusion": "Exclusion de personnage", |
| 1006 | "-- Characters not found --": "-- Personnages non trouvés --", | 1006 | "-- Characters not found --": "-- Personnages non trouvés --", |
| 1007 | "Inclusion Group": "Groupe d'inclusion", | 1007 | "Inclusion Group": "Groupe d'inclusion", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Les groupes d'inclusion garantissent qu'une seule entrée d'un groupe est activée à la fois, si plusieurs sont déclenchées.\rPrend en charge plusieurs groupes séparés par des virgules.\r\rDocumentation : Info Monde - Groupe Inclusion", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Les groupes d'inclusion garantissent qu'une seule entrée d'un groupe est activée à la fois, si plusieurs sont déclenchées.\rPrend en charge plusieurs groupes séparés par des virgules.\r\rDocumentation : Info Monde - Groupe Inclusion", |
| 1009 | "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.": "Prioriser cette entrée : Lorsque cette case est cochée, cette entrée est prioritaire parmi toutes les sélections.\rSi plusieurs sont prioritaires, celui avec l'ordre le plus élevé est choisi.", | 1009 | "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.": "Prioriser cette entrée : Lorsque cette case est cochée, cette entrée est prioritaire parmi toutes les sélections.\rSi plusieurs sont prioritaires, celui avec l'ordre le plus élevé est choisi.", |
| 1010 | "Only one entry with the same label will be activated": "Seule une entrée avec la même étiquette sera activée", | 1010 | "Only one entry with the same label will be activated": "Seule une entrée avec la même étiquette sera activée", |
| 1011 | "A relative likelihood of entry activation within the group": "Une probabilité relative d’activation d’entrée au sein du groupe", | 1011 | "A relative likelihood of entry activation within the group": "Une probabilité relative d’activation d’entrée au sein du groupe", |
| 1012 | "Group Weight": "Poids du groupe", | 1012 | "Group Weight": "Poids du groupe", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Code de réinitialisation :", | 1436 | "Reset Code:": "Code de réinitialisation :", |
| 1437 | "Want to update?": "Envie de mettre à jour ?", | 1437 | "Want to update?": "Envie de mettre à jour ?", |
| 1438 | "How to start chatting?": "Comment commencer à discuter ?", | 1438 | "How to start chatting?": "Comment commencer à discuter ?", |
| 1439 | "Click ": "Cliquez sur", | 1439 | "Click _space": "Cliquez sur", |
| 1440 | "and select a": "et sélectionnez un", | 1440 | "and select a": "et sélectionnez un", |
| 1441 | "Chat API": "API de chat", | 1441 | "Chat API": "API de chat", |
| 1442 | "and pick a character.": "et choisissez un personnage.", | 1442 | "and pick a character.": "et choisissez un personnage.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Tengdu persónuspjöld (innifalin þögguð)", | 853 | "Join character cards (include muted)": "Tengdu persónuspjöld (innifalin þögguð)", |
| 854 | "Inserted before each part of the joined fields.": "Sett inn fyrir hvern hluta sameinaðra reita.", | 854 | "Inserted before each part of the joined fields.": "Sett inn fyrir hvern hluta sameinaðra reita.", |
| 855 | "Join Prefix": "Skráðu þig í Forskeyti", | 855 | "Join Prefix": "Skráðu þig í Forskeyti", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Þegar 'Tengdu persónukort' er valið er verið að tengja saman alla viðkomandi reitir persónanna.\rÞetta þýðir að í sögustrengnum verða til dæmis allar persónulýsingar sameinaðar í einn stóran texta.\rEf þú vilt að þessir reitir séu aðskildir geturðu skilgreint forskeyti eða viðskeyti hér.\r\rÞetta gildi styður venjulega fjölva og mun einnig skipta út {{char}} fyrir viðkomandi bleikjunafni og <FIELDNAME> fyrir nafn hlutans (t.d.: lýsing, persónuleiki, atburðarás osfrv.)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Þegar 'Tengdu persónukort' er valið er verið að tengja saman alla viðkomandi reitir persónanna.\rÞetta þýðir að í sögustrengnum verða til dæmis allar persónulýsingar sameinaðar í einn stóran texta.\rEf þú vilt að þessir reitir séu aðskildir geturðu skilgreint forskeyti eða viðskeyti hér.\r\rÞetta gildi styður venjulega fjölva og mun einnig skipta út {{char}} fyrir viðkomandi bleikjunafni og <FIELDNAME> fyrir nafn hlutans (t.d.: lýsing, persónuleiki, atburðarás osfrv.)", |
| 857 | "Inserted after each part of the joined fields.": "Sett inn á eftir hverjum hluta sameinaðra reita.", | 857 | "Inserted after each part of the joined fields.": "Sett inn á eftir hverjum hluta sameinaðra reita.", |
| 858 | "Join Suffix": "Skráðu þig í viðskeyti", | 858 | "Join Suffix": "Skráðu þig í viðskeyti", |
| 859 | "Set a group chat scenario": "Setja hópspjallsskipulag", | 859 | "Set a group chat scenario": "Setja hópspjallsskipulag", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Breyta mörgum persónum í einu", | 885 | "Bulk_edit_characters": "Breyta mörgum persónum í einu", |
| 886 | "Bulk select all characters": "Velja alla stafi í magni", | 886 | "Bulk select all characters": "Velja alla stafi í magni", |
| 887 | "Bulk delete characters": "Eyða mörgum persónum í einu", | 887 | "Bulk delete characters": "Eyða mörgum persónum í einu", |
| 888 | "popup_text_save": "Vista", | 888 | "popup-button-save": "Vista", |
| 889 | "popup_text_yes": "Já", | 889 | "popup-button-yes": "Já", |
| 890 | "popup_text_no": "Nei", | 890 | "popup-button-no": "Nei", |
| 891 | "popup_text_cancel": "Hætta við", | 891 | "popup-button-cancel": "Hætta við", |
| 892 | "popup_text_import": "Flytja inn", | 892 | "popup-button-import": "Flytja inn", |
| 893 | "Advanced Defininitions": "Ítarleg skilgreiningar", | 893 | "Advanced Defininitions": "Ítarleg skilgreiningar", |
| 894 | "Prompt Overrides": "Hnekkja hvetjandi", | 894 | "Prompt Overrides": "Hnekkja hvetjandi", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Til að ljúka spjalli og leiðbeiningarham)", | 895 | "(For Chat Completion and Instruct Mode)": "(Til að ljúka spjalli og leiðbeiningarham)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Persónuúteslutningur", | 1005 | "Character Exclusion": "Persónuúteslutningur", |
| 1006 | "-- Characters not found --": "-- Persónur finnast ekki --", | 1006 | "-- Characters not found --": "-- Persónur finnast ekki --", |
| 1007 | "Inclusion Group": "Innifólgur Hópur", | 1007 | "Inclusion Group": "Innifólgur Hópur", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Inntökuhópar tryggja að aðeins ein færsla úr hópi sé virkjuð í einu, ef margar eru ræstar.\rStyður marga hópa aðskilda með kommum.\r\rSkjöl: World Info - Inclusion Group", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Inntökuhópar tryggja að aðeins ein færsla úr hópi sé virkjuð í einu, ef margar eru ræstar.\rStyður marga hópa aðskilda með kommum.\r\rSkjöl: World Info - Inclusion Group", |
| 1009 | "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.": "Forgangsraða þessari færslu: Þegar hakað er við þá er þessari færslu forgangsraðað úr öllu vali.\rEf mörgum er forgangsraðað er sá sem hefur hæstu 'pöntun' valin.", | 1009 | "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.": "Forgangsraða þessari færslu: Þegar hakað er við þá er þessari færslu forgangsraðað úr öllu vali.\rEf mörgum er forgangsraðað er sá sem hefur hæstu 'pöntun' valin.", |
| 1010 | "Only one entry with the same label will be activated": "Aðeins ein skrá með sömu merki verður virk", | 1010 | "Only one entry with the same label will be activated": "Aðeins ein skrá með sömu merki verður virk", |
| 1011 | "A relative likelihood of entry activation within the group": "Hlutfallslegar líkur á inngönguvirkjun innan hópsins", | 1011 | "A relative likelihood of entry activation within the group": "Hlutfallslegar líkur á inngönguvirkjun innan hópsins", |
| 1012 | "Group Weight": "Þyngd hópa", | 1012 | "Group Weight": "Þyngd hópa", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Endurstilla kóða:", | 1436 | "Reset Code:": "Endurstilla kóða:", |
| 1437 | "Want to update?": "Viltu uppfæra?", | 1437 | "Want to update?": "Viltu uppfæra?", |
| 1438 | "How to start chatting?": "Hvernig á að byrja að spjalla?", | 1438 | "How to start chatting?": "Hvernig á að byrja að spjalla?", |
| 1439 | "Click ": "Smellur", | 1439 | "Click _space": "Smellur", |
| 1440 | "and select a": "og veldu", | 1440 | "and select a": "og veldu", |
| 1441 | "Chat API": "Spjall API", | 1441 | "Chat API": "Spjall API", |
| 1442 | "and pick a character.": "og veldu karakter.", | 1442 | "and pick a character.": "og veldu karakter.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Unisci le carte dei personaggi (includi disattivate)", | 853 | "Join character cards (include muted)": "Unisci le carte dei personaggi (includi disattivate)", |
| 854 | "Inserted before each part of the joined fields.": "Inserito prima di ogni parte dei campi uniti.", | 854 | "Inserted before each part of the joined fields.": "Inserito prima di ogni parte dei campi uniti.", |
| 855 | "Join Prefix": "Unisciti al prefisso", | 855 | "Join Prefix": "Unisciti al prefisso", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Quando viene selezionato \"Unisci carte personaggio\", tutti i rispettivi campi dei personaggi verranno uniti.\rCiò significa che nella stringa della storia, ad esempio, tutte le descrizioni dei personaggi verranno unite in un unico grande testo.\rSe desideri che questi campi siano separati, puoi definire un prefisso o un suffisso qui.\r\rQuesto valore supporta le macro normali e sostituirà anche {{char}} con il nome del carattere rilevante e <FIELDNAME> con il nome della parte (es.: descrizione, personalità, scenario, ecc.)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Quando viene selezionato \"Unisci carte personaggio\", tutti i rispettivi campi dei personaggi verranno uniti.\rCiò significa che nella stringa della storia, ad esempio, tutte le descrizioni dei personaggi verranno unite in un unico grande testo.\rSe desideri che questi campi siano separati, puoi definire un prefisso o un suffisso qui.\r\rQuesto valore supporta le macro normali e sostituirà anche {{char}} con il nome del carattere rilevante e <FIELDNAME> con il nome della parte (es.: descrizione, personalità, scenario, ecc.)", |
| 857 | "Inserted after each part of the joined fields.": "Inserito dopo ogni parte dei campi uniti.", | 857 | "Inserted after each part of the joined fields.": "Inserito dopo ogni parte dei campi uniti.", |
| 858 | "Join Suffix": "Unisciti al suffisso", | 858 | "Join Suffix": "Unisciti al suffisso", |
| 859 | "Set a group chat scenario": "Imposta uno scenario di chat di gruppo", | 859 | "Set a group chat scenario": "Imposta uno scenario di chat di gruppo", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Modifica personaggi in blocco", | 885 | "Bulk_edit_characters": "Modifica personaggi in blocco", |
| 886 | "Bulk select all characters": "Seleziona in blocco tutti i personaggi", | 886 | "Bulk select all characters": "Seleziona in blocco tutti i personaggi", |
| 887 | "Bulk delete characters": "Elimina personaggi in blocco", | 887 | "Bulk delete characters": "Elimina personaggi in blocco", |
| 888 | "popup_text_save": "Salva", | 888 | "popup-button-save": "Salva", |
| 889 | "popup_text_yes": "SÌ", | 889 | "popup-button-yes": "SÌ", |
| 890 | "popup_text_no": "NO", | 890 | "popup-button-no": "NO", |
| 891 | "popup_text_cancel": "Annulla", | 891 | "popup-button-cancel": "Annulla", |
| 892 | "popup_text_import": "Importare", | 892 | "popup-button-import": "Importare", |
| 893 | "Advanced Defininitions": "Definizioni avanzate", | 893 | "Advanced Defininitions": "Definizioni avanzate", |
| 894 | "Prompt Overrides": "Sostituzioni richieste", | 894 | "Prompt Overrides": "Sostituzioni richieste", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Per il completamento della chat e la modalità istruzione)", | 895 | "(For Chat Completion and Instruct Mode)": "(Per il completamento della chat e la modalità istruzione)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Esclusione Personaggio", | 1005 | "Character Exclusion": "Esclusione Personaggio", |
| 1006 | "-- Characters not found --": "-- Personaggi non trovati --", | 1006 | "-- Characters not found --": "-- Personaggi non trovati --", |
| 1007 | "Inclusion Group": "Gruppo di Inclusione", | 1007 | "Inclusion Group": "Gruppo di Inclusione", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "I gruppi di inclusione garantiscono che venga attivata solo una voce di un gruppo alla volta, se ne vengono attivate più.\rSupporta più gruppi separati da virgole.\r\rDocumentazione: World Info – Gruppo Inclusione", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "I gruppi di inclusione garantiscono che venga attivata solo una voce di un gruppo alla volta, se ne vengono attivate più.\rSupporta più gruppi separati da virgole.\r\rDocumentazione: World Info – Gruppo Inclusione", |
| 1009 | "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.": "Dai priorità a questa voce: se selezionata, questa voce ha la priorità tra tutte le selezioni. Se vengono date priorità a più voci, viene scelta quella con l'\"Ordine\" più alto.", | 1009 | "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.": "Dai priorità a questa voce: se selezionata, questa voce ha la priorità tra tutte le selezioni. Se vengono date priorità a più voci, viene scelta quella con l'\"Ordine\" più alto.", |
| 1010 | "Only one entry with the same label will be activated": "Sarà attivato solo un unico ingresso con lo stesso etichetta", | 1010 | "Only one entry with the same label will be activated": "Sarà attivato solo un unico ingresso con lo stesso etichetta", |
| 1011 | "A relative likelihood of entry activation within the group": "Una probabilità relativa di attivazione dell'ingresso all'interno del gruppo", | 1011 | "A relative likelihood of entry activation within the group": "Una probabilità relativa di attivazione dell'ingresso all'interno del gruppo", |
| 1012 | "Group Weight": "Peso del gruppo", | 1012 | "Group Weight": "Peso del gruppo", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Codice di ripristino:", | 1436 | "Reset Code:": "Codice di ripristino:", |
| 1437 | "Want to update?": "Vuoi aggiornare?", | 1437 | "Want to update?": "Vuoi aggiornare?", |
| 1438 | "How to start chatting?": "Come iniziare a chattare?", | 1438 | "How to start chatting?": "Come iniziare a chattare?", |
| 1439 | "Click ": "Clic", | 1439 | "Click _space": "Clic", |
| 1440 | "and select a": " e seleziona un", | 1440 | "and select a": " e seleziona un", |
| 1441 | "Chat API": " API di chat", | 1441 | "Chat API": " API di chat", |
| 1442 | "and pick a character.": "e scegli un personaggio.", | 1442 | "and pick a character.": "e scegli un personaggio.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "キャラクターカードに参加(ミュート含む)", | 853 | "Join character cards (include muted)": "キャラクターカードに参加(ミュート含む)", |
| 854 | "Inserted before each part of the joined fields.": "結合されたフィールドの各部分の前に挿入されます。", | 854 | "Inserted before each part of the joined fields.": "結合されたフィールドの各部分の前に挿入されます。", |
| 855 | "Join Prefix": "結合プレフィックス", | 855 | "Join Prefix": "結合プレフィックス", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "「キャラクターカードを結合」を選択すると、キャラクターのそれぞれのフィールドがすべて結合されます。つまり、たとえばストーリー文字列では、すべてのキャラクターの説明が 1 つの大きなテキストに結合されます。これらのフィールドを分離したい場合は、ここでプレフィックスまたはサフィックスを定義できます。この値は通常のマクロをサポートし、{{char}} を関連するキャラクターの名前に置き換え、<FIELDNAME> をパーツの名前 (例: 説明、性格、シナリオなど) に置き換えます。", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "「キャラクターカードを結合」を選択すると、キャラクターのそれぞれのフィールドがすべて結合されます。つまり、たとえばストーリー文字列では、すべてのキャラクターの説明が 1 つの大きなテキストに結合されます。これらのフィールドを分離したい場合は、ここでプレフィックスまたはサフィックスを定義できます。この値は通常のマクロをサポートし、{{char}} を関連するキャラクターの名前に置き換え、<FIELDNAME> をパーツの名前 (例: 説明、性格、シナリオなど) に置き換えます。", |
| 857 | "Inserted after each part of the joined fields.": "結合されたフィールドの各部分の後に挿入されます。", | 857 | "Inserted after each part of the joined fields.": "結合されたフィールドの各部分の後に挿入されます。", |
| 858 | "Join Suffix": "結合サフィックス", | 858 | "Join Suffix": "結合サフィックス", |
| 859 | "Set a group chat scenario": "グループチャットのシナリオを設定", | 859 | "Set a group chat scenario": "グループチャットのシナリオを設定", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "キャラクターを一括編集", | 885 | "Bulk_edit_characters": "キャラクターを一括編集", |
| 886 | "Bulk select all characters": "すべての文字を一括選択", | 886 | "Bulk select all characters": "すべての文字を一括選択", |
| 887 | "Bulk delete characters": "キャラクターを一括削除", | 887 | "Bulk delete characters": "キャラクターを一括削除", |
| 888 | "popup_text_save": "保存", | 888 | "popup-button-save": "保存", |
| 889 | "popup_text_yes": "はい", | 889 | "popup-button-yes": "はい", |
| 890 | "popup_text_no": "いいえ", | 890 | "popup-button-no": "いいえ", |
| 891 | "popup_text_cancel": "キャンセル", | 891 | "popup-button-cancel": "キャンセル", |
| 892 | "popup_text_import": "輸入", | 892 | "popup-button-import": "輸入", |
| 893 | "Advanced Defininitions": "高度な定義", | 893 | "Advanced Defininitions": "高度な定義", |
| 894 | "Prompt Overrides": "プロンプトのオーバーライド", | 894 | "Prompt Overrides": "プロンプトのオーバーライド", |
| 895 | "(For Chat Completion and Instruct Mode)": "(チャット補完と指示モード用)", | 895 | "(For Chat Completion and Instruct Mode)": "(チャット補完と指示モード用)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "キャラクターの除外", | 1005 | "Character Exclusion": "キャラクターの除外", |
| 1006 | "-- Characters not found --": "-- キャラクターが見つかりません --", | 1006 | "-- Characters not found --": "-- キャラクターが見つかりません --", |
| 1007 | "Inclusion Group": "含蓋グループ", | 1007 | "Inclusion Group": "含蓋グループ", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "包含グループにより、複数のエントリがトリガーされた場合、一度に 1 つのグループから 1 つのエントリのみがアクティブ化されます。カンマで区切られた複数のグループをサポートします。ドキュメント: World Info - 包含グループ", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "包含グループにより、複数のエントリがトリガーされた場合、一度に 1 つのグループから 1 つのエントリのみがアクティブ化されます。カンマで区切られた複数のグループをサポートします。ドキュメント: World Info - 包含グループ", |
| 1009 | "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.": "このエントリを優先する: チェックすると、このエントリがすべての選択項目の中で優先されます。複数のエントリを優先する場合は、「順序」が最も高いエントリが選択されます。", | 1009 | "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.": "このエントリを優先する: チェックすると、このエントリがすべての選択項目の中で優先されます。複数のエントリを優先する場合は、「順序」が最も高いエントリが選択されます。", |
| 1010 | "Only one entry with the same label will be activated": "同じラベルのエントリが1つだけ有効になります", | 1010 | "Only one entry with the same label will be activated": "同じラベルのエントリが1つだけ有効になります", |
| 1011 | "A relative likelihood of entry activation within the group": "グループ内でのエントリー活性化の相対的な可能性", | 1011 | "A relative likelihood of entry activation within the group": "グループ内でのエントリー活性化の相対的な可能性", |
| 1012 | "Group Weight": "グループの重み", | 1012 | "Group Weight": "グループの重み", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "リセットコード:", | 1436 | "Reset Code:": "リセットコード:", |
| 1437 | "Want to update?": "更新しますか?", | 1437 | "Want to update?": "更新しますか?", |
| 1438 | "How to start chatting?": "チャットを開始する方法は?", | 1438 | "How to start chatting?": "チャットを開始する方法は?", |
| 1439 | "Click ": "クリック", | 1439 | "Click _space": "クリック", |
| 1440 | "and select a": "そして選択します ", | 1440 | "and select a": "そして選択します ", |
| 1441 | "Chat API": "チャットAPI", | 1441 | "Chat API": "チャットAPI", |
| 1442 | "and pick a character.": "キャラクターを選択します。", | 1442 | "and pick a character.": "キャラクターを選択します。", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "캐릭터 카드 가입(뮤트 포함)", | 853 | "Join character cards (include muted)": "캐릭터 카드 가입(뮤트 포함)", |
| 854 | "Inserted before each part of the joined fields.": "결합된 필드의 각 부분 앞에 삽입됩니다.", | 854 | "Inserted before each part of the joined fields.": "결합된 필드의 각 부분 앞에 삽입됩니다.", |
| 855 | "Join Prefix": "접두사 가입", | 855 | "Join Prefix": "접두사 가입", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "'캐릭터 카드 합치기'를 선택하면 캐릭터의 모든 해당 필드가 합쳐집니다. 즉, 스토리 문자열에서 예를 들어 모든 캐릭터 설명이 하나의 큰 텍스트로 합쳐집니다. 이러한 필드를 분리하려면 여기에서 접두사나 접미사를 정의할 수 있습니다. 이 값은 일반 매크로를 지원하고 {{char}}를 해당 캐릭터의 이름으로, <FIELDNAME>을 해당 부분의 이름(예: 설명, 성격, 시나리오 등)으로 대체합니다.", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "'캐릭터 카드 합치기'를 선택하면 캐릭터의 모든 해당 필드가 합쳐집니다. 즉, 스토리 문자열에서 예를 들어 모든 캐릭터 설명이 하나의 큰 텍스트로 합쳐집니다. 이러한 필드를 분리하려면 여기에서 접두사나 접미사를 정의할 수 있습니다. 이 값은 일반 매크로를 지원하고 {{char}}를 해당 캐릭터의 이름으로, <FIELDNAME>을 해당 부분의 이름(예: 설명, 성격, 시나리오 등)으로 대체합니다.", |
| 857 | "Inserted after each part of the joined fields.": "결합된 필드의 각 부분 뒤에 삽입됩니다.", | 857 | "Inserted after each part of the joined fields.": "결합된 필드의 각 부분 뒤에 삽입됩니다.", |
| 858 | "Join Suffix": "접미사 가입", | 858 | "Join Suffix": "접미사 가입", |
| 859 | "Set a group chat scenario": "그룹 채팅 시나리오 설정", | 859 | "Set a group chat scenario": "그룹 채팅 시나리오 설정", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "대량 캐릭터 편집", | 885 | "Bulk_edit_characters": "대량 캐릭터 편집", |
| 886 | "Bulk select all characters": "모든 문자 일괄 선택", | 886 | "Bulk select all characters": "모든 문자 일괄 선택", |
| 887 | "Bulk delete characters": "대량 캐릭터 삭제", | 887 | "Bulk delete characters": "대량 캐릭터 삭제", |
| 888 | "popup_text_save": "구하다", | 888 | "popup-button-save": "구하다", |
| 889 | "popup_text_yes": "예", | 889 | "popup-button-yes": "예", |
| 890 | "popup_text_no": "아니요", | 890 | "popup-button-no": "아니요", |
| 891 | "popup_text_cancel": "취소", | 891 | "popup-button-cancel": "취소", |
| 892 | "popup_text_import": "수입", | 892 | "popup-button-import": "수입", |
| 893 | "Advanced Defininitions": "고급 정의", | 893 | "Advanced Defininitions": "고급 정의", |
| 894 | "Prompt Overrides": "프롬프트 무시", | 894 | "Prompt Overrides": "프롬프트 무시", |
| 895 | "(For Chat Completion and Instruct Mode)": "(채팅 완료 및 지시 모드의 경우)", | 895 | "(For Chat Completion and Instruct Mode)": "(채팅 완료 및 지시 모드의 경우)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "캐릭터 제외", | 1005 | "Character Exclusion": "캐릭터 제외", |
| 1006 | "-- Characters not found --": "-- 캐릭터를 찾을 수 없음 --", | 1006 | "-- Characters not found --": "-- 캐릭터를 찾을 수 없음 --", |
| 1007 | "Inclusion Group": "포함 그룹", | 1007 | "Inclusion Group": "포함 그룹", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "포함 그룹은 여러 항목이 트리거되는 경우 그룹에서 한 번에 하나의 항목만 활성화되도록 합니다.\r쉼표로 구분된 여러 그룹을 지원합니다.\r\r문서: 세계 정보 - 포함 그룹", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "포함 그룹은 여러 항목이 트리거되는 경우 그룹에서 한 번에 하나의 항목만 활성화되도록 합니다.\r쉼표로 구분된 여러 그룹을 지원합니다.\r\r문서: 세계 정보 - 포함 그룹", |
| 1009 | "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여러 항목의 우선순위가 높은 경우 '순서'가 가장 높은 항목이 선택됩니다.", | 1009 | "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.": "이 항목 우선순위 지정: 선택하면 모든 선택 항목 중에서 이 항목의 우선순위가 지정됩니다.\r여러 항목의 우선순위가 높은 경우 '순서'가 가장 높은 항목이 선택됩니다.", |
| 1010 | "Only one entry with the same label will be activated": "동일한 라벨을 가진 항목은 하나만 활성화됩니다", | 1010 | "Only one entry with the same label will be activated": "동일한 라벨을 가진 항목은 하나만 활성화됩니다", |
| 1011 | "A relative likelihood of entry activation within the group": "그룹 내 항목 활성화의 상대적 가능성", | 1011 | "A relative likelihood of entry activation within the group": "그룹 내 항목 활성화의 상대적 가능성", |
| 1012 | "Group Weight": "그룹 가중치", | 1012 | "Group Weight": "그룹 가중치", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "재설정 코드:", | 1436 | "Reset Code:": "재설정 코드:", |
| 1437 | "Want to update?": "업데이트 하시겠습니까?", | 1437 | "Want to update?": "업데이트 하시겠습니까?", |
| 1438 | "How to start chatting?": "채팅을 시작하는 방법은?", | 1438 | "How to start chatting?": "채팅을 시작하는 방법은?", |
| 1439 | "Click ": "딸깍 하는 소리", | 1439 | "Click _space": "딸깍 하는 소리", |
| 1440 | "and select a": "그리고 선택하십시오", | 1440 | "and select a": "그리고 선택하십시오", |
| 1441 | "Chat API": "채팅 API", | 1441 | "Chat API": "채팅 API", |
| 1442 | "and pick a character.": "그리고 캐릭터를 선택하세요.", | 1442 | "and pick a character.": "그리고 캐릭터를 선택하세요.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Sluit je aan bij karakterkaarten (inclusief gedempt)", | 853 | "Join character cards (include muted)": "Sluit je aan bij karakterkaarten (inclusief gedempt)", |
| 854 | "Inserted before each part of the joined fields.": "Ingevoegd vóór elk deel van de samengevoegde velden.", | 854 | "Inserted before each part of the joined fields.": "Ingevoegd vóór elk deel van de samengevoegde velden.", |
| 855 | "Join Prefix": "Sluit je aan bij Voorvoegsel", | 855 | "Join Prefix": "Sluit je aan bij Voorvoegsel", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Wanneer 'Verbind karakterkaarten' is geselecteerd, worden alle respectieve velden van de karakters samengevoegd.\rDit betekent dat in de verhaalreeks bijvoorbeeld alle karakterbeschrijvingen worden samengevoegd tot één grote tekst.\rAls u wilt dat deze velden gescheiden worden, kunt u hier een voor- of achtervoegsel definiëren.\r\rDeze waarde ondersteunt normale macro's en zal ook {{char}} vervangen door de relevante naam van het char en <FIELDNAME> door de naam van het onderdeel (bijvoorbeeld: beschrijving, persoonlijkheid, scenario, etc.)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Wanneer 'Verbind karakterkaarten' is geselecteerd, worden alle respectieve velden van de karakters samengevoegd.\rDit betekent dat in de verhaalreeks bijvoorbeeld alle karakterbeschrijvingen worden samengevoegd tot één grote tekst.\rAls u wilt dat deze velden gescheiden worden, kunt u hier een voor- of achtervoegsel definiëren.\r\rDeze waarde ondersteunt normale macro's en zal ook {{char}} vervangen door de relevante naam van het char en <FIELDNAME> door de naam van het onderdeel (bijvoorbeeld: beschrijving, persoonlijkheid, scenario, etc.)", |
| 857 | "Inserted after each part of the joined fields.": "Ingevoegd na elk deel van de samengevoegde velden.", | 857 | "Inserted after each part of the joined fields.": "Ingevoegd na elk deel van de samengevoegde velden.", |
| 858 | "Join Suffix": "Sluit je aan bij het achtervoegsel", | 858 | "Join Suffix": "Sluit je aan bij het achtervoegsel", |
| 859 | "Set a group chat scenario": "Stel een scenario voor groepschat in", | 859 | "Set a group chat scenario": "Stel een scenario voor groepschat in", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Massaal bewerken personages", | 885 | "Bulk_edit_characters": "Massaal bewerken personages", |
| 886 | "Bulk select all characters": "Selecteer alle tekens in bulk", | 886 | "Bulk select all characters": "Selecteer alle tekens in bulk", |
| 887 | "Bulk delete characters": "Massaal verwijderen personages", | 887 | "Bulk delete characters": "Massaal verwijderen personages", |
| 888 | "popup_text_save": "Redden", | 888 | "popup-button-save": "Redden", |
| 889 | "popup_text_yes": "Ja", | 889 | "popup-button-yes": "Ja", |
| 890 | "popup_text_no": "Nee", | 890 | "popup-button-no": "Nee", |
| 891 | "popup_text_cancel": "Annuleren", | 891 | "popup-button-cancel": "Annuleren", |
| 892 | "popup_text_import": "Importeren", | 892 | "popup-button-import": "Importeren", |
| 893 | "Advanced Defininitions": "Geavanceerde definities", | 893 | "Advanced Defininitions": "Geavanceerde definities", |
| 894 | "Prompt Overrides": "Prompt-overschrijvingen", | 894 | "Prompt Overrides": "Prompt-overschrijvingen", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Voor voltooiing van chat en instructiemodus)", | 895 | "(For Chat Completion and Instruct Mode)": "(Voor voltooiing van chat en instructiemodus)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Personage uitsluiting", | 1005 | "Character Exclusion": "Personage uitsluiting", |
| 1006 | "-- Characters not found --": "-- Personages niet gevonden --", | 1006 | "-- Characters not found --": "-- Personages niet gevonden --", |
| 1007 | "Inclusion Group": "Insluitingsgroep", | 1007 | "Inclusion Group": "Insluitingsgroep", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Inclusiegroepen zorgen ervoor dat slechts één item uit een groep tegelijk wordt geactiveerd, als er meerdere worden geactiveerd.\rOndersteunt meerdere door komma's gescheiden groepen.\r\rDocumentatie: World Info - Inclusion Group", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Inclusiegroepen zorgen ervoor dat slechts één item uit een groep tegelijk wordt geactiveerd, als er meerdere worden geactiveerd.\rOndersteunt meerdere door komma's gescheiden groepen.\r\rDocumentatie: World Info - Inclusion Group", |
| 1009 | "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.": "Geef prioriteit aan deze invoer: Als dit selectievakje is aangevinkt, krijgt deze invoer prioriteit boven alle selecties. Als er meerdere items prioriteit hebben, wordt de invoer met de hoogste 'volgorde' gekozen.", | 1009 | "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.": "Geef prioriteit aan deze invoer: Als dit selectievakje is aangevinkt, krijgt deze invoer prioriteit boven alle selecties. Als er meerdere items prioriteit hebben, wordt de invoer met de hoogste 'volgorde' gekozen.", |
| 1010 | "Only one entry with the same label will be activated": "Slechts één item met hetzelfde label zal worden geactiveerd", | 1010 | "Only one entry with the same label will be activated": "Slechts één item met hetzelfde label zal worden geactiveerd", |
| 1011 | "A relative likelihood of entry activation within the group": "Een relatieve waarschijnlijkheid van activatie binnen de groep", | 1011 | "A relative likelihood of entry activation within the group": "Een relatieve waarschijnlijkheid van activatie binnen de groep", |
| 1012 | "Group Weight": "Groepsgewicht", | 1012 | "Group Weight": "Groepsgewicht", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Reset code:", | 1436 | "Reset Code:": "Reset code:", |
| 1437 | "Want to update?": "Wil je SillyTavern updaten?", | 1437 | "Want to update?": "Wil je SillyTavern updaten?", |
| 1438 | "How to start chatting?": "Hoe begin je met chatten?", | 1438 | "How to start chatting?": "Hoe begin je met chatten?", |
| 1439 | "Click ": "Klik", | 1439 | "Click _space": "Klik", |
| 1440 | "and select a": " en selecteer een", | 1440 | "and select a": " en selecteer een", |
| 1441 | "Chat API": " Chat-API", | 1441 | "Chat API": " Chat-API", |
| 1442 | "and pick a character.": "en kies een personage.", | 1442 | "and pick a character.": "en kies een personage.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Junte-se a cartões de personagem (inclua silenciado)", | 853 | "Join character cards (include muted)": "Junte-se a cartões de personagem (inclua silenciado)", |
| 854 | "Inserted before each part of the joined fields.": "Inserido antes de cada parte dos campos unidos.", | 854 | "Inserted before each part of the joined fields.": "Inserido antes de cada parte dos campos unidos.", |
| 855 | "Join Prefix": "Prefixo de adesão", | 855 | "Join Prefix": "Prefixo de adesão", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Quando 'Unir cartas de personagem' é selecionado, todos os respectivos campos dos personagens são unidos.\rIsto significa que na sequência da história, por exemplo, todas as descrições dos personagens serão unidas a um grande texto.\rSe quiser que esses campos sejam separados, você pode definir um prefixo ou sufixo aqui.\r\rEste valor suporta macros normais e também substituirá {{char}} pelo nome do char relevante e <FIELDNAME> pelo nome da parte (por exemplo: descrição, personalidade, cenário, etc.)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Quando 'Unir cartas de personagem' é selecionado, todos os respectivos campos dos personagens são unidos.\rIsto significa que na sequência da história, por exemplo, todas as descrições dos personagens serão unidas a um grande texto.\rSe quiser que esses campos sejam separados, você pode definir um prefixo ou sufixo aqui.\r\rEste valor suporta macros normais e também substituirá {{char}} pelo nome do char relevante e <FIELDNAME> pelo nome da parte (por exemplo: descrição, personalidade, cenário, etc.)", |
| 857 | "Inserted after each part of the joined fields.": "Inserido após cada parte dos campos unidos.", | 857 | "Inserted after each part of the joined fields.": "Inserido após cada parte dos campos unidos.", |
| 858 | "Join Suffix": "Junte-se ao sufixo", | 858 | "Join Suffix": "Junte-se ao sufixo", |
| 859 | "Set a group chat scenario": "Definir um cenário de bate-papo em grupo", | 859 | "Set a group chat scenario": "Definir um cenário de bate-papo em grupo", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Editar personagens em massa", | 885 | "Bulk_edit_characters": "Editar personagens em massa", |
| 886 | "Bulk select all characters": "Selecione em massa todos os caracteres", | 886 | "Bulk select all characters": "Selecione em massa todos os caracteres", |
| 887 | "Bulk delete characters": "Excluir personagens em massa", | 887 | "Bulk delete characters": "Excluir personagens em massa", |
| 888 | "popup_text_save": "Salvar", | 888 | "popup-button-save": "Salvar", |
| 889 | "popup_text_yes": "Sim", | 889 | "popup-button-yes": "Sim", |
| 890 | "popup_text_no": "Não", | 890 | "popup-button-no": "Não", |
| 891 | "popup_text_cancel": "Cancelar", | 891 | "popup-button-cancel": "Cancelar", |
| 892 | "popup_text_import": "Importar", | 892 | "popup-button-import": "Importar", |
| 893 | "Advanced Defininitions": "Definições Avançadas", | 893 | "Advanced Defininitions": "Definições Avançadas", |
| 894 | "Prompt Overrides": "Substituições de prompt", | 894 | "Prompt Overrides": "Substituições de prompt", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Para conclusão de bate-papo e modo de instrução)", | 895 | "(For Chat Completion and Instruct Mode)": "(Para conclusão de bate-papo e modo de instrução)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Exclusão de personagem", | 1005 | "Character Exclusion": "Exclusão de personagem", |
| 1006 | "-- Characters not found --": "-- Personagens não encontrados --", | 1006 | "-- Characters not found --": "-- Personagens não encontrados --", |
| 1007 | "Inclusion Group": "Grupo de inclusão", | 1007 | "Inclusion Group": "Grupo de inclusão", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Os Grupos de Inclusão garantem que apenas uma entrada de um grupo seja ativada por vez, se várias forem acionadas.\rSuporta vários grupos separados por vírgula.\r\rDocumentação: World Info - Grupo de Inclusão", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Os Grupos de Inclusão garantem que apenas uma entrada de um grupo seja ativada por vez, se várias forem acionadas.\rSuporta vários grupos separados por vírgula.\r\rDocumentação: World Info - Grupo de Inclusão", |
| 1009 | "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.": "Priorizar esta entrada: quando marcada, esta entrada é priorizada entre todas as seleções.\rSe vários forem priorizados, aquele com a “Ordem” mais alta será escolhido.", | 1009 | "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.": "Priorizar esta entrada: quando marcada, esta entrada é priorizada entre todas as seleções.\rSe vários forem priorizados, aquele com a “Ordem” mais alta será escolhido.", |
| 1010 | "Only one entry with the same label will be activated": "Apenas uma entrada com o mesmo rótulo será ativada", | 1010 | "Only one entry with the same label will be activated": "Apenas uma entrada com o mesmo rótulo será ativada", |
| 1011 | "A relative likelihood of entry activation within the group": "Uma probabilidade relativa de ativação de entrada dentro do grupo", | 1011 | "A relative likelihood of entry activation within the group": "Uma probabilidade relativa de ativação de entrada dentro do grupo", |
| 1012 | "Group Weight": "Peso do grupo", | 1012 | "Group Weight": "Peso do grupo", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Reiniciar código:", | 1436 | "Reset Code:": "Reiniciar código:", |
| 1437 | "Want to update?": "Quer atualizar?", | 1437 | "Want to update?": "Quer atualizar?", |
| 1438 | "How to start chatting?": "Como começar a conversar?", | 1438 | "How to start chatting?": "Como começar a conversar?", |
| 1439 | "Click ": "Clique", | 1439 | "Click _space": "Clique", |
| 1440 | "and select a": "e selecione um", | 1440 | "and select a": "e selecione um", |
| 1441 | "Chat API": "API de Chat", | 1441 | "Chat API": "API de Chat", |
| 1442 | "and pick a character.": "e escolha um personagem.", | 1442 | "and pick a character.": "e escolha um personagem.", |
| @@ -1,943 +1,584 @@ | |||
| 1 | { | 1 | { |
| 2 | "Favorite": "Любимый", | ||
| 3 | "Tag": "Ярлык", | ||
| 4 | "Duplicate": "Дублировать", | ||
| 5 | "Persona": "Персона", | ||
| 6 | "Delete": "Удалить", | ||
| 7 | "AI Response Configuration": "Настройка ответа ИИ", | ||
| 8 | "AI Configuration panel will stay open": "Панель настройки ИИ останется открытой", | ||
| 9 | "clickslidertips": "Кликайте по цифрам под ползунками, чтобы менять их вручную.", | 2 | "clickslidertips": "Кликайте по цифрам под ползунками, чтобы менять их вручную.", |
| 10 | "MAD LAB MODE ON": "РЕЖИМ «БЕЗУМНАЯ ЛАБОРАТОРИЯ» ВКЛЮЧЕН", | ||
| 11 | "Documentation on sampling parameters": "Документация по параметрам сэмплеров", | ||
| 12 | "kobldpresets": "Пресеты для Kobold", | 3 | "kobldpresets": "Пресеты для Kobold", |
| 13 | "guikoboldaisettings": "Настройки из интерфейса KoboldAI", | 4 | "guikoboldaisettings": "Настройки из интерфейса KoboldAI", |
| 14 | "Update current preset": "Обновить текущий пресет", | ||
| 15 | "Save preset as": "Сохранить пресет как", | ||
| 16 | "Import preset": "Импортировать пресет", | ||
| 17 | "Export preset": "Экспортировать пресет", | ||
| 18 | "Restore current preset": "Восстановить текущий пресет", | ||
| 19 | "Delete the preset": "Удалить пресет", | ||
| 20 | "novelaipresets": "Пресеты для NovelAI", | ||
| 21 | "Default": "По умолчанию", | ||
| 22 | "openaipresets": "Пресеты для OpenAI", | 5 | "openaipresets": "Пресеты для OpenAI", |
| 23 | "Text Completion presets": "Пресеты для Text Completion", | ||
| 24 | "AI Module": "Модуль ИИ", | ||
| 25 | "Changes the style of the generated text.": "Изменяет стиль создаваемого текста.", | ||
| 26 | "No Module": "Нет модуля", | ||
| 27 | "Instruct": "Инструктировать", | ||
| 28 | "Prose Augmenter": "Аугментатор прозы", | ||
| 29 | "Text Adventure": "Текстовое приключение", | ||
| 30 | "response legth(tokens)": "Ответ (в токенах)", | 6 | "response legth(tokens)": "Ответ (в токенах)", |
| 31 | "Streaming": "Стриминг текста", | ||
| 32 | "Streaming_desc": "Выводить текст последовательно по мере его генерации.\nЕсли параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", | ||
| 33 | "context size(tokens)": "Контекст (в токенах)", | 7 | "context size(tokens)": "Контекст (в токенах)", |
| 34 | "unlocked": "Неограниченный", | 8 | "unlocked": "Неограниченный", |
| 35 | "Only enable this if your model supports context sizes greater than 4096 tokens": "Включайте эту опцию, только если ваша модель поддерживает размер контекста более 4096 токенов.\nУвеличивайте только если вы знаете, что делаете.", | ||
| 36 | "Max prompt cost:": "Максимальная стоимость запроса:", | ||
| 37 | "Display the response bit by bit as it is generated.": "Выводить текст последовательно по мере его генерации.", | ||
| 38 | "When this is off, responses will be displayed all at once when they are complete.": "Если параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", | ||
| 39 | "Temperature": "Температура", | ||
| 40 | "rep.pen": "Штраф за повтор", | 9 | "rep.pen": "Штраф за повтор", |
| 41 | "Rep. Pen. Range.": "Диапазон поиска повторов", | 10 | "rep.pen range": "Окно для штрафов за повтор", |
| 42 | "Rep. Pen. Slope": "Rep. Pen. Slope", | ||
| 43 | "Rep. Pen. Freq.": "Частота штрафа за повторы", | ||
| 44 | "Rep. Pen. Presence": "Наличие штрафа за повторы", | ||
| 45 | "TFS": "ТФС", | ||
| 46 | "Phrase Repetition Penalty": "Штраф за повтор фразы", | ||
| 47 | "Off": "Выключено", | ||
| 48 | "Very light": "Очень легкий", | ||
| 49 | "Light": "Легкий", | ||
| 50 | "Medium": "Средний", | ||
| 51 | "Aggressive": "Агрессивный", | ||
| 52 | "Very aggressive": "Очень агрессивный", | ||
| 53 | "Unlocked Context Size": "Неограниченный размер контекста", | ||
| 54 | "Unrestricted maximum value for the context slider": "Убрать потолок для ползунка контекста. Включайте только если точно знаете, что делаете", | ||
| 55 | "Context Size (tokens)": "Размер контекста (в токенах)", | ||
| 56 | "Max Response Length (tokens)": "Макс. длина ответа (в токенах)", | ||
| 57 | "Multiple swipes per generation": "Несколько свайпов на генерацию", | ||
| 58 | "Enable OpenAI completion streaming": "Включить стриминг OpenAI", | ||
| 59 | "Enable Cohere web-search connector": "Включить коннектор веб-поиска Cohere", | ||
| 60 | "Web-search": "Веб-поиск", | ||
| 61 | "Allow the model to use the web-search connector.": "Разрешите модели использовать соединитель веб-поиска.", | ||
| 62 | "Frequency Penalty": "Штраф за частоту", | ||
| 63 | "Presence Penalty": "Штраф за присутствие", | ||
| 64 | "Count Penalty": "Подсчитайте штраф", | ||
| 65 | "Top K": "Top K", | ||
| 66 | "Top P": "Top P", | ||
| 67 | "Repetition Penalty": "Штраф за повторы", | ||
| 68 | "Min P": "Мин П", | ||
| 69 | "Top A": "Top А", | ||
| 70 | "Quick Prompts Edit": "Быстрое редактирование промптов", | ||
| 71 | "Main": "Основной", | ||
| 72 | "NSFW": "НФВ", | ||
| 73 | "Jailbreak": "Джейлбрейк", | ||
| 74 | "Utility Prompts": "Служебные промпты", | ||
| 75 | "Impersonation prompt": "Промпт для перевоплощения", | ||
| 76 | "Restore default prompt": "Восстановить станндартный промпт", | ||
| 77 | "Prompt that is used for Impersonation function": "Промпт, применяемый при генерации действий от лица пользователя", | ||
| 78 | "World Info Format Template": "Шаблон оформления информации о мире", | ||
| 79 | "Restore default format": "Восстановить формат по умолчанию", | ||
| 80 | "Wraps activated World Info entries before inserting into the prompt.": "Дополняет информацию об активном на данный момент мире перед её отправкой в промпт.", | ||
| 81 | "scenario_format_template_part_1": "Используйте", | ||
| 82 | "scenario_format_template_part_2": "чтобы указать, куда именно вставляется основное содержимое.", | ||
| 83 | "Scenario Format Template": "Шаблон оформления сценария", | ||
| 84 | "Personality Format Template": "Шаблон оформления характера", | ||
| 85 | "Group Nudge Prompt Template": "Шаблон промпта-подсказки для групп", | ||
| 86 | "Sent at the end of the group chat history to force reply from a specific character.": "Добавляется в конец истории сообщений в групповом чате, чтобы запросить ответ от конкретного персонажа.", | ||
| 87 | "New Chat": "Новый чат", | ||
| 88 | "Restore new chat prompt": "Восстановить новое приглашение в чате", | ||
| 89 | "Set at the beginning of the chat history to indicate that a new chat is about to start.": "Добавляется в начале истории сообщений в качестве указания на то, что дальше начнётся новый чат.", | ||
| 90 | "New Group Chat": "Новый групповой чат", | ||
| 91 | "Restore new group chat prompt": "Восстановить приглашение по умолчанию", | ||
| 92 | "Set at the beginning of the chat history to indicate that a new group chat is about to start.": "Добавляется в начале истории сообщений в качестве указания на то, что дальше начнётся новый групповой чат.", | ||
| 93 | "New Example Chat": "Новый образец чата", | ||
| 94 | "Set at the beginning of Dialogue examples to indicate that a new example chat is about to start.": "Добавляется в начале примеров диалогов в качестве указания на то, что дальше начнётся новый чат-пример.", | ||
| 95 | "Continue nudge": "Подсказка для продолжения", | ||
| 96 | "Set at the end of the chat history when the continue button is pressed.": "Добавляется в конец истории чата, когда отправлен запрос на продолжение текущего сообщения.", | ||
| 97 | "Replace empty message": "Заменять пустые сообщения", | ||
| 98 | "Send this text instead of nothing when the text box is empty.": "Этот текст будет отправлен в случае отсутствия текста на отправку.", | ||
| 99 | "Seed": "Зерно", | ||
| 100 | "Set to get deterministic results. Use -1 for random seed.": "Используется для получения предсказуемого результата. Введите -1 для случайного зерна", | ||
| 101 | "Temperature controls the randomness in token selection": "Температура контролирует процесс выбора токена:\n- при низкой температуре (<1.0) предпочтение отдаётся наиболее вероятным токенам, текст получается предсказуемым.\n- при высокой температуре (>1.0) повышаются шансы у токенов с низкой вероятностью, текст получается более креативным.\nУстановите значение 1.0, чтобы вероятности не менялись.", | 11 | "Temperature controls the randomness in token selection": "Температура контролирует процесс выбора токена:\n- при низкой температуре (<1.0) предпочтение отдаётся наиболее вероятным токенам, текст получается предсказуемым.\n- при высокой температуре (>1.0) повышаются шансы у токенов с низкой вероятностью, текст получается более креативным.\nУстановите значение 1.0, чтобы вероятности не менялись.", |
| 102 | "Top_K_desc": "Top K задает жёсткое ограничение на количество рассматриваемых токенов.\nЕсли Top-K равен 20, это означает, что будут сохранены только 20 наиболее вероятных токенов (распределение их вероятностей в расчёт не берётся)\nУстановите значение 0, чтобы отключить.", | 12 | "Top_K_desc": "Top K задает жёсткое ограничение на количество рассматриваемых токенов.\nЕсли Top-K равен 20, это означает, что будут сохранены только 20 наиболее вероятных токенов (распределение их вероятностей в расчёт не берётся)\nУстановите значение 0, чтобы отключить.", |
| 103 | "Top_P_desc": "Top P (он же nucleus sampling) складывает все верхние токены, пока их суммарные вероятности не достигнут целевого процента.\nТо есть, если 2 верхних токена составляют 25%, а Top-P равен 0.50, учитываются только эти 2 верхних токена.\nУстановите значение 1.0, чтобы отключить.", | 13 | "Top_P_desc": "Top P (он же nucleus sampling) складывает все верхние токены, пока их суммарные вероятности не достигнут целевого процента.\nТо есть, если 2 верхних токена составляют 25%, а Top-P равен 0.50, учитываются только эти 2 верхних токена.\nУстановите значение 1.0, чтобы отключить.", |
| 104 | "Typical P": "Typical P", | ||
| 105 | "Typical_P_desc": "Сэмплер Typical P определяет приоритет токенов на основе их отклонения от средней энтропии набора.\nОстаются токены, чья кумулятивная вероятность близка к заданному порогу (например, 0,5), выделяя те, которые имеют среднее информационное содержание.\nУстановите значение 1.0, чтобы отключить.", | 14 | "Typical_P_desc": "Сэмплер Typical P определяет приоритет токенов на основе их отклонения от средней энтропии набора.\nОстаются токены, чья кумулятивная вероятность близка к заданному порогу (например, 0,5), выделяя те, которые имеют среднее информационное содержание.\nУстановите значение 1.0, чтобы отключить.", |
| 106 | "Min_P_desc": "Min P устанавливает базовую минимальную вероятность. Она масштабируется в зависимости от вероятности верхнего токена.\nЕсли вероятность верхнего токена составляет 80%, а Min P - 0.1, будут рассматриваться только токены с вероятностью выше 8%.\nУстановите значение 0, чтобы отключить.", | 15 | "Min_P_desc": "Min P устанавливает базовую минимальную вероятность. Она масштабируется в зависимости от вероятности верхнего токена.\nЕсли вероятность верхнего токена составляет 80%, а Min P - 0.1, будут рассматриваться только токены с вероятностью выше 8%.\nУстановите значение 0, чтобы отключить.", |
| 107 | "Top_A_desc": "Top A устанавливает порог для отбора токенов на основе квадрата наибольшей вероятности токена.\nЕсли значение Top A равно 0.2, а вероятность верхнего токена равна 50%, то токены с вероятностью ниже 5% (0.2 * 0.5^2) будут исключены.\nУстановите значение 0, чтобы отключить.", | 16 | "Top_A_desc": "Top A устанавливает порог для отбора токенов на основе квадрата наибольшей вероятности токена.\nЕсли значение Top A равно 0.2, а вероятность верхнего токена равна 50%, то токены с вероятностью ниже 5% (0.2 * 0.5^2) будут исключены.\nУстановите значение 0, чтобы отключить.", |
| 108 | "Tail_Free_Sampling_desc": "Tail-Free Sampling (TFS) ищет хвост маловероятных токнов в распределении,\n анализируя скорость изменения вероятностей токенов с помощью производных. Он сохраняет токены до порога (например, 0.3), основанного на нормированной второй производной.\nЧем ближе к 0, тем больше отброшенных токенов. Установите значение 1.0, чтобы отключить.", | 17 | "Tail_Free_Sampling_desc": "Tail-Free Sampling (TFS) ищет хвост маловероятных токнов в распределении,\n анализируя скорость изменения вероятностей токенов с помощью производных. Он сохраняет токены до порога (например, 0.3), основанного на нормированной второй производной.\nЧем ближе к 0, тем больше отброшенных токенов. Установите значение 1.0, чтобы отключить.", |
| 109 | "rep.pen range": "Окно для штрафов за повтор", | ||
| 110 | "Mirostat": "Миростат", | ||
| 111 | "Mode": "Режим", | ||
| 112 | "Mirostat_Mode_desc": "Значение 0 полностью отключает Миростат. 1 — для Миростата 1.0, 2 — для Миростата 2.0.", | ||
| 113 | "Tau": "Тау", | ||
| 114 | "Mirostat_Tau_desc": "Контролирует изменчивость выходных данных Миростата", | ||
| 115 | "Eta": "Эта", | ||
| 116 | "Mirostat_Eta_desc": "Контролирует скорость обучения Миростата", | ||
| 117 | "Ban EOS Token": "Запретить EOS-токен", | ||
| 118 | "Ban_EOS_Token_desc": "Заблокируйте токен конца последовательности (EOS) с помощью KoboldCpp (и, возможно, также другие токены с помощью KoboldAI).\rПодходит для написания историй, но не должен использоваться в режиме чата и инструктирования.", | ||
| 119 | "GBNF Grammar": "Грамматика GBNF", | ||
| 120 | "Type in the desired custom grammar": "Введите нужную пользовательскую грамматику", | ||
| 121 | "Samplers Order": "Порядок сэмплеров", | ||
| 122 | "Samplers will be applied in a top-down order. Use with caution.": "Сэмплеры будут применяться в порядке от верхнего к нижнему. Используйте с осторожностью.", | ||
| 123 | "Tail Free Sampling": "Tail Free Sampling", | ||
| 124 | "Load koboldcpp order": "Загрузить порядок из koboldcpp", | ||
| 125 | "Preamble": "Преамбула", | ||
| 126 | "Use style tags to modify the writing style of the output.": "Используйте теги стиля, чтобы изменить стиль написания выходного текста.", | ||
| 127 | "Banned Tokens": "Запрещенные токены", | ||
| 128 | "Sequences you don't want to appear in the output. One per line.": "Строки, которых не должно быть в выходном тексте. По одной на строчку.", | ||
| 129 | "Logit Bias": "Смещение логитов", | ||
| 130 | "Add": "Добавить", | ||
| 131 | "Helps to ban or reenforce the usage of certain words": "Запрещает или поощряет использование определенных слов", | ||
| 132 | "CFG Scale": "CFG Scale", | ||
| 133 | "Negative Prompt": "Отрицательный промпт", | ||
| 134 | "Add text here that would make the AI generate things you don't want in your outputs.": "Добавьте сюда текст, который заставит ИИ генерировать то, что вы не хотите видеть в его текстах", | ||
| 135 | "Used if CFG Scale is unset globally, per chat or character": "Используется, если CFG Scale не установлен глобально, для каждого чата или персонажа.", | ||
| 136 | "Mirostat Tau": "Tau", | ||
| 137 | "Mirostat LR": "Миростат ЛР", | ||
| 138 | "Min Length": "Мин. длина", | ||
| 139 | "Top K Sampling": "Top K", | ||
| 140 | "Nucleus Sampling": "Nucleus Sampling", | ||
| 141 | "Top A Sampling": "Top A", | ||
| 142 | "CFG": "CFG", | ||
| 143 | "Neutralize Samplers": "Нейтрализовать сэмплеры", | ||
| 144 | "Set all samplers to their neutral/disabled state.": "Установить все сэмплеры в нейтральное/отключенное состояние.", | ||
| 145 | "Sampler Select": "Выбор семплера", | ||
| 146 | "Customize displayed samplers or add custom samplers.": "Настройте отображаемые сэмплеры или добавьте собственные сэмплеры.", | ||
| 147 | "Epsilon Cutoff": "Epsilon Cutoff", | ||
| 148 | "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "Epsilon cutoff устанавливает уровень вероятности, ниже которого токены исключаются из выборки.\nВ единицах 1e-4; разумное значение - 3.\nУстановите 0, чтобы отключить.", | 18 | "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "Epsilon cutoff устанавливает уровень вероятности, ниже которого токены исключаются из выборки.\nВ единицах 1e-4; разумное значение - 3.\nУстановите 0, чтобы отключить.", |
| 149 | "Eta Cutoff": "Eta Cutoff", | 19 | "Scale Temperature dynamically per token, based on the variation of probabilities": "Динамическое масштабирование температуры для каждого токена, основанное на изменении вероятностей.", |
| 150 | "Eta_Cutoff_desc": "Отсечение эпсилон - основной параметр специальной техники выборки эпсилон. В единицах 1e-4; разумное значение - 3. Установите в 0, чтобы отключить. См. статью Truncation Sampling as Language Model Desmoothing от Хьюитт и др. (2022) для получения подробной информации.", | ||
| 151 | "rep.pen decay": "Распад репсового пера", | ||
| 152 | "Encoder Rep. Pen.": "Штраф за повтор для кодировщика", | ||
| 153 | "No Repeat Ngram Size": "Размер no_repeat_ngram", | ||
| 154 | "Skew": "Перекос", | ||
| 155 | "Max Tokens Second": "Макс. кол-во токенов в секунду", | ||
| 156 | "Smooth Sampling": "Плавная выборка", | ||
| 157 | "Smooth_Sampling_desc": "Позволяет использовать квадратичные/кубические преобразования для настройки распределения. Более низкие значения коэффициента сглаживания будут более креативными, обычно диапазон 0,2–0,3 — это наилучшая точка (при условии, что кривая = 1). Более высокие значения кривой сглаживания сделают кривую более крутой, что приведет к более агрессивному наказанию за выбор с низкой вероятностью. Кривая 1.0 эквивалентна использованию только коэффициента сглаживания.", | ||
| 158 | "Smoothing Factor": "Коэффициент сглаживания", | ||
| 159 | "Smoothing Curve": "Кривая сглаживания", | ||
| 160 | "DRY_Repetition_Penalty_desc": "DRY наказывает токены, которые расширяют конец ввода до последовательности, которая ранее встречалась во вводе. Установите множитель на 0, чтобы отключить.", | ||
| 161 | "DRY Repetition Penalty": "СУХОЙ Штраф за повторение", | ||
| 162 | "DRY_Multiplier_desc": "Установите значение > 0, чтобы включить DRY. Управляет величиной штрафа для самых коротких штрафных последовательностей.", | ||
| 163 | "Multiplier": "Множитель", | ||
| 164 | "DRY_Base_desc": "Контролирует, насколько быстро растет штраф с увеличением длины последовательности.", | ||
| 165 | "Base": "База", | ||
| 166 | "DRY_Allowed_Length_desc": "Самая длинная последовательность, которую можно повторить без штрафа.", | ||
| 167 | "Allowed Length": "Допустимая длина", | ||
| 168 | "Penalty Range": "Диапазон штрафов", | ||
| 169 | "DRY_Sequence_Breakers_desc": "Токены, для которых не продолжается сопоставление последовательностей. Указывается как список строк в кавычках, разделенных запятыми.", | ||
| 170 | "Sequence Breakers": "Разрушители последовательности", | ||
| 171 | "JSON-serialized array of strings.": "Массив строк, сериализованный в формате JSON.", | ||
| 172 | "Dynamic Temperature": "Динамическая температура", | ||
| 173 | "Scale Temperature dynamically per token, based on the variation of probabilities": "Динамическое масштабирование Temperature для каждого токена, основанное на изменении вероятностей.", | ||
| 174 | "Minimum Temp": "Мин. температура", | 20 | "Minimum Temp": "Мин. температура", |
| 175 | "Maximum Temp": "Макс. температура", | 21 | "Maximum Temp": "Макс. температура", |
| 176 | "Exponent": "Экспонента", | 22 | "Exponent": "Экспонента", |
| 177 | "Mirostat (mode=1 is only for llama.cpp)": "Mirostat (режим=1 предназначен только для llama.cpp)", | ||
| 178 | "Mirostat_desc": "Mirostat - своего рода термометр, измеряющий перплексию для выводимого текста.\nMirostat подгоняет перплексию генерируемого текста к перплексии входного текста, что позволяет избежать повторов.\n(когда по мере генерации текста авторегрессионным инференсом, перплексия всё больше приближается к нулю)\n а также ловушки перплексии (когда перплексия начинает уходить в сторону)\nБолее подробное описание в статье Mirostat: A Neural Text Decoding Algorithm that Directly Controls Perplexity by Basu et al. (2020).\nРежим выбирает версию Mirostat. 0=отключить, 1=Mirostat 1.0 (только llama.cpp), 2=Mirostat 2.0.", | ||
| 179 | "Mirostat Mode": "Режим", | 23 | "Mirostat Mode": "Режим", |
| 180 | "Variability parameter for Mirostat outputs": "Параметр изменчивости для выходных данных Mirostat.", | 24 | "Mirostat Tau": "Tau", |
| 181 | "Mirostat Eta": "Eta", | 25 | "Mirostat Eta": "Eta", |
| 26 | "Variability parameter for Mirostat outputs": "Параметр изменчивости для выходных данных Mirostat.", | ||
| 182 | "Learning rate of Mirostat": "Скорость обучения Mirostat.", | 27 | "Learning rate of Mirostat": "Скорость обучения Mirostat.", |
| 183 | "Beam search": "Поиск Beam", | ||
| 184 | "Helpful tip coming soon.": "Полезный совет скоро появится.", | ||
| 185 | "Number of Beams": "Количество Beam", | ||
| 186 | "Length Penalty": "Штраф за длину", | ||
| 187 | "Early Stopping": "Преждевременная остановка", | ||
| 188 | "Contrastive search": "Контрастный поиск", | ||
| 189 | "Penalty Alpha": "Penalty Alpha", | ||
| 190 | "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "Сила условия регуляризации контрастивного поиска. Установите значение 0, чтобы отключить CS.", | 28 | "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "Сила условия регуляризации контрастивного поиска. Установите значение 0, чтобы отключить CS.", |
| 191 | "Do Sample": "Сделать образец", | ||
| 192 | "Add BOS Token": "Добавлять BOS-токен", | ||
| 193 | "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "Добавлять BOS-токен в начале промпта. Если выключить, ответы могут стать более креативными.", | ||
| 194 | "Ban the eos_token. This forces the model to never end the generation prematurely": "Запрет EOS-токена не позволит модели завершить генерацию преждевременно", | ||
| 195 | "Ignore EOS Token": "Игнорировать EOS-токен", | ||
| 196 | "Ignore the EOS Token even if it generates.": "Игнорировать EOS-токен, даже если он сгенерировался.", | ||
| 197 | "Skip Special Tokens": "Пропускать специальные токены", | ||
| 198 | "Temperature Last": "Температура последней", | 29 | "Temperature Last": "Температура последней", |
| 199 | "Temperature_Last_desc": "Использовать Temperature сэмплер в последнюю очередь. Это почти всегда разумно.\nПри включении: сначала выборка набора правдоподобных токенов, затем применение Temperature для корректировки их относительных вероятностей (технически, логитов).\nПри отключении: сначала применение Temperature для корректировки относительных вероятностей ВСЕХ токенов, затем выборка правдоподобных токенов из этого.\nОтключение Temperature Last увеличивает вероятности в хвосте распределения, что увеличивает шансы получить несогласованный ответ.", | ||
| 200 | "Speculative Ngram": "Спекулятивная Нграмма", | ||
| 201 | "Use a different speculative decoding method without a draft model": "Используйте другой метод спекулятивного декодирования без черновой модели.\rПредпочтительно использовать черновую модель. Спекулятивная нграмма не так эффективна.", | ||
| 202 | "Spaces Between Special Tokens": "Пробелы между специальными токенами", | ||
| 203 | "LLaMA / Mistral / Yi models only": "Только для моделей LLaMA / Mistral / Yi. Перед этим обязательно выберите подходящий токенизатор.\nПоследовательности, которых не должно быть на выходе.\nОдна на строку. Текст или [идентификаторы токенов].\nМногие токены имеют пробел впереди. Используйте счетчик токенов, если не уверены.", | 30 | "LLaMA / Mistral / Yi models only": "Только для моделей LLaMA / Mistral / Yi. Перед этим обязательно выберите подходящий токенизатор.\nПоследовательности, которых не должно быть на выходе.\nОдна на строку. Текст или [идентификаторы токенов].\nМногие токены имеют пробел впереди. Используйте счетчик токенов, если не уверены.", |
| 204 | "Example: some text [42, 69, 1337]": "Пример:\nкакой-то текст\n[42, 69, 1337]", | 31 | "Example: some text [42, 69, 1337]": "Пример:\nкакой-то текст\n[42, 69, 1337]", |
| 205 | "Classifier Free Guidance. More helpful tip coming soon": "Classifier Free Guidance. Чуть позже опишем более подробно", | 32 | "Classifier Free Guidance. More helpful tip coming soon": "Classifier Free Guidance. Чуть позже опишем более подробно", |
| 206 | "Scale": "Scale", | 33 | "Scale": "Scale", |
| 207 | "JSON Schema": "JSON-схема", | 34 | "GBNF Grammar": "Грамматика GBNF", |
| 208 | "Type in the desired JSON schema": "Введите нужную схему JSON.", | 35 | "Usage Stats": "Статистика исп.", |
| 209 | "Grammar String": "Грамматика", | 36 | "Click for stats!": "Нажмите для получения статистики!", |
| 210 | "GNBF or ENBF, depends on the backend in use. If you're using this you should know which.": "GNBF или ENBF, зависит от бэкенда. Если вы это используете, то, скорее всего, сами знаете, какой именно.", | 37 | "Backup": "Бэкап", |
| 211 | "Top P & Min P": "Топ P и Мин P", | 38 | "Backup your personas to a file": "Создать бэкап (резервную копию) персоны в виде файла", |
| 212 | "Load default order": "Загрузить стандартный порядок", | 39 | "Restore": "Восстановить", |
| 213 | "llama.cpp only. Determines the order of samplers. If Mirostat mode is not 0, sampler order is ignored.": "только llama.cpp. Определяет порядок сэмплеров. Если режим Миростата не равен 0, порядок пробоотборника игнорируется.", | 40 | "Restore your personas from a file": "Восстановление персон из файла", |
| 214 | "Sampler Priority": "Приоритет сэмплеров", | 41 | "Type in the desired custom grammar": "Введите нужную пользовательскую грамматику", |
| 215 | "Ooba only. Determines the order of samplers.": "Только Ooba. Определяет порядок сэмплеров.", | 42 | "Encoder Rep. Pen.": "Штраф за повтор для кодировщика", |
| 216 | "Character Names Behavior": "Вставка имени персонажа", | 43 | "Smoothing Factor": "Коэффициент сглаживания", |
| 217 | "Helps the model to associate messages with characters.": "Помогает модели связать сообщения с персонажами.", | 44 | "No Repeat Ngram Size": "Размер no_repeat_ngram", |
| 218 | "None": "Отсутствует", | 45 | "Min Length": "Мин. длина", |
| 219 | "character_names_none": "За исключением групп и прошлых персон. В противном случае обязательно укажите имена в подсказке.", | 46 | "Alternative server URL (leave empty to use the default value).": "Альтернативный URL сервера (оставьте пустым для стандартного значения)", |
| 220 | "Don't add character names.": "Не добавлять имя персонажа", | 47 | "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Удалите свой личный OAI API Key из панели API, и ТОЛЬКО ПОСЛЕ ЭТОГО вводите что-то сюда", |
| 221 | "Completion": "Объект завершения", | 48 | "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "Мы не сможем предоставить помощь с проблемами, с которыми вы столкнетесь при использовании неофициальных прокси для OpenAI", |
| 222 | "character_names_completion": "Только латинские буквы, цифры и знак подчёркивания. Работает не для всех бэкендов, в частности для Claude, MistralAI, Google.", | 49 | "Context Size (tokens)": "Размер контекста (в токенах)", |
| 223 | "Add character names to completion objects.": "Добавлять имя персонажа как часть Completion object", | 50 | "Max Response Length (tokens)": "Макс. длина ответа (в токенах)", |
| 224 | "Message Content": "Внутри сообщения", | 51 | "Temperature": "Температура", |
| 225 | "Prepend character names to message contents.": "Предварять сообщения именем персонажа.", | 52 | "Frequency Penalty": "Штраф за частоту", |
| 226 | "Continue Postfix": "Постфикс для продолжения", | 53 | "Presence Penalty": "Штраф за присутствие", |
| 227 | "The next chunk of the continued message will be appended using this as a separator.": "Используется в качестве разделителя между уже имеющимся сообщением и его новым отрывком, при генерации продолжения", | 54 | "Top A": "Top А", |
| 228 | "Space": "Пробел", | 55 | "Tail Free Sampling": "Tail Free Sampling", |
| 229 | "Newline": "Новая строка", | 56 | "Rep. Pen. Slope": "Rep. Pen. Slope", |
| 230 | "Double Newline": "Две новые строки", | 57 | "Top K": "Top K", |
| 231 | "Wrap user messages in quotes before sending": "Перед отправкой заключать ответ пользователя в кавычки", | 58 | "Top P": "Top P", |
| 59 | "Do Sample": "Сделать образец", | ||
| 60 | "Add BOS Token": "Добавлять BOS-токен", | ||
| 61 | "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "Добавлять BOS-токен в начале промпта. Если выключить, ответы могут стать более креативными.", | ||
| 62 | "Ban EOS Token": "Запретить EOS-токен", | ||
| 63 | "Ban the eos_token. This forces the model to never end the generation prematurely": "Запрет EOS-токена не позволит модели завершить генерацию преждевременно", | ||
| 64 | "Skip Special Tokens": "Пропускать спец. токены", | ||
| 65 | "Beam search": "Поиск Beam", | ||
| 66 | "Number of Beams": "Количество Beam", | ||
| 67 | "Length Penalty": "Штраф за длину", | ||
| 68 | "Early Stopping": "Преждевременная остановка", | ||
| 69 | "Contrastive search": "Контрастный поиск", | ||
| 70 | "Penalty Alpha": "Penalty Alpha", | ||
| 71 | "Seed": "Зерно", | ||
| 72 | "Epsilon Cutoff": "Epsilon Cutoff", | ||
| 73 | "Eta Cutoff": "Eta Cutoff", | ||
| 74 | "Negative Prompt": "Отрицательный промпт", | ||
| 75 | "Mirostat (mode=1 is only for llama.cpp)": "Mirostat (режим=1 предназначен только для llama.cpp)", | ||
| 76 | "Add text here that would make the AI generate things you don't want in your outputs.": "Добавьте сюда текст, который заставит ИИ генерировать то, что вы не хотите видеть в его текстах", | ||
| 77 | "Phrase Repetition Penalty": "Штраф за повтор фразы", | ||
| 78 | "Preamble": "Преамбула", | ||
| 79 | "Use style tags to modify the writing style of the output.": "Используйте теги стиля, чтобы изменить стиль написания выходного текста.", | ||
| 80 | "Banned Tokens": "Запрещённые токены", | ||
| 81 | "Sequences you don't want to appear in the output. One per line.": "Строки, которых не должно быть в выходном тексте. По одной на строчку.", | ||
| 82 | "AI Module": "Модуль ИИ", | ||
| 83 | "Changes the style of the generated text.": "Изменяет стиль создаваемого текста.", | ||
| 84 | "Used if CFG Scale is unset globally, per chat or character": "Используется, если CFG Scale не установлен глобально, для каждого чата или персонажа.", | ||
| 85 | "Streaming": "Стриминг текста", | ||
| 86 | "Dynamic Temperature": "Динамическая температура", | ||
| 87 | "Restore current preset": "Восстановить текущий пресет", | ||
| 88 | "Neutralize Samplers": "Нейтрализовать сэмплеры", | ||
| 89 | "Text Completion presets": "Пресеты для Text Completion", | ||
| 90 | "Documentation on sampling parameters": "Документация по параметрам сэмплеров", | ||
| 91 | "Set all samplers to their neutral/disabled state.": "Установить все сэмплеры в нейтральное/отключенное состояние.", | ||
| 92 | "Only enable this if your model supports context sizes greater than 4096 tokens": "Включайте эту опцию, только если ваша модель поддерживает размер контекста более 4096 токенов.\nУвеличивайте только если вы знаете, что делаете.", | ||
| 232 | "Wrap in Quotes": "Заключать в кавычки", | 93 | "Wrap in Quotes": "Заключать в кавычки", |
| 233 | "Wrap entire user message in quotes before sending.": "Перед отправкой заключать всё сообщение пользователя в кавычки.", | 94 | "Wrap entire user message in quotes before sending.": "Перед отправкой заключать всё сообщение пользователя в кавычки.", |
| 234 | "Leave off if you use quotes manually for speech.": "Оставьте выключенным, если вручную выставляете кавычки для прямой речи.", | 95 | "Leave off if you use quotes manually for speech.": "Оставьте выключенным, если вручную выставляете кавычки для прямой речи.", |
| 235 | "Continue prefill": "Префилл для продолжения", | 96 | "Impersonation prompt": "Промпт для перевоплощения", |
| 236 | "Continue sends the last message as assistant role instead of system message with instruction.": "Продолжение отправляет последнее сообщение в роли ассистента, вместо системного сообщения с инструкцией.", | 97 | "Prompt that is used for Impersonation function": "Промпт, применяемый при генерации действий от лица пользователя", |
| 237 | "Squash system messages": "Склеивать сообщения системы", | 98 | "Logit Bias": "Смещение логитов", |
| 238 | "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "Объединяет последовательные системные сообщения в одно (за исключением примеров диалогов). У некоторых моделей может улучшить логичность ответов.", | 99 | "Helps to ban or reenforce the usage of certain words": "Запрещает или поощряет использование определенных слов", |
| 239 | "Enable function calling": "Включить вызов функций", | ||
| 240 | "Send inline images": "Отправлять inline-картинки", | ||
| 241 | "image_inlining_hint_1": "Отправлять картинки как часть промпта, если позволяет модель (такой функционал поддерживают GPT-4V, Claude 3 или Llava 13B). Чтобы добавить в чат изображение, используйте на нужном сообщении действие", | ||
| 242 | "image_inlining_hint_2": ". Также это можно сделать через меню", | ||
| 243 | "image_inlining_hint_3": ".", | ||
| 244 | "Inline Image Quality": "Качество inline-изображений", | ||
| 245 | "openai_inline_image_quality_auto": "Автоопределение", | ||
| 246 | "openai_inline_image_quality_low": "Низкое", | ||
| 247 | "openai_inline_image_quality_high": "Высокое", | ||
| 248 | "Use AI21 Tokenizer": "Используйте токенизатор AI21", | ||
| 249 | "Use the appropriate tokenizer for Jurassic models, which is more efficient than GPT's.": "Использовать токенайзер для моделей Jurassic, эффективнее GPT-токенайзера", | ||
| 250 | "Use Google Tokenizer": "Использовать токенизатор Google", | ||
| 251 | "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "Используйте соответствующий токенизатор для моделей Google через их API. Медленная обработка подсказок, но предлагает намного более точный подсчет токенов.", | ||
| 252 | "Use system prompt": "Использовать системную подсказку", | ||
| 253 | "(Gemini 1.5 Pro/Flash only)": "(Только Gemini 1.5 Pro/Flash)", | ||
| 254 | "Merges_all_system_messages_desc_1": "Объединяет все системные сообщения вплоть до первого сообщения с несистемной ролью и отправляет их в", | ||
| 255 | "Merges_all_system_messages_desc_2": "поле.", | ||
| 256 | "Assistant Prefill": "Префилл для ассистента", | ||
| 257 | "Start Claude's answer with...": "Начать ответ Клода с...", | ||
| 258 | "Assistant Impersonation Prefill": "Префилл для ассистента при перевоплощении", | ||
| 259 | "Use system prompt (Claude 2.1+ only)": "Использовать системный промпт (только Claude 2.1+)", | ||
| 260 | "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "Отправлять системный промпт для поддерживаемых моделей. Если отключено, в начало промпта добавляется сообщение пользователя.", | ||
| 261 | "User first message": "Первое сообщение пользователя", | ||
| 262 | "Restore User first message": "Восстановить первое сообщение пользователя", | ||
| 263 | "Human message": "Человеческое послание, инструкция и т. д.\nНичего не добавляет, если пусто, т. е. требует нового приглашения с ролью «пользователь».", | ||
| 264 | "New preset": "Новый пресет", | ||
| 265 | "Delete preset": "Удалить пресет", | ||
| 266 | "View / Edit bias preset": "Просмотр / Редактирование пресета смещения", | 100 | "View / Edit bias preset": "Просмотр / Редактирование пресета смещения", |
| 267 | "Add bias entry": "Добавить правило смещения", | 101 | "Add bias entry": "Добавить правило смещения", |
| 268 | "Most tokens have a leading space.": "У большинства токенов в начале пробел.", | 102 | "Connect": "Подключиться", |
| 269 | "API Connections": "Соединения с API", | 103 | "Test Message": "Тестовое сообщение", |
| 270 | "Text Completion": "Завершение текста", | ||
| 271 | "Chat Completion": "Завершение чата", | ||
| 272 | "NovelAI": "NovelAI", | ||
| 273 | "KoboldAI Horde": "KoboldAI Horde", | ||
| 274 | "KoboldAI": "KoboldAI", | 104 | "KoboldAI": "KoboldAI", |
| 275 | "Avoid sending sensitive information to the Horde.": "Избегайте отправки личной информации Horde", | 105 | "API url": "URL-адрес API", |
| 276 | "Review the Privacy statement": "Ознакомиться с заявлением о конфиденциальности", | 106 | "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine (Режим обёртки API OpenAI)", |
| 277 | "Register a Horde account for faster queue times": "Заведите учетную запись Horde для ускорения генерации", | 107 | "Register a Horde account for faster queue times": "Заведите учетную запись Horde для ускорения генерации", |
| 278 | "Learn how to contribute your idle GPU cycles to the Horde": "Узнайте, как внести свой вклад в свои свободные GPU-циклы в орду", | ||
| 279 | "Adjust context size to worker capabilities": "Уточнить размер контекста в соответствии с возможностями рабочих машин", | 108 | "Adjust context size to worker capabilities": "Уточнить размер контекста в соответствии с возможностями рабочих машин", |
| 280 | "Adjust response length to worker capabilities": "Уточнить длинну ответа в соответствии с возможностями рабочих машин", | 109 | "Adjust response length to worker capabilities": "Уточнить длинну ответа в соответствии с возможностями рабочих машин", |
| 281 | "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "Может помочь с плохими ответами ставя в очередь только подтвержденных работников. Может замедлить время ответа.", | ||
| 282 | "Trusted workers only": "Только доверенные рабочие машины", | ||
| 283 | "API key": "API-ключ", | 110 | "API key": "API-ключ", |
| 111 | "Tabby API key": "Tabby API-ключ", | ||
| 284 | "Get it here:": "Получить здесь:", | 112 | "Get it here:": "Получить здесь:", |
| 285 | "Register": "Зарегистрироваться", | 113 | "Register": "Зарегистрироваться", |
| 114 | "TogetherAI Model": "Модель TogetherAI", | ||
| 115 | "Example: 127.0.0.1:5001": "Пример: http://127.0.0.1:5001", | ||
| 116 | "ggerganov/llama.cpp": "ggerganov/llama.cpp (сервер вывода)", | ||
| 117 | "Example: 127.0.0.1:8080": "Пример: http://127.0.0.1:8080", | ||
| 118 | "Example: 127.0.0.1:11434": "Пример: http://127.0.0.1:11434", | ||
| 119 | "Ollama Model": "Модель Ollama", | ||
| 120 | "Download": "Скачать", | ||
| 121 | "TogetherAI API Key": "TogetherAI API-ключ", | ||
| 122 | "-- Connect to the API --": "-- Подключитесь к API --", | ||
| 286 | "View my Kudos": "Посмотреть мой рейтинг(Kudos)", | 123 | "View my Kudos": "Посмотреть мой рейтинг(Kudos)", |
| 287 | "Enter": "Введите", | 124 | "Enter": "Введите", |
| 288 | "to use anonymous mode.": "чтобы использовать анонимный режим.", | 125 | "to use anonymous mode.": "чтобы использовать анонимный режим.", |
| 289 | "Clear your API key": "Стереть ключ от API", | ||
| 290 | "For privacy reasons, your API key will be hidden after you reload the page.": "По причинам безопасности ваш API-ключ будет скрыт после перезагрузки страницы.", | ||
| 291 | "Models": "Модели", | 126 | "Models": "Модели", |
| 292 | "Refresh models": "Обновить модели", | ||
| 293 | "-- Horde models not loaded --": "--Модель Horde не загружена--", | ||
| 294 | "Not connected...": "Нет подключения...", | 127 | "Not connected...": "Нет подключения...", |
| 295 | "API url": "URL-адрес API", | ||
| 296 | "Example: http://127.0.0.1:5000/api ": "Пример: http://127.0.0.1:5000/api", | ||
| 297 | "Connect": "Подключиться", | ||
| 298 | "Cancel": "Отменить", | ||
| 299 | "Novel API key": "API-ключ для NovelAI", | 128 | "Novel API key": "API-ключ для NovelAI", |
| 300 | "Get your NovelAI API Key": "Получите свой API-ключ для NovelAI", | 129 | "Follow": "Следуйте", |
| 130 | "these directions": "данным инструкциям", | ||
| 301 | "Enter it in the box below": "Введите его в окошко ниже", | 131 | "Enter it in the box below": "Введите его в окошко ниже", |
| 302 | "Novel AI Model": "Модель NovelAI", | 132 | "Novel AI Model": "Модель NovelAI", |
| 303 | "No connection...": "Нет соединения...", | ||
| 304 | "API Type": "Тип API", | ||
| 305 | "Default (completions compatible)": "По умолчанию [совместимо с OpenAI/дополнениями: oobabooga, LM Studio и т. д.]", | ||
| 306 | "TogetherAI API Key": "TogetherAI API-ключ", | ||
| 307 | "TogetherAI Model": "Модель TogetherAI", | ||
| 308 | "-- Connect to the API --": "-- Подключитесь к API --", | ||
| 309 | "OpenRouter API Key": "Ключ от OpenRouter API", | ||
| 310 | "Click Authorize below or get the key from": "Нажмите «Авторизоваться» ниже или получите ключ от", | ||
| 311 | "View Remaining Credits": "Посмотреть оставшиеся кредиты", | ||
| 312 | "OpenRouter Model": "Модель OpenRouter", | ||
| 313 | "Model Providers": "Поставщики моделей", | ||
| 314 | "InfermaticAI API Key": "Ключ API InfermaticAI", | ||
| 315 | "InfermaticAI Model": "Модель InfermaticAI", | ||
| 316 | "DreamGen API key": "API-ключ DreamGen", | ||
| 317 | "DreamGen Model": "Модель DreamGen", | ||
| 318 | "Mancer API key": "Ключ от Mancer API", | ||
| 319 | "Mancer Model": "Модель Mancer", | ||
| 320 | "Make sure you run it with": "Обязательно запускайте его с флагом", | 133 | "Make sure you run it with": "Обязательно запускайте его с флагом", |
| 321 | "flag": "", | 134 | "flag": "", |
| 322 | "API key (optional)": "Ключ API (опционально)", | 135 | "API key (optional)": "Ключ API (опционально)", |
| 323 | "Server url": "URL-адрес сервера", | 136 | "Server url": "URL-адрес сервера", |
| 324 | "Example: 127.0.0.1:5000": "Пример: http://127.0.0.1:5000", | ||
| 325 | "Custom model (optional)": "Пользовательская модель (опционально)", | 137 | "Custom model (optional)": "Пользовательская модель (опционально)", |
| 326 | "vllm-project/vllm": "vllm-project/vllm (режим оболочки API OpenAI)", | 138 | "Bypass API status check": "Обход проверки статуса API", |
| 327 | "vLLM API key": "Ключ API vLLM", | 139 | "Example: 127.0.0.1:5000": "Пример: http://127.0.0.1:5000", |
| 328 | "Example: 127.0.0.1:8000": "Пример: http://127.0.0.1:8000", | ||
| 329 | "vLLM Model": "Модель vLLM", | ||
| 330 | "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine (Режим обёртки API OpenAI)", | ||
| 331 | "Aphrodite API key": "Ключ от API Aphrodite", | ||
| 332 | "Aphrodite Model": "Модель Афродиты", | ||
| 333 | "ggerganov/llama.cpp": "ggerganov/llama.cpp (сервер вывода)", | ||
| 334 | "Example: 127.0.0.1:8080": "Пример: http://127.0.0.1:8080", | ||
| 335 | "Example: 127.0.0.1:11434": "Пример: http://127.0.0.1:11434", | ||
| 336 | "Ollama Model": "Модель Ollama", | ||
| 337 | "Download": "Скачать", | ||
| 338 | "Tabby API key": "Tabby API-ключ", | ||
| 339 | "koboldcpp API key (optional)": "Ключ от API koboldcpp (необязательно)", | ||
| 340 | "Example: 127.0.0.1:5001": "Пример: http://127.0.0.1:5001", | ||
| 341 | "Authorize": "Авторизоваться", | ||
| 342 | "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "Получите свой OpenRouter API токен используя OAuth. У вас будет открыта вкладка openrouter.ai", | ||
| 343 | "Legacy API (pre-OAI, no streaming)": "Устаревший API (до OAI, без стриминга)", | 140 | "Legacy API (pre-OAI, no streaming)": "Устаревший API (до OAI, без стриминга)", |
| 344 | "Bypass status check": "Обход проверки статуса", | 141 | "Bypass status check": "Обход проверки статуса", |
| 345 | "Chat Completion Source": "Источник для Chat Completion", | 142 | "Mancer API key": "Ключ от Mancer API", |
| 346 | "Reverse Proxy": "Прокси", | ||
| 347 | "Proxy Presets": "Пресеты для прокси", | ||
| 348 | "Saved addresses and passwords.": "Сохранённые адреса и пароли.", | ||
| 349 | "Save Proxy": "Сохранить прокси", | ||
| 350 | "Delete Proxy": "Удалить прокси", | ||
| 351 | "Proxy Name": "Название прокси", | ||
| 352 | "This will show up as your saved preset.": "Будет отображено в вашем списке пресетов.", | ||
| 353 | "Proxy Server URL": "Адрес прокси-сервера", | ||
| 354 | "Alternative server URL (leave empty to use the default value).": "Альтернативный URL сервера (оставьте пустым для стандартного значения)", | ||
| 355 | "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Удалите свой личный OAI API Key из панели API, и ТОЛЬКО ПОСЛЕ ЭТОГО вводите что-то сюда", | ||
| 356 | "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "Мы не сможем предоставить помощь с проблемами, с которыми вы столкнетесь при использовании неофициальных прокси для OpenAI", | ||
| 357 | "Doesn't work? Try adding": "Не работает? Попробуйте добавить в конце", | ||
| 358 | "at the end!": "!", | ||
| 359 | "Proxy Password": "Пароль от прокси", | ||
| 360 | "Will be used as a password for the proxy instead of API key.": "Будет использован в качестве пароля от прокси вместо ключа от API", | ||
| 361 | "Peek a password": "Взгляните на пароль", | ||
| 362 | "OpenAI API key": "Ключ для API OpenAI", | ||
| 363 | "View API Usage Metrics": "Посмотреть статистику использования API", | ||
| 364 | "Follow": "Следуйте", | ||
| 365 | "these directions": "данным инструкциям", | ||
| 366 | "to get your OpenAI API key.": "для получения ключа от API OpenAI", | 143 | "to get your OpenAI API key.": "для получения ключа от API OpenAI", |
| 367 | "Use Proxy password field instead. This input will be ignored.": "Используйте поле \"Пароль от прокси\". Значение в этом окошке игнорируется", | 144 | "Window AI Model": "Модель Window AI", |
| 368 | "OpenAI Model": "Модель OpenAI", | 145 | "OpenAI Model": "Модель OpenAI", |
| 369 | "Bypass API status check": "Обход проверки статуса API", | ||
| 370 | "Show External models (provided by API)": "Показать \"сторонние\" модели (предоставленные API)", | ||
| 371 | "Get your key from": "Получите ключ в", | 146 | "Get your key from": "Получите ключ в", |
| 372 | "Anthropic's developer console": "консоли разработчика Anthropic", | 147 | "Anthropic's developer console": "консоли разработчика Anthropic", |
| 373 | "Slack and Poe cookies will not work here, do not bother trying.": "Cookie от Slack и Poe здесь не подойдут, можете их не пробовать.", | 148 | "Slack and Poe cookies will not work here, do not bother trying.": "Cookie от Slack и Poe здесь не подойдут, можете их не пробовать.", |
| 374 | "Claude Model": "Модель Claude", | 149 | "Claude Model": "Модель Claude", |
| 375 | "Window AI Model": "Модель Window AI", | ||
| 376 | "Model Order": "Сортировка моделей OpenRouter", | ||
| 377 | "Alphabetically": "По алфавиту", | ||
| 378 | "Price": "По цене (наиболее низкая)", | ||
| 379 | "Context Size": "По размеру контекста", | ||
| 380 | "Group by vendors": "Сгруппировать по владельцу", | ||
| 381 | "Group by vendors Description": "Модели от OpenAI попадут в одну группу, от Anthropic - в другую, и т.д. Можно комбинировать с сортировкой.", | ||
| 382 | "Allow fallback routes": "Разрешить резервные маршруты", | ||
| 383 | "Allow fallback routes Description": "Автоматически выбирает альтернативную модель, если выбранная модель не может удовлетворить ваш запрос.", | ||
| 384 | "openrouter_force_instruct": "Эта опция устарела и в будущем будет удалена. Чтобы использовать форматирование инструкций, вместо этого переключитесь на OpenRouter в разделе API завершения текста.", | ||
| 385 | "LEGACY": "УСТАР.", | ||
| 386 | "Force Instruct Mode formatting": "Включить форматирование для Instruct-режима", | ||
| 387 | "Force_Instruct_Mode_formatting_Description": "Если эта опция включена при активном режиме Instruct, то SillyTavern преобразует промпт в соответствие с настройками расширенного форматирования (кроме системного промпта для instruct). Если опция выключена, промпт форматируется самим OpenRouter.", | ||
| 388 | "Scale API Key": "Ключ от Scale API", | 150 | "Scale API Key": "Ключ от Scale API", |
| 389 | "Clear your cookie": "Очистите файл cookie", | ||
| 390 | "Alt Method": "Альтернативный метод", | 151 | "Alt Method": "Альтернативный метод", |
| 391 | "AI21 API Key": "Ключ от API AI21", | 152 | "AI21 API Key": "Ключ от API AI21", |
| 392 | "AI21 Model": "Модель AI21", | 153 | "AI21 Model": "Модель AI21", |
| 393 | "MakerSuite API Key": "Ключ от API MakerSuite", | 154 | "View API Usage Metrics": "Посмотреть статистику использования API", |
| 394 | "Google Model": "Модель Google", | 155 | "Show External models (provided by API)": "Показать \"сторонние\" модели (предоставленные API)", |
| 395 | "MistralAI API Key": "Ключ от API MistralAI", | 156 | "Allow fallback routes": "Разрешить резервные маршруты", |
| 396 | "MistralAI Model": "Модель MistralAI", | 157 | "Allow fallback routes Description": "Автоматически выбирает альтернативную модель, если выбранная модель не может удовлетворить ваш запрос.", |
| 397 | "Groq API Key": "API-ключ Groq", | 158 | "OpenRouter API Key": "Ключ от OpenRouter API", |
| 398 | "Groq Model": "Модель Грока", | 159 | "OpenRouter Model": "Модель OpenRouter", |
| 399 | "Perplexity API Key": "API-ключ недоумения", | 160 | "View Remaining Credits": "Посмотреть оставшиеся кредиты", |
| 400 | "Perplexity Model": "Модель недоумения", | 161 | "Click Authorize below or get the key from": "Нажмите «Авторизоваться» ниже или получите ключ от", |
| 401 | "Cohere API Key": "Ключ от API Cohere", | ||
| 402 | "Cohere Model": "Модель Cohere", | ||
| 403 | "Custom Endpoint (Base URL)": "Пользовательская конечная точка (базовый URL-адрес)", | ||
| 404 | "Custom API Key": "Пользовательский ключ API", | ||
| 405 | "Available Models": "Доступные модели", | ||
| 406 | "Prompt Post-Processing": "Быстрая постобработка", | ||
| 407 | "Applies additional processing to the prompt before sending it to the API.": "Применяет дополнительную обработку к приглашению перед отправкой его в API.", | ||
| 408 | "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "Проверка работоспособности вашего соединения с API. Знайте, что оно будет отправлено от вашего лица.", | ||
| 409 | "Test Message": "Тестовое сообщение", | ||
| 410 | "Auto-connect to Last Server": "Автоматическое подключение к последнему серверу", | 162 | "Auto-connect to Last Server": "Автоматическое подключение к последнему серверу", |
| 411 | "Missing key": "❌ Ключа нет", | ||
| 412 | "Key saved": "✔️ Ключ сохранён", | ||
| 413 | "View hidden API keys": "Посмотреть скрытые API-ключи", | 163 | "View hidden API keys": "Посмотреть скрытые API-ключи", |
| 414 | "AI Response Formatting": "Формат ответа ИИ", | ||
| 415 | "Advanced Formatting": "Расширенное форматирование", | 164 | "Advanced Formatting": "Расширенное форматирование", |
| 416 | "Context Template": "Шаблон контекста", | 165 | "Context Template": "Шаблон контекста", |
| 417 | "Auto-select this preset for Instruct Mode": "Автоматический выбор этого пресета для режима Instruct.", | 166 | "Replace Macro in Custom Stopping Strings": "Заменить макросы в пользовательских стоп-строках", |
| 418 | "Story String": "Строка истории", | 167 | "Story String": "Строка истории", |
| 419 | "Example Separator": "Пример разделителя", | 168 | "Example Separator": "Пример разделителя", |
| 420 | "Chat Start": "Начало чата", | 169 | "Chat Start": "Начало чата", |
| 421 | "Add Chat Start and Example Separator to a list of stopping strings.": "Добавьте начало чата и разделитель примеров в список останавливаемых строк.", | ||
| 422 | "Use as Stop Strings": "Использовать в качестве стоп-строк", | ||
| 423 | "context_allow_jailbreak": "Включает Jailbreak в конце подсказки, если это определено в карточке персонажа И «Prefer Char». Джейлбрейк включен.\nЭТО НЕ РЕКОМЕНДУЕТСЯ ДЛЯ МОДЕЛЕЙ ЗАПОЛНЕНИЯ ТЕКСТА, МОЖЕТ ПРИВЕСТИ К ПЛОХОМУ ВЫВОДУ.", | ||
| 424 | "Allow Jailbreak": "Разрешить джейлбрейк", | ||
| 425 | "Context Order": "Порядок контекста", | ||
| 426 | "Summary": "Краткое содержание", | ||
| 427 | "Author's Note": "Заметки автора", | ||
| 428 | "Example Dialogues": "Примеры диалогов", | ||
| 429 | "Hint": "Намекать:", | ||
| 430 | "In-Chat Position not affected": "Заказы на сводку и примечания автора затрагиваются только в том случае, если для них не установлена позиция в чате.", | ||
| 431 | "Instruct Mode": "Режим Instruct", | ||
| 432 | "Enabled": "Включено", | ||
| 433 | "instruct_bind_to_context": "Если этот параметр включен, шаблоны контекста будут автоматически выбираться на основе выбранного имени шаблона инструкций или по предпочтениям.", | ||
| 434 | "Bind to Context": "Привязка к контексту", | ||
| 435 | "Presets": "Пресеты", | ||
| 436 | "Auto-select this preset on API connection": "Автоматический выбор этого пресета при подключении к API.", | ||
| 437 | "Activation Regex": "Regex для активации", | 170 | "Activation Regex": "Regex для активации", |
| 171 | "Instruct Mode": "Режим Instruct", | ||
| 438 | "Wrap Sequences with Newline": "Отделять строки символом новой строки", | 172 | "Wrap Sequences with Newline": "Отделять строки символом новой строки", |
| 439 | "Replace Macro in Sequences": "Заменить макросы в строках", | ||
| 440 | "Skip Example Dialogues Formatting": "Пропустить форматирование примеров диалогов", | ||
| 441 | "Include Names": "Добавлять имена", | 173 | "Include Names": "Добавлять имена", |
| 442 | "Force for Groups and Personas": "Также для групп и персон", | 174 | "Force for Groups and Personas": "Также для групп и персон", |
| 443 | "System Prompt": "Системный промпт", | 175 | "System Prompt": "Системный промпт", |
| 444 | "Instruct Mode Sequences": "Строки для Instruct-режима", | 176 | "Instruct Mode Sequences": "Строки для Instruct-режима", |
| 445 | "System Prompt Wrapping": "Обрамление для системного промпта", | ||
| 446 | "Inserted before a System prompt.": "Вставляется перед системным приглашением.", | ||
| 447 | "System Prompt Prefix": "Префикс системного промпта", | ||
| 448 | "Inserted after a System prompt.": "Вставляется после системного приглашения.", | ||
| 449 | "System Prompt Suffix": "Постфикс системного промпта", | ||
| 450 | "Chat Messages Wrapping": "Обрамление для сообщений в чате", | ||
| 451 | "Inserted before a User message and as a last prompt line when impersonating.": "Вставляется перед сообщением пользователя и в качестве последней строки подсказки при олицетворении.", | ||
| 452 | "User Message Prefix": "Префикс сообщения пользователя", | ||
| 453 | "Inserted after a User message.": "Вставляется после сообщения пользователя.", | ||
| 454 | "User Message Suffix": "Постфикс сообщения пользователя", | ||
| 455 | "Inserted before an Assistant message and as a last prompt line when generating an AI reply.": "Вставляется перед сообщением Ассистента и в качестве последней строки подсказки при генерации ответа AI.", | ||
| 456 | "Assistant Message Prefix": "Префикс сообщения ассистента", | ||
| 457 | "Inserted after an Assistant message.": "Вставляется после сообщения помощника.", | ||
| 458 | "Assistant Message Suffix": "Постфикс сообщения ассистента", | ||
| 459 | "Inserted before a System (added by slash commands or extensions) message.": "Вставляется перед системным сообщением (добавленным с помощью косой черты или расширений).", | ||
| 460 | "System Message Prefix": "Префикс сообщения системы", | ||
| 461 | "Inserted after a System message.": "Вставляется после системного сообщения.", | ||
| 462 | "System Message Suffix": "Постфикс сообщения системы", | ||
| 463 | "If enabled, System Sequences will be the same as User Sequences.": "Если этот параметр включен, системные последовательности будут такими же, как пользовательские последовательности.", | ||
| 464 | "System same as User": "Для системы то же самое, что и для пользователя", | ||
| 465 | "Misc. Sequences": "Прочие строки", | ||
| 466 | "Inserted before the first Assistant's message.": "Вставляется перед первым сообщением Ассистента.", | ||
| 467 | "First Assistant Prefix": "Первый префикс ассистента", | ||
| 468 | "instruct_last_output_sequence": "Вставляется перед последним сообщением помощника или в качестве последней строки подсказки при генерации ответа AI (кроме нейтральной/системной роли).", | ||
| 469 | "Last Assistant Prefix": "Последний префикс ассистента", | ||
| 470 | "Will be inserted as a last prompt line when using system/neutral generation.": "Будет вставлена как последняя строка подсказки при использовании системной/нейтральной генерации.", | ||
| 471 | "System Instruction Prefix": "Префикс системной инструкции", | ||
| 472 | "If a stop sequence is generated, everything past it will be removed from the output (inclusive).": "Если генерируется последовательность остановки, все, что находится за ней, будет удалено из вывода (включительно).", | ||
| 473 | "Stop Sequence": "Стоп-строка", | 177 | "Stop Sequence": "Стоп-строка", |
| 474 | "Will be inserted at the start of the chat history if it doesn't start with a User message.": "Будет вставлен в начало истории чата, если она не начинается с сообщения пользователя.", | ||
| 475 | "User Filler Message": "Принудительное сообщение пользователя", | ||
| 476 | "Context Formatting": "Форматирование контекста", | 178 | "Context Formatting": "Форматирование контекста", |
| 477 | "(Saved to Context Template)": "(Сохраняется в шаблоне контекста)", | 179 | "(Saved to Context Template)": "(Сохраняется в шаблоне контекста)", |
| 180 | "Tokenizer": "Токенайзер", | ||
| 181 | "Token Padding": "Кол-во добавочных токенов", | ||
| 182 | "Save preset as": "Сохранить пресет как", | ||
| 478 | "Always add character's name to prompt": "Всегда добавлять имя персонажа в промпт", | 183 | "Always add character's name to prompt": "Всегда добавлять имя персонажа в промпт", |
| 184 | "Use as Stop Strings": "Использовать в качестве стоп-строк", | ||
| 185 | "Bind to Context": "Привязка к контексту", | ||
| 479 | "Generate only one line per request": "Генерировать одну строку на запрос", | 186 | "Generate only one line per request": "Генерировать одну строку на запрос", |
| 480 | "Trim Incomplete Sentences": "Удалять неоконченные предложения", | ||
| 481 | "Include Newline": "Добавлять новую строку", | ||
| 482 | "Misc. Settings": "Доп. настройки", | 187 | "Misc. Settings": "Доп. настройки", |
| 483 | "Collapse Consecutive Newlines": "Сворачивать последовательные новые строки", | ||
| 484 | "Trim spaces": "Обрезать пробелы", | ||
| 485 | "Tokenizer": "Токенайзер", | ||
| 486 | "Token Padding": "Кол-во добавочных токенов", | ||
| 487 | "Start Reply With": "Начинать ответ с", | ||
| 488 | "AI reply prefix": "Префикс для ответа ИИ", | ||
| 489 | "Show reply prefix in chat": "Показывать префикс ответов в чате", | ||
| 490 | "Non-markdown strings": "Строки без разметки", | ||
| 491 | "separate with commas w/o space between": "разделять запятыми без пробела", | ||
| 492 | "Custom Stopping Strings": "Стоп-строки", | ||
| 493 | "JSON serialized array of strings": "Список строк в формате JSON", | ||
| 494 | "Replace Macro in Custom Stopping Strings": "Заменить макросы в пользовательских стоп-строках", | ||
| 495 | "Auto-Continue": "Авто-продолжение", | 188 | "Auto-Continue": "Авто-продолжение", |
| 189 | "Collapse Consecutive Newlines": "Сворачивать последовательные новые строки", | ||
| 496 | "Allow for Chat Completion APIs": "Разрешить для API Chat Completion", | 190 | "Allow for Chat Completion APIs": "Разрешить для API Chat Completion", |
| 497 | "Target length (tokens)": "Целевая длина (в токенах)", | 191 | "Target length (tokens)": "Целевая длина (в токенах)", |
| 498 | "World Info": "Информация о мире", | 192 | "World Info": "Информация о мире", |
| 499 | "Locked = World Editor will stay open": "Закреплено = Редактор мира останется открытым", | ||
| 500 | "Worlds/Lorebooks": "Миры и лорбуки", | ||
| 501 | "Active World(s) for all chats": "Активные миры для всех чатов", | ||
| 502 | "-- World Info not found --": "-- Информация о мире не найдена --", | ||
| 503 | "Global World Info/Lorebook activation settings": "Настройки активации глобальной информации о мире/книги знаний", | ||
| 504 | "Click to expand": "Нажмите, чтобы развернуть", | ||
| 505 | "Scan Depth": "Глубина сканирования", | 193 | "Scan Depth": "Глубина сканирования", |
| 194 | "Case-Sensitive": "С учетом регистра", | ||
| 195 | "Match Whole Words": "Только полное совпадение", | ||
| 196 | "Use global setting": "Использовать глобальную настройку", | ||
| 197 | "Yes": "Да", | ||
| 198 | "No": "Нет", | ||
| 506 | "Context %": "Процент контекста", | 199 | "Context %": "Процент контекста", |
| 507 | "Budget Cap": "Бюджетный лимит", | 200 | "Budget Cap": "Бюджетный лимит", |
| 508 | "(0 = disabled)": "(0 = отключено)", | 201 | "(0 = disabled)": "(0 = отключено)", |
| 509 | "Scan chronologically until reached min entries or token budget.": "Сканировать в хронологической последовательности, пока не будет достигнуто мин. число вхождений или не израсходуется бюджет токенов.", | 202 | "None": "Отсутствует", |
| 510 | "Min Activations": "Мин. число активаций", | ||
| 511 | "Max Depth": "Макс. глубина", | ||
| 512 | "(0 = unlimited, use budget)": "(0 = безграничная, использовать бюджет)", | ||
| 513 | "Insertion Strategy": "Стратегия вставки", | ||
| 514 | "Sorted Evenly": "Равномерная сортировка", | ||
| 515 | "Character Lore First": "Сначала лор персонажа", | ||
| 516 | "Global Lore First": "Сначала глобальный лор", | ||
| 517 | "Entries can activate other entries by mentioning their keywords": "Записи могут активировать другие записи, если в них содержатся ключевые слова", | ||
| 518 | "Recursive Scan": "Рекурсивное сканирование", | ||
| 519 | "Lookup for the entry keys in the context will respect the case": "Большая буква имеет значение при активации ключевого слова", | ||
| 520 | "Case Sensitive": "Учитывать регистр", | ||
| 521 | "If the entry key consists of only one word, it would not be matched as part of other words": "Если ключевое слово состоит только из одного слова, оно не будет активироваться как часть других слов", | ||
| 522 | "Match Whole Words": "Только полное совпадение", | ||
| 523 | "Only the entries with the most number of key matches will be selected for Inclusion Group filtering": "Для фильтрации по группам включения будут выбраны только записи с наибольшим количеством ключевых совпадений.", | ||
| 524 | "Use Group Scoring": "Использовать групповую оценку", | ||
| 525 | "Alert if your world info is greater than the allocated budget.": "Оповещать, если ваш мир выходит за выделенный бюджет.", | ||
| 526 | "Alert On Overflow": "Оповещение о переполнении", | ||
| 527 | "New": "Новый", | ||
| 528 | "or": "или", | ||
| 529 | "--- Pick to Edit ---": "--- Выберите для редактирования ---", | ||
| 530 | "Rename World Info": "Переименовать мир", | ||
| 531 | "Open all Entries": "Открыть все записи", | ||
| 532 | "Close all Entries": "Закрыть все записи", | ||
| 533 | "New Entry": "Новая запись", | ||
| 534 | "Fill empty Memo/Titles with Keywords": "Заполните пустые Заметки/Названия ключевыми словами", | ||
| 535 | "Import World Info": "Импортировать мир", | ||
| 536 | "Export World Info": "Экспортировать мир", | ||
| 537 | "Duplicate World Info": "Дублировать мир", | ||
| 538 | "Delete World Info": "Удалить мир", | ||
| 539 | "Search...": "Поиск...", | ||
| 540 | "Search": "Поиск", | ||
| 541 | "Priority": "Приоритет", | ||
| 542 | "Custom": "Пользовательский", | ||
| 543 | "Title A-Z": "Название от A до Z", | ||
| 544 | "Title Z-A": "Название от Z до A", | ||
| 545 | "Tokens ↗": "Токены ↗", | ||
| 546 | "Tokens ↘": "Токены ↘", | ||
| 547 | "Depth ↗": "Глубина ↗", | ||
| 548 | "Depth ↘": "Глубина ↘", | ||
| 549 | "Order ↗": "Порядок ↗", | ||
| 550 | "Order ↘": "Порядок ↘", | ||
| 551 | "UID ↗": "UID ↗", | ||
| 552 | "UID ↘": "UID ↘", | ||
| 553 | "Trigger% ↗": "Триггер% ↗", | ||
| 554 | "Trigger% ↘": "Триггер% ↘", | ||
| 555 | "Refresh": "Обновить", | ||
| 556 | "User Settings": "Настройки пользователя", | 203 | "User Settings": "Настройки пользователя", |
| 557 | "Simple": "Простой", | ||
| 558 | "Advanced": "Расширенный", | ||
| 559 | "UI Language": "Язык интерфейса", | 204 | "UI Language": "Язык интерфейса", |
| 560 | "Account": "Аккаунт", | ||
| 561 | "Admin Panel": "Панель администратора", | ||
| 562 | "Logout": "Выйти", | ||
| 563 | "Search Settings": "Поиск по настройкам", | ||
| 564 | "UI Theme": "Тема UI", | ||
| 565 | "Import a theme file": "Импортировать файл темы", | ||
| 566 | "Export a theme file": "Экспортировать файл темы", | ||
| 567 | "Delete a theme": "Удалить тему", | ||
| 568 | "Update a theme file": "Обновить файл темы", | ||
| 569 | "Save as a new theme": "Сохранить как новую тему", | ||
| 570 | "Avatar Style": "Аватарки", | 205 | "Avatar Style": "Аватарки", |
| 571 | "Circle": "Круглые", | 206 | "Circle": "Круглые", |
| 572 | "Square": "Квадратные", | ||
| 573 | "Rectangle": "Прямоугольные", | 207 | "Rectangle": "Прямоугольные", |
| 574 | "Chat Style:": "Стиль чата", | 208 | "Square": "Квадратные", |
| 575 | "Flat": "Стандартный", | 209 | "Default": "По умолчанию", |
| 576 | "Bubbles": "Пузыри", | 210 | "Bubbles": "Пузыри", |
| 577 | "Document": "Документ", | 211 | "No Blur Effect": "Отключить размытие", |
| 578 | "Specify colors for your theme.": "Настройте собственные цвета для вашей темы.", | 212 | "No Text Shadows": "Отключить тень текста", |
| 579 | "Theme Colors": "Цвета темы", | 213 | "Waifu Mode": "Рeжим Вайфу", |
| 214 | "Message Timer": "Таймер сообщений", | ||
| 215 | "Model Icon": "Значки моделей", | ||
| 216 | "Advanced Character Search": "Расширенный поиск по персонажам", | ||
| 217 | "Allow {{char}}: in bot messages": "Показывать {{char}}: в ответах", | ||
| 218 | "Allow {{user}}: in bot messages": "Показать {{user}}: в ответах", | ||
| 219 | "Show tags in responses": "Показывать <теги> в ответах", | ||
| 220 | "Lorebook Import Dialog": "Показывать окно импорта лорбука", | ||
| 221 | "MUI Preset": "Пресет MUI:", | ||
| 222 | "If set in the advanced character definitions, this field will be displayed in the characters list.": "Если это поле задано в расширенных параметрах персонажа, оно будет отображаться в списке персонажей.", | ||
| 223 | "Relaxed API URLS": "Смягчённые адреса API", | ||
| 224 | "Custom CSS": "Пользовательский CSS", | ||
| 225 | "Mancer Model": "Модель Mancer", | ||
| 226 | "API Type": "Тип API", | ||
| 227 | "Aphrodite API key": "Ключ от API Aphrodite", | ||
| 228 | "Relax message trim in Groups": "Мягкая обрезка сообщений в группах", | ||
| 229 | "Characters Hotswap": "HotSwap (смена персонажей на лету)", | ||
| 230 | "Request token probabilities": "Запрашивать вероятность токена", | ||
| 231 | "Movable UI Panels": "Подвижные панели UI", | ||
| 580 | "Main Text": "Основной текст", | 232 | "Main Text": "Основной текст", |
| 581 | "Italics Text": "Курсив", | 233 | "Italics Text": "Курсив", |
| 582 | "Underlined Text": "Подчёркнутый", | ||
| 583 | "Quote Text": "Текст в кавычках", | 234 | "Quote Text": "Текст в кавычках", |
| 584 | "Shadow Color": "Цвет теней", | 235 | "Shadow Color": "Цвет теней", |
| 585 | "Chat Background": "Фон чата", | ||
| 586 | "UI Background": "Фон UI", | ||
| 587 | "UI Border": "Границы UI", | ||
| 588 | "User Message Blur Tint": "Ваши сообщения", | ||
| 589 | "AI Message Blur Tint": "Сообщения ИИ", | ||
| 590 | "Chat Width": "Ширина чата", | ||
| 591 | "Width of the main chat window in % of screen width": "Ширина окна с чатом, в % от ширины экрана", | ||
| 592 | "Font Scale": "Размер текста", | 236 | "Font Scale": "Размер текста", |
| 593 | "Font size": "Размер шрифта", | ||
| 594 | "Blur Strength": "Сила размытия", | 237 | "Blur Strength": "Сила размытия", |
| 595 | "Blur strength on UI panels.": "Сила размытия на панелях UI.", | ||
| 596 | "Text Shadow Width": "Размер теней текста", | 238 | "Text Shadow Width": "Размер теней текста", |
| 597 | "Strength of the text shadows": "Размер теней, отбрасываемых текстом", | 239 | "Swipes": "Свайпы", |
| 598 | "Disables animations and transitions": "Отключение анимаций и переходов.", | 240 | "Miscellaneous": "Разное", |
| 599 | "Reduced Motion": "Сокращение анимаций", | 241 | "Background Sound Only": "Только фоновый звук", |
| 600 | "removes blur from window backgrounds": "Убрать размытие с фона окон, чтобы ускорить рендеринг.", | 242 | "Auto-load Last Chat": "Автозагрузка последнего чата", |
| 601 | "No Blur Effect": "Отключить размытие", | 243 | "Auto-save Message Edits": "Автоматически сохранять отредактированные сообщения", |
| 602 | "Remove text shadow effect": "Удаление эффекта тени от текста.", | 244 | "Auto-fix Markdown": "Автоисправление разметки", |
| 603 | "No Text Shadows": "Отключить тень текста", | 245 | "Auto-scroll Chat": "Автоматическая прокрутка чата", |
| 604 | "Reduce chat height, and put a static sprite behind the chat window": "Уменьшить высоту чата и поместить статичный спрайт за окном чата.", | 246 | "Render Formulas": "Рендер формул", |
| 605 | "Waifu Mode": "Рeжим Вайфу", | 247 | "Send on Enter": "Отправка на Enter", |
| 606 | "Always show the full list of the Message Actions context items for chat messages, instead of hiding them behind '...'": "Всегда показывать полный список действий с сообщением, а не прятать их за '...'.", | 248 | "Debug Menu": "Меню отладки", |
| 607 | "Auto-Expand Message Actions": "Развернуть действия", | 249 | "Restore User Input": "Восстанавливать введённый текст", |
| 608 | "Alternative UI for numeric sampling parameters with fewer steps": "Альтернативный пользовательский интерфейс для числовых параметров выборки с меньшим количеством шагов.", | 250 | "Character Handling": "Обработка персонажа", |
| 609 | "Zen Sliders": "Дзен слайдеры", | 251 | "Example Messages Behavior": "Примеры сообщений:", |
| 610 | "Entirely unrestrict all numeric sampling parameters": "Снять ограничения со всех числовых сэмплеров.", | 252 | "Gradual push-out": "Постепенное выталкивание", |
| 253 | "Chat/Message Handling": "Обработка чата и сообщений", | ||
| 254 | "Always include examples": "Всегда применять примеры", | ||
| 255 | "Never include examples": "Никогда не применять примеры", | ||
| 256 | "Forbid External Media": "Запрет внешних медиа", | ||
| 257 | "System Backgrounds": "Системные фоны", | ||
| 258 | "Name": "Имя", | ||
| 259 | "Auto-connect": "Подключаться автоматически", | ||
| 260 | "First message": "Первое сообщение", | ||
| 261 | "Group Controls": "Управление группой", | ||
| 262 | "Group reply strategy": "Персонажи отвечают...", | ||
| 263 | "Natural order": "По алфавиту", | ||
| 264 | "List order": "По списку", | ||
| 265 | "Allow self responses": "Разрешить ответ себе", | ||
| 266 | "Auto Mode": "Авто-режим", | ||
| 267 | "Add Members": "Добавить участников", | ||
| 268 | "Current Members": "Текущие участники", | ||
| 269 | "Delete": "Удалить", | ||
| 270 | "Cancel": "Отменить", | ||
| 271 | "Advanced Defininitions": "Расширенное описание", | ||
| 272 | "Personality summary": "Резюме по личности", | ||
| 273 | "Scenario": "Сценарий", | ||
| 274 | "Talkativeness": "Разговорчивость", | ||
| 275 | "group chats!": "групповых чатах!", | ||
| 276 | "Shy": "Застенчивый", | ||
| 277 | "Normal": "Обычный", | ||
| 278 | "Chatty": "Разговорчивый", | ||
| 279 | "Examples of dialogue": "Примеры диалога", | ||
| 280 | "Save": "Сохранить", | ||
| 281 | "Chat History": "История чата", | ||
| 282 | "Content": "Содержание", | ||
| 283 | "Selective": "Выборочно", | ||
| 284 | "Disable": "Отключено", | ||
| 285 | "Back to parent chat": "Вернуться в основной чат", | ||
| 286 | "Convert to group": "Превратить в группу", | ||
| 287 | "Start new chat": "Начать новый чат", | ||
| 288 | "Delete messages": "Удалить сообщения", | ||
| 289 | "Impersonate": "Перевоплощение", | ||
| 290 | "Regenerate": "Повторная генерация", | ||
| 291 | "Message Sound": "Звук сообщения", | ||
| 292 | "Author's Note": "Заметки автора", | ||
| 293 | "Replace empty message": "Заменять пустые сообщения", | ||
| 294 | "Send this text instead of nothing when the text box is empty.": "Этот текст будет отправлен в случае отсутствия текста на отправку.", | ||
| 295 | "Unrestricted maximum value for the context slider": "Убрать потолок для ползунка контекста. Включайте только если точно знаете, что делаете", | ||
| 296 | "Chat Completion Source": "Источник для Chat Completion", | ||
| 297 | "Avoid sending sensitive information to the Horde.": "Избегайте отправки личной информации Horde", | ||
| 298 | "Review the Privacy statement": "Ознакомиться с заявлением о конфиденциальности", | ||
| 299 | "Trusted workers only": "Только доверенные рабочие машины", | ||
| 300 | "For privacy reasons, your API key will be hidden after you reload the page.": "По причинам безопасности ваш API-ключ будет скрыт после перезагрузки страницы.", | ||
| 301 | "-- Horde models not loaded --": "--Модель Horde не загружена--", | ||
| 302 | "Example: http://127.0.0.1:5000/api ": "Пример: http://127.0.0.1:5000/api", | ||
| 303 | "No connection...": "Нет соединения...", | ||
| 304 | "Get your NovelAI API Key": "Получите свой API-ключ для NovelAI", | ||
| 305 | "KoboldAI Horde": "KoboldAI Horde", | ||
| 306 | "NovelAI": "NovelAI", | ||
| 307 | "OpenAI API key": "Ключ для API OpenAI", | ||
| 308 | "Trim spaces": "Обрезать пробелы", | ||
| 309 | "Trim Incomplete Sentences": "Удалять неоконченные предложения", | ||
| 310 | "Include Newline": "Добавлять новую строку", | ||
| 311 | "Non-markdown strings": "Строки без разметки", | ||
| 312 | "Replace Macro in Sequences": "Заменить макросы в строках", | ||
| 313 | "Presets": "Пресеты", | ||
| 314 | "Start Reply With": "Начинать ответ с", | ||
| 315 | "Show reply prefix in chat": "Показывать префикс ответов в чате", | ||
| 316 | "Worlds/Lorebooks": "Миры и лорбуки", | ||
| 317 | "Sorted Evenly": "Равномерная сортировка", | ||
| 318 | "Active World(s) for all chats": "Активные миры для всех чатов", | ||
| 319 | "-- World Info not found --": "-- Информация о мире не найдена --", | ||
| 320 | "--- Pick to Edit ---": "--- Выберите для редактирования ---", | ||
| 321 | "or": "или", | ||
| 322 | "New": "Новый", | ||
| 323 | "Priority": "Приоритет", | ||
| 324 | "Custom": "Пользовательский", | ||
| 325 | "Title A-Z": "Название от A до Z", | ||
| 326 | "Title Z-A": "Название от Z до A", | ||
| 327 | "Tokens ↗": "Токены ↗", | ||
| 328 | "Tokens ↘": "Токены ↘", | ||
| 329 | "Depth ↗": "Глубина ↗", | ||
| 330 | "Depth ↘": "Глубина ↘", | ||
| 331 | "Order ↗": "Порядок ↗", | ||
| 332 | "Order ↘": "Порядок ↘", | ||
| 333 | "UID ↗": "UID ↗", | ||
| 334 | "UID ↘": "UID ↘", | ||
| 335 | "Trigger% ↗": "Триггер% ↗", | ||
| 336 | "Trigger% ↘": "Триггер% ↘", | ||
| 337 | "Order:": "Порядок:", | ||
| 338 | "Depth:": "Глубина:", | ||
| 339 | "Character Lore First": "Сначала лор персонажа", | ||
| 340 | "Global Lore First": "Сначала глобальный лор", | ||
| 341 | "Recursive Scan": "Рекурсивное сканирование", | ||
| 342 | "Case Sensitive": "Учитывать регистр", | ||
| 343 | "Alert On Overflow": "Оповещение о переполнении", | ||
| 344 | "Use Probability": "Использовать вероятность", | ||
| 345 | "Exclude from recursion": "Исключить из рекурсии", | ||
| 346 | "Entry Title/Memo": "Название или заметка о записи", | ||
| 347 | "Position:": "Положение:", | ||
| 348 | "T_Position": "↑Char: Перед определениями Персонажа\n↓Char: После определений Персонажа\n↑AN: Перед Пометок автора\n↓AN: После Пометок автора\n@D: На глубине", | ||
| 349 | "Before Char Defs": "↑Перс.", | ||
| 350 | "After Char Defs": "↓Перс.", | ||
| 351 | "Before AN": "↑АЗ", | ||
| 352 | "After AN": "↓АЗ", | ||
| 353 | "Order": "Порядок:", | ||
| 354 | "Update a theme file": "Обновить файл темы", | ||
| 355 | "Save as a new theme": "Сохранить как новую тему", | ||
| 356 | "Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных запрещённых слов, при котором срабатывает авто-свайп.", | ||
| 357 | "User Message Blur Tint": "Ваши сообщения", | ||
| 358 | "AI Message Blur Tint": "Сообщения ИИ", | ||
| 359 | "Chat Backgrounds": "Фоны чата", | ||
| 360 | "Chat Background": "Фон чата", | ||
| 361 | "UI Background": "Фон UI", | ||
| 611 | "Mad Lab Mode": "Режим безумца", | 362 | "Mad Lab Mode": "Режим безумца", |
| 612 | "Time the AI's message generation, and show the duration in the chat log": "Время генерации сообщений ИИ и его показ в журнале чата.", | ||
| 613 | "Message Timer": "Таймер сообщений", | ||
| 614 | "Show a timestamp for each message in the chat log": "Показывать временную метку для каждого сообщения в журнале чата.", | ||
| 615 | "Chat Timestamps": "Метки времени в чате", | ||
| 616 | "Show an icon for the API that generated the message": "Показать значок API, сгенерировавшего сообщение.", | ||
| 617 | "Model Icon": "Значки моделей", | ||
| 618 | "Show sequential message numbers in the chat log": "Показывать порядковые номера сообщений в журнале чата.", | ||
| 619 | "Message IDs": "ID сообщений", | ||
| 620 | "Hide avatars in chat messages.": "Скрыть аватарки сбоку от сообщений в чате", | ||
| 621 | "Hide Chat Avatars": "Не показывать аватарки в чате", | ||
| 622 | "Show the number of tokens in each message in the chat log": "Показать количество токенов в каждом сообщении в журнале чата.", | ||
| 623 | "Show Message Token Count": "Счетчик токенов сообщения", | 363 | "Show Message Token Count": "Счетчик токенов сообщения", |
| 624 | "Single-row message input area. Mobile only, no effect on PC": "Однорядная область ввода сообщений. Только для мобильных устройств, на ПК не работает.", | ||
| 625 | "Compact Input Area (Mobile)": "Компактная зона ввода", | 364 | "Compact Input Area (Mobile)": "Компактная зона ввода", |
| 626 | "In the Character Management panel, show quick selection buttons for favorited characters": "На панели управления персонажами будут отображены кнопки быстрого выбора для избранных персонажей.", | 365 | "Zen Sliders": "Дзен слайдеры", |
| 627 | "Characters Hotswap": "HotSwap (смена персонажей на лету)", | 366 | "UI Border": "Границы UI", |
| 628 | "Enable magnification for zoomed avatar display.": "Добавляет возможность приближать увеличенную версию аватарки.", | 367 | "Chat Style:": "Стиль чата", |
| 629 | "Avatar Hover Magnification": "Зум аватарки по наведению", | 368 | "Chat Timestamps": "Метки времени в чате", |
| 630 | "Enables a magnification effect on hover when you display the zoomed avatar after clicking an avatar's image in chat.": "Включает эффект увеличения при наведении курсора мыши, когда вы отображаете увеличенный аватар после щелчка по изображению аватара в чате.", | ||
| 631 | "Show tagged character folders in the character list": "Отобразить теговые папки с персонажами в списке персонажей.", | ||
| 632 | "Tags as Folders": "Теги как папки", | 369 | "Tags as Folders": "Теги как папки", |
| 633 | "Tags_as_Folders_desc": "Недавнее изменение: теги должны быть помечены как папки в меню «Управление тегами», чтобы они отображались как таковые. Нажмите здесь, чтобы открыть его.", | 370 | "Streaming FPS": "FPS для стриминга", |
| 634 | "Character Handling": "Обработка персонажа", | 371 | "Gestures": "Жесты", |
| 635 | "If set in the advanced character definitions, this field will be displayed in the characters list.": "Если это поле задано в расширенных параметрах персонажа, оно будет отображаться в списке персонажей.", | 372 | "Message IDs": "ID сообщений", |
| 636 | "Char List Subheader": "Доп. заголовок в списке персонажей", | ||
| 637 | "Character Version": "Версия персонажа", | ||
| 638 | "Created by": "Автор", | ||
| 639 | "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "Искать персонажей по всем полям данных, а не только по имени.", | ||
| 640 | "Advanced Character Search": "Расширенный поиск по персонажам", | ||
| 641 | "If checked and the character card contains a prompt override (System Prompt), use that instead": "При включении этой опции, системный промпт будет заменяться кастомным промптом из карточки (при его наличии).", | ||
| 642 | "Prefer Character Card Prompt": "Приоритет промпту из карточки персонажа", | 373 | "Prefer Character Card Prompt": "Приоритет промпту из карточки персонажа", |
| 643 | "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "При включении этой опции, пользовательский джейлбрейк будет заменяться кастомным джейлбрейком из карточки (при его наличии).", | ||
| 644 | "Prefer Character Card Jailbreak": "Приоритет джейлбрейку из карточки персонажа", | 374 | "Prefer Character Card Jailbreak": "Приоритет джейлбрейку из карточки персонажа", |
| 645 | "Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Не менять размер картинок у импортируемых персонажей. При отключении все картинки будут приводиться к размеру 512х768", | 375 | "Press Send to continue": "Кнопка отправки продолжает сообщение", |
| 376 | "Quick 'Continue' button": "Кнопка быстрого продолжения", | ||
| 377 | "Log prompts to console": "Выводить промпты в консоль", | ||
| 646 | "Never resize avatars": "Не менять размер аватарок", | 378 | "Never resize avatars": "Не менять размер аватарок", |
| 647 | "Show actual file names on the disk, in the characters list display only": "Отображение названий файлов персонажей на диске, только в списке персонажей.", | ||
| 648 | "Show avatar filenames": "Показывать названия файлов аватарок", | 379 | "Show avatar filenames": "Показывать названия файлов аватарок", |
| 649 | "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "Запрашивать разрешения на импорт встроенных тегов карт при импорте персонажей. В противном случае встроенные теги игнорируются.", | ||
| 650 | "Import Card Tags": "Импорт тегов карточки", | 380 | "Import Card Tags": "Импорт тегов карточки", |
| 651 | "Hide character definitions from the editor panel behind a spoiler button": "Спрятать определения персонажей из панели редактора за кнопку спойлера.", | 381 | "Confirm message deletion": "Подтверждение удаления сообщений", |
| 652 | "Spoiler Free Mode": "Режим без спойлеров", | 382 | "Spoiler Free Mode": "Режим без спойлеров", |
| 653 | "Miscellaneous": "Разное", | 383 | "Auto-swipe": "Автоматические свайпы", |
| 654 | "Reload and redraw the currently open chat": "Перезагрузить и перерисовать открытый в данный момент чат.", | 384 | "Minimum generated message length": "Минимальная длина сгенерированных сообщений", |
| 385 | "Blacklisted words": "Запрещенные слова", | ||
| 386 | "Blacklisted word count to swipe": "Количество запрещенных слов для свайпа", | ||
| 655 | "Reload Chat": "Перезагрузить чат", | 387 | "Reload Chat": "Перезагрузить чат", |
| 656 | "Debug Menu": "Меню отладки", | 388 | "Search Settings": "Поиск по настройкам", |
| 657 | "Smooth Streaming": "Плавный стриминг", | 389 | "Disabled": "Отключено", |
| 658 | "Experimental feature. May not work for all backends.": "Экспериментальная возможность, на некоторых бэкендах может не работать.", | 390 | "Automatic (PC)": "Автоматическое (ПК)", |
| 659 | "Slow": "Медленный", | 391 | "Enabled": "Включено", |
| 660 | "Fast": "Быстрый", | 392 | "Simple": "Простой", |
| 393 | "Advanced": "Расширенный", | ||
| 394 | "Disables animations and transitions": "Отключение анимаций и переходов.", | ||
| 395 | "removes blur from window backgrounds": "Убрать размытие с фона окон, чтобы ускорить рендеринг.", | ||
| 396 | "Remove text shadow effect": "Удаление эффекта тени от текста.", | ||
| 397 | "Reduce chat height, and put a static sprite behind the chat window": "Уменьшить высоту чата и поместить статичный спрайт за окном чата.", | ||
| 398 | "Always show the full list of the Message Actions context items for chat messages, instead of hiding them behind '...'": "Всегда показывать полный список действий с сообщением, а не прятать их за '...'.", | ||
| 399 | "Alternative UI for numeric sampling parameters with fewer steps": "Альтернативный пользовательский интерфейс для числовых параметров выборки с меньшим количеством шагов.", | ||
| 400 | "Entirely unrestrict all numeric sampling parameters": "Снять ограничения со всех числовых сэмплеров.", | ||
| 401 | "Time the AI's message generation, and show the duration in the chat log": "Время генерации сообщений ИИ и его показ в журнале чата.", | ||
| 402 | "Show a timestamp for each message in the chat log": "Показывать временную метку для каждого сообщения в журнале чата.", | ||
| 403 | "Show an icon for the API that generated the message": "Показать значок API, сгенерировавшего сообщение.", | ||
| 404 | "Show sequential message numbers in the chat log": "Показывать порядковые номера сообщений в журнале чата.", | ||
| 405 | "Show the number of tokens in each message in the chat log": "Показать количество токенов в каждом сообщении в журнале чата.", | ||
| 406 | "Single-row message input area. Mobile only, no effect on PC": "Однорядная область ввода сообщений. Только для мобильных устройств, на ПК не работает.", | ||
| 407 | "In the Character Management panel, show quick selection buttons for favorited characters": "На панели управления персонажами будут отображены кнопки быстрого выбора для избранных персонажей.", | ||
| 408 | "Show tagged character folders in the character list": "Отобразить теговые папки с персонажами в списке персонажей.", | ||
| 661 | "Play a sound when a message generation finishes": "Воспроизведение звука при завершении генерации сообщения.", | 409 | "Play a sound when a message generation finishes": "Воспроизведение звука при завершении генерации сообщения.", |
| 662 | "Message Sound": "Звук сообщения", | ||
| 663 | "Only play a sound when ST's browser tab is unfocused": "Воспроизводить звук только тогда, когда вкладка браузера ST не выбрана.", | 410 | "Only play a sound when ST's browser tab is unfocused": "Воспроизводить звук только тогда, когда вкладка браузера ST не выбрана.", |
| 664 | "Background Sound Only": "Только фоновый звук", | ||
| 665 | "Reduce the formatting requirements on API URLs": "Снижение требований к форматированию URL-адресов API.", | 411 | "Reduce the formatting requirements on API URLs": "Снижение требований к форматированию URL-адресов API.", |
| 666 | "Relaxed API URLS": "Смягчённые адреса API", | ||
| 667 | "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "Спрашивать разрешение на импорт лорбука для всех персонажей со встроенным лорбуком. При выключенной опции вместо этого будет показываться короткое сообщение", | 412 | "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "Спрашивать разрешение на импорт лорбука для всех персонажей со встроенным лорбуком. При выключенной опции вместо этого будет показываться короткое сообщение", |
| 668 | "Lorebook Import Dialog": "Показывать окно импорта лорбука", | ||
| 669 | "Restore unsaved user input on page refresh": "Восстановление несохраненного пользовательского запроса при обновлении страницы.", | 413 | "Restore unsaved user input on page refresh": "Восстановление несохраненного пользовательского запроса при обновлении страницы.", |
| 670 | "Restore User Input": "Восстанавливать введённый текст", | ||
| 671 | "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "Позволяет перемещать некоторые элементы интерфейса путем их перетаскивания. Только для ПК, на телефонах не работает.", | 414 | "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "Позволяет перемещать некоторые элементы интерфейса путем их перетаскивания. Только для ПК, на телефонах не работает.", |
| 672 | "Movable UI Panels": "Подвижные панели UI", | ||
| 673 | "MovingUI preset. Predefined/saved draggable positions": "Пресет для MovingUI. Предопределенные/сохраненные позиции для перетаскивания.", | 415 | "MovingUI preset. Predefined/saved draggable positions": "Пресет для MovingUI. Предопределенные/сохраненные позиции для перетаскивания.", |
| 674 | "MUI Preset": "Пресет MUI:", | ||
| 675 | "Save movingUI changes to a new file": "Сохранение изменений MovingUI в новый файл.", | 416 | "Save movingUI changes to a new file": "Сохранение изменений MovingUI в новый файл.", |
| 676 | "Reset MovingUI panel sizes/locations.": "Сбросить размеры/расположение панели MovingUI.", | ||
| 677 | "Apply a custom CSS style to all of the ST GUI": "Применять пользовательский CSS ко всему интерфейсу Таверны.", | 417 | "Apply a custom CSS style to all of the ST GUI": "Применять пользовательский CSS ко всему интерфейсу Таверны.", |
| 678 | "Custom CSS": "Пользовательский CSS", | 418 | "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "Искать персонажей по всем полям данных, а не только по имени.", |
| 679 | "Expand the editor": "Развернуть редактор", | 419 | "If checked and the character card contains a prompt override (System Prompt), use that instead": "При включении этой опции, системный промпт будет заменяться кастомным промптом из карточки (при его наличии).", |
| 680 | "Chat/Message Handling": "Обработка чата и сообщений", | 420 | "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "При включении этой опции, пользовательский джейлбрейк будет заменяться кастомным джейлбрейком из карточки (при его наличии).", |
| 681 | "# Messages to Load": "Сколько сообщений загружать", | 421 | "Show actual file names on the disk, in the characters list display only": "Отображение названий файлов персонажей на диске, только в списке персонажей.", |
| 682 | "The number of chat history messages to load before pagination.": "Кол-во сообщений чата, загружаемых перед пагинацией.", | 422 | "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "Запрашивать разрешения на импорт встроенных тегов карт при импорте персонажей. В противном случае встроенные теги игнорируются.", |
| 683 | "(0 = All)": "(0 = все)", | 423 | "Hide character definitions from the editor panel behind a spoiler button": "Спрятать определения персонажей из панели редактора за кнопку спойлера.", |
| 684 | "Streaming FPS": "FPS для стриминга", | ||
| 685 | "Update speed of streamed text.": "Скорость обновления текста при стриминге.", | ||
| 686 | "Example Messages Behavior": "Примеры сообщений:", | ||
| 687 | "Gradual push-out": "Постепенное выталкивание", | ||
| 688 | "Always include examples": "Всегда применять примеры", | ||
| 689 | "Never include examples": "Никогда не применять примеры", | ||
| 690 | "Send on Enter": "Отправка на Enter", | ||
| 691 | "Disabled": "Отключено", | ||
| 692 | "Automatic (PC)": "Автоматическое (ПК)", | ||
| 693 | "Press Send to continue": "Кнопка отправки продолжает сообщение", | ||
| 694 | "Show a button in the input area to ask the AI to continue (extend) its last message": "Показывать на форме ответа кнопку, по нажатии на которую ИИ продолжит своё предыдущее сообщение.", | 424 | "Show a button in the input area to ask the AI to continue (extend) its last message": "Показывать на форме ответа кнопку, по нажатии на которую ИИ продолжит своё предыдущее сообщение.", |
| 695 | "Quick 'Continue' button": "Кнопка быстрого продолжения", | ||
| 696 | "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "Показывать кнопки со стрелками на последнем сообщении в чате, чтобы генерировать альтернативные ответы ИИ. Как для ПК, так и для мобильных устройств.", | 425 | "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "Показывать кнопки со стрелками на последнем сообщении в чате, чтобы генерировать альтернативные ответы ИИ. Как для ПК, так и для мобильных устройств.", |
| 697 | "Swipes": "Свайпы", | ||
| 698 | "Allow using swiping gestures on the last in-chat message to trigger swipe generation. Mobile only, no effect on PC": "Позволяет использовать жесты смахивания на последнем сообщении в чате, чтобы вызвать альтернативную генерацию. Только для мобильных устройств, на ПК не работает.", | 426 | "Allow using swiping gestures on the last in-chat message to trigger swipe generation. Mobile only, no effect on PC": "Позволяет использовать жесты смахивания на последнем сообщении в чате, чтобы вызвать альтернативную генерацию. Только для мобильных устройств, на ПК не работает.", |
| 699 | "Gestures": "Жесты", | ||
| 700 | "Auto-load Last Chat": "Автозагрузка последнего чата", | ||
| 701 | "Auto-scroll Chat": "Автоматическая прокрутка чата", | ||
| 702 | "Save edits to messages without confirmation as you type": "Сохранять правки в сообщениях без подтверждения по мере ввода текста.", | 427 | "Save edits to messages without confirmation as you type": "Сохранять правки в сообщениях без подтверждения по мере ввода текста.", |
| 703 | "Auto-save Message Edits": "Автоматически сохранять отредактированные сообщения", | ||
| 704 | "Confirm message deletion": "Подтверждение удаления сообщений", | ||
| 705 | "Auto-fix Markdown": "Автоисправление разметки", | ||
| 706 | "Render LaTeX and AsciiMath equation notation in chat messages. Powered by KaTeX": "Отображение нотации уравнений LaTeX и AsciiMath в сообщениях чата. При поддержке KaTeX.", | 428 | "Render LaTeX and AsciiMath equation notation in chat messages. Powered by KaTeX": "Отображение нотации уравнений LaTeX и AsciiMath в сообщениях чата. При поддержке KaTeX.", |
| 707 | "Render Formulas": "Рендер формул", | ||
| 708 | "Disallow embedded media from other domains in chat messages": "Запретить встраивание мультимедиа из других доменов в сообщения чата.", | ||
| 709 | "Forbid External Media": "Запрет внешних медиа", | ||
| 710 | "Allow {{char}}: in bot messages": "Показывать {{char}}: в ответах", | ||
| 711 | "Allow {{user}}: in bot messages": "Показать {{user}}: в ответах", | ||
| 712 | "Skip encoding and characters in message text, allowing a subset of HTML markup as well as Markdown": "Не кодировать символы < и > в тексте сообщения, что позволяет использовать подмножество HTML-разметки, а также Markdown.", | 429 | "Skip encoding and characters in message text, allowing a subset of HTML markup as well as Markdown": "Не кодировать символы < и > в тексте сообщения, что позволяет использовать подмножество HTML-разметки, а также Markdown.", |
| 713 | "Show tags in responses": "Показывать <теги> в ответах", | ||
| 714 | "Allow AI messages in groups to contain lines spoken by other group members": "Разрешить ИИ в группах генерировать строчки за других участников группы в своих сообщениях.", | 430 | "Allow AI messages in groups to contain lines spoken by other group members": "Разрешить ИИ в группах генерировать строчки за других участников группы в своих сообщениях.", |
| 715 | "Relax message trim in Groups": "Мягкая обрезка сообщений в группах", | ||
| 716 | "Log prompts to console": "Выводить промпты в консоль", | ||
| 717 | "Requests logprobs from the API for the Token Probabilities feature": "Запросить логпробы из API для функции Token Probabilities.", | 431 | "Requests logprobs from the API for the Token Probabilities feature": "Запросить логпробы из API для функции Token Probabilities.", |
| 718 | "Request token probabilities": "Запрашивать вероятность токена", | ||
| 719 | "Automatically reject and re-generate AI message based on configurable criteria": "Автоматическое отклонение и повторная генерация сообщений AI на основе настраиваемых критериев.", | 432 | "Automatically reject and re-generate AI message based on configurable criteria": "Автоматическое отклонение и повторная генерация сообщений AI на основе настраиваемых критериев.", |
| 720 | "Auto-swipe": "Автоматические свайпы", | ||
| 721 | "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить авто-свайп. Настройки в этом разделе действуют только при включенном авто-свайпе.", | 433 | "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить авто-свайп. Настройки в этом разделе действуют только при включенном авто-свайпе.", |
| 722 | "Minimum generated message length": "Минимальная длина сгенерированных сообщений", | ||
| 723 | "If the generated message is shorter than this, trigger an auto-swipe": "Если сгенерированное сообщение короче этого значения, срабатывает авто-свайп.", | 434 | "If the generated message is shorter than this, trigger an auto-swipe": "Если сгенерированное сообщение короче этого значения, срабатывает авто-свайп.", |
| 724 | "Blacklisted words": "Запрещенные слова", | 435 | "Reload and redraw the currently open chat": "Перезагрузить и перерисовать открытый в данный момент чат.", |
| 436 | "Auto-Expand Message Actions": "Развернуть действия", | ||
| 437 | "Persona Management": "Управление персоной", | ||
| 438 | "Persona Description": "Описание персоны", | ||
| 439 | "Your Persona": "Ваша персона", | ||
| 440 | "Show notifications on switching personas": "Показывать уведомления при смене персоны", | ||
| 441 | "In Story String / Prompt Manager": "В строке истории / Менеджер промптов", | ||
| 442 | "Top of Author's Note": "Сверху от заметок автора", | ||
| 443 | "Bottom of Author's Note": "Снизу от заметок автора", | ||
| 444 | "How do I use this?": "Как пользоваться?", | ||
| 445 | "More...": "Ещё...", | ||
| 446 | "Link to World Info": "Ссылка на информацию о мире", | ||
| 447 | "Import Card Lore": "Импортировать лор карточки", | ||
| 448 | "Scenario Override": "Перезапись сценария", | ||
| 449 | "Rename": "Переименовать", | ||
| 450 | "Character Description": "Описание персонажа", | ||
| 451 | "Creator's Notes": "Заметки создателя", | ||
| 452 | "A-Z": "A-Z", | ||
| 453 | "Z-A": "Z-A", | ||
| 454 | "Newest": "Новейшие", | ||
| 455 | "Oldest": "Старейшие", | ||
| 456 | "Favorites": "Избранные", | ||
| 457 | "Recent": "Последние", | ||
| 458 | "Most chats": "Больше всего чатов", | ||
| 459 | "Least chats": "Меньше всего чатов", | ||
| 460 | "Prompt Overrides": "Индивидуальные промпты", | ||
| 461 | "Insert {{original}} into either box to include the respective default prompt from system settings.": "Введите {{original}} в любое поле, чтобы вставить соответствующий промпт из системных настроек", | ||
| 462 | "Main Prompt": "Основной промпт", | ||
| 463 | "Jailbreak": "Джейлбрейк", | ||
| 464 | "Everything here is optional": "Все поля необязательные", | ||
| 465 | "Created by": "Автор", | ||
| 466 | "Character Version": "Версия персонажа", | ||
| 467 | "Tags to Embed": "Встраиваемые теги", | ||
| 468 | "Important to set the character's writing style.": "Серьёзно влияет на стиль письма персонажа.", | ||
| 469 | "Samplers Order": "Порядок сэмплеров", | ||
| 470 | "Samplers will be applied in a top-down order. Use with caution.": "Сэмплеры будут применяться в порядке от верхнего к нижнему. Используйте с осторожностью.", | ||
| 471 | "Repetition Penalty": "Штраф за повторы", | ||
| 472 | "Rep. Pen. Range.": "Диапазон поиска повторов", | ||
| 473 | "Rep. Pen. Freq.": "Частота штрафа за повторы", | ||
| 474 | "Rep. Pen. Presence": "Наличие штрафа за повторы", | ||
| 475 | "separate with commas w/o space between": "разделять запятыми без пробела", | ||
| 476 | "Document": "Документ", | ||
| 477 | "Continue": "Продолжить", | ||
| 478 | "CFG Scale": "CFG Scale", | ||
| 479 | "AI reply prefix": "Префикс для ответа ИИ", | ||
| 480 | "Custom Stopping Strings": "Стоп-строки", | ||
| 481 | "JSON serialized array of strings": "Список строк в формате JSON", | ||
| 725 | "words you dont want generated separated by comma ','": "слова, которые вы не хотите генерировать, через запятую ','", | 482 | "words you dont want generated separated by comma ','": "слова, которые вы не хотите генерировать, через запятую ','", |
| 726 | "Blacklisted word count to swipe": "Количество запрещенных слов для свайпа", | 483 | "Enter your name": "Введите свое имя", |
| 727 | "Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных запрещённых слов, при котором срабатывает авто-свайп.", | 484 | "Name this character": "Назовите этого персонажа", |
| 728 | "AutoComplete Settings": "Настройки автозаполнения", | 485 | "Search / Create Tags": "Искать / Создать тэги", |
| 729 | "Automatically hide details": "Автоматически скрывать детали", | 486 | "Describe your character's physical and mental traits here.": "Опишите ментальные и физические черты персонажа", |
| 730 | "Determines how entries are found for autocomplete.": "Определяет, как находятся записи для автозаполнения.", | 487 | "This will be the first message from the character that starts every chat.": "Это будет первое сообщение от персонажа при начале нового чата", |
| 731 | "Autocomplete Matching": "Соответствие", | 488 | "Chat Name (Optional)": "Название чата (необязательно)", |
| 732 | "Starts with": "Начинается с", | 489 | "Search...": "Поиск...", |
| 733 | "Includes": "Включает", | 490 | "Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "Все содержимое этого поля будет заменять стандартный промпт", |
| 734 | "Fuzzy": "Нечеткий", | 491 | "Any contents here will replace the default Jailbreak Prompt used for this character. (v2 spec: post_history_instructions)": "Все содержимое этого поля будет заменять стандартный джейлбрейк", |
| 735 | "Sets the style of the autocomplete.": "Устанавливает стиль автозаполнения.", | 492 | "(Botmaker's name / Contact Info)": "(Имя автора, контакты)", |
| 736 | "Autocomplete Style": "Стиль", | 493 | "(If you want to track character versions)": "Если вы хотите отслеживать версии персонажа", |
| 737 | "Follow Theme": "Следовать теме", | 494 | "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(Описание персонажа, советы по использованию, список моделей, на которых он тестировался. Информация будет отображаться в списке персонажей)", |
| 738 | "Dark": "Темный", | 495 | "(Write a comma-separated list of tags)": "(Список тегов через запятую)", |
| 739 | "Sets the font size of the autocomplete.": "Устанавливает размер шрифта автозаполнения.", | 496 | "(A brief description of the personality)": "(Краткое описание личности)", |
| 740 | "Sets the width of the autocomplete.": "Устанавливает ширину автозаполнения.", | 497 | "(Circumstances and context of the interaction)": "(Обстоятельства и контекст этого диалога)", |
| 741 | "Autocomplete Width": "Ширина", | 498 | "(Examples of chat dialog. Begin each example with START on a new line.)": "(Примеры диалога. Начинайте каждый пример с START или новой линией.)", |
| 742 | "chat input box": "поле ввода чата", | 499 | "Type here...": "Пишите здесь...", |
| 743 | "entire chat width": "вся ширина чата", | 500 | "Comma separated (required)": "Через запятую (обязательное поле)", |
| 744 | "full window width": "полная ширина окна", | 501 | "What this keyword should mean to the AI, sent verbatim": "Что это ключевое слово должно означать для ИИ, отправляется дословно", |
| 745 | "STscript Settings": "Настройки STscript", | 502 | "Filter to Character(s)": "Фильтр по персонажу(ам)", |
| 746 | "Sets default flags for the STscript parser.": "Устанавливает флаги по умолчанию для анализатора STscript.", | 503 | "Character Exclusion": "Исключить персонажей", |
| 747 | "Parser Flags": "Флаги парсера", | 504 | "Inclusion Group": "Включить персонажей", |
| 748 | "Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well.": "Переключитесь на более строгое экранирование, позволяющее экранировать все символы-разделители с помощью обратной косой черты, а также экранировать обратную косую черту.", | 505 | "Only one entry with the same label will be activated": "Будет активна только одна запись с одинаковой меткой", |
| 749 | "STRICT_ESCAPING": "STRICT_ESCAPING", | 506 | "-- Characters not found --": "-- Персонажей не найдено --", |
| 750 | "Replace all {{getvar::}} and {{getglobalvar::}} macros with scoped variables to avoid double macro substitution.": "Замените все макросы {{getvar::}} и {{getglobalvar::}} на переменные с ограниченной областью действия, чтобы избежать двойной подстановки макросов.", | 507 | "(This will be the first message from the character that starts every chat)": "(Это будет первое сообщение от персонажа, когда вы начинаете новый чат)", |
| 751 | "REPLACE_GETVAR": "REPLACE_GETVAR", | 508 | "AI Response Configuration": "Настройка ответа ИИ", |
| 509 | "AI Configuration panel will stay open": "Панель настройки ИИ останется открытой", | ||
| 510 | "Update current preset": "Обновить текущий пресет", | ||
| 511 | "Import preset": "Импортировать пресет", | ||
| 512 | "Export preset": "Экспортировать пресет", | ||
| 513 | "Delete the preset": "Удалить пресет", | ||
| 514 | "Auto-select this preset for Instruct Mode": "Автоматический выбор этого пресета для режима Instruct.", | ||
| 515 | "Auto-select this preset on API connection": "Автоматический выбор этого пресета при подключении к API.", | ||
| 516 | "Wrap user messages in quotes before sending": "Перед отправкой заключать ответ пользователя в кавычки", | ||
| 517 | "Restore default prompt": "Восстановить станндартный промпт", | ||
| 518 | "New preset": "Новый пресет", | ||
| 519 | "Delete preset": "Удалить пресет", | ||
| 520 | "API Connections": "Соединения с API", | ||
| 521 | "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "Может помочь с плохими ответами ставя в очередь только подтвержденных работников. Может замедлить время ответа.", | ||
| 522 | "Clear your API key": "Стереть ключ от API", | ||
| 523 | "Refresh models": "Обновить модели", | ||
| 524 | "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "Получите свой OpenRouter API токен используя OAuth. У вас будет открыта вкладка openrouter.ai", | ||
| 525 | "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "Проверка работоспособности вашего соединения с API путём отправки короткого тестового сообщения. Внимание: оно будет отправлено от вашего имени.", | ||
| 526 | "Edit": "Редактировать", | ||
| 527 | "Locked = World Editor will stay open": "Закреплено = Редактор мира останется открытым", | ||
| 528 | "Entries can activate other entries by mentioning their keywords": "Записи могут активировать другие записи, если в них содержатся ключевые слова", | ||
| 529 | "Lookup for the entry keys in the context will respect the case": "Большая буква имеет значение при активации ключевого слова", | ||
| 530 | "If the entry key consists of only one word, it would not be matched as part of other words": "Если ключевое слово состоит только из одного слова, оно не будет активироваться как часть других слов", | ||
| 531 | "Open all Entries": "Открыть все записи", | ||
| 532 | "Close all Entries": "Закрыть все записи", | ||
| 533 | "Create": "Создать", | ||
| 534 | "Import World Info": "Импортировать мир", | ||
| 535 | "Export World Info": "Экспортировать мир", | ||
| 536 | "Delete World Info": "Удалить мир", | ||
| 537 | "Duplicate World Info": "Дублировать мир", | ||
| 538 | "Rename World Info": "Переименовать мир", | ||
| 539 | "Refresh": "Обновить", | ||
| 540 | "Primary Keywords": "Основные ключевые слова", | ||
| 541 | "Logic": "Логика", | ||
| 542 | "AND ANY": "И ЛЮБОЙ", | ||
| 543 | "AND ALL": "И ВСЕ", | ||
| 544 | "NOT ALL": "НЕ ВСЕ", | ||
| 545 | "NOT ANY": "НЕ ЛЮБОЙ", | ||
| 546 | "Optional Filter": "Дополнительный фильтр", | ||
| 547 | "New Entry": "Новая запись", | ||
| 548 | "Fill empty Memo/Titles with Keywords": "Заполните пустые Заметки/Названия ключевыми словами", | ||
| 549 | "AI Response Formatting": "Формат ответа ИИ", | ||
| 752 | "Change Background Image": "Изменить фон", | 550 | "Change Background Image": "Изменить фон", |
| 753 | "Filter": "Фильтр", | ||
| 754 | "Automatically select a background based on the chat context": "Автоматический выбор фона в зависимости от контекста чата", | ||
| 755 | "Auto-select": "Авто-выбор", | ||
| 756 | "System Backgrounds": "Системные фоны", | ||
| 757 | "Chat Backgrounds": "Фоны чата", | ||
| 758 | "bg_chat_hint_1": "Здесь будут появляться фоны, сгенерированные расширением", | ||
| 759 | "bg_chat_hint_2": ".", | ||
| 760 | "Extensions": "Расширения", | 551 | "Extensions": "Расширения", |
| 761 | "Notify on extension updates": "Уведомлять об обновлениях расширений", | ||
| 762 | "Manage extensions": "Управление расширениями", | ||
| 763 | "Import Extension From Git Repo": "Импортировать расширение из Git Repository", | ||
| 764 | "Install extension": "Установить расширение", | ||
| 765 | "Extras API:": "Дополнительный API:", | ||
| 766 | "Auto-connect": "Подключаться автоматически", | ||
| 767 | "Extras API URL": "URL-адрес дополнительного API", | ||
| 768 | "Extras API key (optional)": "Ключ от Extras API (необязательно)", | ||
| 769 | "Persona Management": "Управление персоной", | ||
| 770 | "How do I use this?": "Как пользоваться?", | ||
| 771 | "Click for stats!": "Нажмите для получения статистики!", | ||
| 772 | "Usage Stats": "Статистика исп.", | ||
| 773 | "Backup your personas to a file": "Создать бэкап (резервную копию) персоны в виде файла", | ||
| 774 | "Backup": "Бэкап", | ||
| 775 | "Restore your personas from a file": "Восстановление персон из файла", | ||
| 776 | "Restore": "Восстановить", | ||
| 777 | "Create a dummy persona": "Создать персону-болванку", | ||
| 778 | "Create": "Создать", | ||
| 779 | "Toggle grid view": "Переключить вид сетки", | ||
| 780 | "No persona description": "[Нет описания]", | ||
| 781 | "Name": "Имя", | ||
| 782 | "Enter your name": "Введите свое имя", | ||
| 783 | "Click to set a new User Name": "Нажмите, чтобы задать новое имя пользователя.", | 552 | "Click to set a new User Name": "Нажмите, чтобы задать новое имя пользователя.", |
| 784 | "Click to lock your selected persona to the current chat. Click again to remove the lock.": "Нажмите, чтобы закрепить выбранную персону для текущего чата. Нажмите еще раз, чтобы открепить.", | 553 | "Click to lock your selected persona to the current chat. Click again to remove the lock.": "Нажмите, чтобы закрепить выбранную персону для текущего чата. Нажмите еще раз, чтобы открепить.", |
| 785 | "Click to set user name for all messages": "Нажмите, чтобы задать имя пользователя для всех сообщений.", | 554 | "Click to set user name for all messages": "Нажмите, чтобы задать имя пользователя для всех сообщений.", |
| 786 | "Persona Description": "Описание персоны", | 555 | "Create a dummy persona": "Создать персону-болванку", |
| 787 | "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "Пример:\n [{{user}} is a 28-year-old Romanian cat girl.]", | ||
| 788 | "Tokens persona description": "Токенов", | ||
| 789 | "Position:": "Положение:", | ||
| 790 | "In Story String / Prompt Manager": "В строке истории / Менеджер промптов", | ||
| 791 | "Top of Author's Note": "Сверху от заметок автора", | ||
| 792 | "Bottom of Author's Note": "Снизу от заметок автора", | ||
| 793 | "In-chat @ Depth": "Встав. на глуб.", | ||
| 794 | "Depth:": "Глубина:", | ||
| 795 | "Role:": "Роль:", | ||
| 796 | "System": "Система", | ||
| 797 | "User": "Пользователь", | ||
| 798 | "Assistant": "Ассистент", | ||
| 799 | "Show notifications on switching personas": "Показывать уведомления при смене персоны", | ||
| 800 | "Character Management": "Управление персонажами", | 556 | "Character Management": "Управление персонажами", |
| 801 | "Locked = Character Management panel will stay open": "Закреплено = Панель управление персонажами останется открытой", | 557 | "Locked = Character Management panel will stay open": "Закреплено = Панель управление персонажами останется открытой", |
| 802 | "Select/Create Characters": "Выбрать/Создать персонажа", | 558 | "Select/Create Characters": "Выбрать/Создать персонажа", |
| 803 | "Favorite characters to add them to HotSwaps": "Чтобы включить персонажа в HotSwaps, добавьте его в Избранное", | ||
| 804 | "Token counts may be inaccurate and provided just for reference.": "Счетчик токенов может быть неточным, используйте как ориентир", | 559 | "Token counts may be inaccurate and provided just for reference.": "Счетчик токенов может быть неточным, используйте как ориентир", |
| 805 | "Total tokens": "Всего токенов", | ||
| 806 | "Calculating...": "Расчет...", | ||
| 807 | "Tokens": "токенов", | ||
| 808 | "Permanent tokens": "Постоянные токены", | ||
| 809 | "Permanent": "перманентных", | ||
| 810 | "About Token 'Limits'": "О лимитах токена", | ||
| 811 | "Toggle character info panel": "Показать / скрыть инфо-панель", | ||
| 812 | "Name this character": "Назовите этого персонажа", | ||
| 813 | "extension_token_counter": "Токенов:", | ||
| 814 | "Click to select a new avatar for this character": "Нажмите чтобы выбрать новый аватар для этого персонажа", | 560 | "Click to select a new avatar for this character": "Нажмите чтобы выбрать новый аватар для этого персонажа", |
| 561 | "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "Пример:\n [{{user}} is a 28-year-old Romanian cat girl.]", | ||
| 562 | "Toggle grid view": "Переключить вид сетки", | ||
| 815 | "Add to Favorites": "Добавить в Избранное", | 563 | "Add to Favorites": "Добавить в Избранное", |
| 816 | "Advanced Definition": "Расширенное определение", | 564 | "Advanced Definition": "Расширенное определение", |
| 817 | "Character Lore": "Лор персонажа", | 565 | "Character Lore": "Лор персонажа", |
| 818 | "Chat Lore": "Лор чата", | ||
| 819 | "Export and Download": "Экспортировать и скачать", | 566 | "Export and Download": "Экспортировать и скачать", |
| 820 | "Duplicate Character": "Дублировать персонажа", | 567 | "Duplicate Character": "Дублировать персонажа", |
| 821 | "Create Character": "Создать персонажа", | 568 | "Create Character": "Создать персонажа", |
| 822 | "Delete Character": "Удалить персонажа", | 569 | "Delete Character": "Удалить персонажа", |
| 823 | "More...": "Ещё...", | ||
| 824 | "Link to World Info": "Ссылка на информацию о мире", | ||
| 825 | "Import Card Lore": "Импортировать лор карточки", | ||
| 826 | "Scenario Override": "Перезапись сценария", | ||
| 827 | "Convert to Persona": "Преобразовать в персону", | ||
| 828 | "Rename": "Переименовать", | ||
| 829 | "Link to Source": "Ссылка на источник", | ||
| 830 | "Replace / Update": "Заменить / Обновить", | ||
| 831 | "Import Tags": "Импортировать теги", | ||
| 832 | "Search / Create Tags": "Искать / Создать тэги", | ||
| 833 | "View all tags": "Показать все тэги", | 570 | "View all tags": "Показать все тэги", |
| 834 | "Creator's Notes": "Заметки создателя", | ||
| 835 | "Show / Hide Description and First Message": "Показать / убрать описание и первое сообщение", | ||
| 836 | "Character Description": "Описание персонажа", | ||
| 837 | "Click to allow/forbid the use of external media for this character.": "Нажмите, чтобы разрешить/запретить использование внешних носителей для этого персонажа.", | ||
| 838 | "Ext. Media": "Внешн. медиа", | ||
| 839 | "Describe your character's physical and mental traits here.": "Опишите ментальные и физические черты персонажа", | ||
| 840 | "First message": "Первое сообщение", | ||
| 841 | "Click to set additional greeting messages": "Нажмите чтобы создать дополнительное вступительное сообщение", | 571 | "Click to set additional greeting messages": "Нажмите чтобы создать дополнительное вступительное сообщение", |
| 842 | "Alt. Greetings": "Др. варианты", | 572 | "Show / Hide Description and First Message": "Показать / убрать описание и первое сообщение", |
| 843 | "This will be the first message from the character that starts every chat.": "Это будет первое сообщение от персонажа при начале нового чата", | ||
| 844 | "Group Controls": "Управление группой", | ||
| 845 | "Chat Name (Optional)": "Название чата (необязательно)", | ||
| 846 | "Click to select a new avatar for this group": "Нажмите чтобы выбрать новый аватар для этой группы", | 573 | "Click to select a new avatar for this group": "Нажмите чтобы выбрать новый аватар для этой группы", |
| 847 | "Group reply strategy": "Персонажи отвечают...", | ||
| 848 | "Natural order": "По алфавиту", | ||
| 849 | "List order": "По списку", | ||
| 850 | "Group generation handling mode": "Генерировать ответы путём...", | ||
| 851 | "Swap character cards": "Подмены карточки персонажа", | ||
| 852 | "Join character cards (exclude muted)": "Совмещения карточек (кроме заглушенных)", | ||
| 853 | "Join character cards (include muted)": "Совмещения карточек (включая заглушенных)", | ||
| 854 | "Inserted before each part of the joined fields.": "Вставляется перед каждой частью соединяемых полей.", | ||
| 855 | "Join Prefix": "Префикс присоединения", | ||
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "При выборе «Объединить карты персонажей» все соответствующие поля персонажей объединяются.\rЭто означает, что, например, в строке истории все описания персонажей будут объединены в один большой текст.\rЕсли вы хотите, чтобы эти поля были разделены, вы можете определить здесь префикс или суффикс.\r\rЭто значение поддерживает обычные макросы, а также заменит {{char}} именем соответствующего символа и <FIELDNAME> именем части (например: описание, личность, сценарий и т. д.).", | ||
| 857 | "Inserted after each part of the joined fields.": "Вставляется после каждой части объединенных полей.", | ||
| 858 | "Join Suffix": "Присоединиться суффикс", | ||
| 859 | "Set a group chat scenario": "Задать сценарий для группового чата", | 574 | "Set a group chat scenario": "Задать сценарий для группового чата", |
| 860 | "Click to allow/forbid the use of external media for this group.": "Нажмите, чтобы разрешить/запретить использование внешних медиа в этой группе.", | ||
| 861 | "Restore collage avatar": "Восстановить аватар-коллаж", | 575 | "Restore collage avatar": "Восстановить аватар-коллаж", |
| 862 | "Allow self responses": "Разрешить ответ себе", | ||
| 863 | "Auto Mode": "Авто-режим", | ||
| 864 | "Auto Mode delay": "Задержка автоматического режима", | ||
| 865 | "Hide Muted Member Sprites": "Скрыть спрайты заглушенных участников", | ||
| 866 | "Current Members": "Текущие участники", | ||
| 867 | "Add Members": "Добавить участников", | ||
| 868 | "Create New Character": "Создать нового персонажа", | 576 | "Create New Character": "Создать нового персонажа", |
| 869 | "Import Character from File": "Импортировать персонажа из файла", | 577 | "Import Character from File": "Импортировать персонажа из файла", |
| 870 | "Import content from external URL": "Импортировать содержимое из внешнего URL", | 578 | "Import content from external URL": "Импортировать содержимое из внешнего URL", |
| 871 | "Create New Chat Group": "Создать новый групповой чат", | 579 | "Create New Chat Group": "Создать новый групповой чат", |
| 872 | "Characters sorting order": "Порядок сортировки персонажей", | 580 | "Characters sorting order": "Порядок сортировки персонажей", |
| 873 | "A-Z": "A-Z", | ||
| 874 | "Z-A": "Z-A", | ||
| 875 | "Newest": "Новейшие", | ||
| 876 | "Oldest": "Старейшие", | ||
| 877 | "Favorites": "Избранные", | ||
| 878 | "Recent": "Последние", | ||
| 879 | "Most chats": "Больше всего чатов", | ||
| 880 | "Least chats": "Меньше всего чатов", | ||
| 881 | "Most tokens": "Больше всего токенов", | ||
| 882 | "Least tokens": "Меньше всего токенов", | ||
| 883 | "Random": "Случайно", | ||
| 884 | "Toggle character grid view": "Изменить вид грида персонажей", | ||
| 885 | "Bulk_edit_characters": "Массовое редактирование персонажей", | ||
| 886 | "Bulk select all characters": "Массовый выбор всех персонажей", | ||
| 887 | "Bulk delete characters": "Массовое удаление персонажей", | ||
| 888 | "popup_text_save": "Сохранить", | ||
| 889 | "popup_text_yes": "Да", | ||
| 890 | "popup_text_no": "Нет", | ||
| 891 | "popup_text_cancel": "Отмена", | ||
| 892 | "popup_text_import": "Импортировать", | ||
| 893 | "Advanced Defininitions": "Расширенное описание", | ||
| 894 | "Prompt Overrides": "Индивидуальные промпты", | ||
| 895 | "(For Chat Completion and Instruct Mode)": "(для Chat Completion и режима Instruct)", | ||
| 896 | "Insert {{original}} into either box to include the respective default prompt from system settings.": "Введите {{original}} в любое поле, чтобы вставить соответствующий промпт из системных настроек", | ||
| 897 | "Main Prompt": "Основной промпт", | ||
| 898 | "Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "Все содержимое этого поля будет заменять стандартный промпт", | ||
| 899 | "Any contents here will replace the default Jailbreak Prompt used for this character. (v2 spec: post_history_instructions)": "Все содержимое этого поля будет заменять стандартный джейлбрейк", | ||
| 900 | "Creator's Metadata (Not sent with the AI prompt)": "Метаданные автора\n(Не отправляется с подсказкой AI)", | ||
| 901 | "Creator's Metadata": "Метаданные", | ||
| 902 | "(Not sent with the AI Prompt)": "(не отправляются ИИ)", | ||
| 903 | "Everything here is optional": "Все поля необязательные", | ||
| 904 | "(Botmaker's name / Contact Info)": "(Имя автора, контакты)", | ||
| 905 | "(If you want to track character versions)": "Если вы хотите отслеживать версии персонажа", | ||
| 906 | "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(Описание персонажа, советы по использованию, список моделей, на которых он тестировался. Информация будет отображаться в списке персонажей)", | ||
| 907 | "Tags to Embed": "Встраиваемые теги", | ||
| 908 | "(Write a comma-separated list of tags)": "(Список тегов через запятую)", | ||
| 909 | "Personality summary": "Резюме по личности", | ||
| 910 | "(A brief description of the personality)": "(Краткое описание личности)", | ||
| 911 | "Scenario": "Сценарий", | ||
| 912 | "(Circumstances and context of the interaction)": "(Обстоятельства и контекст этого диалога)", | ||
| 913 | "Character's Note": "Заметка о персонаже", | ||
| 914 | "(Text to be inserted in-chat @ designated depth and role)": "Этот текст будет вставлен в чат на заданную глубину и с определённой ролью", | ||
| 915 | "@ Depth": "Глубина", | ||
| 916 | "Role": "Роль", | ||
| 917 | "Talkativeness": "Разговорчивость", | ||
| 918 | "How often the character speaks in group chats!": "Как часто персонаж общается в групповых чатах!", | ||
| 919 | "How often the character speaks in": "Как часто персонаж говорит в", | ||
| 920 | "group chats!": "групповых чатах!", | ||
| 921 | "Shy": "Застенчивый", | ||
| 922 | "Normal": "Обычный", | ||
| 923 | "Chatty": "Разговорчивый", | ||
| 924 | "Examples of dialogue": "Примеры диалога", | ||
| 925 | "Important to set the character's writing style.": "Серьёзно влияет на стиль письма персонажа.", | ||
| 926 | "(Examples of chat dialog. Begin each example with START on a new line.)": "(Примеры диалога. Начинайте каждый пример с START или новой линией.)", | ||
| 927 | "Save": "Сохранить", | ||
| 928 | "Chat History": "История чата", | ||
| 929 | "Import Chat": "Импорт чата", | ||
| 930 | "Copy to system backgrounds": "Копировать в системные фоны", | ||
| 931 | "Rename background": "Переименовать фон", | ||
| 932 | "Lock": "Закрепить", | ||
| 933 | "Unlock": "Открепить", | ||
| 934 | "Delete background": "Удалить фон", | ||
| 935 | "Chat Scenario Override": "Переопределение сценария чата", | ||
| 936 | "Remove": "Убрать", | 581 | "Remove": "Убрать", |
| 937 | "Type here...": "Пишите здесь...", | ||
| 938 | "Chat Lorebook": "Чат История знаний для", | ||
| 939 | "Chat Lorebook for": "Лорбук для чата", | ||
| 940 | "chat_world_template_txt": "Выбранный мир будет привязан к этому чату. При генерации ответа ИИ он будет совмещён с записями из глобального лорбука и лорбука персонажа.", | ||
| 941 | "Select a World Info file for": "Выбрать файл с миром для", | 582 | "Select a World Info file for": "Выбрать файл с миром для", |
| 942 | "Primary Lorebook": "Основного лорбука", | 583 | "Primary Lorebook": "Основного лорбука", |
| 943 | "A selected World Info will be bound to this character as its own Lorebook.": "Информация о мире будет привязана к персонажу как его собственный лорбук", | 584 | "A selected World Info will be bound to this character as its own Lorebook.": "Информация о мире будет привязана к персонажу как его собственный лорбук", |
| @@ -946,133 +587,22 @@ | |||
| 946 | "Additional Lorebooks": "Вспомогательные лорбуки", | 587 | "Additional Lorebooks": "Вспомогательные лорбуки", |
| 947 | "Associate one or more auxillary Lorebooks with this character.": "Привязать к этому персонажу один или больше вспомогательных лорбуков", | 588 | "Associate one or more auxillary Lorebooks with this character.": "Привязать к этому персонажу один или больше вспомогательных лорбуков", |
| 948 | "NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: эти выборы необязательные и не будут сохранены при экспорте персонажа!", | 589 | "NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: эти выборы необязательные и не будут сохранены при экспорте персонажа!", |
| 949 | "Rename chat file": "Переименовать чат", | 590 | "Rename chat file": "Переименовать чат", |
| 950 | "Export JSONL chat file": "Экспортировать чат в формате JSONL", | 591 | "Export JSONL chat file": "Экспортировать чат в формате JSONL", |
| 951 | "Download chat as plain text document": "Скачать чат в формате .txt", | 592 | "Download chat as plain text document": "Скачать чат в формате .txt", |
| 952 | "Delete chat file": "Удалить файл этого чата", | 593 | "Delete chat file": "Удалить файл этого чата", |
| 953 | "Use tag as folder": "Пометить как папку", | 594 | "Delete tag": "Удалить тэг", |
| 954 | "Delete tag": "Удалить тэг", | ||
| 955 | "Entry Title/Memo": "Название или заметка о записи", | ||
| 956 | "WI Entry Status:🔵 Constant🟢 Normal🔗 Vectorized❌ Disabled": "Статус записи в WI:\r🔵 Постоянно\r🟢 Нормальный\r🔗 Векторизованный\r❌ Отключено", | ||
| 957 | "WI_Entry_Status_Constant": "Постоянный", | ||
| 958 | "WI_Entry_Status_Normal": "Нормальный", | ||
| 959 | "WI_Entry_Status_Vectorized": "Векторизованный", | ||
| 960 | "WI_Entry_Status_Disabled": "Неполноценный", | ||
| 961 | "T_Position": "↑Char: Перед определениями Персонажа\n↓Char: После определений Персонажа\n↑AN: Перед Пометок автора\n↓AN: После Пометок автора\n@D: На глубине", | ||
| 962 | "Before Char Defs": "↑Перс.", | ||
| 963 | "After Char Defs": "↓Перс.", | ||
| 964 | "Before EM": "↑ЭМ", | ||
| 965 | "After EM": "↓ЕМ", | ||
| 966 | "Before AN": "↑АЗ", | ||
| 967 | "After AN": "↓АЗ", | ||
| 968 | "at Depth System": "@Д ⚙️", | ||
| 969 | "at Depth User": "@Д 👤", | ||
| 970 | "at Depth AI": "@Д 🤖", | ||
| 971 | "Depth": "Глубина", | ||
| 972 | "Order:": "Порядок:", | ||
| 973 | "Order": "Порядок:", | ||
| 974 | "Trigger %:": "Курок %:", | ||
| 975 | "Probability": "Вероятность", | ||
| 976 | "Duplicate world info entry": "Дублированная запись информации о мире", | ||
| 977 | "Delete world info entry": "Удалить запись о мире", | ||
| 978 | "Comma separated (required)": "Через запятую (обязательное поле)", | ||
| 979 | "Primary Keywords": "Основные ключевые слова", | ||
| 980 | "Keywords or Regexes": "Ключевые слова или регулярные выражения", | ||
| 981 | "Comma separated list": "Список, разделенный запятыми", | ||
| 982 | "Switch to plaintext mode": "Переключиться в режим открытого текста", | ||
| 983 | "Logic": "Логика", | ||
| 984 | "AND ANY": "И ЛЮБОЙ", | ||
| 985 | "AND ALL": "И ВСЕ", | ||
| 986 | "NOT ALL": "НЕ ВСЕ", | ||
| 987 | "NOT ANY": "НЕ ЛЮБОЙ", | ||
| 988 | "(ignored if empty)": "(игнорируется, если пусто)", | ||
| 989 | "Optional Filter": "Дополнительный фильтр", | ||
| 990 | "Keywords or Regexes (ignored if empty)": "Ключевые слова или регулярные выражения (игнорируются, если пусто)", | ||
| 991 | "Comma separated list (ignored if empty)": "Список, разделенный запятыми (игнорируется, если он пуст)", | ||
| 992 | "Use global setting": "Использовать глобальную настройку", | ||
| 993 | "Case-Sensitive": "С учетом регистра", | ||
| 994 | "Yes": "Да", | ||
| 995 | "No": "Нет", | ||
| 996 | "Can be used to automatically activate Quick Replies": "Может использоваться для автоматической активации быстрых ответов.", | ||
| 997 | "Automation ID": "Идентификатор автоматизации", | ||
| 998 | "( None )": "( Никто )", | ||
| 999 | "Content": "Содержание", | ||
| 1000 | "Exclude from recursion": "Исключить из рекурсии", | ||
| 1001 | "Prevent further recursion (this entry will not activate others)": "Пресечь дальнейшую рекурсию (эта запись не будет активировать другие)", | ||
| 1002 | "Delay until recursion (this entry can only be activated on recursive checking)": "Задержка до рекурсии (эту запись можно активировать только при рекурсивной проверке)", | ||
| 1003 | "What this keyword should mean to the AI, sent verbatim": "Что это ключевое слово должно означать для ИИ, отправляется дословно", | ||
| 1004 | "Filter to Character(s)": "Фильтр по персонажу(ам)", | ||
| 1005 | "Character Exclusion": "Исключить персонажей", | ||
| 1006 | "-- Characters not found --": "-- Персонажей не найдено --", | ||
| 1007 | "Inclusion Group": "Включить персонажей", | ||
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Группы включения гарантируют, что одновременно активируется только одна запись из группы, если активировано несколько.\rПоддерживает несколько групп, разделенных запятыми.\r\rДокументация: World Info - Группа включения", | ||
| 1009 | "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Если приоритет имеют несколько, выбирается тот, у которого самый высокий «Порядок».", | ||
| 1010 | "Only one entry with the same label will be activated": "Будет активна только одна запись с одинаковой меткой", | ||
| 1011 | "A relative likelihood of entry activation within the group": "Относительная вероятность активации входа внутри группы", | ||
| 1012 | "Group Weight": "Вес группы", | ||
| 1013 | "Selective": "Выборочно", | ||
| 1014 | "Use Probability": "Использовать вероятность", | ||
| 1015 | "Add Memo": "Добавить памятку", | ||
| 1016 | "Text or token ids": "Текст или [идентификаторы токенов]", | ||
| 1017 | "close": "закрывать", | ||
| 1018 | "prompt_manager_edit": "Редактирование", | ||
| 1019 | "prompt_manager_name": "Имя", | ||
| 1020 | "A name for this prompt.": "Имя данного промпта.", | ||
| 1021 | "To whom this message will be attributed.": "От чьего лица будет отправляться сообщение.", | ||
| 1022 | "AI Assistant": "ИИ-ассистент", | ||
| 1023 | "prompt_manager_position": "Точка инжекта", | ||
| 1024 | "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Как рассчитывать позицию для инжекта. Она может располагаться по отношению к другим промптам (относительная) либо по отношению к чату (абсолютная).", | ||
| 1025 | "prompt_manager_relative": "Относительная", | ||
| 1026 | "prompt_manager_absolute": "Абсолютная", | ||
| 1027 | "prompt_manager_depth": "Глубина", | ||
| 1028 | "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Глубина вставки. 0 = после последнего сообщения, 1 = перед последним сообщением, и т.д.", | ||
| 1029 | "Prompt": "Промпт", | ||
| 1030 | "The prompt to be sent.": "Отправляемый ИИ промпт.", | ||
| 1031 | "This prompt cannot be overridden by character cards, even if overrides are preferred.": "Карточка персонажа не сможет перезаписать этот промпт, даже если настройки отдают приоритет именно ей.", | ||
| 1032 | "prompt_manager_forbid_overrides": "Запретить перезапись", | ||
| 1033 | "reset": "перезагрузить", | ||
| 1034 | "save": "сохранять", | ||
| 1035 | "This message is invisible for the AI": "Это сообщение невидимо для ИИ", | ||
| 1036 | "Message Actions": "Действия с сообщением", | ||
| 1037 | "Translate message": "Перевести сообщение", | 595 | "Translate message": "Перевести сообщение", |
| 1038 | "Generate Image": "Создать изображение", | 596 | "Generate Image": "Создать изображение", |
| 1039 | "Narrate": "Повествовать", | 597 | "Narrate": "Повествовать", |
| 1040 | "Exclude message from prompts": "Исключить сообщение из промпта", | 598 | "Prompt": "Промпт", |
| 1041 | "Include message in prompts": "Включить сообщение в подсказки", | ||
| 1042 | "Embed file or image": "Вставить файл или изображение", | ||
| 1043 | "Create checkpoint": "Создать чекпоинт", | ||
| 1044 | "Create Branch": "Создать ветку", | ||
| 1045 | "Copy": "Скопировать", | 599 | "Copy": "Скопировать", |
| 1046 | "Open checkpoint chat": "Открыть чат на контрольно-пропускном пункте", | ||
| 1047 | "Edit": "Редактировать", | ||
| 1048 | "Confirm": "Подтвердить", | 600 | "Confirm": "Подтвердить", |
| 1049 | "Copy this message": "Скопировать сообщение", | 601 | "Copy this message": "Скопировать сообщение", |
| 1050 | "Delete this message": "Удалить сообщение", | 602 | "Delete this message": "Удалить сообщение", |
| 1051 | "Move message up": "Переместить сообщение вверх", | 603 | "Move message up": "Переместить сообщение вверх", |
| 1052 | "Move message down": "Переместить сообщение вниз", | 604 | "Move message down": "Переместить сообщение вниз", |
| 1053 | "Enlarge": "Увеличить", | 605 | "Enlarge": "Увеличить", |
| 1054 | "Welcome to SillyTavern!": "Добро пожаловать в SillyTavern!", | ||
| 1055 | "welcome_message_part_1": "Ознакомьтесь с", | ||
| 1056 | "welcome_message_part_2": "официальной документацией", | ||
| 1057 | "welcome_message_part_3": ".", | ||
| 1058 | "welcome_message_part_4": "Введите", | ||
| 1059 | "welcome_message_part_5": "в чате, чтобы получить справку по командам и макросам.", | ||
| 1060 | "welcome_message_part_6": "Заходите на наш", | ||
| 1061 | "Discord server": "Discord-сервер,", | ||
| 1062 | "welcome_message_part_7": "там публикуется много разной полезной информации, в том числе анонсы.", | ||
| 1063 | "SillyTavern is aimed at advanced users.": "SillyTavern рассчитана на продвинутых пользователей.", | ||
| 1064 | "If you're new to this, enable the simplified UI mode below.": "Если вы новичок, советуем включить упрощённый UI.", | ||
| 1065 | "Change it later in the 'User Settings' panel.": "Его можно будет выключить в меню \"Настройки пользователя\"", | ||
| 1066 | "Enable simple UI mode": "Включить упрощённый UI", | ||
| 1067 | "Looking for AI characters?": "Ищете ИИ-персонажей?", | ||
| 1068 | "onboarding_import": "Импортируйте", | ||
| 1069 | "from supported sources or view": "из источника или посмотрите", | ||
| 1070 | "Sample characters": "Стандартных персонажей", | ||
| 1071 | "Your Persona": "Ваша персона", | ||
| 1072 | "Before you get started, you must select a persona name.": "Для начала вам следует выбрать имя своей персоны.", | ||
| 1073 | "welcome_message_part_8": "Его можно будет изменить в любое время через иконку", | ||
| 1074 | "welcome_message_part_9": ".", | ||
| 1075 | "Persona Name:": "Имя персоны:", | ||
| 1076 | "Temporarily disable automatic replies from this character": "Временно отключить автоматические сообщения от этого персонажа", | 606 | "Temporarily disable automatic replies from this character": "Временно отключить автоматические сообщения от этого персонажа", |
| 1077 | "Enable automatic replies from this character": "Включить автоматическую отправку сообщения этого персонажа", | 607 | "Enable automatic replies from this character": "Включить автоматическую отправку сообщения этого персонажа", |
| 1078 | "Trigger a message from this character": "Запросить сообщение от этого персонажа", | 608 | "Trigger a message from this character": "Запросить сообщение от этого персонажа", |
| @@ -1081,37 +611,212 @@ | |||
| 1081 | "View character card": "Посмотреть карточку персонажа", | 611 | "View character card": "Посмотреть карточку персонажа", |
| 1082 | "Remove from group": "Убрать из группы", | 612 | "Remove from group": "Убрать из группы", |
| 1083 | "Add to group": "Добавить в группу", | 613 | "Add to group": "Добавить в группу", |
| 1084 | "Alternate Greetings": "Альтернативные приветствия", | 614 | "Add": "Добавить", |
| 1085 | "Alternate_Greetings_desc": "Они будут отображаться в виде пролистывания первого сообщения при запуске нового чата.\n Члены группы могут выбрать одного из них, чтобы начать разговор.", | 615 | "Abort request": "Прекратить генерацию", |
| 1086 | "Alternate Greetings Hint": "Нажмите кнопку, чтобы начать!", | 616 | "Send a message": "Отправить сообщение", |
| 1087 | "(This will be the first message from the character that starts every chat)": "(Это будет первое сообщение от персонажа, когда вы начинаете новый чат)", | 617 | "Ask AI to write your message for you": "Попросить ИИ написать сообщение за вас", |
| 1088 | "Forbid Media Override explanation": "Возможность текущего персонажа/группы использовать внешние носители в чатах.", | 618 | "Continue the last message": "Продолжить текущее сообщение", |
| 1089 | "Forbid Media Override subtitle": "Медиа: изображения, видео, аудио. Внешний: не размещается на локальном сервере.", | 619 | "Bind user name to that avatar": "Закрепить имя за этим аватаром", |
| 1090 | "Always forbidden": "Всегда запрещено", | 620 | "Select this as default persona for the new chats.": "Выберать эту Персону в качестве персоны по умолчанию для новых чатов.", |
| 1091 | "Always allowed": "всегда разрешено", | 621 | "Change persona image": "Сменить аватар персоны", |
| 1092 | "View contents": "Посмотреть содержимое", | 622 | "Delete persona": "Удалить персону", |
| 1093 | "Remove the file": "Удалить файл", | 623 | "Reduced Motion": "Сокращение анимаций", |
| 624 | "Auto-select": "Авто-выбор", | ||
| 625 | "Automatically select a background based on the chat context": "Автоматический выбор фона в зависимости от контекста чата", | ||
| 626 | "Filter": "Фильтр", | ||
| 627 | "Exclude message from prompts": "Исключить сообщение из промпта", | ||
| 628 | "Include message in prompts": "Включить сообщение в подсказки", | ||
| 629 | "Create checkpoint": "Создать чекпоинт", | ||
| 630 | "Create Branch": "Создать ветку", | ||
| 631 | "Embed file or image": "Вставить файл или изображение", | ||
| 632 | "UI Theme": "Тема UI", | ||
| 633 | "This message is invisible for the AI": "Это сообщение невидимо для ИИ", | ||
| 634 | "Sampler Priority": "Приоритет сэмплеров", | ||
| 635 | "Ooba only. Determines the order of samplers.": "Только Ooba. Определяет порядок сэмплеров.", | ||
| 636 | "Load default order": "Загрузить стандартный порядок", | ||
| 637 | "Max Tokens Second": "Макс. кол-во токенов в секунду", | ||
| 638 | "CFG": "CFG", | ||
| 639 | "Extras API key (optional)": "Ключ от Extras API (необязательно)", | ||
| 640 | "Notify on extension updates": "Уведомлять об обновлениях расширений", | ||
| 641 | "Toggle character grid view": "Изменить вид грида персонажей", | ||
| 642 | "Bulk delete characters": "Массовое удаление персонажей", | ||
| 643 | "Favorite characters to add them to HotSwaps": "Чтобы включить персонажа в HotSwaps, добавьте его в Избранное", | ||
| 644 | "Underlined Text": "Подчёркнутый", | ||
| 645 | "Token Probabilities": "Вероятности токенов", | ||
| 646 | "Close chat": "Закрыть чат", | ||
| 647 | "Manage chat files": "Все чаты", | ||
| 648 | "Import Extension From Git Repo": "Импортировать расширение из Git Repository", | ||
| 649 | "Install extension": "Установить расширение", | ||
| 650 | "Manage extensions": "Управление расширениями", | ||
| 651 | "Tokens persona description": "Токенов", | ||
| 652 | "Most tokens": "Больше всего токенов", | ||
| 653 | "Least tokens": "Меньше всего токенов", | ||
| 654 | "Random": "Случайно", | ||
| 655 | "Skip Example Dialogues Formatting": "Пропустить форматирование примеров диалогов", | ||
| 656 | "Import a theme file": "Импортировать файл темы", | ||
| 657 | "Export a theme file": "Экспортировать файл темы", | ||
| 658 | "Unlocked Context Size": "Неограниченный размер контекста", | ||
| 659 | "Display the response bit by bit as it is generated.": "Выводить текст последовательно по мере его генерации.", | ||
| 660 | "When this is off, responses will be displayed all at once when they are complete.": "Если параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", | ||
| 661 | "Quick Prompts Edit": "Быстрое редактирование промптов", | ||
| 662 | "Enable OpenAI completion streaming": "Включить стриминг OpenAI", | ||
| 663 | "Main": "Основной", | ||
| 664 | "Utility Prompts": "Служебные промпты", | ||
| 665 | "Continue prefill": "Префилл для продолжения", | ||
| 666 | "Continue sends the last message as assistant role instead of system message with instruction.": "Продолжение отправляет последнее сообщение в роли ассистента, вместо системного сообщения с инструкцией.", | ||
| 667 | "Squash system messages": "Склеивать сообщения системы", | ||
| 668 | "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "Объединяет последовательные системные сообщения в одно (за исключением примеров диалогов). У некоторых моделей может улучшить логичность ответов.", | ||
| 669 | "Send inline images": "Отправлять inline-картинки", | ||
| 670 | "Assistant Prefill": "Префилл для ассистента", | ||
| 671 | "Start Claude's answer with...": "Начать ответ Клода с...", | ||
| 672 | "Use system prompt (Claude 2.1+ only)": "Использовать системный промпт (только Claude 2.1+)", | ||
| 673 | "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "Отправлять системный промпт для поддерживаемых моделей. Если отключено, в начало промпта добавляется сообщение пользователя.", | ||
| 674 | "Prompts": "Промпты", | ||
| 675 | "Total Tokens:": "Всего токенов:", | ||
| 676 | "Insert prompt": "Вставить промпт", | ||
| 677 | "Delete prompt": "Удалить промпт", | ||
| 678 | "Import a prompt list": "Импортировать список промптов", | ||
| 679 | "Export this prompt list": "Экспортировать этот список промптов", | ||
| 680 | "Reset current character": "Сбросить текущего персонажа", | ||
| 681 | "New prompt": "Новый промпт", | ||
| 682 | "Tokens": "токенов", | ||
| 683 | "Want to update?": "Хотите обновиться?", | ||
| 684 | "How to start chatting?": "Как начать общение?", | ||
| 685 | "and select a": " и выберите ", | ||
| 686 | "Chat API": "API чата", | ||
| 687 | "in the chat bar": " в поле чата", | ||
| 688 | "Confused or lost?": "Не можете в чём-то разобраться?", | ||
| 689 | "click these icons!": "нажмите на эти значки!", | ||
| 690 | "SillyTavern Documentation Site": "Сайт документации SillyTavern", | ||
| 691 | "Extras Installation Guide": "Руководство по установке Extras", | ||
| 692 | "Still have questions?": "Остались вопросы?", | ||
| 693 | "Join the SillyTavern Discord": "Заходите на сервер SillyTavern в Discord", | ||
| 694 | "Post a GitHub issue": "Опубликуйте GitHub issue", | ||
| 695 | "Contact the developers": "Свяжитесь с разработчиками", | ||
| 696 | "Nucleus Sampling": "Nucleus Sampling", | ||
| 697 | "Typical P": "Typical P", | ||
| 698 | "Top K Sampling": "Top K", | ||
| 699 | "Top A Sampling": "Top A", | ||
| 700 | "Off": "Выключено", | ||
| 701 | "Very light": "Очень легкий", | ||
| 702 | "Light": "Легкий", | ||
| 703 | "Medium": "Средний", | ||
| 704 | "Aggressive": "Агрессивный", | ||
| 705 | "Very aggressive": "Очень агрессивный", | ||
| 706 | "Eta_Cutoff_desc": "Eta cutoff - основной параметр специальной техники сэмплинга под названием Eta Sampling. В единицах 1e-4; разумное значение - 3. Установите в 0, чтобы отключить. См. статью Truncation Sampling as Language Model Desmoothing от Хьюитт и др. (2022) для получения подробной информации.", | ||
| 707 | "Learn how to contribute your idle GPU cycles to the Horde": "Узнайте, как внести свой вклад в свои свободные GPU-циклы в орду", | ||
| 708 | "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "Используйте соответствующий токенизатор для моделей Google через их API. Медленная обработка подсказок, но предлагает намного более точный подсчет токенов.", | ||
| 709 | "Load koboldcpp order": "Загрузить порядок из koboldcpp", | ||
| 710 | "Use Google Tokenizer": "Использовать токенизатор Google", | ||
| 711 | "koboldcpp API key (optional)": "Ключ от API koboldcpp (необязательно)", | ||
| 712 | "Reverse Proxy": "Прокси", | ||
| 713 | "Use Proxy password field instead. This input will be ignored.": "Используйте поле \"Пароль от прокси\". Значение в этом окошке игнорируется", | ||
| 714 | "Proxy Password": "Пароль от прокси", | ||
| 715 | "Will be used as a password for the proxy instead of API key.": "Будет использован в качестве пароля от прокси вместо ключа от API", | ||
| 716 | "Proxy Presets": "Пресеты для прокси", | ||
| 717 | "Saved addresses and passwords.": "Сохранённые адреса и пароли.", | ||
| 718 | "Save Proxy": "Сохранить прокси", | ||
| 719 | "Delete Proxy": "Удалить прокси", | ||
| 720 | "Proxy Name": "Название прокси", | ||
| 721 | "This will show up as your saved preset.": "Будет отображено в вашем списке пресетов.", | ||
| 722 | "Proxy Server URL": "Адрес прокси-сервера", | ||
| 723 | "MistralAI Model": "Модель MistralAI", | ||
| 724 | "MistralAI API Key": "Ключ от API MistralAI", | ||
| 725 | "MakerSuite API Key": "Ключ от API MakerSuite", | ||
| 726 | "Google Model": "Модель Google", | ||
| 727 | "Cohere API Key": "Ключ от API Cohere", | ||
| 728 | "Cohere Model": "Модель Cohere", | ||
| 729 | "Model Order": "Сортировка моделей OpenRouter", | ||
| 730 | "Alphabetically": "По алфавиту", | ||
| 731 | "Price": "По цене (наиболее низкая)", | ||
| 732 | "Context Size": "По размеру контекста", | ||
| 733 | "Group by vendors": "Сгруппировать по владельцу", | ||
| 734 | "Group by vendors Description": "Модели от OpenAI попадут в одну группу, от Anthropic - в другую, и т.д. Можно комбинировать с сортировкой.", | ||
| 735 | "LEGACY": "УСТАР.", | ||
| 736 | "Force Instruct Mode formatting": "Включить форматирование для Instruct-режима", | ||
| 737 | "Allow Jailbreak": "Разрешить джейлбрейк", | ||
| 738 | "System Prompt Wrapping": "Обрамление для системного промпта", | ||
| 739 | "System Prompt Prefix": "Префикс системного промпта", | ||
| 740 | "System Prompt Suffix": "Постфикс системного промпта", | ||
| 741 | "Chat Messages Wrapping": "Обрамление для сообщений в чате", | ||
| 742 | "User Message Prefix": "Префикс сообщения пользователя", | ||
| 743 | "User Message Suffix": "Постфикс сообщения пользователя", | ||
| 744 | "Assistant Message Prefix": "Префикс сообщения ассистента", | ||
| 745 | "Assistant Message Suffix": "Постфикс сообщения ассистента", | ||
| 746 | "System Message Prefix": "Префикс сообщения системы", | ||
| 747 | "System Message Suffix": "Постфикс сообщения системы", | ||
| 748 | "System same as User": "Для системы то же самое, что и для пользователя", | ||
| 749 | "Misc. Sequences": "Прочие строки", | ||
| 750 | "First Assistant Prefix": "Первый префикс ассистента", | ||
| 751 | "Last Assistant Prefix": "Последний префикс ассистента", | ||
| 752 | "System Instruction Prefix": "Префикс системной инструкции", | ||
| 753 | "User Filler Message": "Принудительное сообщение пользователя", | ||
| 754 | "Permanent": "перманентных", | ||
| 755 | "Alt. Greetings": "Др. варианты", | ||
| 756 | "Smooth Streaming": "Плавный стриминг", | ||
| 757 | "Save checkpoint": "Сохранить чекпоинт", | ||
| 758 | "Min Activations": "Мин. число активаций", | ||
| 759 | "Scan chronologically until reached min entries or token budget.": "Сканировать в хронологической последовательности, пока не будет достигнуто мин. число вхождений или не израсходуется бюджет токенов.", | ||
| 760 | "Max Depth": "Макс. глубина", | ||
| 761 | "(0 = unlimited, use budget)": "(0 = безграничная, использовать бюджет)", | ||
| 762 | "Ext. Media": "Внешн. медиа", | ||
| 763 | "Multiple swipes per generation": "Несколько свайпов на генерацию", | ||
| 764 | "Set to get deterministic results. Use -1 for random seed.": "Используется для получения предсказуемого результата. Введите -1 для случайного зерна", | ||
| 765 | "Most tokens have a leading space.": "У большинства токенов в начале пробел.", | ||
| 766 | "Text or token ids": "Текст или [идентификаторы токенов]", | ||
| 767 | "World Info Format Template": "Шаблон оформления информации о мире", | ||
| 768 | "Wraps activated World Info entries before inserting into the prompt.": "Дополняет информацию об активном на данный момент мире перед её отправкой в промпт.", | ||
| 769 | "Doesn't work? Try adding": "Не работает? Попробуйте добавить в конце", | ||
| 770 | "at the end!": "!", | ||
| 771 | "Authorize": "Авторизоваться", | ||
| 772 | "No persona description": "[Нет описания]", | ||
| 773 | "Not connected to API!": "Нет соединения с API!", | ||
| 774 | "Type a message, or /? for help": "Введите сообщение, или /? для получения справки", | ||
| 775 | "Welcome to SillyTavern!": "Добро пожаловать в SillyTavern!", | ||
| 776 | "Won't be shared with the character card on export.": "Не попадут в карточку персонажа при экспорте.", | ||
| 777 | "Web-search": "Веб-поиск", | ||
| 778 | "Persona Name:": "Имя персоны:", | ||
| 779 | "User first message": "Первое сообщение пользователя", | ||
| 780 | "extension_token_counter": "Токенов:", | ||
| 781 | "Character's Note": "Заметка о персонаже", | ||
| 782 | "(Text to be inserted in-chat @ designated depth and role)": "Этот текст будет вставлен в чат на заданную глубину и с определённой ролью", | ||
| 783 | "@ Depth": "Глубина", | ||
| 784 | "Role": "Роль", | ||
| 785 | "System": "Система", | ||
| 786 | "User": "Пользователь", | ||
| 787 | "Assistant": "Ассистент", | ||
| 788 | "How often the character speaks in": "Как часто персонаж говорит в", | ||
| 789 | "Creator's Metadata": "Метаданные", | ||
| 790 | "(Not sent with the AI Prompt)": "(не отправляются ИИ)", | ||
| 791 | "New Chat": "Новый чат", | ||
| 792 | "Import Chat": "Импорт чата", | ||
| 793 | "Chat Lore": "Лор чата", | ||
| 794 | "Chat Lorebook for": "Лорбук для чата", | ||
| 795 | "Missing key": "❌ Ключа нет", | ||
| 796 | "Key saved": "✔️ Ключ сохранён", | ||
| 797 | "Use the appropriate tokenizer for Jurassic models, which is more efficient than GPT's.": "Использовать токенайзер для моделей Jurassic, эффективнее GPT-токенайзера", | ||
| 798 | "Experimental feature. May not work for all backends.": "Экспериментальная возможность, на некоторых бэкендах может не работать.", | ||
| 799 | "Avatar Hover Magnification": "Зум аватарки по наведению", | ||
| 800 | "Enable magnification for zoomed avatar display.": "Добавляет возможность приближать увеличенную версию аватарки.", | ||
| 1094 | "Unique to this chat": "Только для текущего чата", | 801 | "Unique to this chat": "Только для текущего чата", |
| 1095 | "Checkpoints inherit the Note from their parent, and can be changed individually after that.": "Чекпоинты наследуют заметки от родительского чата, но впоследствие их всегда можно изменить.", | 802 | "Checkpoints inherit the Note from their parent, and can be changed individually after that.": "Чекпоинты наследуют заметки от родительского чата, но впоследствие их всегда можно изменить.", |
| 1096 | "Include in World Info Scanning": "Учитывать при сканировании Информации о мире", | 803 | "Include in World Info Scanning": "Учитывать при сканировании Информации о мире", |
| 1097 | "Before Main Prompt / Story String": "Перед основным промптом / строкой истории", | 804 | "Before Main Prompt / Story String": "Перед основным промптом / строкой истории", |
| 1098 | "After Main Prompt / Story String": "После основного промпта / строки истории", | 805 | "After Main Prompt / Story String": "После основного промпта / строки истории", |
| 806 | "In-chat @ Depth": "Встав. на глуб.", | ||
| 1099 | "as": "роль:", | 807 | "as": "роль:", |
| 1100 | "Insertion Frequency": "Частота вставки", | 808 | "Insertion Frequency": "Частота вставки", |
| 1101 | "(0 = Disable, 1 = Always)": "(0 = никогда, 1 = всегда)", | 809 | "(0 = Disable, 1 = Always)": "(0 = никогда, 1 = всегда)", |
| 1102 | "User inputs until next insertion:": "Ваших сообщений до след. вставки:", | 810 | "User inputs until next insertion:": "Ваших сообщений до след. вставки:", |
| 1103 | "Character Author's Note (Private)": "Заметки автора персонажа (личные)", | 811 | "Character Author's Note (Private)": "Заметки автора персонажа (личные)", |
| 1104 | "Won't be shared with the character card on export.": "Не попадут в карточку персонажа при экспорте.", | ||
| 1105 | "Will be automatically added as the author's note for this character. Will be used in groups, but can't be modified when a group chat is open.": "Автоматически применятся к этому персонажу в качестве заметок автора. Будут использоваться в группах, но при активном групповом чате к редактированию недоступны.", | 812 | "Will be automatically added as the author's note for this character. Will be used in groups, but can't be modified when a group chat is open.": "Автоматически применятся к этому персонажу в качестве заметок автора. Будут использоваться в группах, но при активном групповом чате к редактированию недоступны.", |
| 1106 | "Use character author's note": "Использовать заметки автора персонажа", | 813 | "Use character author's note": "Использовать заметки автора персонажа", |
| 1107 | "Replace Author's Note": "Вместо заметок автора", | 814 | "Replace Author's Note": "Вместо заметок автора", |
| 1108 | "Default Author's Note": "Стандартные заметки автора", | 815 | "Default Author's Note": "Стандартные заметки автора", |
| 1109 | "Will be automatically added as the Author's Note for all new chats.": "Будут автоматически добавляться во все новые чаты в качестве Заметок автора", | 816 | "Will be automatically added as the Author's Note for all new chats.": "Будут автоматически добавляться во все новые чаты в качестве Заметок автора", |
| 1110 | "Chat CFG": "CFG для чата", | ||
| 1111 | "1 = disabled": "1 = откл.", | 817 | "1 = disabled": "1 = откл.", |
| 1112 | "write short replies, write replies using past tense": "пиши короткие ответы, пиши в настоящем времени", | 818 | "write short replies, write replies using past tense": "пиши короткие ответы, пиши в настоящем времени", |
| 1113 | "Positive Prompt": "Положительный промпт", | 819 | "Positive Prompt": "Положительный промпт", |
| 1114 | "Use character CFG scales": "Используйте масштабы компьютерной графики персонажей.", | ||
| 1115 | "Character CFG": "CFG для персонажа", | 820 | "Character CFG": "CFG для персонажа", |
| 1116 | "Will be automatically added as the CFG for this character.": "Автоматически применится к персонажу как его CFG.", | 821 | "Will be automatically added as the CFG for this character.": "Автоматически применится к персонажу как его CFG.", |
| 1117 | "Global CFG": "Глобальный CFG", | 822 | "Global CFG": "Глобальный CFG", |
| @@ -1125,76 +830,95 @@ | |||
| 1125 | "Global Negatives": "Глобальные негативы", | 830 | "Global Negatives": "Глобальные негативы", |
| 1126 | "Custom Separator:": "Кастомный разделитель:", | 831 | "Custom Separator:": "Кастомный разделитель:", |
| 1127 | "Insertion Depth:": "Глубина вставки:", | 832 | "Insertion Depth:": "Глубина вставки:", |
| 1128 | "Token Probabilities": "Вероятности токенов", | 833 | "Chat CFG": "CFG для чата", |
| 1129 | "Select a token to see alternatives considered by the AI.": "Выберите токен, чтобы увидеть альтернативы, рассматриваемые ИИ.", | 834 | "bg_chat_hint_1": "Здесь будут появляться фоны, сгенерированные расширением", |
| 1130 | "Not connected to API!": "Нет соединения с API!", | 835 | "bg_chat_hint_2": ".", |
| 1131 | "Type a message, or /? for help": "Введите сообщение, или /? для получения справки по командам", | 836 | "Prevent further recursion (this entry will not activate others)": "Пресечь дальнейшую рекурсию (эта запись не будет активировать другие)", |
| 1132 | "Continue script execution": "Продолжить выполнение скрипта", | 837 | "Alert if your world info is greater than the allocated budget.": "Оповещать, если ваш мир выходит за выделенный бюджет.", |
| 1133 | "Pause script execution": "Приостановить выполнение скрипта", | 838 | "Convert to Persona": "Преобразовать в персону", |
| 1134 | "Abort script execution": "Прервать выполнение скрипта", | 839 | "Link to Source": "Ссылка на источник", |
| 1135 | "Abort request": "Прекратить генерацию", | 840 | "Replace / Update": "Заменить / Обновить", |
| 1136 | "Continue the last message": "Продолжить текущее сообщение", | 841 | "Smoothing Curve": "Кривая сглаживания", |
| 1137 | "Send a message": "Отправить сообщение", | 842 | "Message Actions": "Действия с сообщением", |
| 1138 | "Close chat": "Закрыть чат", | 843 | "SillyTavern is aimed at advanced users.": "SillyTavern рассчитана на продвинутых пользователей.", |
| 1139 | "Toggle Panels": "Переключить панели", | 844 | "If you're new to this, enable the simplified UI mode below.": "Если вы новичок, советуем включить упрощённый UI.", |
| 1140 | "Back to parent chat": "Вернуться в основной чат", | 845 | "Enable simple UI mode": "Включить упрощённый UI", |
| 1141 | "Save checkpoint": "Сохранить чекпоинт", | 846 | "welcome_message_part_1": "Ознакомьтесь с", |
| 1142 | "Convert to group": "Превратить в группу", | 847 | "welcome_message_part_2": "официальной документацией", |
| 1143 | "Start new chat": "Начать новый чат", | 848 | "welcome_message_part_3": ".", |
| 1144 | "Manage chat files": "Управление чатами", | 849 | "welcome_message_part_4": "Введите", |
| 1145 | "Delete messages": "Удалить сообщения", | 850 | "welcome_message_part_5": "в чате, чтобы получить справку по командам и макросам.", |
| 1146 | "Regenerate": "Повторная генерация", | 851 | "welcome_message_part_6": "Заходите на наш", |
| 1147 | "Ask AI to write your message for you": "Попросить ИИ написать сообщение за вас", | 852 | "Discord server": "Discord-сервер,", |
| 1148 | "Impersonate": "Перевоплощение", | 853 | "welcome_message_part_7": "там публикуется много разной полезной информации, в том числе анонсы.", |
| 1149 | "Continue": "Продолжить", | 854 | "Before you get started, you must select a persona name.": "Для начала вам следует выбрать имя своей персоны.", |
| 1150 | "Bind user name to that avatar": "Закрепить имя за этим аватаром", | 855 | "welcome_message_part_8": "Его можно будет изменить в любое время через иконку", |
| 1151 | "Change persona image": "Сменить аватар персоны", | 856 | "welcome_message_part_9": ".", |
| 1152 | "Select this as default persona for the new chats.": "Выберать эту Персону в качестве персоны по умолчанию для новых чатов.", | 857 | "Ignore EOS Token": "Игнорировать EOS-токен", |
| 1153 | "Delete persona": "Удалить персону", | 858 | "Ignore the EOS Token even if it generates.": "Игнорировать EOS-токен, даже если он сгенерировался.", |
| 1154 | "These characters are the winners of character design contests and have outstandable quality.": "Персонажи наивысшего качества, одержавшие победу в конкурсе персонажей.", | 859 | "Hide Muted Member Sprites": "Скрыть спрайты заглушенных участников", |
| 1155 | "Contest Winners": "Победители конкурса", | 860 | "Group generation handling mode": "Генерировать ответы путём...", |
| 1156 | "These characters are the finalists of character design contests and have remarkable quality.": "Персонажи отличного качества, финалисты конкурса персонажей.", | 861 | "Swap character cards": "Подмены карточки персонажа", |
| 1157 | "Featured Characters": "Рекомендуемые персонажи", | 862 | "Join character cards (exclude muted)": "Совмещения карточек (кроме заглушенных)", |
| 1158 | "Attach a File": "Прикрепить файл", | 863 | "Join character cards (include muted)": "Совмещения карточек (включая заглушенных)", |
| 1159 | "Open Data Bank": "Открытый банк данных", | 864 | "Click to allow/forbid the use of external media for this group.": "Нажмите, чтобы разрешить/запретить использование внешних медиа в этой группе.", |
| 1160 | "Enter a URL or the ID of a Fandom wiki page to scrape:": "Введите URL-адрес или идентификатор вики-страницы Фэндома, которую нужно очистить:", | 865 | "Scenario Format Template": "Шаблон оформления сценария", |
| 1161 | "Examples:": "Примеры:", | 866 | "scenario_format_template_part_1": "Используйте", |
| 1162 | "Example:": "Пример:", | 867 | "scenario_format_template_part_2": "чтобы указать, куда именно вставляется основное содержимое.", |
| 1163 | "Single file": "Отдельный файл", | 868 | "Personality Format Template": "Шаблон оформления характера", |
| 1164 | "All articles will be concatenated into a single file.": "Все статьи будут объединены в один файл.", | 869 | "Group Nudge Prompt Template": "Шаблон промпта-подсказки для групп", |
| 1165 | "File per article": "Файл на статью", | 870 | "Sent at the end of the group chat history to force reply from a specific character.": "Добавляется в конец истории сообщений в групповом чате, чтобы запросить ответ от конкретного персонажа.", |
| 1166 | "Each article will be saved as a separate file.": "Не рекомендуется. Каждая статья будет сохранена в отдельный файл.", | 871 | "Set at the beginning of the chat history to indicate that a new chat is about to start.": "Добавляется в начале истории сообщений в качестве указания на то, что дальше начнётся новый чат.", |
| 1167 | "Data Bank": "База данных", | 872 | "New Group Chat": "Новый групповой чат", |
| 1168 | "These files will be available for extensions that support attachments (e.g. Vector Storage).": "Эти файлы будут доступны для расширений, поддерживающих вложения (например, Vector Storage).", | 873 | "Set at the beginning of the chat history to indicate that a new group chat is about to start.": "Добавляется в начале истории сообщений в качестве указания на то, что дальше начнётся новый групповой чат.", |
| 1169 | "Supported file types: Plain Text, PDF, Markdown, HTML, EPUB.": "Поддерживаемые типы файлов: обычный текст, PDF, Markdown, HTML, EPUB.", | 874 | "New Example Chat": "Новый образец чата", |
| 1170 | "Drag and drop files here to upload.": "Перетащите сюда файлы для загрузки.", | 875 | "Set at the beginning of Dialogue examples to indicate that a new example chat is about to start.": "Добавляется в начале примеров диалогов в качестве указания на то, что дальше начнётся новый чат-пример.", |
| 1171 | "Date (Newest First)": "Дата (сначала новые)", | 876 | "Continue nudge": "Подсказка для продолжения", |
| 1172 | "Date (Oldest First)": "Дата (сначала самые старые)", | 877 | "Set at the end of the chat history when the continue button is pressed.": "Добавляется в конец истории чата, когда отправлен запрос на продолжение текущего сообщения.", |
| 1173 | "Name (A-Z)": "Имя (А–Я)", | 878 | "Continue Postfix": "Постфикс для продолжения", |
| 1174 | "Name (Z-A)": "Имя (Я-А)", | 879 | "Space": "Пробел", |
| 1175 | "Size (Smallest First)": "Размер (сначала самый маленький)", | 880 | "Newline": "Новая строка", |
| 1176 | "Size (Largest First)": "Размер (сначала самый большой)", | 881 | "Double Newline": "Две новые строки", |
| 1177 | "Bulk Edit": "Массовое редактирование", | 882 | "The next chunk of the continued message will be appended using this as a separator.": "Используется в качестве разделителя между уже имеющимся сообщением и его новым отрывком, при генерации продолжения", |
| 1178 | "Select All": "Выбрать все", | 883 | "Regex Editor": "Редактор рег. выражений", |
| 1179 | "Select None": "Выбрать «Ничего»", | 884 | "ext_regex_import_script": "Импорт скрипта", |
| 1180 | "Global Attachments": "Глобальные вложения", | 885 | "ext_regex_desc": "Regex - это инструмент, позволяющий находить и изменять строки, используя регулярные выражения. Для более подробной информации нажмите ? рядом с заголовком.", |
| 1181 | "These files are available for all characters in all chats.": "Эти файлы доступны для всех персонажей во всех чатах.", | 886 | "Input": "Поле ввода", |
| 1182 | "Character Attachments": "Вложения персонажей", | 887 | "ext_regex_test_input_placeholder": "Введите текст...", |
| 1183 | "These files are available the current character in all chats they are in.": "Эти файлы доступны текущему персонажу во всех чатах, в которых он находится.", | 888 | "Output": "Результат", |
| 1184 | "Saved locally. Not exported.": "Сохранено локально. Не экспортируется.", | 889 | "ext_regex_output_placeholder": "Пусто", |
| 1185 | "Chat Attachments": "Вложения чата", | 890 | "Script Name": "Название скрипта", |
| 1186 | "These files are available to all characters in the current chat.": "Эти файлы доступны всем персонажам текущего чата.", | 891 | "Find Regex": "Рег. выражение для поиска", |
| 1187 | "Enter a base URL of the MediaWiki to scrape.": "Введите базовый URL-адрес MediaWiki для парсинга.", | 892 | "Replace With": "Замена", |
| 1188 | "Don't include the page name!": "Не указывайте название страницы!", | 893 | "ext_regex_replace_string_placeholder": "Чтобы вставить всё вхождение рег. выражения, используйте {{match}}. Чтобы вставить группу символов, используйте $1, $2 и т.д.", |
| 1189 | "Enter web URLs to scrape (one per line):": "Введите URL-адреса веб-сайтов для парсинга (по одному в строке):", | 894 | "Trim Out": "Усечение", |
| 1190 | "Enter a video URL to download its transcript.": "Введите URL-адрес или идентификатор видео, чтобы загрузить его расшифровку.", | 895 | "ext_regex_trim_placeholder": "Удалить перед обработкой ненужные части текста. Каждый элемент с новой строки.", |
| 1191 | "Expression API": "Местный\nДополнительно\nМагистр права", | 896 | "Slash Commands": "Слэш-команды", |
| 897 | "Min Depth": "Мин. глубина", | ||
| 898 | "ext_regex_min_depth_desc": "При форматировании затрагивать только те сообщения, которые находятся как минимум на глубине N. 0 = последнее сообщение, 1 = предпоследнее и т.д. Учитываются только видимые сообщения, т.е. не скрытые и не системные.", | ||
| 899 | "ext_regex_max_depth_desc": "При форматировании затрагивать только те сообщения, которые находятся на глубине не более N. 0 = последнее сообщение, 1 = предпоследнее и т.д. Учитываются только видимые сообщения, т.е. не скрытые и не системные.", | ||
| 900 | "ext_regex_min_depth_placeholder": "Неогранич.", | ||
| 901 | "ext_regex_other_options": "Другие опции", | ||
| 902 | "Only Format Display": "Только визуально", | ||
| 903 | "ext_regex_only_format_prompt_desc": "История чата не изменится, замена будет осуществляться только в промпте (при генерации)", | ||
| 904 | "Only Format Prompt (?)": "Только промпт", | ||
| 905 | "Run On Edit": "Выполнять при редактировании", | ||
| 906 | "Substitute Regex": "Заменить в рег. выражении", | ||
| 907 | "ext_regex_substitute_regex_desc": "Перед выполнением заменять {{макросы}} в рег. выражении", | ||
| 908 | "Test Mode": "Протестировать", | ||
| 909 | "ext_regex_affects": "Затрагивает", | ||
| 910 | "ext_regex_user_input": "Ваши сообщения", | ||
| 911 | "ext_regex_ai_output": "Ответы ИИ", | ||
| 912 | "ext_regex_disable_script": "Выключить этот скрипт", | ||
| 913 | "ext_regex_enable_script": "Включить скрипт", | ||
| 914 | "ext_regex_edit_script": "Редактировать", | ||
| 915 | "ext_regex_export_script": "Экспортировать", | ||
| 916 | "ext_regex_delete_script": "Удалить", | ||
| 1192 | "ext_sum_with": "Для пересказа использовать:", | 917 | "ext_sum_with": "Для пересказа использовать:", |
| 1193 | "ext_sum_main_api": "Основное API", | 918 | "ext_sum_main_api": "Основное API", |
| 1194 | "ext_sum_current_summary": "Текущий пересказ:", | 919 | "ext_sum_current_summary": "Текущий пересказ:", |
| 1195 | "ext_sum_restore_previous": "Восстановить предыдущий", | 920 | "ext_sum_restore_previous": "Восстановить предыдущий", |
| 1196 | "ext_sum_memory_placeholder": "Сгенерированный пересказ будет здесь...", | 921 | "ext_sum_memory_placeholder": "Сгенерированный пересказ будет здесь...", |
| 1197 | "Trigger a summary update right now.": "Подведите итоги сейчас", | ||
| 1198 | "ext_sum_force_text": "Пересказать сейчас", | 922 | "ext_sum_force_text": "Пересказать сейчас", |
| 1199 | "Disable automatic summary updates. While paused, the summary remains as-is. You can still force an update by pressing the Summarize now button (which is only available with the Main API).": "Отключить авто-обновление пересказа. Пересказ всё время будет фиксированным. Однако останется возможность принудительно обновить пересказ через кнопку \"Пересказать сейчас\" (доступно только через Основное API)", | 923 | "Disable automatic summary updates. While paused, the summary remains as-is. You can still force an update by pressing the Summarize now button (which is only available with the Main API).": "Отключить авто-обновление пересказа. Пересказ всё время будет фиксированным. Однако останется возможность принудительно обновить пересказ через кнопку \"Пересказать сейчас\" (доступно только через Основное API)", |
| 1200 | "ext_sum_pause": "Приостановить", | 924 | "ext_sum_pause": "Приостановить", |
| @@ -1224,232 +948,693 @@ | |||
| 1224 | "Update frequency": "Частота обновления", | 948 | "Update frequency": "Частота обновления", |
| 1225 | "ext_sum_update_every_messages_1": "Интервал обновления (кол-во сообщений):", | 949 | "ext_sum_update_every_messages_1": "Интервал обновления (кол-во сообщений):", |
| 1226 | "ext_sum_update_every_messages_2": "", | 950 | "ext_sum_update_every_messages_2": "", |
| 1227 | "ext_sum_0_disable": "для отключения поставьте 0", | ||
| 1228 | "ext_sum_auto_adjust_desc": "Попытаться автоматически рассчитать значение интервала, исходя из статистики чата", | ||
| 1229 | "ext_sum_update_every_words_1": "Интервал обновления (кол-во слов):", | 951 | "ext_sum_update_every_words_1": "Интервал обновления (кол-во слов):", |
| 1230 | "ext_sum_update_every_words_2": "", | 952 | "ext_sum_update_every_words_2": "", |
| 953 | "ext_sum_0_disable": "для отключения поставьте 0", | ||
| 954 | "ext_sum_auto_adjust_desc": "Попытаться автоматически рассчитать значение интервала, исходя из статистики чата", | ||
| 1231 | "ext_sum_both_sliders": "Если оба ползунка отличны от нуля, то оба будут триггерить генерацию пересказа с соответствующей периодичностью.", | 955 | "ext_sum_both_sliders": "Если оба ползунка отличны от нуля, то оба будут триггерить генерацию пересказа с соответствующей периодичностью.", |
| 1232 | "ext_sum_injection_template": "Шаблон для инжекта", | 956 | "ext_sum_injection_template": "Шаблон для инжекта", |
| 1233 | "ext_sum_memory_template_placeholder": "Макрос {{summary}} будет заменён на содержимое пересказа", | 957 | "ext_sum_memory_template_placeholder": "Макрос {{summary}} будет заменён на содержимое пересказа", |
| 1234 | "ext_sum_injection_position": "Куда инжектить", | 958 | "ext_sum_injection_position": "Куда инжектить", |
| 1235 | "How many messages before the current end of the chat.": "Сколько сообщений от конца чата.", | 959 | "How many messages before the current end of the chat.": "Сколько сообщений от конца чата.", |
| 1236 | "ext_regex_title": "регулярное выражение", | 960 | "Change it later in the 'User Settings' panel.": "Его можно будет выключить в меню \"Настройки пользователя\"", |
| 1237 | "ext_regex_new_global_script": "+ Глобальный", | 961 | "Looking for AI characters?": "Ищете ИИ-персонажей?", |
| 1238 | "ext_regex_new_scoped_script": "+ Область действия", | 962 | "onboarding_import": "Импортируйте", |
| 1239 | "ext_regex_import_script": "Импорт скрипта", | 963 | "from supported sources or view": "из источника или посмотрите", |
| 1240 | "ext_regex_global_scripts": "Глобальные сценарии", | 964 | "Sample characters": "Стандартных персонажей", |
| 1241 | "ext_regex_global_scripts_desc": "Доступно для всех персонажей. Сохранено в локальных настройках.", | 965 | "popup-button-save": "Сохранить", |
| 1242 | "ext_regex_scoped_scripts": "Сценарии с ограниченной областью действия", | 966 | "popup-button-yes": "Да", |
| 1243 | "ext_regex_scoped_scripts_desc": "Доступно только для этого персонажа. Сохранено в данных карты.", | 967 | "popup-button-no": "Нет", |
| 1244 | "Regex Editor": "Редактор рег. выражений", | 968 | "popup-button-cancel": "Отмена", |
| 1245 | "Test Mode": "Протестировать", | 969 | "popup-button-import": "Импортировать", |
| 1246 | "ext_regex_desc": "Regex - это инструмент, позволяющий находить и изменять строки, используя регулярные выражения. Для более подробной информации нажмите ? рядом с заголовком.", | ||
| 1247 | "Input": "Поле ввода", | ||
| 1248 | "ext_regex_test_input_placeholder": "Введите текст...", | ||
| 1249 | "Output": "Результат", | ||
| 1250 | "ext_regex_output_placeholder": "Пусто", | ||
| 1251 | "Script Name": "Название скрипта", | ||
| 1252 | "Find Regex": "Рег. выражение для поиска", | ||
| 1253 | "Replace With": "Замена", | ||
| 1254 | "ext_regex_replace_string_placeholder": "Чтобы вставить всё вхождение рег. выражения, используйте {{match}}. Чтобы вставить группу символов, используйте $1, $2 и т.д.", | ||
| 1255 | "Trim Out": "Усечение", | ||
| 1256 | "ext_regex_trim_placeholder": "Удалить перед обработкой ненужные части текста. Каждый элемент с новой строки.", | ||
| 1257 | "ext_regex_affects": "Затрагивает", | ||
| 1258 | "ext_regex_user_input": "Ваши сообщения", | ||
| 1259 | "ext_regex_ai_output": "Ответы ИИ", | ||
| 1260 | "Slash Commands": "Слэш-команды", | ||
| 1261 | "ext_regex_min_depth_desc": "При форматировании затрагивать только те сообщения, которые находятся как минимум на глубине N. 0 = последнее сообщение, 1 = предпоследнее и т.д. Учитываются только видимые сообщения, т.е. не скрытые и не системные.", | ||
| 1262 | "Min Depth": "Мин. глубина", | ||
| 1263 | "ext_regex_min_depth_placeholder": "Неогранич.", | ||
| 1264 | "ext_regex_max_depth_desc": "При форматировании затрагивать только те сообщения, которые находятся на глубине не более N. 0 = последнее сообщение, 1 = предпоследнее и т.д. Учитываются только видимые сообщения, т.е. не скрытые и не системные.", | ||
| 1265 | "ext_regex_other_options": "Другие опции", | ||
| 1266 | "Only Format Display": "Только визуально", | ||
| 1267 | "ext_regex_only_format_prompt_desc": "История чата не изменится, замена будет осуществляться только в промпте (при генерации)", | ||
| 1268 | "Only Format Prompt (?)": "Только промпт", | ||
| 1269 | "Run On Edit": "Выполнять при редактировании", | ||
| 1270 | "ext_regex_substitute_regex_desc": "Перед выполнением заменять {{макросы}} в рег. выражении", | ||
| 1271 | "Substitute Regex": "Заменить в рег. выражении", | ||
| 1272 | "ext_regex_import_target": "Импортировать в:", | ||
| 1273 | "ext_regex_disable_script": "Отключить скрипт", | ||
| 1274 | "ext_regex_enable_script": "Включить скрипт", | ||
| 1275 | "ext_regex_edit_script": "Редактировать", | ||
| 1276 | "ext_regex_move_to_global": "Перейти к глобальным сценариям", | ||
| 1277 | "ext_regex_move_to_scoped": "Перейти к сценариям с ограниченной областью действия", | ||
| 1278 | "ext_regex_export_script": "Экспортировать", | ||
| 1279 | "ext_regex_delete_script": "Удалить", | ||
| 1280 | "Trigger Stable Diffusion": "Запуск стабильной диффузии", | ||
| 1281 | "sd_Yourself": "Сам", | ||
| 1282 | "sd_Your_Face": "Твое лицо", | ||
| 1283 | "sd_Me": "Мне", | ||
| 1284 | "sd_The_Whole_Story": "Вся история", | ||
| 1285 | "sd_The_Last_Message": "Последнее сообщение", | ||
| 1286 | "sd_Raw_Last_Message": "Необработанное последнее сообщение", | ||
| 1287 | "sd_Background": "Фон", | ||
| 1288 | "Image Generation": "Генерация изображений", | ||
| 1289 | "sd_refine_mode": "Разрешить редактировать запросы вручную перед отправкой их в API генерации.", | ||
| 1290 | "sd_refine_mode_txt": "Редактировать запросы перед генерацией", | ||
| 1291 | "sd_interactive_mode": "Автоматически генерировать изображения при отправке сообщений типа «отправь мне фотографию кота».", | ||
| 1292 | "sd_interactive_mode_txt": "Интерактивный режим", | ||
| 1293 | "sd_multimodal_captioning": "Используйте мультимодальные субтитры для создания подсказок для портретов пользователей и персонажей на основе их аватаров.", | ||
| 1294 | "sd_multimodal_captioning_txt": "Используйте мультимодальные субтитры для портретов", | ||
| 1295 | "sd_expand": "Автоматически расширять подсказки, используя модель генерации текста", | ||
| 1296 | "sd_expand_txt": "Подсказки по автоулучшению", | ||
| 1297 | "sd_snap": "Запросы на генерацию привязки с принудительным соотношением сторон (портреты, фон) до ближайшего известного разрешения, при этом пытаясь сохранить абсолютное количество пикселей (рекомендуется для SDXL).", | ||
| 1298 | "sd_snap_txt": "Автоматически настраиваемое разрешение Snap", | ||
| 1299 | "Source": "Источник", | ||
| 1300 | "sd_auto_url": "Пример: {{auto_url}}", | ||
| 1301 | "Authentication (optional)": "Аутентификация (необязательно)", | ||
| 1302 | "Example: username:password": "Пример: имя пользователя:пароль", | ||
| 1303 | "Important:": "Важный:", | ||
| 1304 | "sd_auto_auth_warning_1": "запустите веб-интерфейс SD с помощью", | ||
| 1305 | "sd_auto_auth_warning_2": "флаг! Сервер должен быть доступен с хост-машины SillyTavern.", | ||
| 1306 | "sd_drawthings_url": "Пример: {{drawthings_url}}", | ||
| 1307 | "sd_drawthings_auth_txt": "запустите приложение DrawThings с включенным переключателем HTTP API в пользовательском интерфейсе! Сервер должен быть доступен с хост-компьютера SillyTavern.", | ||
| 1308 | "sd_vlad_url": "Пример: {{vlad_url}}", | ||
| 1309 | "The server must be accessible from the SillyTavern host machine.": "Сервер должен быть доступен с хост-компьютера SillyTavern.", | ||
| 1310 | "Hint: Save an API key in Horde KoboldAI API settings to use it here.": "Подсказка: сохраните ключ API в настройках API Horde KoboldAI, чтобы использовать его здесь.", | ||
| 1311 | "Allow NSFW images from Horde": "Разрешить NSFW-изображения от Horde", | ||
| 1312 | "Sanitize prompts (recommended)": "Обеззараживать подсказки (рекомендуется)", | ||
| 1313 | "Automatically adjust generation parameters to ensure free image generations.": "Автоматически настраивайте параметры генерации, чтобы обеспечить бесплатную генерацию изображений.", | ||
| 1314 | "Avoid spending Anlas": "Избегайте тратить Anlas", | ||
| 1315 | "Opus tier": "(уровень опуса)", | ||
| 1316 | "View my Anlas": "Посмотреть мой Anlas", | ||
| 1317 | "These settings only apply to DALL-E 3": "Эти настройки применимы только к DALL-E 3.", | ||
| 1318 | "Image Style": "Стиль изображения", | ||
| 1319 | "Image Quality": "Качество изображения", | ||
| 1320 | "Standard": "Стандартный", | ||
| 1321 | "HD": "HD", | ||
| 1322 | "sd_comfy_url": "Пример: {{comfy_url}}", | ||
| 1323 | "Open workflow editor": "Открыть редактор рабочего процесса", | ||
| 1324 | "Create new workflow": "Создать новый рабочий процесс", | ||
| 1325 | "Delete workflow": "Удалить рабочий процесс", | ||
| 1326 | "Enhance": "Усиливать", | ||
| 1327 | "Refine": "Уточнить", | ||
| 1328 | "Decrisper": "Расшифровать", | ||
| 1329 | "Sampling steps": "Шаги выборки ()", | ||
| 1330 | "Width": "Ширина ()", | ||
| 1331 | "Height": "Высота ()", | ||
| 1332 | "Resolution": "Разрешение", | ||
| 1333 | "Model": "Модель", | ||
| 1334 | "Sampling method": "Метод выборки", | ||
| 1335 | "Karras (not all samplers supported)": "Каррас (поддерживаются не все сэмплеры)", | ||
| 1336 | "SMEA versions of samplers are modified to perform better at high resolution.": "Версии пробоотборников SMEA модифицированы для лучшей работы при высоком разрешении.", | ||
| 1337 | "SMEA": "СМИА", | ||
| 1338 | "DYN variants of SMEA samplers often lead to more varied output, but may fail at very high resolutions.": "Варианты DYN пробоотборников SMEA часто дают более разнообразный результат, но могут давать сбой при очень высоких разрешениях.", | ||
| 1339 | "DYN": "ДИН", | ||
| 1340 | "Scheduler": "Планировщик", | ||
| 1341 | "Restore Faces": "Восстановить лица", | ||
| 1342 | "Hires. Fix": "Нанимает. Исправить", | ||
| 1343 | "Upscaler": "Апскейлер", | ||
| 1344 | "Upscale by": "Высококлассный по", | ||
| 1345 | "Denoising strength": "Шумоподавление", | ||
| 1346 | "Hires steps (2nd pass)": "Нанимает шаги (2-й проход)", | ||
| 1347 | "Preset for prompt prefix and negative prompt": "Предустановка для префикса подсказки и отрицательной подсказки", | ||
| 1348 | "Style": "Стиль", | ||
| 1349 | "Save style": "Сохранить стиль", | ||
| 1350 | "Delete style": "Удалить стиль", | ||
| 1351 | "Common prompt prefix": "Общий префикс приглашения", | ||
| 1352 | "sd_prompt_prefix_placeholder": "Используйте {prompt}, чтобы указать, куда будет вставлено сгенерированное приглашение.", | ||
| 1353 | "Negative common prompt prefix": "Отрицательный префикс общего приглашения", | ||
| 1354 | "Character-specific prompt prefix": "Префикс подсказки, специфичный для символа", | ||
| 1355 | "Won't be used in groups.": "Не будет использоваться в группах.", | ||
| 1356 | "sd_character_prompt_placeholder": "Любые характеристики, описывающие выбранного персонажа. Будут добавлены после общего префикса подсказки. Пример: женщина, зеленые глаза, каштановые волосы, розовая рубашка", | ||
| 1357 | "Character-specific negative prompt prefix": "Префикс отрицательной подсказки для конкретного персонажа", | ||
| 1358 | "sd_character_negative_prompt_placeholder": "Любые характеристики, которые не должны появляться у выбранного персонажа. Будет добавлен после отрицательного общего префикса приглашения.\nПример: украшения, обувь, очки.", | ||
| 1359 | "Shareable": "Общий доступ", | ||
| 1360 | "Image Prompt Templates": "Шаблоны изображений", | ||
| 1361 | "Vectors Model Warning": "Рекомендуется удалять векторы при изменении модели в середине чата. В противном случае это приведет к некачественным результатам.", | ||
| 1362 | "Translate files into English before processing": "Переведите файлы на английский язык перед обработкой", | ||
| 1363 | "Manager Users": "Управление пользователями", | ||
| 1364 | "New User": "Новый пользователь", | ||
| 1365 | "Status:": "Положение дел:", | ||
| 1366 | "Created:": "Создан:", | ||
| 1367 | "Display Name:": "Отображаемое имя:", | ||
| 1368 | "User Handle:": "Имя пользователя:", | ||
| 1369 | "Password:": "Пароль:", | ||
| 1370 | "Confirm Password:": "Подтвердите пароль:", | ||
| 1371 | "This will create a new subfolder...": "Это создаст новую подпапку в каталоге /data/ с дескриптором пользователя в качестве имени папки.", | ||
| 1372 | "Current Password:": "Текущий пароль:", | ||
| 1373 | "New Password:": "Новый пароль:", | ||
| 1374 | "Confirm New Password:": "Подтвердите новый пароль:", | ||
| 1375 | "Debug Warning": "Функции этой категории предназначены только для опытных пользователей. Ничего не нажимайте, если не уверены в последствиях.", | ||
| 1376 | "Execute": "Выполнять", | ||
| 1377 | "Are you sure you want to delete this user?": "Вы уверены, что хотите удалить этого пользователя?", | ||
| 1378 | "Deleting:": "Удаление:", | ||
| 1379 | "Also wipe user data.": "Также сотрите пользовательские данные.", | ||
| 1380 | "Warning:": "Предупреждение:", | ||
| 1381 | "This action is irreversible.": "Это действие необратимо.", | ||
| 1382 | "Type the user's handle below to confirm:": "Введите дескриптор пользователя ниже для подтверждения:", | ||
| 1383 | "Import Characters": "Импортировать персонажей", | ||
| 1384 | "Enter the URL of the content to import": "Введите URL-адрес импортируемого контента", | 970 | "Enter the URL of the content to import": "Введите URL-адрес импортируемого контента", |
| 1385 | "Supported sources:": "Поддерживаются следующие источники:", | 971 | "Supported sources:": "Поддерживаются следующие источники:", |
| 1386 | "char_import_1": "Персонаж с Chub (прямая ссылка или ID)", | ||
| 1387 | "char_import_example": "Пример:", | 972 | "char_import_example": "Пример:", |
| 973 | "char_import_1": "Персонаж с Chub (прямая ссылка или ID)", | ||
| 1388 | "char_import_2": "Лорбук с Chub (прямая ссылка или ID)", | 974 | "char_import_2": "Лорбук с Chub (прямая ссылка или ID)", |
| 1389 | "char_import_3": "Персонаж с JanitorAI (прямая ссылка или UUID)", | 975 | "char_import_3": "Персонаж с JanitorAI (прямая ссылка или UUID)", |
| 1390 | "char_import_4": "Персонаж с Pygmalion.chat (прямая ссылка или UUID)", | 976 | "char_import_4": "Персонаж с Pygmalion.chat (прямая ссылка или UUID)", |
| 1391 | "char_import_5": "Персонаж с AICharacterCard.com (прямая ссылка или ID)", | 977 | "char_import_5": "Персонаж с AICharacterCard.com (прямая ссылка или ID)", |
| 1392 | "char_import_6": "Прямая ссылка на PNG-файл (чтобы узнать список разрешённых хостов, загляните в", | 978 | "char_import_6": "Прямая ссылка на PNG-файл (чтобы узнать список разрешённых хостов, загляните в", |
| 1393 | "char_import_7": ")", | 979 | "char_import_7": ")", |
| 1394 | "char_import_8": "Персонаж RisuRealm (прямая ссылка)", | 980 | "Grammar String": "Грамматика", |
| 1395 | "Supports importing multiple characters.": "Поддерживает импорт нескольких символов.", | 981 | "GNBF or ENBF, depends on the backend in use. If you're using this you should know which.": "GNBF или ENBF, зависит от бэкенда. Если вы это используете, то, скорее всего, сами знаете, какой именно.", |
| 1396 | "Write each URL or ID into a new line.": "Запишите каждый URL-адрес или идентификатор в новую строку.", | 982 | "Account": "Аккаунт", |
| 1397 | "Export for character": "Экспорт для персонажа", | ||
| 1398 | "Export prompts for this character, including their order.": "Экспортируйте подсказки для этого персонажа, включая их порядок.", | ||
| 1399 | "Export all": "Экспортировать всё", | ||
| 1400 | "Export all your prompts to a file": "Экспортировать все промпты в виде файла", | ||
| 1401 | "Insert prompt": "Вставить промпт", | ||
| 1402 | "Delete prompt": "Удалить промпт", | ||
| 1403 | "Import a prompt list": "Импортировать список промптов", | ||
| 1404 | "Export this prompt list": "Экспортировать этот список промптов", | ||
| 1405 | "Reset current character": "Сбросить текущего персонажа", | ||
| 1406 | "New prompt": "Новый промпт", | ||
| 1407 | "Prompts": "Промпты", | ||
| 1408 | "Total Tokens:": "Всего токенов:", | ||
| 1409 | "prompt_manager_tokens": "Токенов", | ||
| 1410 | "Are you sure you want to reset your settings to factory defaults?": "Вы уверены, что хотите сбросить настройки до заводских?", | ||
| 1411 | "Don't forget to save a snapshot of your settings before proceeding.": "Не забудьте сохранить снимок настроек, прежде чем продолжить.", | ||
| 1412 | "Settings Snapshots": "Снимки настроек", | ||
| 1413 | "Record a snapshot of your current settings.": "Сделать снимок текущих настроек.", | ||
| 1414 | "Make a Snapshot": "Сделать снимок", | ||
| 1415 | "Restore this snapshot": "Откатиться к этому снимку", | ||
| 1416 | "Hi,": "Привет,", | 983 | "Hi,": "Привет,", |
| 1417 | "To enable multi-account features, restart the SillyTavern server with": "Чтобы активировать систему аккаунтов, перезапустите SillyTavern, выставив", | 984 | "To enable multi-account features, restart the SillyTavern server with": "Чтобы активировать систему аккаунтов, перезапустите SillyTavern, выставив", |
| 1418 | "set to true in the config.yaml file.": "в файле config.yaml в положение true.", | 985 | "set to true in the config.yaml file.": "в файле config.yaml в положение true.", |
| 1419 | "Account Info": "Об аккаунте", | 986 | "Account Info": "Об аккаунте", |
| 1420 | "To change your user avatar, use the buttons below or select a default persona in the Persona Management menu.": "Чтобы сменить аватарку, используйте кнопки ниже, либо выберите персону по умолчанию в меню управления персоной.", | ||
| 1421 | "Set your custom avatar.": "Установить аватарку", | ||
| 1422 | "Remove your custom avatar.": "Сбросить аватарку", | ||
| 1423 | "Handle:": "Хэндл:", | 987 | "Handle:": "Хэндл:", |
| 988 | "Role:": "Роль:", | ||
| 989 | "Created:": "Создан:", | ||
| 990 | "Password:": "Пароль:", | ||
| 1424 | "This account is password protected.": "Аккаунт защищён паролем.", | 991 | "This account is password protected.": "Аккаунт защищён паролем.", |
| 1425 | "This account is not password protected.": "Аккаунт не защищён паролем.", | 992 | "This account is not password protected.": "Аккаунт не защищён паролем.", |
| 1426 | "Account Actions": "Действия", | 993 | "Account Actions": "Действия", |
| 1427 | "Change Password": "Изменить пароль", | 994 | "Settings Snapshots": "Снимки настроек", |
| 1428 | "Manage your settings snapshots.": "Управление снимками настроек.", | 995 | "Manage your settings snapshots.": "Управление снимками настроек.", |
| 1429 | "Download a complete backup of your user data.": "Скачать полный бэкап данных пользователя.", | ||
| 1430 | "Download Backup": "Скачать бэкап", | 996 | "Download Backup": "Скачать бэкап", |
| 997 | "Download a complete backup of your user data.": "Скачать полный бэкап данных пользователя.", | ||
| 1431 | "Danger Zone": "Опасно", | 998 | "Danger Zone": "Опасно", |
| 1432 | "Reset your settings to factory defaults.": "Сбросить настройки до заводских.", | ||
| 1433 | "Reset Settings": "Сбросить настройки", | 999 | "Reset Settings": "Сбросить настройки", |
| 1434 | "Wipe all user data and reset your account to factory settings.": "Стереть все данные пользователя и сбросить аккаунт до заводских настроек.", | 1000 | "Reset your settings to factory defaults.": "Сбросить настройки до заводских.", |
| 1435 | "Reset Everything": "Сбросить всё", | 1001 | "Reset Everything": "Сбросить всё", |
| 1436 | "Reset Code:": "Сброс кода:", | 1002 | "Wipe all user data and reset your account to factory settings.": "Стереть все данные пользователя и сбросить аккаунт до заводских настроек.", |
| 1437 | "Want to update?": "Хотите обновиться?", | 1003 | "Set your custom avatar.": "Установить аватарку", |
| 1438 | "How to start chatting?": "Как начать общение?", | 1004 | "Remove your custom avatar.": "Сбросить аватарку", |
| 1439 | "Click ": "Нажмите", | 1005 | "Make a Snapshot": "Сделать снимок", |
| 1440 | "and select a": " и выберите ", | 1006 | "Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "Не менять размер картинок у импортируемых персонажей. При отключении все картинки будут приводиться к размеру 512х768", |
| 1441 | "Chat API": "API чата", | 1007 | "Char List Subheader": "Доп. заголовок в списке персонажей", |
| 1008 | "# Messages to Load": "Сколько сообщений загружать", | ||
| 1009 | "(0 = All)": "(0 = все)", | ||
| 1010 | "Theme Colors": "Цвета темы", | ||
| 1011 | "Specify colors for your theme.": "Настройте собственные цвета для вашей темы.", | ||
| 1012 | "Update speed of streamed text.": "Скорость обновления текста при стриминге.", | ||
| 1013 | "The number of chat history messages to load before pagination.": "Кол-во сообщений чата, загружаемых перед пагинацией.", | ||
| 1014 | "Chat Width": "Ширина чата", | ||
| 1015 | "Width of the main chat window in % of screen width": "Ширина окна с чатом, в % от ширины экрана", | ||
| 1016 | "Blur strength on UI panels.": "Сила размытия на панелях UI.", | ||
| 1017 | "Font size": "Размер шрифта", | ||
| 1018 | "Strength of the text shadows": "Размер теней, отбрасываемых текстом", | ||
| 1019 | "prompt_manager_edit": "Редактирование", | ||
| 1020 | "prompt_manager_tokens": "Токенов", | ||
| 1021 | "prompt_manager_name": "Имя", | ||
| 1022 | "A name for this prompt.": "Имя данного промпта.", | ||
| 1023 | "To whom this message will be attributed.": "От чьего лица будет отправляться сообщение.", | ||
| 1024 | "AI Assistant": "ИИ-ассистент", | ||
| 1025 | "prompt_manager_position": "Точка инжекта", | ||
| 1026 | "Injection position. Next to other prompts (relative) or in-chat (absolute).": "Как рассчитывать позицию для инжекта. Она может располагаться по отношению к другим промптам (относительная) либо по отношению к чату (абсолютная).", | ||
| 1027 | "prompt_manager_relative": "Относительная", | ||
| 1028 | "prompt_manager_absolute": "Абсолютная", | ||
| 1029 | "prompt_manager_depth": "Глубина", | ||
| 1030 | "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "Глубина вставки. 0 = после последнего сообщения, 1 = перед последним сообщением, и т.д.", | ||
| 1031 | "The prompt to be sent.": "Отправляемый ИИ промпт.", | ||
| 1032 | "prompt_manager_forbid_overrides": "Запретить перезапись", | ||
| 1033 | "This prompt cannot be overridden by character cards, even if overrides are preferred.": "Карточка персонажа не сможет перезаписать этот промпт, даже если настройки отдают приоритет именно ей.", | ||
| 1034 | "image_inlining_hint_1": "Отправлять картинки как часть промпта, если позволяет модель (такой функционал поддерживают GPT-4V, Claude 3 или Llava 13B). Чтобы добавить в чат изображение, используйте на нужном сообщении действие", | ||
| 1035 | "image_inlining_hint_2": ". Также это можно сделать через меню", | ||
| 1036 | "image_inlining_hint_3": ".", | ||
| 1037 | "Contest Winners": "Победители конкурса", | ||
| 1038 | "Rename background": "Переименовать фон", | ||
| 1039 | "Lock": "Закрепить", | ||
| 1040 | "Unlock": "Открепить", | ||
| 1041 | "Delete background": "Удалить фон", | ||
| 1042 | "Export all": "Экспортировать всё", | ||
| 1043 | "Export all your prompts to a file": "Экспортировать все промпты в виде файла", | ||
| 1044 | "Don't add character names.": "Не добавлять имя персонажа", | ||
| 1045 | "Add character names to completion objects.": "Добавлять имя персонажа как часть Completion object", | ||
| 1046 | "Message Content": "Внутри сообщения", | ||
| 1047 | "Prepend character names to message contents.": "Предварять сообщения именем персонажа.", | ||
| 1048 | "Character Names Behavior": "Вставка имени персонажа", | ||
| 1442 | "and pick a character.": "и выберите персонажа.", | 1049 | "and pick a character.": "и выберите персонажа.", |
| 1443 | "You can browse a list of bundled characters in the": "Вы можете просмотреть список включенных в комплект персонажей в", | 1050 | "Record a snapshot of your current settings.": "Сделать снимок текущих настроек.", |
| 1444 | "Download Extensions & Assets": "Скачать расширения и ресурсы", | 1051 | "Restore this snapshot": "Откатиться к этому снимку", |
| 1445 | "menu within": "меню внутри", | 1052 | "To change your user avatar, use the buttons below or select a default persona in the Persona Management menu.": "Чтобы сменить аватарку, используйте кнопки ниже, либо выберите персону по умолчанию в меню управления персоной.", |
| 1446 | "Confused or lost?": "Не можете в чём-то разобраться?", | 1053 | "These characters are the winners of character design contests and have outstandable quality.": "Персонажи наивысшего качества, одержавшие победу в конкурсе персонажей.", |
| 1447 | "click these icons!": "нажмите на эти значки!", | 1054 | "Featured Characters": "Рекомендуемые персонажи", |
| 1448 | "in the chat bar": " в поле чата", | 1055 | "These characters are the finalists of character design contests and have remarkable quality.": "Персонажи отличного качества, финалисты конкурса персонажей.", |
| 1449 | "SillyTavern Documentation Site": "Сайт документации SillyTavern", | 1056 | "Inline Image Quality": "Качество inline-изображений", |
| 1450 | "Extras Installation Guide": "Руководство по установке Extras", | 1057 | "openai_inline_image_quality_auto": "Автоопределение", |
| 1451 | "Still have questions?": "Остались вопросы?", | 1058 | "openai_inline_image_quality_low": "Низкое", |
| 1452 | "Join the SillyTavern Discord": "Заходите на сервер SillyTavern в Discord", | 1059 | "openai_inline_image_quality_high": "Высокое", |
| 1453 | "Post a GitHub issue": "Опубликуйте GitHub issue", | 1060 | "Assistant Impersonation Prefill": "Префилл для ассистента при перевоплощении", |
| 1454 | "Contact the developers": "Свяжитесь с разработчиками" | 1061 | "Hide Chat Avatars": "Не показывать аватарки в чате", |
| 1062 | "Hide avatars in chat messages.": "Скрыть аватарки сбоку от сообщений в чате", | ||
| 1063 | "Flat": "Стандартный", | ||
| 1064 | "Toggle character info panel": "Показать / скрыть инфо-панель", | ||
| 1065 | "(For Chat Completion and Instruct Mode)": "(для Chat Completion и режима Instruct)", | ||
| 1066 | "help_1": "Приветствуем! Выберите тему, которая вас интересует:", | ||
| 1067 | "help_2": "Слэш-команды", | ||
| 1068 | "help_or": "также", | ||
| 1069 | "help_3": "Разметка", | ||
| 1070 | "help_4": "Горячие клавиши", | ||
| 1071 | "help_5": "{{Макросы}}", | ||
| 1072 | "help_6": "Не нашли ответа на свой вопрос? Загляните в", | ||
| 1073 | "help_7": "официальную документацию SillyTavern", | ||
| 1074 | "help_8": ", там система описана гораздо более подробно!", | ||
| 1075 | "help_format_1": "Команды для разметки текста:", | ||
| 1076 | "help_format_2": "*текст*", | ||
| 1077 | "help_format_3": "добавляет ", | ||
| 1078 | "help_format_4": "курсив", | ||
| 1079 | "help_format_5": "**текст**", | ||
| 1080 | "help_format_6": "делает текст ", | ||
| 1081 | "help_format_7": "полужирным", | ||
| 1082 | "help_format_8": "***текст***", | ||
| 1083 | "help_format_9": "добавляет ", | ||
| 1084 | "help_format_10": "полужирный курсив", | ||
| 1085 | "help_format_11": "__текст__", | ||
| 1086 | "help_format_12": "добавляет ", | ||
| 1087 | "help_format_13": "подчёркивание", | ||
| 1088 | "help_format_14": "~~текст~~", | ||
| 1089 | "help_format_15": "делает текст ", | ||
| 1090 | "help_format_16": "зачёркнутым", | ||
| 1091 | "help_format_17": "[текст](url)", | ||
| 1092 | "help_format_18": "добавляет в текст ", | ||
| 1093 | "help_format_19": "ссылку", | ||
| 1094 | "help_format_20": "", | ||
| 1095 | "help_format_21": "добавляет в текст картинку", | ||
| 1096 | "help_format_22": "```текст```", | ||
| 1097 | "help_format_23": "оформляет текст как кусок кода (символ новой строки также допустим)", | ||
| 1098 | "help_format_like_this": "вот так", | ||
| 1099 | "help_format_24": "`текст`", | ||
| 1100 | "help_format_25": "отображает кусок кода ", | ||
| 1101 | "help_format_26": "внутри строки", | ||
| 1102 | "help_format_27": "> текст", | ||
| 1103 | "help_format_28": "отображает текст как цитату (обратите внимание на пробел после >)", | ||
| 1104 | "help_format_29": "# текст", | ||
| 1105 | "help_format_30": "создаёт крупный заголовок (обратите внимание на пробел)", | ||
| 1106 | "help_format_32": "## текст", | ||
| 1107 | "help_format_33": "создаёт средний заголовок (обратите внимание на пробел)", | ||
| 1108 | "help_format_35": "### текст", | ||
| 1109 | "help_format_36": "создаёт малый заголовок (обратите внимание на пробел)", | ||
| 1110 | "help_format_38": "$$ текст $$", | ||
| 1111 | "help_format_39": "отрендерить в виде формулы LaTeX (если включено в настройках)", | ||
| 1112 | "help_format_40": "$ текст $", | ||
| 1113 | "help_format_41": "отрендерить в виде формулы AsciiMath (если включено в настройках)", | ||
| 1114 | "help_hotkeys_1": "Стрелка вверх", | ||
| 1115 | "help_hotkeys_2": "Редактировать последнее сообщение в чате", | ||
| 1116 | "help_hotkeys_3": "Ctrl+Стрелка вверх", | ||
| 1117 | "help_hotkeys_4": "Редактировать ВАШЕ последнее сообщение в чате", | ||
| 1118 | "help_hotkeys_5": "Стрелка влево", | ||
| 1119 | "help_hotkeys_6": "Свайп влево", | ||
| 1120 | "help_hotkeys_7": "Стрелка вправо", | ||
| 1121 | "help_hotkeys_8": "Свайп вправо (ОБРАТИТЕ ВНИМАНИЕ: если в окошке ввода что-то есть, клавиши для свайпов не работают)", | ||
| 1122 | "help_hotkeys_10": "(при фокусе на окошке ввода)", | ||
| 1123 | "help_hotkeys_10_1": "Отправить сообщение", | ||
| 1124 | "help_hotkeys_12": "Повторно сгенерировать последний ответ ИИ", | ||
| 1125 | "help_hotkeys_14": "Продолжить последний ответ ИИ", | ||
| 1126 | "help_hotkeys_16": "Остановить генерацию ответа, скрыть UI-панель, отменить редактирование сообщения", | ||
| 1127 | "help_hotkeys_17": "Ctrl+Shift+Вверх", | ||
| 1128 | "help_hotkeys_18": "Прокрутить до линии контекста", | ||
| 1129 | "help_hotkeys_19": "Ctrl+Shift+Вниз", | ||
| 1130 | "help_hotkeys_20": "Прокрутить вниз до конца", | ||
| 1131 | "help_hotkeys_0": "Горячие клавиши", | ||
| 1132 | "You can browse a list of bundled characters in the": "Комплектных персонажей можно найти в меню", | ||
| 1133 | "Download Extensions & Assets": "Загрузить расширения и ресурсы", | ||
| 1134 | "menu within": "внутри этих кубиков", | ||
| 1135 | "Assets URL": "URL с описанием ресурсов", | ||
| 1136 | "Custom (OpenAI-compatible)": "Кастомный (совместимый с OpenAI)", | ||
| 1137 | "Custom Endpoint (Base URL)": "Кастомный эндпоинт (базовый URL)", | ||
| 1138 | "Example: http://localhost:1234/v1": "Пример: http://localhost:1234/v1", | ||
| 1139 | "at the end of the URL!": "!", | ||
| 1140 | "Custom API Key": "Ключ от кастомного API", | ||
| 1141 | "(Optional)": "(необязательно)", | ||
| 1142 | "Enter a Model ID": "Введите идентификатор модели", | ||
| 1143 | "Example: gpt-3.5-turbo": "Пример: gpt-3.5-turbo", | ||
| 1144 | "Available Models": "Доступные модели", | ||
| 1145 | "Prompt Post-Processing": "Постобработка промпта", | ||
| 1146 | "Applies additional processing to the prompt before sending it to the API.": "Позволяет обработать промпт перед отправкой в API.", | ||
| 1147 | "prompt_post_processing_none": "Отсутствует", | ||
| 1148 | "Additional Parameters": "Доп. параметры", | ||
| 1149 | "Include Body Parameters": "Добавить параметры в тело", | ||
| 1150 | "custom_include_body_desc": "Эти параметры будут добавлены в тело запроса к API Chat Completion (YAML-объект)\n\nПример:\n- top_k: 20\n- repetition_penalty: 1.1", | ||
| 1151 | "Exclude Body Parameters": "Исключить параметры из тела", | ||
| 1152 | "custom_exclude_body_desc": "Эти параметры будут исключены из тела запроса к API Chat Completion (YAML-массив)\n\nПример:\n- frequency_penalty\n- presence_penalty", | ||
| 1153 | "Include Request Headers": "Добавить заголовки запроса", | ||
| 1154 | "custom_include_headers_desc": "Дополнительные заголовки, добавляемые к запросу в API Chat Completion (YAML-объект)\n\nПример:\n- CustomHeader: custom-value\n- AnotherHeader: custom-value", | ||
| 1155 | "Groq API Key": "Ключ от API Groq", | ||
| 1156 | "Groq Model": "Модель Groq", | ||
| 1157 | "Perplexity API Key": "Ключ от API Perplexity", | ||
| 1158 | "Perplexity Model": "Модель Perplexity", | ||
| 1159 | "Enables a magnification effect on hover when you display the zoomed avatar after clicking an avatar's image in chat.": "Создаёт эффект приближения, когда вы наводитесь мышкой на изображение, отображаемое по клику на аватарку в чате.", | ||
| 1160 | "STscript Settings": "Настройки STscript", | ||
| 1161 | "Sets default flags for the STscript parser.": "Задаёт стандартные значения флагов для парсера STscript.", | ||
| 1162 | "Parser Flags": "Флаги парсера", | ||
| 1163 | "ext_regex_new_global_script": "+ Глобальный", | ||
| 1164 | "ext_regex_new_scoped_script": "+ Локальный", | ||
| 1165 | "ext_regex_new_global_script_desc": "Создать глобальный regex-скрипт", | ||
| 1166 | "ext_regex_new_scoped_script_desc": "Создать локальный regex-скрипт", | ||
| 1167 | "ext_regex_global_scripts": "Глобальные скрипты", | ||
| 1168 | "ext_regex_global_scripts_desc": "Распространяются на всех персонажей. Сохраняются как часть настроек.", | ||
| 1169 | "ext_regex_scoped_scripts": "Локальные скрипты", | ||
| 1170 | "ext_regex_scoped_scripts_desc": "Распространяются только на этого персонажа. Сохраняются в его карточку.", | ||
| 1171 | "ext_regex_allow_scoped": "Разрешить использование локальных скриптов", | ||
| 1172 | "ext_regex_move_to_global": "Сделать глобальным", | ||
| 1173 | "openai_logit_bias_no_items": "Правил нет", | ||
| 1174 | "Enable function calling": "Включить функции", | ||
| 1175 | "enable_functions_desc_1": "Включает возможность ", | ||
| 1176 | "enable_functions_desc_2": "вызова функций", | ||
| 1177 | "enable_functions_desc_3": "Используется расширениями для добавления нового функционала.", | ||
| 1178 | "MAD LAB MODE ON": "ВКЛЮЧЕН РЕЖИМ БЕЗУМЦА", | ||
| 1179 | "api_no_connection": "Нет соединения...", | ||
| 1180 | "Sampler Select": "Выбор сэмплеров", | ||
| 1181 | "Customize displayed samplers or add custom samplers.": "Выберите, какие сэмплеры хотите здесь отображать, или добавьте собственные сэмплеры", | ||
| 1182 | "ext_translate_auto_mode": "Автоперевод", | ||
| 1183 | "ext_translate_mode_none": "Откл.", | ||
| 1184 | "ext_translate_mode_responses": "Переводить ответы ИИ", | ||
| 1185 | "ext_translate_mode_inputs": "Переводить ваши сообщения", | ||
| 1186 | "ext_translate_mode_both": "Переводить всё", | ||
| 1187 | "ext_translate_mode_provider": "Переводчик", | ||
| 1188 | "ext_translate_target_lang": "На какой язык переводить", | ||
| 1189 | "ext_translate_clear": "Очистить переводы", | ||
| 1190 | "ext_translate_btn_chat": "Перевести чат", | ||
| 1191 | "ext_translate_btn_input": "Перевести моё сообщение", | ||
| 1192 | "ext_translate_delete_confirm_1": "Вы уверены?", | ||
| 1193 | "ext_translate_delete_confirm_2": "Будет удалён текст всех имеющихся в этом чате переводов. Отменить это действие невозможно.", | ||
| 1194 | "Favorite": "Избранное", | ||
| 1195 | "Tag": "Тег", | ||
| 1196 | "Duplicate": "Duplicate", | ||
| 1197 | "Persona": "Персона", | ||
| 1198 | "novelaipresets": "Пресеты NovelAI", | ||
| 1199 | "No Module": "No Module", | ||
| 1200 | "Instruct": "Instruct", | ||
| 1201 | "Prose Augmenter": "Prose Augmenter", | ||
| 1202 | "Text Adventure": "Text Adventure", | ||
| 1203 | "Streaming_desc": "Выводить текст последовательно по мере его генерации.\rЕсли параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", | ||
| 1204 | "Max prompt cost:": "Max prompt cost:", | ||
| 1205 | "TFS": "TFS", | ||
| 1206 | "Enable Cohere web-search connector": "Enable Cohere web-search connector", | ||
| 1207 | "Allow the model to use the web-search connector.": "Allow the model to use the web-search connector.", | ||
| 1208 | "Count Penalty": "Count Penalty", | ||
| 1209 | "Min P": "Min P", | ||
| 1210 | "NSFW": "NSFW", | ||
| 1211 | "Restore default format": "Restore default format", | ||
| 1212 | "Restore new chat prompt": "Restore new chat prompt", | ||
| 1213 | "Restore new group chat prompt": "Restore default prompt", | ||
| 1214 | "Mirostat": "Mirostat", | ||
| 1215 | "Mode": "Режим", | ||
| 1216 | "Mirostat_Mode_desc": "0 = отключить полностью. 1 = включить Mirostat 1.0. 2 = включить Mirostat 2.0.", | ||
| 1217 | "Tau": "Tau", | ||
| 1218 | "Mirostat_Tau_desc": "Controls variability of Mirostat outputs", | ||
| 1219 | "Eta": "Eta", | ||
| 1220 | "Mirostat_Eta_desc": "Controls learning rate of Mirostat", | ||
| 1221 | "Ban_EOS_Token_desc": "Запретить токен конца последовательности (EOS) (актуально для KoboldCpp, но KoboldAI может запрещать ещё и другие токены).\rПодходит для написания историй, но не рекомендуется для режимов Chat и Instruct.", | ||
| 1222 | "Mirostat LR": "Mirostat LR", | ||
| 1223 | "rep.pen decay": "Rep Pen Decay", | ||
| 1224 | "Skew": "Skew", | ||
| 1225 | "Smooth Sampling": "Smooth Sampling", | ||
| 1226 | "Smooth_Sampling_desc": "Allows you to use quadratic/cubic transformations to adjust the distribution. Lower Smoothing Factor values will be more creative, usually between 0.2-0.3 is the sweetspot (assuming the curve = 1). Higher Smoothing Curve values will make the curve steeper, which will punish low probability choices more aggressively. 1.0 curve is equivalent to only using Smoothing Factor.", | ||
| 1227 | "DRY_Repetition_Penalty_desc": "DRY penalizes tokens that would extend the end of the input into a sequence that has previously occurred in the input. Set multiplier to 0 to disable.", | ||
| 1228 | "DRY Repetition Penalty": "DRY Repetition Penalty", | ||
| 1229 | "DRY_Multiplier_desc": "Set to value > 0 to enable DRY. Controls the magnitude of the penalty for the shortest penalized sequences.", | ||
| 1230 | "Multiplier": "Multiplier", | ||
| 1231 | "DRY_Base_desc": "Controls how fast the penalty grows with increasing sequence length.", | ||
| 1232 | "Base": "Base", | ||
| 1233 | "DRY_Allowed_Length_desc": "Longest sequence that can be repeated without being penalized.", | ||
| 1234 | "Allowed Length": "Allowed Length", | ||
| 1235 | "Penalty Range": "Penalty Range", | ||
| 1236 | "DRY_Sequence_Breakers_desc": "Tokens across which sequence matching is not continued. Specified as a comma-separated list of quoted strings.", | ||
| 1237 | "Sequence Breakers": "Sequence Breakers", | ||
| 1238 | "JSON-serialized array of strings.": "Список строк в формате JSON.", | ||
| 1239 | "Mirostat_desc": "Mirostat - своего рода термометр, измеряющий перплексию для выводимого текста.\nMirostat подгоняет перплексию генерируемого текста к перплексии входного текста, что позволяет избежать повторов.\n(когда по мере генерации текста авторегрессионным инференсом, перплексия всё больше приближается к нулю)\n а также ловушки перплексии (когда перплексия начинает уходить в сторону)\nБолее подробное описание в статье Mirostat: A Neural Text Decoding Algorithm that Directly Controls Perplexity by Basu et al. (2020).\nРежим выбирает версию Mirostat. 0=отключить, 1=Mirostat 1.0 (только llama.cpp), 2=Mirostat 2.0.", | ||
| 1240 | "Helpful tip coming soon.": "Подсказку скоро добавим.", | ||
| 1241 | "Temperature_Last_desc": "Использовать Temperature сэмплер в последнюю очередь. Это почти всегда разумно.\nПри включении: сначала выборка набора правдоподобных токенов, затем применение Temperature для корректировки их относительных вероятностей (технически, логитов).\nПри отключении: сначала применение Temperature для корректировки относительных вероятностей ВСЕХ токенов, затем выборка правдоподобных токенов из этого.\nОтключение Temperature Last увеличивает вероятности в хвосте распределения, что увеличивает шансы получить несогласованный ответ.", | ||
| 1242 | "Speculative Ngram": "Speculative Ngram", | ||
| 1243 | "Use a different speculative decoding method without a draft model": "Use a different speculative decoding method without a draft model.\rUsing a draft model is preferred. Speculative ngram is not as effective.", | ||
| 1244 | "Spaces Between Special Tokens": "Spaces Between Special Tokens", | ||
| 1245 | "JSON Schema": "JSON Schema", | ||
| 1246 | "Type in the desired JSON schema": "Type in the desired JSON schema", | ||
| 1247 | "Top P & Min P": "Top P & Min P", | ||
| 1248 | "llama.cpp only. Determines the order of samplers. If Mirostat mode is not 0, sampler order is ignored.": "llama.cpp only. Determines the order of samplers. If Mirostat mode is not 0, sampler order is ignored.", | ||
| 1249 | "Helps the model to associate messages with characters.": "Помогает модели связывать сообщения с персонажами.", | ||
| 1250 | "character_names_none": "Except for groups and past personas. Otherwise, make sure you provide names in the prompt.", | ||
| 1251 | "Completion": "Completion Object", | ||
| 1252 | "character_names_completion": "Только латинские буквы, цифры и знак подчёркивания. Работает не для всех бэкендов, в частности для Claude, MistralAI, Google.", | ||
| 1253 | "Use AI21 Tokenizer": "Использовать токенайзер AI21", | ||
| 1254 | "Use system prompt": "Использовать системный промпт", | ||
| 1255 | "(Gemini 1.5 Pro/Flash only)": "(только Gemini 1.5 Pro/Flash)", | ||
| 1256 | "Merges_all_system_messages_desc_1": "Объединяет все системные сообщения до первого не-системного, и отсылает их в поле", | ||
| 1257 | "Merges_all_system_messages_desc_2": ".", | ||
| 1258 | "Restore User first message": "Restore User first message", | ||
| 1259 | "Human message": "Сообщение, инструкция и т.п. от лица человека.\nПри пустом поле ничего не отправляется, тогда требуется самостоятельно отправить промт от лица пользователя.", | ||
| 1260 | "Text Completion": "Text Completion", | ||
| 1261 | "Chat Completion": "Chat Completion", | ||
| 1262 | "Default (completions compatible)": "Default [OpenAI /completions compatible: oobabooga, LM Studio, etc.]", | ||
| 1263 | "Model Providers": "Model Providers", | ||
| 1264 | "InfermaticAI API Key": "Ключ от API InfermaticAI", | ||
| 1265 | "InfermaticAI Model": "Модель InfermaticAI", | ||
| 1266 | "DreamGen API key": "Ключ от API DreamGen", | ||
| 1267 | "DreamGen Model": "Модель DreamGen", | ||
| 1268 | "vllm-project/vllm": "vllm-project/vllm (режим враппера OpenAI API)", | ||
| 1269 | "vLLM API key": "Ключ от API vLLM", | ||
| 1270 | "Example: 127.0.0.1:8000": "Example: http://127.0.0.1:8000", | ||
| 1271 | "vLLM Model": "Модель vLLM", | ||
| 1272 | "Aphrodite Model": "Модель Aphrodite", | ||
| 1273 | "Peek a password": "Посмотреть пароль", | ||
| 1274 | "openrouter_force_instruct": "This option is outdated and will be removed in the future. To use instruct formatting, please switch to OpenRouter under Text Completion API instead.", | ||
| 1275 | "Force_Instruct_Mode_formatting_Description": "If both Instruct Mode and this are enabled, the prompt will be formatted by SillyTavern using the current\n advanced formatting settings (except instruct System Prompt). If disabled, the prompt will be formatted by OpenRouter.", | ||
| 1276 | "Clear your cookie": "Clear your cookie", | ||
| 1277 | "Add Chat Start and Example Separator to a list of stopping strings.": "Add Chat Start and Example Separator to a list of stopping strings.", | ||
| 1278 | "context_allow_jailbreak": "Если в карточке есть джейлбрейк И ПРИ ЭТОМ включена опция \"Приоритет джейлбрейку из карточки персонажа\", то этот джейлбрейк добавляется в конец промпта.\nНЕ РЕКОМЕНДУЕТСЯ ДЛЯ МОДЕЛЕЙ TEXT COMPLETION, МОЖЕТ ПОРТИТЬ ВЫХОДНОЙ ТЕКСТ.", | ||
| 1279 | "Context Order": "Context Order", | ||
| 1280 | "Summary": "Summary", | ||
| 1281 | "Example Dialogues": "Примеры диалогов", | ||
| 1282 | "Hint": "Hint:", | ||
| 1283 | "In-Chat Position not affected": "Summary and Author's Note orders are only affected when they don't have an In-Chat position set.", | ||
| 1284 | "instruct_bind_to_context": "If enabled, Context templates will be automatically selected based on selected Instruct template name or by preference.", | ||
| 1285 | "Inserted before a System prompt.": "Вставляется перед системным промптом.", | ||
| 1286 | "Inserted after a System prompt.": "Вставляется после системного промпта.", | ||
| 1287 | "Inserted before a User message and as a last prompt line when impersonating.": "Inserted before a User message and as a last prompt line when impersonating.", | ||
| 1288 | "Inserted after a User message.": "Вставляется после сообщения пользователя.", | ||
| 1289 | "Inserted before an Assistant message and as a last prompt line when generating an AI reply.": "Вставляется перед сообщением ассистента и в качестве последней строки промпта во время генерации ответа ИИ.", | ||
| 1290 | "Inserted after an Assistant message.": "Вставляется после сообщения ассистента.", | ||
| 1291 | "Inserted before a System (added by slash commands or extensions) message.": "Inserted before a System (added by slash commands or extensions) message.", | ||
| 1292 | "Inserted after a System message.": "Вставляется после сообщения системы.", | ||
| 1293 | "If enabled, System Sequences will be the same as User Sequences.": "Для сообщений системы будет использоваться то же обрамление, что и для пользователя.", | ||
| 1294 | "Inserted before the first Assistant's message.": "Вставляется перед первым сообщением ассистента.", | ||
| 1295 | "instruct_last_output_sequence": "Вставляется перед последним сообщением ассистента либо в качестве последней строки промпта во время генерации ответа ИИ (если роль не системная / нейтральная).", | ||
| 1296 | "Will be inserted as a last prompt line when using system/neutral generation.": "Will be inserted as a last prompt line when using system/neutral generation.", | ||
| 1297 | "If a stop sequence is generated, everything past it will be removed from the output (inclusive).": "Если ИИ генерирует стоп-строку, то всё после неё будет вырезано из ответа (включая и саму стоп-строку).", | ||
| 1298 | "Will be inserted at the start of the chat history if it doesn't start with a User message.": "Вставляется в начале истории чата, если она начинается не с сообщения пользователя.", | ||
| 1299 | "Global World Info/Lorebook activation settings": "Настройки активации глобального лорбука / Информации о мире", | ||
| 1300 | "Click to expand": "Щёлкните, чтобы развернуть", | ||
| 1301 | "Insertion Strategy": "Как инжектить", | ||
| 1302 | "Only the entries with the most number of key matches will be selected for Inclusion Group filtering": "Only the entries with the most number of key matches will be selected for Inclusion Group filtering", | ||
| 1303 | "Use Group Scoring": "Use Group Scoring", | ||
| 1304 | "Search": "Search", | ||
| 1305 | "Admin Panel": "Admin Panel", | ||
| 1306 | "Logout": "Logout", | ||
| 1307 | "Delete a theme": "Delete a theme", | ||
| 1308 | "Tags_as_Folders_desc": "Recent change: Tags must be marked as folders in the Tag Management menu to appear as such. Click here to bring it up.", | ||
| 1309 | "Slow": "Slow", | ||
| 1310 | "Fast": "Fast", | ||
| 1311 | "Reset MovingUI panel sizes/locations.": "Reset MovingUI panel sizes/locations.", | ||
| 1312 | "Expand the editor": "Expand the editor", | ||
| 1313 | "Disallow embedded media from other domains in chat messages": "Disallow embedded media from other domains in chat messages.", | ||
| 1314 | "AutoComplete Settings": "AutoComplete Settings", | ||
| 1315 | "Automatically hide details": "Automatically hide details", | ||
| 1316 | "Determines how entries are found for autocomplete.": "Determines how entries are found for autocomplete.", | ||
| 1317 | "Autocomplete Matching": "Matching", | ||
| 1318 | "Starts with": "Starts with", | ||
| 1319 | "Includes": "Includes", | ||
| 1320 | "Fuzzy": "Fuzzy", | ||
| 1321 | "Sets the style of the autocomplete.": "Sets the style of the autocomplete.", | ||
| 1322 | "Autocomplete Style": "Style", | ||
| 1323 | "Follow Theme": "Follow Theme", | ||
| 1324 | "Dark": "Dark", | ||
| 1325 | "Sets the font size of the autocomplete.": "Sets the font size of the autocomplete.", | ||
| 1326 | "Sets the width of the autocomplete.": "Sets the width of the autocomplete.", | ||
| 1327 | "Autocomplete Width": "Width", | ||
| 1328 | "chat input box": "chat input box", | ||
| 1329 | "entire chat width": "entire chat width", | ||
| 1330 | "full window width": "full window width", | ||
| 1331 | "Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well.": "Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well.", | ||
| 1332 | "STRICT_ESCAPING": "STRICT_ESCAPING", | ||
| 1333 | "Replace all {{getvar::}} and {{getglobalvar::}} macros with scoped variables to avoid double macro substitution.": "Replace all {{getvar::}} and {{getglobalvar::}} macros with scoped variables to avoid double macro substitution.", | ||
| 1334 | "REPLACE_GETVAR": "REPLACE_GETVAR", | ||
| 1335 | "Extras API:": "Extras API:", | ||
| 1336 | "Extras API URL": "Extras API URL", | ||
| 1337 | "Total tokens": "Total tokens", | ||
| 1338 | "Calculating...": "Calculating...", | ||
| 1339 | "Permanent tokens": "Permanent tokens", | ||
| 1340 | "About Token 'Limits'": "About Token 'Limits'", | ||
| 1341 | "Import Tags": "Импортировать теги", | ||
| 1342 | "Click to allow/forbid the use of external media for this character.": "Нажмите, чтобы разрешить/запретить использование внешних медиа для этого персонажа.", | ||
| 1343 | "Inserted before each part of the joined fields.": "Inserted before each part of the joined fields.", | ||
| 1344 | "Join Prefix": "Join Prefix", | ||
| 1345 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)", | ||
| 1346 | "Inserted after each part of the joined fields.": "Inserted after each part of the joined fields.", | ||
| 1347 | "Join Suffix": "Join Suffix", | ||
| 1348 | "Auto Mode delay": "Auto Mode delay", | ||
| 1349 | "Bulk_edit_characters": "Bulk edit characters\r\rClick to toggle characters\rShift + Click to select/deselect a range of characters\rRight-click for actions", | ||
| 1350 | "Bulk select all characters": "Bulk select all characters", | ||
| 1351 | "Copy to system backgrounds": "Copy to system backgrounds", | ||
| 1352 | "Chat Scenario Override": "Chat Scenario Override", | ||
| 1353 | "Chat Lorebook": "Chat Lorebook for", | ||
| 1354 | "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.", | ||
| 1355 | "Use tag as folder": "Tag as folder", | ||
| 1356 | "WI Entry Status:🔵 Constant🟢 Normal🔗 Vectorized❌ Disabled": "Статус записи:\n 🔵 Постоянная\n 🟢 Обычная\n 🔗 Векторизованная\n ❌ Отключена", | ||
| 1357 | "WI_Entry_Status_Constant": "Постоянная", | ||
| 1358 | "WI_Entry_Status_Normal": "Обычная", | ||
| 1359 | "WI_Entry_Status_Vectorized": "Векторизованная", | ||
| 1360 | "WI_Entry_Status_Disabled": "Отключена", | ||
| 1361 | "Before EM": "↑EM", | ||
| 1362 | "After EM": "↓EM", | ||
| 1363 | "at Depth System": "@D ⚙️", | ||
| 1364 | "at Depth User": "@D 👤", | ||
| 1365 | "at Depth AI": "@D 🤖", | ||
| 1366 | "Depth": "Глубина", | ||
| 1367 | "Trigger %:": "Trigger %:", | ||
| 1368 | "Probability": "Вероятность", | ||
| 1369 | "Duplicate world info entry": "Дублировать запись", | ||
| 1370 | "Delete world info entry": "Удалить запись", | ||
| 1371 | "Keywords or Regexes": "Ключевые слова или регулярки", | ||
| 1372 | "Comma separated list": "Comma separated list", | ||
| 1373 | "Switch to plaintext mode": "Switch to plaintext mode", | ||
| 1374 | "(ignored if empty)": "(пустое поле игнорируется)", | ||
| 1375 | "Keywords or Regexes (ignored if empty)": "Ключевые слова или регулярки (пустое поле игнорируется)", | ||
| 1376 | "Comma separated list (ignored if empty)": "Список через запятую (пустой игнорируется)", | ||
| 1377 | "Can be used to automatically activate Quick Replies": "Can be used to automatically activate Quick Replies", | ||
| 1378 | "Automation ID": "Automation ID", | ||
| 1379 | "( None )": "( None )", | ||
| 1380 | "Delay until recursion (this entry can only be activated on recursive checking)": "Delay until recursion (this entry can only be activated on recursive checking)", | ||
| 1381 | "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", | ||
| 1382 | "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", | ||
| 1383 | "A relative likelihood of entry activation within the group": "A relative likelihood of entry activation within the group", | ||
| 1384 | "Group Weight": "Group Weight", | ||
| 1385 | "Add Memo": "Add Memo", | ||
| 1386 | "close": "close", | ||
| 1387 | "reset": "reset", | ||
| 1388 | "save": "save", | ||
| 1389 | "Open checkpoint chat": "Открыть чат из чекпоинта", | ||
| 1390 | "Alternate Greetings": "Варианты первого сообщения", | ||
| 1391 | "Alternate_Greetings_desc": "Будут отображаться в виде свайпов для первого сообщения нового чата.\n Участники групповых чатов могут выбирать одно из них при начале беседы.", | ||
| 1392 | "alternate_greetings_hint_1": "Чтобы начать, нажмите на кнопку", | ||
| 1393 | "alternate_greetings_hint_2": ".", | ||
| 1394 | "Forbid Media Override explanation": "Ability of the current character/group to use external media in chats.", | ||
| 1395 | "Forbid Media Override subtitle": "Media: images, videos, audio. External: not hosted on the local server.", | ||
| 1396 | "Always forbidden": "Always forbidden", | ||
| 1397 | "Always allowed": "Always allowed", | ||
| 1398 | "View contents": "View contents", | ||
| 1399 | "Remove the file": "Remove the file", | ||
| 1400 | "Use character CFG scales": "Use character CFG scales", | ||
| 1401 | "Select a token to see alternatives considered by the AI.": "Select a token to see alternatives considered by the AI.", | ||
| 1402 | "Continue script execution": "Continue script execution", | ||
| 1403 | "Pause script execution": "Pause script execution", | ||
| 1404 | "Abort script execution": "Abort script execution", | ||
| 1405 | "Toggle Panels": "Toggle Panels", | ||
| 1406 | "Attach a File": "Attach a File", | ||
| 1407 | "Open Data Bank": "Open Data Bank", | ||
| 1408 | "Enter a URL or the ID of a Fandom wiki page to scrape:": "Enter a URL or the ID of a Fandom wiki page to scrape:", | ||
| 1409 | "Examples:": "Examples:", | ||
| 1410 | "Example:": "Example:", | ||
| 1411 | "Single file": "Single file", | ||
| 1412 | "All articles will be concatenated into a single file.": "All articles will be concatenated into a single file.", | ||
| 1413 | "File per article": "File per article", | ||
| 1414 | "Each article will be saved as a separate file.": "Not recommended. Each article will be saved as a separate file.", | ||
| 1415 | "Data Bank": "Data Bank", | ||
| 1416 | "These files will be available for extensions that support attachments (e.g. Vector Storage).": "These files will be available for extensions that support attachments (e.g. Vector Storage).", | ||
| 1417 | "Supported file types: Plain Text, PDF, Markdown, HTML, EPUB.": "Supported file types: Plain Text, PDF, Markdown, HTML, EPUB.", | ||
| 1418 | "Drag and drop files here to upload.": "Drag and drop files here to upload.", | ||
| 1419 | "Date (Newest First)": "Date (Newest First)", | ||
| 1420 | "Date (Oldest First)": "Date (Oldest First)", | ||
| 1421 | "Name (A-Z)": "Name (A-Z)", | ||
| 1422 | "Name (Z-A)": "Name (Z-A)", | ||
| 1423 | "Size (Smallest First)": "Size (Smallest First)", | ||
| 1424 | "Size (Largest First)": "Size (Largest First)", | ||
| 1425 | "Bulk Edit": "Bulk Edit", | ||
| 1426 | "Select All": "Select All", | ||
| 1427 | "Select None": "Select None", | ||
| 1428 | "Enable": "Enable", | ||
| 1429 | "Global Attachments": "Global Attachments", | ||
| 1430 | "These files are available for all characters in all chats.": "These files are available for all characters in all chats.", | ||
| 1431 | "Character Attachments": "Character Attachments", | ||
| 1432 | "These files are available for the current character in all chats they are in.": "These files are available for the current character in all chats they are in.", | ||
| 1433 | "Saved locally. Not exported.": "Saved locally. Not exported.", | ||
| 1434 | "Chat Attachments": "Chat Attachments", | ||
| 1435 | "These files are available for all characters in the current chat.": "These files are available for all characters in the current chat.", | ||
| 1436 | "Enter a base URL of the MediaWiki to scrape.": "Enter a base URL of the MediaWiki to scrape.", | ||
| 1437 | "Don't include the page name!": "Don't include the page name!", | ||
| 1438 | "Enter web URLs to scrape (one per line):": "Enter web URLs to scrape (one per line):", | ||
| 1439 | "Enter a video URL to download its transcript.": "Enter a video URL or ID to download its transcript.", | ||
| 1440 | "Expression API": "Local\nExtras\nLLM", | ||
| 1441 | "Trigger a summary update right now.": "Сгенерировать пересказ прямо сейчас.", | ||
| 1442 | "ext_regex_title": "Regex", | ||
| 1443 | "ext_regex_import_target": "Импортировать в:", | ||
| 1444 | "ext_regex_move_to_scoped": "Сделать локальным", | ||
| 1445 | "Trigger Stable Diffusion": "Trigger Stable Diffusion", | ||
| 1446 | "sd_Yourself": "Yourself", | ||
| 1447 | "sd_Your_Face": "Your Face", | ||
| 1448 | "sd_Me": "Me", | ||
| 1449 | "sd_The_Whole_Story": "The Whole Story", | ||
| 1450 | "sd_The_Last_Message": "The Last Message", | ||
| 1451 | "sd_Raw_Last_Message": "Raw Last Message", | ||
| 1452 | "sd_Background": "Background", | ||
| 1453 | "Image Generation": "Image Generation", | ||
| 1454 | "sd_refine_mode": "Allow to edit prompts manually before sending them to generation API", | ||
| 1455 | "sd_refine_mode_txt": "Edit prompts before generation", | ||
| 1456 | "sd_interactive_mode": "Automatically generate images when sending messages like 'send me a picture of cat'.", | ||
| 1457 | "sd_interactive_mode_txt": "Interactive mode", | ||
| 1458 | "sd_multimodal_captioning": "Use multimodal captioning to generate prompts for user and character portraits based on their avatars.", | ||
| 1459 | "sd_multimodal_captioning_txt": "Use multimodal captioning for portraits", | ||
| 1460 | "sd_expand": "Automatically extend prompts using text generation model", | ||
| 1461 | "sd_expand_txt": "Auto-enhance prompts", | ||
| 1462 | "sd_snap": "Snap generation requests with a forced aspect ratio (portraits, backgrounds) to the nearest known resolution, while trying to preserve the absolute pixel counts (recommended for SDXL).", | ||
| 1463 | "sd_snap_txt": "Snap auto-adjusted resolutions", | ||
| 1464 | "Source": "Source", | ||
| 1465 | "sd_auto_url": "Example: {{auto_url}}", | ||
| 1466 | "Authentication (optional)": "Authentication (optional)", | ||
| 1467 | "Example: username:password": "Example: username:password", | ||
| 1468 | "Important:": "Important:", | ||
| 1469 | "sd_auto_auth_warning_1": "run SD Web UI with the", | ||
| 1470 | "sd_auto_auth_warning_2": "flag! The server must be accessible from the SillyTavern host machine.", | ||
| 1471 | "sd_drawthings_url": "Example: {{drawthings_url}}", | ||
| 1472 | "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.", | ||
| 1473 | "sd_vlad_url": "Example: {{vlad_url}}", | ||
| 1474 | "The server must be accessible from the SillyTavern host machine.": "The server must be accessible from the SillyTavern host machine.", | ||
| 1475 | "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.", | ||
| 1476 | "Allow NSFW images from Horde": "Разрешить NSFW-картинки в Horde", | ||
| 1477 | "Sanitize prompts (recommended)": "Sanitize prompts (recommended)", | ||
| 1478 | "Automatically adjust generation parameters to ensure free image generations.": "Automatically adjust generation parameters to ensure free image generations.", | ||
| 1479 | "Avoid spending Anlas": "Avoid spending Anlas", | ||
| 1480 | "Opus tier": "(Opus tier)", | ||
| 1481 | "View my Anlas": "View my Anlas", | ||
| 1482 | "These settings only apply to DALL-E 3": "These settings only apply to DALL-E 3", | ||
| 1483 | "Image Style": "Image Style", | ||
| 1484 | "Image Quality": "Image Quality", | ||
| 1485 | "Standard": "Standard", | ||
| 1486 | "HD": "HD", | ||
| 1487 | "sd_comfy_url": "Example: {{comfy_url}}", | ||
| 1488 | "Open workflow editor": "Open workflow editor", | ||
| 1489 | "Create new workflow": "Create new workflow", | ||
| 1490 | "Delete workflow": "Delete workflow", | ||
| 1491 | "Enhance": "Enhance", | ||
| 1492 | "Refine": "Refine", | ||
| 1493 | "Decrisper": "Decrisper", | ||
| 1494 | "Sampling steps": "Sampling steps ()", | ||
| 1495 | "Width": "Width ()", | ||
| 1496 | "Height": "Height ()", | ||
| 1497 | "Resolution": "Resolution", | ||
| 1498 | "Model": "Model", | ||
| 1499 | "Sampling method": "Sampling method", | ||
| 1500 | "Karras (not all samplers supported)": "Karras (not all samplers supported)", | ||
| 1501 | "SMEA versions of samplers are modified to perform better at high resolution.": "SMEA versions of samplers are modified to perform better at high resolution.", | ||
| 1502 | "SMEA": "SMEA", | ||
| 1503 | "DYN variants of SMEA samplers often lead to more varied output, but may fail at very high resolutions.": "DYN variants of SMEA samplers often lead to more varied output, but may fail at very high resolutions.", | ||
| 1504 | "DYN": "DYN", | ||
| 1505 | "Scheduler": "Scheduler", | ||
| 1506 | "Restore Faces": "Restore Faces", | ||
| 1507 | "Hires. Fix": "Hires. Fix", | ||
| 1508 | "Upscaler": "Upscaler", | ||
| 1509 | "Upscale by": "Upscale by", | ||
| 1510 | "Denoising strength": "Denoising strength", | ||
| 1511 | "Hires steps (2nd pass)": "Hires steps (2nd pass)", | ||
| 1512 | "Preset for prompt prefix and negative prompt": "Preset for prompt prefix and negative prompt", | ||
| 1513 | "Style": "Style", | ||
| 1514 | "Save style": "Save style", | ||
| 1515 | "Delete style": "Delete style", | ||
| 1516 | "Common prompt prefix": "Common prompt prefix", | ||
| 1517 | "sd_prompt_prefix_placeholder": "Use {prompt} to specify where the generated prompt will be inserted", | ||
| 1518 | "Negative common prompt prefix": "Negative common prompt prefix", | ||
| 1519 | "Character-specific prompt prefix": "Character-specific prompt prefix", | ||
| 1520 | "Won't be used in groups.": "Won't be used in groups.", | ||
| 1521 | "sd_character_prompt_placeholder": "Any characteristics that describe the currently selected character. Will be added after a common prompt prefix.\nExample: female, green eyes, brown hair, pink shirt", | ||
| 1522 | "Character-specific negative prompt prefix": "Character-specific negative prompt prefix", | ||
| 1523 | "sd_character_negative_prompt_placeholder": "Any characteristics that should not appear for the selected character. Will be added after a negative common prompt prefix.\nExample: jewellery, shoes, glasses", | ||
| 1524 | "Shareable": "Shareable", | ||
| 1525 | "Image Prompt Templates": "Image Prompt Templates", | ||
| 1526 | "ext_translate_title": "Chat Translation", | ||
| 1527 | "Vectors Model Warning": "It is recommended to purge vectors when changing the model mid-chat. Otherwise, it will lead to sub-par results.", | ||
| 1528 | "Translate files into English before processing": "Translate files into English before processing", | ||
| 1529 | "Manager Users": "Manage Users", | ||
| 1530 | "New User": "New User", | ||
| 1531 | "Status:": "Status:", | ||
| 1532 | "Display Name:": "Отображаемое имя:", | ||
| 1533 | "User Handle:": "Хэндл пользователя:", | ||
| 1534 | "Confirm Password:": "Подтвердждение пароля:", | ||
| 1535 | "This will create a new subfolder...": "В папке /data/ будет создана новая подпапка, названная согласно хэндлу пользователя.", | ||
| 1536 | "Current Password:": "Текущий пароль:", | ||
| 1537 | "New Password:": "Новый пароль:", | ||
| 1538 | "Confirm New Password:": "Подтвердите новый пароль:", | ||
| 1539 | "Debug Warning": "Functions in this category are for advanced users only. Don't click anything if you're not sure about the consequences.", | ||
| 1540 | "Execute": "Execute", | ||
| 1541 | "Are you sure you want to delete this user?": "Вы точно хотите удалить этого пользователя?", | ||
| 1542 | "Deleting:": "Удаляется:", | ||
| 1543 | "Also wipe user data.": "Также стереть данные пользователя.", | ||
| 1544 | "Warning:": "Предупреждение:", | ||
| 1545 | "This action is irreversible.": "Данное действие невозможно отменить.", | ||
| 1546 | "Type the user's handle below to confirm:": "Для подтверждения введите хэндл пользователя:", | ||
| 1547 | "help_hotkeys_9": "Enter", | ||
| 1548 | "help_hotkeys_11": "Ctrl+Enter", | ||
| 1549 | "help_hotkeys_13": "Alt+Enter", | ||
| 1550 | "help_hotkeys_15": "Escape", | ||
| 1551 | "Import Characters": "Импорт персонажей", | ||
| 1552 | "char_import_8": "Персонаж с RisuRealm (прямая ссылка)", | ||
| 1553 | "Supports importing multiple characters.": "Можно импортировать несколько персонажей за раз.", | ||
| 1554 | "Write each URL or ID into a new line.": "Запишите URL-адреса / идентификаторы на отдельных строчках.", | ||
| 1555 | "System-wide Replacement Macros (in order of evaluation):": "System-wide Replacement Macros (in order of evaluation):", | ||
| 1556 | "help_macros_1": "only for slash command batching. Replaced with the returned result of the previous command.", | ||
| 1557 | "help_macros_2": "just inserts a newline.", | ||
| 1558 | "help_macros_3": "trims newlines surrounding this macro.", | ||
| 1559 | "help_macros_4": "no operation, just an empty string.", | ||
| 1560 | "help_macros_5": "global prompts defined in API settings. Only valid in Advanced Definitions prompt overrides.", | ||
| 1561 | "help_macros_6": "the user input", | ||
| 1562 | "help_macros_7": "the Character's Main Prompt override", | ||
| 1563 | "help_macros_8": "the Character's Jailbreak Prompt override", | ||
| 1564 | "help_macros_9": "the Character's Description", | ||
| 1565 | "help_macros_10": "the Character's Personality", | ||
| 1566 | "help_macros_11": "the Character's Scenario", | ||
| 1567 | "help_macros_12": "your current Persona Description", | ||
| 1568 | "help_macros_13": "the Character's Dialogue Examples", | ||
| 1569 | "help_macros_14": "unformatted Dialogue Examples", | ||
| 1570 | "help_macros_15": "your current Persona username", | ||
| 1571 | "help_macros_16": "the Character's name", | ||
| 1572 | "help_macros_17": "the Character's version number", | ||
| 1573 | "help_macros_18": "a comma-separated list of group member names or the character name in solo chats. Alias: {{charIfNotGroup}}", | ||
| 1574 | "help_macros_19": "a text generation model name for the currently selected API.", | ||
| 1575 | "help_macros_20": "the text of the latest chat message.", | ||
| 1576 | "help_macros_21": "index # of the latest chat message. Useful for slash command batching.", | ||
| 1577 | "help_macros_22": "the ID of the first message included in the context. Requires generation to be ran at least once in the current session.", | ||
| 1578 | "help_macros_23": "the 1-based ID of the current swipe in the last chat message. Empty string if the last message is user or prompt-hidden.", | ||
| 1579 | "help_macros_24": "the number of swipes in the last chat message. Empty string if the last message is user or prompt-hidden.", | ||
| 1580 | "help_macros_25": "you can leave a note here, and the macro will be replaced with blank content. Not visible for the AI.", | ||
| 1581 | "help_macros_26": "the current time", | ||
| 1582 | "help_macros_27": "the current date", | ||
| 1583 | "help_macros_28": "the current weekday", | ||
| 1584 | "help_macros_29": "the current ISO time (24-hour clock)", | ||
| 1585 | "help_macros_30": "the current ISO date (YYYY-MM-DD)", | ||
| 1586 | "help_macros_31": "the current date/time in the specified format, e. g. for German date/time:", | ||
| 1587 | "help_macros_32": "the current time in the specified UTC time zone offset, e.g. UTC-4 or UTC+2", | ||
| 1588 | "help_macros_33": "the time difference between time1 and time2. Accepts time and date macros. (Ex: {{timeDiff::{{isodate}} {{time}}::2024/5/11 12:30:00}})", | ||
| 1589 | "help_macros_34": "the time since the last user message was sent", | ||
| 1590 | "help_macros_35": "sets a behavioral bias for the AI until the next user input. Quotes around the text are important.", | ||
| 1591 | "help_macros_36": "rolls a dice. (ex:", | ||
| 1592 | "help_macros_37": "returns a random item from the list. (ex:", | ||
| 1593 | "help_macros_38": "alternative syntax for random that allows to use commas in the list items.", | ||
| 1594 | "help_macros_39": "picks a random item from the list. Works the same as {{random}}, with the same possible syntax options, but the pick will stay consistent for this chat once picked and won't be re-rolled on consecutive messages and prompt processing.", | ||
| 1595 | "help_macros_40": "dynamically add text in the quotes to banned words sequences, if Text Generation WebUI backend used. Do nothing for others backends. Can be used anywhere (Character description, WI, AN, etc.) Quotes around the text are important.", | ||
| 1596 | "Instruct Mode and Context Template Macros:": "Instruct Mode and Context Template Macros:", | ||
| 1597 | "(enabled in the Advanced Formatting settings)": "(enabled in the Advanced Formatting settings)", | ||
| 1598 | "help_macros_41": "max allowed prompt length in tokens = (context size - response length)", | ||
| 1599 | "help_macros_42": "context template example dialogues separator", | ||
| 1600 | "help_macros_43": "context template chat start line", | ||
| 1601 | "help_macros_44": "main system prompt (either character prompt override if chosen, or instructSystemPrompt)", | ||
| 1602 | "help_macros_45": "instruct system prompt", | ||
| 1603 | "help_macros_46": "instruct system prompt prefix sequence", | ||
| 1604 | "help_macros_47": "instruct system prompt suffix sequence", | ||
| 1605 | "help_macros_48": "instruct user prefix sequence", | ||
| 1606 | "help_macros_49": "instruct user suffix sequence", | ||
| 1607 | "help_macros_50": "instruct assistant prefix sequence", | ||
| 1608 | "help_macros_51": "instruct assistant suffix sequence", | ||
| 1609 | "help_macros_52": "instruct assistant first output sequence", | ||
| 1610 | "help_macros_53": "instruct assistant last output sequence", | ||
| 1611 | "help_macros_54": "instruct system message prefix sequence", | ||
| 1612 | "help_macros_55": "instruct system message suffix sequence", | ||
| 1613 | "help_macros_56": "instruct system instruction prefix", | ||
| 1614 | "help_macros_57": "instruct first user message filler", | ||
| 1615 | "help_macros_58": "instruct stop sequence", | ||
| 1616 | "Chat variables Macros:": "Chat variables Macros:", | ||
| 1617 | "Local variables = unique to the current chat": "Local variables = unique to the current chat", | ||
| 1618 | "Global variables = works in any chat for any character": "Global variables = works in any chat for any character", | ||
| 1619 | "Scoped variables = works in STscript": "Scoped variables = works in STscript", | ||
| 1620 | "help_macros_59": "replaced with the value of the local variable \"name\"", | ||
| 1621 | "help_macros_60": "replaced with empty string, sets the local variable \"name\" to \"value\"", | ||
| 1622 | "help_macros_61": "replaced with empty strings, adds a numeric value of \"increment\" to the local variable \"name\"", | ||
| 1623 | "help_macros_62": "replaced with the result of the increment of value of the variable \"name\" by 1", | ||
| 1624 | "help_macros_63": "replaced with the result of the decrement of value of the variable \"name\" by 1", | ||
| 1625 | "help_macros_64": "replaced with the value of the global variable \"name\"", | ||
| 1626 | "help_macros_65": "replaced with empty string, sets the global variable \"name\" to \"value\"", | ||
| 1627 | "help_macros_66": "replaced with empty string, adds a numeric value of \"increment\" to the global variable \"name\"", | ||
| 1628 | "help_macros_67": "replaced with the result of the increment of value of the global variable \"name\" by 1", | ||
| 1629 | "help_macros_68": "replaced with the result of the decrement of value of the global variable \"name\" by 1", | ||
| 1630 | "help_macros_69": "replaced with the value of the scoped variable \"name\"", | ||
| 1631 | "help_macros_70": "replaced with the value of item at index (for arrays / lists or objects / dictionaries) of the scoped variable \"name\"", | ||
| 1632 | "Export for character": "Export for character", | ||
| 1633 | "Export prompts for this character, including their order.": "Export prompts for this character, including their order.", | ||
| 1634 | "Are you sure you want to reset your settings to factory defaults?": "Вы точно хотите сбросить настройки до заводских?", | ||
| 1635 | "Don't forget to save a snapshot of your settings before proceeding.": "Настоятельно советуем перед этим сохранить снимок текущих настроек.", | ||
| 1636 | "Change Password": "Сменить пароль", | ||
| 1637 | "Reset Code:": "Reset Code:", | ||
| 1638 | "Click _space": "Нажмите ", | ||
| 1639 | "Alternate Greeting #": "Вариант #" | ||
| 1455 | } | 1640 | } |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Приєднатися до карток персонажів (включно з приглушеними)", | 853 | "Join character cards (include muted)": "Приєднатися до карток персонажів (включно з приглушеними)", |
| 854 | "Inserted before each part of the joined fields.": "Вставляється перед кожною частиною об’єднаних полів.", | 854 | "Inserted before each part of the joined fields.": "Вставляється перед кожною частиною об’єднаних полів.", |
| 855 | "Join Prefix": "Префікс приєднання", | 855 | "Join Prefix": "Префікс приєднання", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Якщо вибрано «Об’єднати картки персонажів», усі відповідні поля персонажів об’єднуються.\rЦе означає, що, наприклад, у рядку історії всі описи персонажів будуть об’єднані в один великий текст.\rЯкщо ви хочете, щоб ці поля були розділені, ви можете визначити тут префікс або суфікс.\r\rЦе значення підтримує звичайні макроси, а також замінює {{char}} на ім’я відповідного символу, а <FIELDNAME> — на назву частини (наприклад, опис, особистість, сценарій тощо).", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Якщо вибрано «Об’єднати картки персонажів», усі відповідні поля персонажів об’єднуються.\rЦе означає, що, наприклад, у рядку історії всі описи персонажів будуть об’єднані в один великий текст.\rЯкщо ви хочете, щоб ці поля були розділені, ви можете визначити тут префікс або суфікс.\r\rЦе значення підтримує звичайні макроси, а також замінює {{char}} на ім’я відповідного символу, а <FIELDNAME> — на назву частини (наприклад, опис, особистість, сценарій тощо).", |
| 857 | "Inserted after each part of the joined fields.": "Вставляється після кожної частини об’єднаних полів.", | 857 | "Inserted after each part of the joined fields.": "Вставляється після кожної частини об’єднаних полів.", |
| 858 | "Join Suffix": "Суфікс приєднання", | 858 | "Join Suffix": "Суфікс приєднання", |
| 859 | "Set a group chat scenario": "Встановити сценарій групового чату", | 859 | "Set a group chat scenario": "Встановити сценарій групового чату", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Масове редагування персонажів", | 885 | "Bulk_edit_characters": "Масове редагування персонажів", |
| 886 | "Bulk select all characters": "Масове виділення всіх символів", | 886 | "Bulk select all characters": "Масове виділення всіх символів", |
| 887 | "Bulk delete characters": "Масове видалення персонажів", | 887 | "Bulk delete characters": "Масове видалення персонажів", |
| 888 | "popup_text_save": "зберегти", | 888 | "popup-button-save": "зберегти", |
| 889 | "popup_text_yes": "Так", | 889 | "popup-button-yes": "Так", |
| 890 | "popup_text_no": "Немає", | 890 | "popup-button-no": "Немає", |
| 891 | "popup_text_cancel": "Скасувати", | 891 | "popup-button-cancel": "Скасувати", |
| 892 | "popup_text_import": "Імпорт", | 892 | "popup-button-import": "Імпорт", |
| 893 | "Advanced Defininitions": "Розширені визначення", | 893 | "Advanced Defininitions": "Розширені визначення", |
| 894 | "Prompt Overrides": "Перевизначення підказок", | 894 | "Prompt Overrides": "Перевизначення підказок", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Для завершення чату та режиму інструктажу)", | 895 | "(For Chat Completion and Instruct Mode)": "(Для завершення чату та режиму інструктажу)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Виключення персонажів", | 1005 | "Character Exclusion": "Виключення персонажів", |
| 1006 | "-- Characters not found --": "-- Персонажі не знайдені --", | 1006 | "-- Characters not found --": "-- Персонажі не знайдені --", |
| 1007 | "Inclusion Group": "Група включення", | 1007 | "Inclusion Group": "Група включення", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Групи включення гарантують, що одночасно активується лише один запис із групи, якщо їх активовано декілька.\rПідтримує кілька груп, розділених комами.\r\rДокументація: World Info - Inclusion Group", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Групи включення гарантують, що одночасно активується лише один запис із групи, якщо їх активовано декілька.\rПідтримує кілька груп, розділених комами.\r\rДокументація: World Info - Inclusion Group", |
| 1009 | "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Якщо кілька пріоритетів, вибирається той, який має найвищий «порядок».", | 1009 | "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.": "Пріоритезувати цей запис: якщо позначено, цей запис має пріоритет серед усіх вибраних.\rЯкщо кілька пріоритетів, вибирається той, який має найвищий «порядок».", |
| 1010 | "Only one entry with the same label will be activated": "Буде активовано лише один запис з однією міткою", | 1010 | "Only one entry with the same label will be activated": "Буде активовано лише один запис з однією міткою", |
| 1011 | "A relative likelihood of entry activation within the group": "Відносна ймовірність активації входу в групу", | 1011 | "A relative likelihood of entry activation within the group": "Відносна ймовірність активації входу в групу", |
| 1012 | "Group Weight": "Вага групи", | 1012 | "Group Weight": "Вага групи", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Скинути код:", | 1436 | "Reset Code:": "Скинути код:", |
| 1437 | "Want to update?": "Хочете оновити?", | 1437 | "Want to update?": "Хочете оновити?", |
| 1438 | "How to start chatting?": "Як почати спілкування?", | 1438 | "How to start chatting?": "Як почати спілкування?", |
| 1439 | "Click ": "Натисніть", | 1439 | "Click _space": "Натисніть", |
| 1440 | "and select a": "і виберіть", | 1440 | "and select a": "і виберіть", |
| 1441 | "Chat API": "API чату", | 1441 | "Chat API": "API чату", |
| 1442 | "and pick a character.": "і виберіть персонажа.", | 1442 | "and pick a character.": "і виберіть персонажа.", |
| @@ -853,7 +853,7 @@ | |||
| 853 | "Join character cards (include muted)": "Tham gia thẻ nhân vật (bao gồm cả tắt tiếng)", | 853 | "Join character cards (include muted)": "Tham gia thẻ nhân vật (bao gồm cả tắt tiếng)", |
| 854 | "Inserted before each part of the joined fields.": "Được chèn trước mỗi phần của các trường đã nối.", | 854 | "Inserted before each part of the joined fields.": "Được chèn trước mỗi phần của các trường đã nối.", |
| 855 | "Join Prefix": "Tham gia tiền tố", | 855 | "Join Prefix": "Tham gia tiền tố", |
| 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Khi chọn 'Tham gia thẻ nhân vật', tất cả các trường tương ứng của các nhân vật sẽ được nối với nhau.\rĐiều này có nghĩa là trong chuỗi câu chuyện chẳng hạn, tất cả các mô tả nhân vật sẽ được nối thành một văn bản lớn.\rNếu muốn tách các trường đó, bạn có thể xác định tiền tố hoặc hậu tố tại đây.\r\rGiá trị này hỗ trợ các macro thông thường và cũng sẽ thay thế {{char}} bằng tên của char có liên quan và <FIELDNAME> bằng tên của phần đó (ví dụ: mô tả, tính cách, kịch bản, v.v.)", | 856 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "Khi chọn 'Tham gia thẻ nhân vật', tất cả các trường tương ứng của các nhân vật sẽ được nối với nhau.\rĐiều này có nghĩa là trong chuỗi câu chuyện chẳng hạn, tất cả các mô tả nhân vật sẽ được nối thành một văn bản lớn.\rNếu muốn tách các trường đó, bạn có thể xác định tiền tố hoặc hậu tố tại đây.\r\rGiá trị này hỗ trợ các macro thông thường và cũng sẽ thay thế {{char}} bằng tên của char có liên quan và <FIELDNAME> bằng tên của phần đó (ví dụ: mô tả, tính cách, kịch bản, v.v.)", |
| 857 | "Inserted after each part of the joined fields.": "Được chèn sau mỗi phần của các trường đã nối.", | 857 | "Inserted after each part of the joined fields.": "Được chèn sau mỗi phần của các trường đã nối.", |
| 858 | "Join Suffix": "Tham gia hậu tố", | 858 | "Join Suffix": "Tham gia hậu tố", |
| 859 | "Set a group chat scenario": "Đặt một kịch bản trò chuyện nhóm", | 859 | "Set a group chat scenario": "Đặt một kịch bản trò chuyện nhóm", |
| @@ -885,11 +885,11 @@ | |||
| 885 | "Bulk_edit_characters": "Chỉnh sửa nhân vật theo lô", | 885 | "Bulk_edit_characters": "Chỉnh sửa nhân vật theo lô", |
| 886 | "Bulk select all characters": "Chọn hàng loạt tất cả các ký tự", | 886 | "Bulk select all characters": "Chọn hàng loạt tất cả các ký tự", |
| 887 | "Bulk delete characters": "Xóa nhân vật theo lô", | 887 | "Bulk delete characters": "Xóa nhân vật theo lô", |
| 888 | "popup_text_save": "Cứu", | 888 | "popup-button-save": "Cứu", |
| 889 | "popup_text_yes": "Đúng", | 889 | "popup-button-yes": "Đúng", |
| 890 | "popup_text_no": "KHÔNG", | 890 | "popup-button-no": "KHÔNG", |
| 891 | "popup_text_cancel": "Hủy bỏ", | 891 | "popup-button-cancel": "Hủy bỏ", |
| 892 | "popup_text_import": "Nhập khẩu", | 892 | "popup-button-import": "Nhập khẩu", |
| 893 | "Advanced Defininitions": "Các Định nghĩa Nâng cao", | 893 | "Advanced Defininitions": "Các Định nghĩa Nâng cao", |
| 894 | "Prompt Overrides": "Ghi đè nhắc nhở", | 894 | "Prompt Overrides": "Ghi đè nhắc nhở", |
| 895 | "(For Chat Completion and Instruct Mode)": "(Đối với chế độ hoàn thành trò chuyện và hướng dẫn)", | 895 | "(For Chat Completion and Instruct Mode)": "(Đối với chế độ hoàn thành trò chuyện và hướng dẫn)", |
| @@ -1005,8 +1005,8 @@ | |||
| 1005 | "Character Exclusion": "Loại trừ Nhân vật", | 1005 | "Character Exclusion": "Loại trừ Nhân vật", |
| 1006 | "-- Characters not found --": "-- Không tìm thấy Nhân vật --", | 1006 | "-- Characters not found --": "-- Không tìm thấy Nhân vật --", |
| 1007 | "Inclusion Group": "Nhóm Bao gồm", | 1007 | "Inclusion Group": "Nhóm Bao gồm", |
| 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "Nhóm Bao gồm đảm bảo chỉ một mục từ một nhóm được kích hoạt tại một thời điểm, nếu nhiều mục được kích hoạt.\rHỗ trợ nhiều nhóm được phân tách bằng dấu phẩy.\r\rTài liệu: World Info - Inclusion Group", | 1008 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "Nhóm Bao gồm đảm bảo chỉ một mục từ một nhóm được kích hoạt tại một thời điểm, nếu nhiều mục được kích hoạt.\rHỗ trợ nhiều nhóm được phân tách bằng dấu phẩy.\r\rTài liệu: World Info - Inclusion Group", |
| 1009 | "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.": "Ưu tiên mục nhập này: Khi được chọn, mục nhập này được ưu tiên trong số tất cả các lựa chọn.\rNếu nhiều ưu tiên được ưu tiên thì cái có 'Thứ tự' cao nhất sẽ được chọn.", | 1009 | "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.": "Ưu tiên mục nhập này: Khi được chọn, mục nhập này được ưu tiên trong số tất cả các lựa chọn.\rNếu nhiều ưu tiên được ưu tiên thì cái có 'Thứ tự' cao nhất sẽ được chọn.", |
| 1010 | "Only one entry with the same label will be activated": "Chỉ một mục có cùng nhãn sẽ được kích hoạt", | 1010 | "Only one entry with the same label will be activated": "Chỉ một mục có cùng nhãn sẽ được kích hoạt", |
| 1011 | "A relative likelihood of entry activation within the group": "Khả năng tương đối của việc kích hoạt mục nhập trong nhóm", | 1011 | "A relative likelihood of entry activation within the group": "Khả năng tương đối của việc kích hoạt mục nhập trong nhóm", |
| 1012 | "Group Weight": "Trọng lượng nhóm", | 1012 | "Group Weight": "Trọng lượng nhóm", |
| @@ -1436,7 +1436,7 @@ | |||
| 1436 | "Reset Code:": "Đặt lại mã:", | 1436 | "Reset Code:": "Đặt lại mã:", |
| 1437 | "Want to update?": "Muốn cập nhật?", | 1437 | "Want to update?": "Muốn cập nhật?", |
| 1438 | "How to start chatting?": "Làm thế nào để bắt đầu trò chuyện?", | 1438 | "How to start chatting?": "Làm thế nào để bắt đầu trò chuyện?", |
| 1439 | "Click ": "Nhấp chuột", | 1439 | "Click _space": "Nhấp chuột", |
| 1440 | "and select a": "và chọn một", | 1440 | "and select a": "và chọn một", |
| 1441 | "Chat API": "API Trò chuyện", | 1441 | "Chat API": "API Trò chuyện", |
| 1442 | "and pick a character.": "và chọn một nhân vật.", | 1442 | "and pick a character.": "và chọn một nhân vật.", |
| @@ -27,23 +27,23 @@ | |||
| 27 | "Instruct": "指导", | 27 | "Instruct": "指导", |
| 28 | "Prose Augmenter": "散文增强器", | 28 | "Prose Augmenter": "散文增强器", |
| 29 | "Text Adventure": "文字冒险", | 29 | "Text Adventure": "文字冒险", |
| 30 | "response legth(tokens)": "响应长度(以词符数计)", | 30 | "response legth(tokens)": "回复长度(以词符数计)", |
| 31 | "Streaming": "流式传输", | 31 | "Streaming": "流式传输", |
| 32 | "Streaming_desc": "逐位显示生成的响应", | 32 | "Streaming_desc": "逐位显示生成的回复", |
| 33 | "context size(tokens)": "上下文长度(以词符数计)", | 33 | "context size(tokens)": "上下文长度(以词符数计)", |
| 34 | "unlocked": "解锁", | 34 | "unlocked": "解锁", |
| 35 | "Only enable this if your model supports context sizes greater than 4096 tokens": "仅在您的模型支持大于4096个词符的上下文大小时启用此选项", | 35 | "Only enable this if your model supports context sizes greater than 4096 tokens": "仅在您的模型支持大于4096个词符的上下文大小时启用此选项", |
| 36 | "Max prompt cost:": "最大提示费用:", | 36 | "Max prompt cost:": "最大提示词费用:", |
| 37 | "Display the response bit by bit as it is generated.": "随着响应的生成,逐步显示结果。", | 37 | "Display the response bit by bit as it is generated.": "随着回复的生成,逐位显示结果。", |
| 38 | "When this is off, responses will be displayed all at once when they are complete.": "当此选项关闭时,响应将在完成后一次性显示。", | 38 | "When this is off, responses will be displayed all at once when they are complete.": "当此选项关闭时,回复将在完成后一次性显示。", |
| 39 | "Temperature": "温度", | 39 | "Temperature": "温度", |
| 40 | "rep.pen": "重复度惩罚", | 40 | "rep.pen": "重复惩罚", |
| 41 | "Rep. Pen. Range.": "重复度惩罚范围。", | 41 | "Rep. Pen. Range.": "重复惩罚范围。", |
| 42 | "Rep. Pen. Slope": "重复度惩罚斜率", | 42 | "Rep. Pen. Slope": "重复惩罚斜率", |
| 43 | "Rep. Pen. Freq.": "频率重复度惩罚", | 43 | "Rep. Pen. Freq.": "频率重复惩罚", |
| 44 | "Rep. Pen. Presence": "存在重复度惩罚", | 44 | "Rep. Pen. Presence": "存在重复惩罚", |
| 45 | "TFS": "无尾采样", | 45 | "TFS": "无尾采样", |
| 46 | "Phrase Repetition Penalty": "短语重复度惩罚", | 46 | "Phrase Repetition Penalty": "短语重复惩罚", |
| 47 | "Off": "关闭", | 47 | "Off": "关闭", |
| 48 | "Very light": "非常轻", | 48 | "Very light": "非常轻", |
| 49 | "Light": "轻", | 49 | "Light": "轻", |
| @@ -54,7 +54,7 @@ | |||
| 54 | "Unrestricted maximum value for the context slider": "AI可见的最大上下文长度", | 54 | "Unrestricted maximum value for the context slider": "AI可见的最大上下文长度", |
| 55 | "Context Size (tokens)": "上下文长度(以词符数计)", | 55 | "Context Size (tokens)": "上下文长度(以词符数计)", |
| 56 | "Max Response Length (tokens)": "最大回复长度(以词符数计)", | 56 | "Max Response Length (tokens)": "最大回复长度(以词符数计)", |
| 57 | "Multiple swipes per generation": "每次生成多个备选项", | 57 | "Multiple swipes per generation": "每次生成多个备选回复", |
| 58 | "Enable OpenAI completion streaming": "启用OpenAI文本补全流式传输", | 58 | "Enable OpenAI completion streaming": "启用OpenAI文本补全流式传输", |
| 59 | "Enable Cohere web-search connector": "启用 Cohere 网络搜索连接器", | 59 | "Enable Cohere web-search connector": "启用 Cohere 网络搜索连接器", |
| 60 | "Web-search": "联网搜索", | 60 | "Web-search": "联网搜索", |
| @@ -64,12 +64,12 @@ | |||
| 64 | "Count Penalty": "计数惩罚", | 64 | "Count Penalty": "计数惩罚", |
| 65 | "Top K": "Top K", | 65 | "Top K": "Top K", |
| 66 | "Top P": "Top P", | 66 | "Top P": "Top P", |
| 67 | "Repetition Penalty": "重复度惩罚", | 67 | "Repetition Penalty": "重复惩罚", |
| 68 | "Min P": "最小P", | 68 | "Min P": "Min P", |
| 69 | "Top A": "Top A", | 69 | "Top A": "Top A", |
| 70 | "Quick Prompts Edit": "快速提示词编辑", | 70 | "Quick Prompts Edit": "快速提示词编辑", |
| 71 | "Main": "主要", | 71 | "Main": "主要", |
| 72 | "NSFW": "不适合上班时间", | 72 | "NSFW": "NSFW", |
| 73 | "Jailbreak": "越狱", | 73 | "Jailbreak": "越狱", |
| 74 | "Utility Prompts": "实用提示词", | 74 | "Utility Prompts": "实用提示词", |
| 75 | "Impersonation prompt": "AI帮答提示词", | 75 | "Impersonation prompt": "AI帮答提示词", |
| @@ -77,27 +77,27 @@ | |||
| 77 | "Prompt that is used for Impersonation function": "用于AI帮答功能的提示词", | 77 | "Prompt that is used for Impersonation function": "用于AI帮答功能的提示词", |
| 78 | "World Info Format Template": "世界信息格式模板", | 78 | "World Info Format Template": "世界信息格式模板", |
| 79 | "Restore default format": "恢复默认格式", | 79 | "Restore default format": "恢复默认格式", |
| 80 | "Wraps activated World Info entries before inserting into the prompt.": "在插入提示之前包装激活的世界信息条目。", | 80 | "Wraps activated World Info entries before inserting into the prompt.": "在插入提示词之前包裹激活的世界信息条目。", |
| 81 | "scenario_format_template_part_1": "使用", | 81 | "scenario_format_template_part_1": "使用", |
| 82 | "scenario_format_template_part_2": "标记插入内容的位置。", | 82 | "scenario_format_template_part_2": "标记插入内容的位置。", |
| 83 | "Scenario Format Template": "场景格式模板", | 83 | "Scenario Format Template": "场景格式模板", |
| 84 | "Personality Format Template": "个性格式模板", | 84 | "Personality Format Template": "角色设定格式模板", |
| 85 | "Group Nudge Prompt Template": "群组提醒提示模板", | 85 | "Group Nudge Prompt Template": "群组推进提示词模板", |
| 86 | "Sent at the end of the group chat history to force reply from a specific character.": "在群聊历史结束时发送,强制特定角色回复。", | 86 | "Sent at the end of the group chat history to force reply from a specific character.": "在群聊记录的末尾发送,以强制特定角色回复。", |
| 87 | "New Chat": "新聊天", | 87 | "New Chat": "新聊天", |
| 88 | "Restore new chat prompt": "恢复新的聊天提示", | 88 | "Restore new chat prompt": "恢复新的聊天提示词", |
| 89 | "Set at the beginning of the chat history to indicate that a new chat is about to start.": "设置在聊天历史的开头,表示新的聊天即将开始。", | 89 | "Set at the beginning of the chat history to indicate that a new chat is about to start.": "设置在聊天历史的开头,表示新的聊天即将开始。", |
| 90 | "New Group Chat": "新群聊", | 90 | "New Group Chat": "新群聊", |
| 91 | "Restore new group chat prompt": "恢复默认提示", | 91 | "Restore new group chat prompt": "恢复默认提示词", |
| 92 | "Set at the beginning of the chat history to indicate that a new group chat is about to start.": "设置在聊天记录的开头,表示新的群聊即将开始。", | 92 | "Set at the beginning of the chat history to indicate that a new group chat is about to start.": "设置在聊天记录的开头,表示新的群聊即将开始。", |
| 93 | "New Example Chat": "新示例聊天", | 93 | "New Example Chat": "新示例聊天", |
| 94 | "Set at the beginning of Dialogue examples to indicate that a new example chat is about to start.": "设置在对话示例的开头,以表明新的示例聊天即将开始。", | 94 | "Set at the beginning of Dialogue examples to indicate that a new example chat is about to start.": "设置在对话示例的开头,以表明新的示例聊天即将开始。", |
| 95 | "Continue nudge": "继续推动", | 95 | "Continue nudge": "继续推进", |
| 96 | "Set at the end of the chat history when the continue button is pressed.": "当按下继续按钮时在聊天记录的末尾设置。", | 96 | "Set at the end of the chat history when the continue button is pressed.": "当按下继续按钮时在聊天记录的末尾设置。", |
| 97 | "Replace empty message": "替换空消息", | 97 | "Replace empty message": "替换空消息", |
| 98 | "Send this text instead of nothing when the text box is empty.": "当文本框为空时,发送此文本而不是空白。", | 98 | "Send this text instead of nothing when the text box is empty.": "当文本框为空时,发送此文本而不是空白。", |
| 99 | "Seed": "种子", | 99 | "Seed": "种子", |
| 100 | "Set to get deterministic results. Use -1 for random seed.": "设置为确定性结果。使用 -1 为随机种子。", | 100 | "Set to get deterministic results. Use -1 for random seed.": "设置此值以得到确定性结果。使用 -1 表示随机种子。", |
| 101 | "Temperature controls the randomness in token selection": "温度控制词符选择中的随机性:\n- 低温(<1.0)导致更可预测的文本,优先选择高概率的词符。\n- 高温(>1.0)鼓励创造性和输出的多样性,更多地选择低概率的词符。\n将值设置为 1.0 以使用原始概率。", | 101 | "Temperature controls the randomness in token selection": "温度控制词符选择中的随机性:\n- 低温(<1.0)导致更可预测的文本,优先选择高概率的词符。\n- 高温(>1.0)鼓励创造性和输出的多样性,更多地选择低概率的词符。\n将值设置为 1.0 以使用原始概率。", |
| 102 | "Top_K_desc": "Top K 设定了可以选择的最高概率词符的最大数量。", | 102 | "Top_K_desc": "Top K 设定了可以选择的最高概率词符的最大数量。", |
| 103 | "Top_P_desc": "Top P(又称核采样)将所有高概率词符聚集在一起,直到达到特定的百分比。\n换句话说,如果前两个词符分别都有 25% 的概率,而 Top-P 为 0.50,那么只有这两个词符会被考虑。\n将这个值设置为 1.0 就相当于关闭了这个功能。", | 103 | "Top_P_desc": "Top P(又称核采样)将所有高概率词符聚集在一起,直到达到特定的百分比。\n换句话说,如果前两个词符分别都有 25% 的概率,而 Top-P 为 0.50,那么只有这两个词符会被考虑。\n将这个值设置为 1.0 就相当于关闭了这个功能。", |
| @@ -106,13 +106,13 @@ | |||
| 106 | "Min_P_desc": "Min P 设定了一个基础的最小概率,它会根据最高词符概率来进行优化。\n如果最高词符概率是 80%,而Min P设定为 0.1,那么只有那些概率高于8%的词符会被考虑。\n将这个值设置为 0 就相当于关闭了这个功能。", | 106 | "Min_P_desc": "Min P 设定了一个基础的最小概率,它会根据最高词符概率来进行优化。\n如果最高词符概率是 80%,而Min P设定为 0.1,那么只有那些概率高于8%的词符会被考虑。\n将这个值设置为 0 就相当于关闭了这个功能。", |
| 107 | "Top_A_desc": "Top A 设定了一个阈值,用于根据最高词符概率的平方来选择词符。\n如果 Top A 设定为 0.2,而最高词符概率是 50%,那么概率低于 5% 的词符会被排除(0.2 * 0.5^2)。\n将这个值设置为 0 就相当于关闭了这个功能。", | 107 | "Top_A_desc": "Top A 设定了一个阈值,用于根据最高词符概率的平方来选择词符。\n如果 Top A 设定为 0.2,而最高词符概率是 50%,那么概率低于 5% 的词符会被排除(0.2 * 0.5^2)。\n将这个值设置为 0 就相当于关闭了这个功能。", |
| 108 | "Tail_Free_Sampling_desc": "无尾采样(TFS)通过分析词符概率变化率以及二阶导数来搜索分布中概率较低的尾部词符,\n词符会被保留到某个阈值(例如 0.3),这取决于统一的二阶导数。\n这个值越接近 0,被拒绝的词符数量就越多。将这个值设置为 1.0 就相当于关闭了这个功能。", | 108 | "Tail_Free_Sampling_desc": "无尾采样(TFS)通过分析词符概率变化率以及二阶导数来搜索分布中概率较低的尾部词符,\n词符会被保留到某个阈值(例如 0.3),这取决于统一的二阶导数。\n这个值越接近 0,被拒绝的词符数量就越多。将这个值设置为 1.0 就相当于关闭了这个功能。", |
| 109 | "rep.pen range": "重复度惩罚范围", | 109 | "rep.pen range": "重复惩罚范围", |
| 110 | "Mirostat": "Mirostat", | 110 | "Mirostat": "Mirostat", |
| 111 | "Mode": "模式", | 111 | "Mode": "模式", |
| 112 | "Mirostat_Mode_desc": "值为 0 表示完全禁用 Mirostat。1 表示 Mirostat 1.0,2 表示 Mirostat 2.0", | 112 | "Mirostat_Mode_desc": "值为 0 表示完全禁用 Mirostat。1 表示 Mirostat 1.0,2 表示 Mirostat 2.0", |
| 113 | "Tau": "牛头", | 113 | "Tau": "τ", |
| 114 | "Mirostat_Tau_desc": "控制 Mirostat 输出的变化", | 114 | "Mirostat_Tau_desc": "控制 Mirostat 输出的变化", |
| 115 | "Eta": "埃塔", | 115 | "Eta": "η", |
| 116 | "Mirostat_Eta_desc": "控制 Mirostat 的学习率", | 116 | "Mirostat_Eta_desc": "控制 Mirostat 的学习率", |
| 117 | "Ban EOS Token": "禁止 EOS 词符", | 117 | "Ban EOS Token": "禁止 EOS 词符", |
| 118 | "Ban_EOS_Token_desc": "禁止使用 KoboldCpp 的序列结束 (EOS) 词符(可能还禁止使用 KoboldAI 的其他词符)。适合故事写作,但不应用于聊天和指导模式。", | 118 | "Ban_EOS_Token_desc": "禁止使用 KoboldCpp 的序列结束 (EOS) 词符(可能还禁止使用 KoboldAI 的其他词符)。适合故事写作,但不应用于聊天和指导模式。", |
| @@ -145,10 +145,10 @@ | |||
| 145 | "Sampler Select": "采样器选择", | 145 | "Sampler Select": "采样器选择", |
| 146 | "Customize displayed samplers or add custom samplers.": "自定义显示的采样器或添加自定义采样器。", | 146 | "Customize displayed samplers or add custom samplers.": "自定义显示的采样器或添加自定义采样器。", |
| 147 | "Epsilon Cutoff": "ε 截断", | 147 | "Epsilon Cutoff": "ε 截断", |
| 148 | "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "ε 截止设置了一个概率下限,低于该下限的词符将被排除在采样之外。\n以 1e-4 单位;合适的值为 3。将其设置为 0 以禁用。", | 148 | "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "ε 截断设置了一个概率下限,低于该下限的词符将被排除在采样之外。\n以 1e-4 单位;合适的值为 3。将其设置为 0 以禁用。", |
| 149 | "Eta Cutoff": "η 截断", | 149 | "Eta Cutoff": "η 截断", |
| 150 | "Eta_Cutoff_desc": "η截止是特殊η采样技术的主要参数。 以1e-4为单位;合理的值为3。 设置为0以禁用。 有关详细信息,请参阅Hewitt等人的论文《Truncation Sampling as Language Model Desmoothing》(2022年)。", | 150 | "Eta_Cutoff_desc": "η截断是特殊η采样技术的主要参数。 以1e-4为单位;合理的值为3。 设置为0以禁用。 有关详细信息,请参阅Hewitt等人的论文《Truncation Sampling as Language Model Desmoothing》(2022年)。", |
| 151 | "rep.pen decay": "声望值衰减", | 151 | "rep.pen decay": "重复惩罚衰减", |
| 152 | "Encoder Rep. Pen.": "编码器重复惩罚", | 152 | "Encoder Rep. Pen.": "编码器重复惩罚", |
| 153 | "No Repeat Ngram Size": "无重复n-gram大小", | 153 | "No Repeat Ngram Size": "无重复n-gram大小", |
| 154 | "Skew": "倾斜", | 154 | "Skew": "倾斜", |
| @@ -157,17 +157,17 @@ | |||
| 157 | "Smooth_Sampling_desc": "允许您使用二次/三次变换来调整分布。较低的平滑因子值将更具创造性,通常在 0.2-0.3 之间是最佳点(假设曲线 = 1)。较高的平滑曲线值将使曲线更陡峭,这将更积极地惩罚低概率选择。1.0 曲线相当于仅使用平滑因子。", | 157 | "Smooth_Sampling_desc": "允许您使用二次/三次变换来调整分布。较低的平滑因子值将更具创造性,通常在 0.2-0.3 之间是最佳点(假设曲线 = 1)。较高的平滑曲线值将使曲线更陡峭,这将更积极地惩罚低概率选择。1.0 曲线相当于仅使用平滑因子。", |
| 158 | "Smoothing Factor": "平滑系数", | 158 | "Smoothing Factor": "平滑系数", |
| 159 | "Smoothing Curve": "平滑曲线", | 159 | "Smoothing Curve": "平滑曲线", |
| 160 | "DRY_Repetition_Penalty_desc": "DRY 会惩罚那些将输入末尾延伸到输入中之前出现过的序列的标记。将乘数设置为 0 以禁用。", | 160 | "DRY_Repetition_Penalty_desc": "DRY 会对那些会将输入末尾扩展为输入中之前出现过的序列的词符进行惩罚。将乘数设置为 0 以禁用。", |
| 161 | "DRY Repetition Penalty": "DRY 重复惩罚", | 161 | "DRY Repetition Penalty": "DRY 重复惩罚", |
| 162 | "DRY_Multiplier_desc": "设置为值 > 0 以启用 DRY。控制最短惩罚序列的惩罚幅度。", | 162 | "DRY_Multiplier_desc": "将值设置为 > 0 以启用 DRY。控制最短惩罚序列的惩罚幅度。", |
| 163 | "Multiplier": "乘数", | 163 | "Multiplier": "乘数", |
| 164 | "DRY_Base_desc": "控制惩罚随序列长度的增加而增长的速度。", | 164 | "DRY_Base_desc": "控制惩罚随序列长度的增加而增长的速度。", |
| 165 | "Base": "根据", | 165 | "Base": "基数", |
| 166 | "DRY_Allowed_Length_desc": "可以重复而不会受到惩罚的最长序列。", | 166 | "DRY_Allowed_Length_desc": "可以重复而不会受到惩罚的最长序列长度。", |
| 167 | "Allowed Length": "允许长度", | 167 | "Allowed Length": "允许长度", |
| 168 | "Penalty Range": "惩罚范围", | 168 | "Penalty Range": "惩罚范围", |
| 169 | "DRY_Sequence_Breakers_desc": "序列匹配不再继续的标记。指定为用逗号分隔的带引号的字符串列表。", | 169 | "DRY_Sequence_Breakers_desc": "序列匹配不再继续的词符。用逗号分隔的带引号的字符串列表指定。", |
| 170 | "Sequence Breakers": "序列破坏者", | 170 | "Sequence Breakers": "序列打断符", |
| 171 | "JSON-serialized array of strings.": "JSON 序列化的字符串数组。", | 171 | "JSON-serialized array of strings.": "JSON 序列化的字符串数组。", |
| 172 | "Dynamic Temperature": "动态温度", | 172 | "Dynamic Temperature": "动态温度", |
| 173 | "Scale Temperature dynamically per token, based on the variation of probabilities": "根据概率的变化动态地缩放每个词符的温度。", | 173 | "Scale Temperature dynamically per token, based on the variation of probabilities": "根据概率的变化动态地缩放每个词符的温度。", |
| @@ -175,7 +175,7 @@ | |||
| 175 | "Maximum Temp": "最大温度", | 175 | "Maximum Temp": "最大温度", |
| 176 | "Exponent": "指数", | 176 | "Exponent": "指数", |
| 177 | "Mirostat (mode=1 is only for llama.cpp)": "Mirostat(mode=1 仅用于 llama.cpp)", | 177 | "Mirostat (mode=1 is only for llama.cpp)": "Mirostat(mode=1 仅用于 llama.cpp)", |
| 178 | "Mirostat_desc": "Mirostat 是输出困惑度的恒温器", | 178 | "Mirostat_desc": "Mirostat 是一个用于控制输出困惑度的恒温器", |
| 179 | "Mirostat Mode": "Mirostat 模式", | 179 | "Mirostat Mode": "Mirostat 模式", |
| 180 | "Variability parameter for Mirostat outputs": "Mirostat 输出的变异性参数。", | 180 | "Variability parameter for Mirostat outputs": "Mirostat 输出的变异性参数。", |
| 181 | "Mirostat Eta": "Mirostat η", | 181 | "Mirostat Eta": "Mirostat η", |
| @@ -190,26 +190,26 @@ | |||
| 190 | "Penalty Alpha": "惩罚系数 α", | 190 | "Penalty Alpha": "惩罚系数 α", |
| 191 | "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "对比搜索正则化项的强度。 将值设置为 0 以禁用对比搜索。", | 191 | "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "对比搜索正则化项的强度。 将值设置为 0 以禁用对比搜索。", |
| 192 | "Do Sample": "进行采样", | 192 | "Do Sample": "进行采样", |
| 193 | "Add BOS Token": "添加 BOS 词符", | 193 | "Add BOS Token": "添加序列开始词符", |
| 194 | "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "在提示词的开头添加 bos_token。 禁用此功能可以使回复更具创意", | 194 | "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "在提示词的开头添加序列开始词符。 禁用此功能可以使回复更具创意", |
| 195 | "Ban the eos_token. This forces the model to never end the generation prematurely": "禁止 eos_token。 这将强制模型永远不会提前结束生成", | 195 | "Ban the eos_token. This forces the model to never end the generation prematurely": "禁止序列结束词符。 这将强制模型永远不会提前结束生成", |
| 196 | "Ignore EOS Token": "忽略序列结束词符", | 196 | "Ignore EOS Token": "忽略序列结束词符", |
| 197 | "Ignore the EOS Token even if it generates.": "即使生成了序列结束词符,也忽略它。", | 197 | "Ignore the EOS Token even if it generates.": "即使生成了序列结束词符,也忽略它。", |
| 198 | "Skip Special Tokens": "跳过特殊词符", | 198 | "Skip Special Tokens": "跳过特殊词符", |
| 199 | "Temperature Last": "温度放最后", | 199 | "Temperature Last": "温度放最后", |
| 200 | "Temperature_Last_desc": "温度采样器放到最后使用。这通常是合理的。\n当启用时:首先进行潜在词符的选择,然后应用温度来修正它们的相对概率(技术上是对数似然)。\n当禁用时:首先应用温度来修正所有词符的相对概率,然后从中选择潜在词符。\n禁用此项可以增大分布在尾部的词符概率,这可能加大得到不相关回复的几率。", | 200 | "Temperature_Last_desc": "温度采样器放到最后使用。这通常是合理的。\n当启用时:首先进行潜在词符的选择,然后应用温度来修正它们的相对概率(技术上是对数似然)。\n当禁用时:首先应用温度来修正所有词符的相对概率,然后从中选择潜在词符。\n禁用此项可以增大分布在尾部的词符概率,这可能加大得到不相关回复的几率。", |
| 201 | "Speculative Ngram": "推测性 Ngram", | 201 | "Speculative Ngram": "推测性 Ngram", |
| 202 | "Use a different speculative decoding method without a draft model": "使用不同的推测解码方法(不采用草稿模型)。最好使用草稿模型。推测 ngram 的效果不太好。", | 202 | "Use a different speculative decoding method without a draft model": "使用不同的推测解码方法(不采用草稿模型)。最好使用草稿模型。推测性 Ngram 的效果不太好。", |
| 203 | "Spaces Between Special Tokens": "特殊标记之间的空格", | 203 | "Spaces Between Special Tokens": "特殊词符之间的空格", |
| 204 | "LLaMA / Mistral / Yi models only": "LLaMA / Mistral / Yi模型专用。首先确保您选择了适当的词符化器。\n这项设置决定了你不想在结果中看到的字符串。\n每行一个字符串。可以是文本或者[词符id]。\n许多词符以空格开头。如果不确定,请使用词符计数器。", | 204 | "LLaMA / Mistral / Yi models only": "LLaMA / Mistral / Yi模型专用。首先确保您选择了适当的词符化器。\n这项设置决定了你不想在结果中看到的字符串。\n每行一个字符串。可以是文本或者[词符id]。\n许多词符以空格开头。如果不确定,请使用词符计数器。", |
| 205 | "Example: some text [42, 69, 1337]": "例如:\n一些文本\n[42, 69, 1337]", | 205 | "Example: some text [42, 69, 1337]": "例如:\n一些文本\n[42, 69, 1337]", |
| 206 | "Classifier Free Guidance. More helpful tip coming soon": "无分类器指导(CFG)。更多有用的提示敬请期待。", | 206 | "Classifier Free Guidance. More helpful tip coming soon": "无分类器指导(CFG)。更多有用的提示敬请期待。", |
| 207 | "Scale": "缩放比例", | 207 | "Scale": "缩放比例", |
| 208 | "JSON Schema": "JSON 模式", | 208 | "JSON Schema": "JSON 结构", |
| 209 | "Type in the desired JSON schema": "输入所需的 JSON 架构", | 209 | "Type in the desired JSON schema": "输入所需的 JSON 结构", |
| 210 | "Grammar String": "语法字符串", | 210 | "Grammar String": "语法字符串", |
| 211 | "GNBF or ENBF, depends on the backend in use. If you're using this you should know which.": "GNBF 或 ENBF,取决于使用的后端。如果您使用这个,您应该知道哪一个。", | 211 | "GNBF or ENBF, depends on the backend in use. If you're using this you should know which.": "GNBF 或 ENBF,取决于使用的后端。如果您使用这个,您应该知道该用哪一个。", |
| 212 | "Top P & Min P": "最高点数和最低点数", | 212 | "Top P & Min P": "Top P 和 Min P", |
| 213 | "Load default order": "加载默认顺序", | 213 | "Load default order": "加载默认顺序", |
| 214 | "llama.cpp only. Determines the order of samplers. If Mirostat mode is not 0, sampler order is ignored.": "仅限 llama.cpp。确定采样器的顺序。如果 Mirostat 模式不为 0,则忽略采样器顺序。", | 214 | "llama.cpp only. Determines the order of samplers. If Mirostat mode is not 0, sampler order is ignored.": "仅限 llama.cpp。确定采样器的顺序。如果 Mirostat 模式不为 0,则忽略采样器顺序。", |
| 215 | "Sampler Priority": "采样器优先级", | 215 | "Sampler Priority": "采样器优先级", |
| @@ -217,10 +217,10 @@ | |||
| 217 | "Character Names Behavior": "角色名称行为", | 217 | "Character Names Behavior": "角色名称行为", |
| 218 | "Helps the model to associate messages with characters.": "有助于模型将消息与角色关联起来。", | 218 | "Helps the model to associate messages with characters.": "有助于模型将消息与角色关联起来。", |
| 219 | "None": "无", | 219 | "None": "无", |
| 220 | "character_names_none": "群聊和过去的角色除外。否则,请确保在提示中提供了姓名。", | 220 | "character_names_none": "群聊和过去的角色除外。否则,请确保在提示词中提供了姓名。", |
| 221 | "Don't add character names.": "不添加角色名称。", | 221 | "Don't add character names.": "不添加角色名称。", |
| 222 | "Completion": "补全对象", | 222 | "Completion": "补全对象", |
| 223 | "character_names_completion": "限制适用:仅限拉丁字母数字和下划线。不适用于所有来源,尤其是:Claude、MistralAI、Google。", | 223 | "character_names_completion": "适用限制:仅限拉丁字母数字和下划线。不适用于所有补全源,尤其是:Claude、MistralAI、Google。", |
| 224 | "Add character names to completion objects.": "在补全对象中添加角色名称。", | 224 | "Add character names to completion objects.": "在补全对象中添加角色名称。", |
| 225 | "Message Content": "消息内容", | 225 | "Message Content": "消息内容", |
| 226 | "Prepend character names to message contents.": "在消息内容中添加角色名称。", | 226 | "Prepend character names to message contents.": "在消息内容中添加角色名称。", |
| @@ -238,38 +238,43 @@ | |||
| 238 | "Squash system messages": "压缩系统消息", | 238 | "Squash system messages": "压缩系统消息", |
| 239 | "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "将连续的系统消息合并为一条(不包括示例对话),可能会提高一些模型的连贯性。", | 239 | "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "将连续的系统消息合并为一条(不包括示例对话),可能会提高一些模型的连贯性。", |
| 240 | "Enable function calling": "启用函数调用", | 240 | "Enable function calling": "启用函数调用", |
| 241 | "enable_functions_desc_1": "允许使用", | ||
| 242 | "enable_functions_desc_2": "功能工具", | ||
| 243 | "enable_functions_desc_3": "可以被各种扩展利用来提供附加功能。", | ||
| 241 | "Send inline images": "发送内联图像", | 244 | "Send inline images": "发送内联图像", |
| 242 | "image_inlining_hint_1": "如果模型支持,则在提示中发送图像(例如 GPT-4V、Claude 3 或 Llava 13B)。\n使用", | 245 | "image_inlining_hint_1": "如果模型支持,则在提示词中发送图像(例如 GPT-4V、Claude 3 或 Llava 13B)。\n对任何消息使用", |
| 243 | "image_inlining_hint_2": "对任何消息或", | 246 | "image_inlining_hint_2": "或", |
| 244 | "image_inlining_hint_3": "菜单将图像文件附加到聊天中。", | 247 | "image_inlining_hint_3": "菜单将图像文件附加到聊天中。", |
| 245 | "Inline Image Quality": "内联图像质量", | 248 | "Inline Image Quality": "内联图像质量", |
| 246 | "openai_inline_image_quality_auto": "自动", | 249 | "openai_inline_image_quality_auto": "自动", |
| 247 | "openai_inline_image_quality_low": "低", | 250 | "openai_inline_image_quality_low": "低", |
| 248 | "openai_inline_image_quality_high": "高", | 251 | "openai_inline_image_quality_high": "高", |
| 249 | "Use AI21 Tokenizer": "使用 AI21 Tokenizer", | 252 | "Use AI21 Tokenizer": "使用 AI21 词符化器", |
| 250 | "Use the appropriate tokenizer for Jurassic models, which is more efficient than GPT's.": "对侏罗纪模型使用适当的词符化器,它比 GPT 的更高效。", | 253 | "Use the appropriate tokenizer for Jurassic models, which is more efficient than GPT's.": "对Jurassic模型使用适当的词符化器,它比 GPT 的更高效。", |
| 251 | "Use Google Tokenizer": "使用Google词符化器", | 254 | "Use Google Tokenizer": "使用Google词符化器", |
| 252 | "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "通过其API为Google模型使用适当的词符化器。处理速度较慢,但提供更准确的词符计数。", | 255 | "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "通过其API为Google模型使用适当的词符化器。处理速度较慢,但提供更准确的词符计数。", |
| 253 | "Use system prompt": "使用系统提示", | 256 | "Use system prompt": "使用系统提示词", |
| 254 | "(Gemini 1.5 Pro/Flash only)": "(仅限 Gemini 1.5 Pro/Flash)", | 257 | "(Gemini 1.5 Pro/Flash only)": "(仅限 Gemini 1.5 Pro/Flash)", |
| 255 | "Merges_all_system_messages_desc_1": "合并所有系统消息,直到第一条具有非系统角色的消息,然后以", | 258 | "Merges_all_system_messages_desc_1": "合并所有系统消息,直到第一条具有非系统角色的消息,然后通过", |
| 256 | "Merges_all_system_messages_desc_2": "场地。", | 259 | "Merges_all_system_messages_desc_2": "字段发送。", |
| 257 | "Assistant Prefill": "助手预填充", | 260 | "Assistant Prefill": "AI预填", |
| 258 | "Start Claude's answer with...": "以如下内容开始Claude的回答...", | 261 | "Start Claude's answer with...": "以如下内容开始Claude的回答...", |
| 259 | "Assistant Impersonation Prefill": "助理模仿预填", | 262 | "Assistant Impersonation Prefill": "AI帮答预填", |
| 260 | "Use system prompt (Claude 2.1+ only)": "使用系统提示词(仅适用于Claude 2.1+)", | 263 | "Use system prompt (Claude 2.1+ only)": "使用系统提示词(仅适用于Claude 2.1+)", |
| 261 | "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "为支持的模型发送系统提示词。如果禁用,则用户消息将添加到提示词的开头。", | 264 | "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "为支持的模型发送系统提示词。如果禁用,则用户消息将添加到提示词的开头。", |
| 262 | "User first message": "用户第一条消息", | 265 | "User first message": "用户第一条消息", |
| 263 | "Restore User first message": "恢复用户第一条消息", | 266 | "Restore User first message": "恢复用户第一条消息", |
| 264 | "Human message": "人性化消息、说明等。\n为空时不添加任何内容,即需要具有“用户”角色的新提示。", | 267 | "Human message": "人性化消息、说明等。\n为空时不添加任何内容,即需要具有“用户”角色的新提示词。", |
| 265 | "New preset": "新预设", | 268 | "New preset": "新预设", |
| 266 | "Delete preset": "删除预设", | 269 | "Delete preset": "删除预设", |
| 267 | "View / Edit bias preset": "查看/编辑偏置预设", | 270 | "View / Edit bias preset": "查看/编辑偏置预设", |
| 268 | "Add bias entry": "添加偏置条目", | 271 | "Add bias entry": "添加偏置条目", |
| 269 | "Most tokens have a leading space.": "大多数标记都有一个前导空格。", | 272 | "openai_logit_bias_no_items": "没有相关产品", |
| 273 | "Most tokens have a leading space.": "大多数词符都有一个前导空格。", | ||
| 270 | "API Connections": "API连接", | 274 | "API Connections": "API连接", |
| 271 | "Text Completion": "文本完成", | 275 | "api_no_connection": "无连接...", |
| 272 | "Chat Completion": "聊天完成", | 276 | "Text Completion": "文本补全", |
| 277 | "Chat Completion": "聊天补全", | ||
| 273 | "NovelAI": "NovelAI", | 278 | "NovelAI": "NovelAI", |
| 274 | "KoboldAI Horde": "KoboldAI Horde", | 279 | "KoboldAI Horde": "KoboldAI Horde", |
| 275 | "KoboldAI": "KoboldAI", | 280 | "KoboldAI": "KoboldAI", |
| @@ -279,7 +284,7 @@ | |||
| 279 | "Learn how to contribute your idle GPU cycles to the Horde": "了解如何将您的空闲GPU时钟周期共享给Horde", | 284 | "Learn how to contribute your idle GPU cycles to the Horde": "了解如何将您的空闲GPU时钟周期共享给Horde", |
| 280 | "Adjust context size to worker capabilities": "根据工作单元能力调整上下文大小", | 285 | "Adjust context size to worker capabilities": "根据工作单元能力调整上下文大小", |
| 281 | "Adjust response length to worker capabilities": "根据工作单元能力调整响应长度", | 286 | "Adjust response length to worker capabilities": "根据工作单元能力调整响应长度", |
| 282 | "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "可以通过仅排队批准的工作单元来帮助处理不良回复。这可能会减慢回复速度。", | 287 | "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "可以通过仅排队认证的工作单元来帮助处理不良回复。这可能会减慢回复速度。", |
| 283 | "Trusted workers only": "仅信任的工作单元", | 288 | "Trusted workers only": "仅信任的工作单元", |
| 284 | "API key": "API密钥", | 289 | "API key": "API密钥", |
| 285 | "Get it here:": "在此获取:", | 290 | "Get it here:": "在此获取:", |
| @@ -313,7 +318,7 @@ | |||
| 313 | "OpenRouter Model": "OpenRouter 模型", | 318 | "OpenRouter Model": "OpenRouter 模型", |
| 314 | "Model Providers": "模型提供者", | 319 | "Model Providers": "模型提供者", |
| 315 | "InfermaticAI API Key": "InfermaticAI API 密钥", | 320 | "InfermaticAI API Key": "InfermaticAI API 密钥", |
| 316 | "InfermaticAI Model": "信息人工智能模型", | 321 | "InfermaticAI Model": "InfermaticAI 模型", |
| 317 | "DreamGen API key": "DreamGen API 密钥", | 322 | "DreamGen API key": "DreamGen API 密钥", |
| 318 | "DreamGen Model": "DreamGen 模型", | 323 | "DreamGen Model": "DreamGen 模型", |
| 319 | "Mancer API key": "Mancer API 密钥", | 324 | "Mancer API key": "Mancer API 密钥", |
| @@ -330,7 +335,7 @@ | |||
| 330 | "vLLM Model": "vLLM 模型", | 335 | "vLLM Model": "vLLM 模型", |
| 331 | "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine(用于OpenAI API的包装器)", | 336 | "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine(用于OpenAI API的包装器)", |
| 332 | "Aphrodite API key": "Aphrodite API 密钥", | 337 | "Aphrodite API key": "Aphrodite API 密钥", |
| 333 | "Aphrodite Model": "阿芙罗狄蒂模型", | 338 | "Aphrodite Model": "Aphrodite 模型", |
| 334 | "ggerganov/llama.cpp": "ggerganov/llama.cpp", | 339 | "ggerganov/llama.cpp": "ggerganov/llama.cpp", |
| 335 | "Example: 127.0.0.1:8080": "示例:127.0.0.1:8080", | 340 | "Example: 127.0.0.1:8080": "示例:127.0.0.1:8080", |
| 336 | "Example: 127.0.0.1:11434": "示例:127.0.0.1:11434", | 341 | "Example: 127.0.0.1:11434": "示例:127.0.0.1:11434", |
| @@ -341,9 +346,10 @@ | |||
| 341 | "Example: 127.0.0.1:5001": "示例:127.0.0.1:5001", | 346 | "Example: 127.0.0.1:5001": "示例:127.0.0.1:5001", |
| 342 | "Authorize": "授权", | 347 | "Authorize": "授权", |
| 343 | "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "使用OAuth流程获取您的OpenRouter API令牌。您将被重定向到openrouter.ai", | 348 | "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "使用OAuth流程获取您的OpenRouter API令牌。您将被重定向到openrouter.ai", |
| 344 | "Legacy API (pre-OAI, no streaming)": "传统API(OAI之前,无流式传输)", | 349 | "Legacy API (pre-OAI, no streaming)": "旧版API(OAI之前,无流式传输)", |
| 345 | "Bypass status check": "绕过状态检查", | 350 | "Bypass status check": "绕过状态检查", |
| 346 | "Chat Completion Source": "聊天补全来源", | 351 | "Chat Completion Source": "聊天补全来源", |
| 352 | "Custom (OpenAI-compatible)": "自定义(兼容 OpenAI)", | ||
| 347 | "Reverse Proxy": "反向代理", | 353 | "Reverse Proxy": "反向代理", |
| 348 | "Proxy Presets": "代理预设", | 354 | "Proxy Presets": "代理预设", |
| 349 | "Saved addresses and passwords.": "保存的地址和密码。", | 355 | "Saved addresses and passwords.": "保存的地址和密码。", |
| @@ -355,8 +361,8 @@ | |||
| 355 | "Alternative server URL (leave empty to use the default value).": "备用服务器 URL(留空以使用默认值)。", | 361 | "Alternative server URL (leave empty to use the default value).": "备用服务器 URL(留空以使用默认值)。", |
| 356 | "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "在键入任何内容之前,从 API 面板中删除您的真实 OAI API 密钥", | 362 | "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "在键入任何内容之前,从 API 面板中删除您的真实 OAI API 密钥", |
| 357 | "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "我们无法为使用非官方 OpenAI 代理时遇到的问题提供支持", | 363 | "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "我们无法为使用非官方 OpenAI 代理时遇到的问题提供支持", |
| 358 | "Doesn't work? Try adding": "不起作用?尝试添加", | 364 | "Doesn't work? Try adding": "不起作用?尝试在最后添加", |
| 359 | "at the end!": "在它的最后!", | 365 | "at the end!": "!", |
| 360 | "Proxy Password": "代理密码", | 366 | "Proxy Password": "代理密码", |
| 361 | "Will be used as a password for the proxy instead of API key.": "将用作代理的密码,而不是 API 密钥。", | 367 | "Will be used as a password for the proxy instead of API key.": "将用作代理的密码,而不是 API 密钥。", |
| 362 | "Peek a password": "查看密码", | 368 | "Peek a password": "查看密码", |
| @@ -364,7 +370,7 @@ | |||
| 364 | "View API Usage Metrics": "查看API使用情况", | 370 | "View API Usage Metrics": "查看API使用情况", |
| 365 | "Follow": "跟随", | 371 | "Follow": "跟随", |
| 366 | "these directions": "这些说明", | 372 | "these directions": "这些说明", |
| 367 | "to get your OpenAI API key.": "获取您的OpenAI API密钥。", | 373 | "to get your OpenAI API key.": "以获取您的OpenAI API密钥。", |
| 368 | "Use Proxy password field instead. This input will be ignored.": "请使用“代理密码”字段。此输入将被忽略。", | 374 | "Use Proxy password field instead. This input will be ignored.": "请使用“代理密码”字段。此输入将被忽略。", |
| 369 | "OpenAI Model": "OpenAI 模型", | 375 | "OpenAI Model": "OpenAI 模型", |
| 370 | "Bypass API status check": "绕过API状态检查", | 376 | "Bypass API status check": "绕过API状态检查", |
| @@ -374,7 +380,7 @@ | |||
| 374 | "Slack and Poe cookies will not work here, do not bother trying.": "Slack和Poe的cookie在这里不起作用,请不要尝试。", | 380 | "Slack and Poe cookies will not work here, do not bother trying.": "Slack和Poe的cookie在这里不起作用,请不要尝试。", |
| 375 | "Claude Model": "Claude 模型", | 381 | "Claude Model": "Claude 模型", |
| 376 | "Window AI Model": "Window AI 模型", | 382 | "Window AI Model": "Window AI 模型", |
| 377 | "Model Order": "OpenRouter 型号排序", | 383 | "Model Order": "OpenRouter 模型顺序", |
| 378 | "Alphabetically": "按字母顺序", | 384 | "Alphabetically": "按字母顺序", |
| 379 | "Price": "价格(最便宜)", | 385 | "Price": "价格(最便宜)", |
| 380 | "Context Size": "上下文大小", | 386 | "Context Size": "上下文大小", |
| @@ -383,36 +389,43 @@ | |||
| 383 | "Allow fallback routes": "允许后备方案", | 389 | "Allow fallback routes": "允许后备方案", |
| 384 | "Allow fallback routes Description": "如果所选模型无法响应您的请求,则自动选择备用模型。", | 390 | "Allow fallback routes Description": "如果所选模型无法响应您的请求,则自动选择备用模型。", |
| 385 | "openrouter_force_instruct": "此选项已过时,将来会被删除。要使用指令格式,请改用文本完成 API 下的 OpenRouter。", | 391 | "openrouter_force_instruct": "此选项已过时,将来会被删除。要使用指令格式,请改用文本完成 API 下的 OpenRouter。", |
| 386 | "LEGACY": "遗产", | 392 | "LEGACY": "旧版", |
| 387 | "Force Instruct Mode formatting": "强制指令模式格式化", | 393 | "Force Instruct Mode formatting": "强制指令模式格式化", |
| 388 | "Force_Instruct_Mode_formatting_Description": "如果同时启用了“指示模式”和“系统提示”,则 SillyTavern 将使用当前\n高级格式设置(指示系统提示除外)对提示进行格式化。如果禁用,则 OpenRouter 将对提示进行格式化。", | 394 | "Force_Instruct_Mode_formatting_Description": "如果同时启用了“指示模式”和“系统提示词”,则 SillyTavern 将使用当前\n高级格式设置(指示系统提示词除外)对提示词进行格式化。如果禁用,则 OpenRouter 将对提示词进行格式化。", |
| 389 | "Scale API Key": "Scale API密钥", | 395 | "Scale API Key": "Scale API密钥", |
| 390 | "Clear your cookie": "清除你的 Cookie", | 396 | "Clear your cookie": "清除你的 Cookie", |
| 391 | "Alt Method": "备用方法", | 397 | "Alt Method": "备用方法", |
| 392 | "AI21 API Key": "AI21 API 密钥", | 398 | "AI21 API Key": "AI21 API 密钥", |
| 393 | "AI21 Model": "AI21 模型", | 399 | "AI21 Model": "AI21 模型", |
| 394 | "MakerSuite API Key": "MakerSuite API 密钥", | 400 | "MakerSuite API Key": "MakerSuite API 密钥", |
| 395 | "Google Model": "谷歌模型", | 401 | "Google Model": "Google 模型", |
| 396 | "MistralAI API Key": "MistralAI API 密钥", | 402 | "MistralAI API Key": "MistralAI API 密钥", |
| 397 | "MistralAI Model": "MistralAI 模型", | 403 | "MistralAI Model": "MistralAI 模型", |
| 398 | "Groq API Key": "Groq API 密钥", | 404 | "Groq API Key": "Groq API 密钥", |
| 399 | "Groq Model": "Groq 模型", | 405 | "Groq Model": "Groq 模型", |
| 400 | "Perplexity API Key": "困惑度 API 密钥", | 406 | "Perplexity API Key": "Perplexity API 密钥", |
| 401 | "Perplexity Model": "困惑度模型", | 407 | "Perplexity Model": "Perplexity 模型", |
| 402 | "Cohere API Key": "Cohere API 密钥", | 408 | "Cohere API Key": "Cohere API 密钥", |
| 403 | "Cohere Model": "Cohere 模型", | 409 | "Cohere Model": "Cohere 模型", |
| 404 | "Custom Endpoint (Base URL)": "自定义端点(基本 URL)", | 410 | "Custom Endpoint (Base URL)": "自定义端点(基本 URL)", |
| 411 | "Example: http://localhost:1234/v1": "例如:http://localhost:1234/v1", | ||
| 412 | "at the end of the URL!": "在 URL 的末尾!", | ||
| 405 | "Custom API Key": "自定义 API 密钥", | 413 | "Custom API Key": "自定义 API 密钥", |
| 406 | "Available Models": "可用型号", | 414 | "(Optional)": "(可选的)", |
| 407 | "Prompt Post-Processing": "及时后期处理", | 415 | "Enter a Model ID": "输入模型名", |
| 408 | "Applies additional processing to the prompt before sending it to the API.": "在将提示发送到 API 之前对其进行额外处理。", | 416 | "Example: gpt-3.5-turbo": "例如:gpt-3.5-turbo", |
| 417 | "Available Models": "可用模型", | ||
| 418 | "Prompt Post-Processing": "提示词后处理", | ||
| 419 | "Applies additional processing to the prompt before sending it to the API.": "在将提示词发送到 API 之前对其进行额外处理。", | ||
| 420 | "prompt_post_processing_none": "未选择", | ||
| 421 | "Additional Parameters": "附加参数", | ||
| 409 | "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "通过发送简短的测试消息验证您的API连接。请注意,您将因此而消耗额度!", | 422 | "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "通过发送简短的测试消息验证您的API连接。请注意,您将因此而消耗额度!", |
| 410 | "Test Message": "发送测试消息", | 423 | "Test Message": "发送测试消息", |
| 411 | "Auto-connect to Last Server": "自动连接到上次的服务器", | 424 | "Auto-connect to Last Server": "自动连接到上次的服务器", |
| 412 | "Missing key": "❌ 缺少密钥", | 425 | "Missing key": "❌ 缺少密钥", |
| 413 | "Key saved": "密钥已保存", | 426 | "Key saved": "密钥已保存", |
| 414 | "View hidden API keys": "查看隐藏的API密钥", | 427 | "View hidden API keys": "查看隐藏的API密钥", |
| 415 | "AI Response Formatting": "AI响应格式化", | 428 | "AI Response Formatting": "AI回复格式化", |
| 416 | "Advanced Formatting": "高级格式化设置", | 429 | "Advanced Formatting": "高级格式化设置", |
| 417 | "Context Template": "上下文模板", | 430 | "Context Template": "上下文模板", |
| 418 | "Auto-select this preset for Instruct Mode": "在指示模式下自动选择此预设", | 431 | "Auto-select this preset for Instruct Mode": "在指示模式下自动选择此预设", |
| @@ -421,10 +434,10 @@ | |||
| 421 | "Chat Start": "聊天开始", | 434 | "Chat Start": "聊天开始", |
| 422 | "Add Chat Start and Example Separator to a list of stopping strings.": "将聊天开始和示例分隔符添加到停止字符串列表中。", | 435 | "Add Chat Start and Example Separator to a list of stopping strings.": "将聊天开始和示例分隔符添加到停止字符串列表中。", |
| 423 | "Use as Stop Strings": "用作停止字符串", | 436 | "Use as Stop Strings": "用作停止字符串", |
| 424 | "context_allow_jailbreak": "如果在角色卡中定义并且启用了“首选角色越狱”,则在提示末尾包含越狱。\n不建议在文本完成模型中使用此功能,否则会导致输出错误。", | 437 | "context_allow_jailbreak": "如果在角色卡中定义并且启用了“首选角色越狱”,则在提示词末尾包含越狱。\n不建议在文本完成模型中使用此功能,否则会导致输出错误。", |
| 425 | "Allow Jailbreak": "允许越狱", | 438 | "Allow Jailbreak": "允许越狱", |
| 426 | "Context Order": "上下文顺序", | 439 | "Context Order": "上下文顺序", |
| 427 | "Summary": "概括", | 440 | "Summary": "总结", |
| 428 | "Author's Note": "作者注释", | 441 | "Author's Note": "作者注释", |
| 429 | "Example Dialogues": "对话范例", | 442 | "Example Dialogues": "对话范例", |
| 430 | "Hint": "提示:", | 443 | "Hint": "提示:", |
| @@ -443,21 +456,21 @@ | |||
| 443 | "Force for Groups and Personas": "强制适用于群聊和我的角色", | 456 | "Force for Groups and Personas": "强制适用于群聊和我的角色", |
| 444 | "System Prompt": "系统提示词", | 457 | "System Prompt": "系统提示词", |
| 445 | "Instruct Mode Sequences": "指示模式序列", | 458 | "Instruct Mode Sequences": "指示模式序列", |
| 446 | "System Prompt Wrapping": "系统提示换行", | 459 | "System Prompt Wrapping": "系统提示词换行", |
| 447 | "Inserted before a System prompt.": "插入到系统提示符之前。", | 460 | "Inserted before a System prompt.": "插入到系统提示词之前。", |
| 448 | "System Prompt Prefix": "系统提示符前缀", | 461 | "System Prompt Prefix": "系统提示词前缀", |
| 449 | "Inserted after a System prompt.": "在系统提示后插入。", | 462 | "Inserted after a System prompt.": "在系统提示词后插入。", |
| 450 | "System Prompt Suffix": "系统提示符后缀", | 463 | "System Prompt Suffix": "系统提示词后缀", |
| 451 | "Chat Messages Wrapping": "聊天消息换行", | 464 | "Chat Messages Wrapping": "聊天消息换行", |
| 452 | "Inserted before a User message and as a last prompt line when impersonating.": "插入到用户消息之前并作为模拟时的最后一条提示行。", | 465 | "Inserted before a User message and as a last prompt line when impersonating.": "插入到用户消息之前并作为模拟时的最后一行提示词。", |
| 453 | "User Message Prefix": "用户消息前缀", | 466 | "User Message Prefix": "用户消息前缀", |
| 454 | "Inserted after a User message.": "插入到用户消息之后。", | 467 | "Inserted after a User message.": "插入到用户消息之后。", |
| 455 | "User Message Suffix": "用户消息后缀", | 468 | "User Message Suffix": "用户消息后缀", |
| 456 | "Inserted before an Assistant message and as a last prompt line when generating an AI reply.": "插入到助手消息之前并作为生成 AI 回复时的最后一条提示行。", | 469 | "Inserted before an Assistant message and as a last prompt line when generating an AI reply.": "插入到助手消息之前并作为生成 AI 回复时的最后一行提示词。", |
| 457 | "Assistant Message Prefix": "助理消息前缀", | 470 | "Assistant Message Prefix": "助理消息前缀", |
| 458 | "Inserted after an Assistant message.": "插入于助手消息之后。", | 471 | "Inserted after an Assistant message.": "插入于助手消息之后。", |
| 459 | "Assistant Message Suffix": "助理消息后缀", | 472 | "Assistant Message Suffix": "助理消息后缀", |
| 460 | "Inserted before a System (added by slash commands or extensions) message.": "插入到系统(由斜线命令或扩展添加)消息之前。", | 473 | "Inserted before a System (added by slash commands or extensions) message.": "插入到系统(由快捷命令或扩展添加)消息之前。", |
| 461 | "System Message Prefix": "系统消息前缀", | 474 | "System Message Prefix": "系统消息前缀", |
| 462 | "Inserted after a System message.": "插入到系统消息之后。", | 475 | "Inserted after a System message.": "插入到系统消息之后。", |
| 463 | "System Message Suffix": "系统消息后缀", | 476 | "System Message Suffix": "系统消息后缀", |
| @@ -466,9 +479,9 @@ | |||
| 466 | "Misc. Sequences": "杂项序列", | 479 | "Misc. Sequences": "杂项序列", |
| 467 | "Inserted before the first Assistant's message.": "插入到第一个助理的消息之前。", | 480 | "Inserted before the first Assistant's message.": "插入到第一个助理的消息之前。", |
| 468 | "First Assistant Prefix": "第一个助理前缀", | 481 | "First Assistant Prefix": "第一个助理前缀", |
| 469 | "instruct_last_output_sequence": "插入到最后一条助手消息之前或作为生成 AI 回复时的最后一条提示行(中立/系统角色除外)。", | 482 | "instruct_last_output_sequence": "插入到最后一条助手消息之前或作为生成 AI 回复时的最后一行提示词(中立/系统角色除外)。", |
| 470 | "Last Assistant Prefix": "最后一个助理前缀", | 483 | "Last Assistant Prefix": "最后一个助理前缀", |
| 471 | "Will be inserted as a last prompt line when using system/neutral generation.": "当使用系统/中性生成时将作为最后的提示行插入。", | 484 | "Will be inserted as a last prompt line when using system/neutral generation.": "当使用系统/中性生成时将作为最后的一行提示词插入。", |
| 472 | "System Instruction Prefix": "系统指令前缀", | 485 | "System Instruction Prefix": "系统指令前缀", |
| 473 | "If a stop sequence is generated, everything past it will be removed from the output (inclusive).": "如果生成了停止序列,则该序列之后的所有内容都将从输出中删除(包括在内)。", | 486 | "If a stop sequence is generated, everything past it will be removed from the output (inclusive).": "如果生成了停止序列,则该序列之后的所有内容都将从输出中删除(包括在内)。", |
| 474 | "Stop Sequence": "停止序列", | 487 | "Stop Sequence": "停止序列", |
| @@ -496,12 +509,12 @@ | |||
| 496 | "Auto-Continue": "自动继续", | 509 | "Auto-Continue": "自动继续", |
| 497 | "Allow for Chat Completion APIs": "允许使用聊天补全API", | 510 | "Allow for Chat Completion APIs": "允许使用聊天补全API", |
| 498 | "Target length (tokens)": "目标长度(以词符数计)", | 511 | "Target length (tokens)": "目标长度(以词符数计)", |
| 499 | "World Info": "世界书", | 512 | "World Info": "世界信息", |
| 500 | "Locked = World Editor will stay open": "锁定 = 世界编辑器将保持打开状态", | 513 | "Locked = World Editor will stay open": "锁定 = 世界编辑器将保持打开状态", |
| 501 | "Worlds/Lorebooks": "世界书/传说书", | 514 | "Worlds/Lorebooks": "世界/知识书", |
| 502 | "Active World(s) for all chats": "已启用的世界书(全局有效)", | 515 | "Active World(s) for all chats": "已启用的世界(全局有效)", |
| 503 | "-- World Info not found --": "-- 未找到世界书 --", | 516 | "-- World Info not found --": "-- 未找到世界信息 --", |
| 504 | "Global World Info/Lorebook activation settings": "全局世界书/角色设定书激活设置", | 517 | "Global World Info/Lorebook activation settings": "全局世界信息/知识书激活设置", |
| 505 | "Click to expand": "单击展开", | 518 | "Click to expand": "单击展开", |
| 506 | "Scan Depth": "扫描深度", | 519 | "Scan Depth": "扫描深度", |
| 507 | "Context %": "上下文百分比", | 520 | "Context %": "上下文百分比", |
| @@ -602,11 +615,11 @@ | |||
| 602 | "No Blur Effect": "禁用模糊效果", | 615 | "No Blur Effect": "禁用模糊效果", |
| 603 | "Remove text shadow effect": "移除文本阴影效果", | 616 | "Remove text shadow effect": "移除文本阴影效果", |
| 604 | "No Text Shadows": "禁用文本阴影", | 617 | "No Text Shadows": "禁用文本阴影", |
| 605 | "Reduce chat height, and put a static sprite behind the chat window": "缩小聊天窗口的高度,并在聊天窗口后面放置一个固定的精灵图像。", | 618 | "Reduce chat height, and put a static sprite behind the chat window": "缩小聊天窗口的高度,并在聊天窗口后面放置一个固定的表情图。", |
| 606 | "Waifu Mode": "视觉小说模式", | 619 | "Waifu Mode": "视觉小说模式", |
| 607 | "Always show the full list of the Message Actions context items for chat messages, instead of hiding them behind '...'": "始终显示聊天消息的操作菜单完整列表,而不是将它们隐藏在“...”后面", | 620 | "Always show the full list of the Message Actions context items for chat messages, instead of hiding them behind '...'": "始终显示聊天消息的操作菜单完整列表,而不是将它们隐藏在“...”后面", |
| 608 | "Auto-Expand Message Actions": "自动展开消息操作菜单", | 621 | "Auto-Expand Message Actions": "自动展开消息操作菜单", |
| 609 | "Alternative UI for numeric sampling parameters with fewer steps": "为数值采样参数提供一个步骤更少的替代用户界面。", | 622 | "Alternative UI for numeric sampling parameters with fewer steps": "为数字采样参数提供一个步骤更少的替代用户界面。", |
| 610 | "Zen Sliders": "禅意滑块", | 623 | "Zen Sliders": "禅意滑块", |
| 611 | "Entirely unrestrict all numeric sampling parameters": "完全解除所有数字采样参数的限制", | 624 | "Entirely unrestrict all numeric sampling parameters": "完全解除所有数字采样参数的限制", |
| 612 | "Mad Lab Mode": "疯狂实验室模式", | 625 | "Mad Lab Mode": "疯狂实验室模式", |
| @@ -637,18 +650,21 @@ | |||
| 637 | "Char List Subheader": "角色列表子标题", | 650 | "Char List Subheader": "角色列表子标题", |
| 638 | "Character Version": "角色版本", | 651 | "Character Version": "角色版本", |
| 639 | "Created by": "创作者", | 652 | "Created by": "创作者", |
| 640 | "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "使用模糊匹配,在列表中通过所有数据字段搜索字符,而不仅仅是名称子字符串", | 653 | "Defines on importing cards which action should be chosen for importing its listed tags. 'Ask' will always display the dialog.": "定义在导入卡片时应选择哪种操作来导入其列出的标签。“询问”将始终显示对话框。", |
| 654 | "Import Card Tags": "导入卡片标签", | ||
| 655 | "Ask": "询问", | ||
| 656 | "All": "全部", | ||
| 657 | "Existing": "现存的", | ||
| 658 | "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "使用模糊匹配,在列表中通过所有数据字段搜索角色,而不仅仅是名称子字符串", | ||
| 641 | "Advanced Character Search": "高级角色搜索", | 659 | "Advanced Character Search": "高级角色搜索", |
| 642 | "If checked and the character card contains a prompt override (System Prompt), use that instead": "如果角色卡包含提示词,则使用它替代系统提示词", | 660 | "If checked and the character card contains a prompt override (System Prompt), use that instead": "如果角色卡包含提示词,则使用它替代系统提示词", |
| 643 | "Prefer Character Card Prompt": "角色卡提示词优先", | 661 | "Prefer Character Card Prompt": "角色卡提示词优先", |
| 644 | "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "如果角色卡包含越狱(后置历史记录指令),则使用它替代系统越狱", | 662 | "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "如果角色卡包含越狱(后置历史记录指令),则使用它替代系统越狱", |
| 645 | "Prefer Character Card Jailbreak": "角色卡越狱优先", | 663 | "Prefer Character Card Jailbreak": "角色卡越狱优先", |
| 646 | "Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "避免裁剪和调整导入的字符图像的大小。关闭时,裁剪/调整大小为 512x768。", | 664 | "Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "避免裁剪和调整导入的角色图像的大小。关闭时,裁剪/调整大小为 512x768。", |
| 647 | "Never resize avatars": "永不调整头像大小", | 665 | "Never resize avatars": "永不调整头像大小", |
| 648 | "Show actual file names on the disk, in the characters list display only": "在角色列表显示中,显示磁盘上实际的文件名。", | 666 | "Show actual file names on the disk, in the characters list display only": "在角色列表显示中,显示磁盘上实际的文件名。", |
| 649 | "Show avatar filenames": "显示头像文件名", | 667 | "Show avatar filenames": "显示头像文件名", |
| 650 | "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "在导入角色时提示词导入嵌入式卡片标签。否则,嵌入式标签将被忽略", | ||
| 651 | "Import Card Tags": "导入卡片标签", | ||
| 652 | "Hide character definitions from the editor panel behind a spoiler button": "在编辑器面板中,将角色定义隐藏在一个剧透按钮后面。", | 668 | "Hide character definitions from the editor panel behind a spoiler button": "在编辑器面板中,将角色定义隐藏在一个剧透按钮后面。", |
| 653 | "Spoiler Free Mode": "隐藏角色卡信息", | 669 | "Spoiler Free Mode": "隐藏角色卡信息", |
| 654 | "Miscellaneous": "杂项", | 670 | "Miscellaneous": "杂项", |
| @@ -665,8 +681,8 @@ | |||
| 665 | "Background Sound Only": "仅背景声音", | 681 | "Background Sound Only": "仅背景声音", |
| 666 | "Reduce the formatting requirements on API URLs": "减少API URL的格式化要求", | 682 | "Reduce the formatting requirements on API URLs": "减少API URL的格式化要求", |
| 667 | "Relaxed API URLS": "宽松的API URL", | 683 | "Relaxed API URLS": "宽松的API URL", |
| 668 | "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "询问是否为每个具有嵌入的世界书的新角色导入世界书。如果未选中,则会显示简短的消息", | 684 | "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "询问是否为每个具有嵌入的知识书的新角色导入世界信息/知识书。如果未选中,则会显示简短的消息", |
| 669 | "Lorebook Import Dialog": "传说书导入对话框", | 685 | "Lorebook Import Dialog": "知识书导入对话框", |
| 670 | "Restore unsaved user input on page refresh": "在页面刷新时恢复未保存的用户输入", | 686 | "Restore unsaved user input on page refresh": "在页面刷新时恢复未保存的用户输入", |
| 671 | "Restore User Input": "恢复用户输入", | 687 | "Restore User Input": "恢复用户输入", |
| 672 | "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "允许通过拖动重新定位某些UI元素。仅适用于PC,对移动设备无影响", | 688 | "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "允许通过拖动重新定位某些UI元素。仅适用于PC,对移动设备无影响", |
| @@ -683,7 +699,7 @@ | |||
| 683 | "The number of chat history messages to load before pagination.": "分页前要加载的聊天历史消息数。", | 699 | "The number of chat history messages to load before pagination.": "分页前要加载的聊天历史消息数。", |
| 684 | "(0 = All)": "(0 = 全部)", | 700 | "(0 = All)": "(0 = 全部)", |
| 685 | "Streaming FPS": "流式传输帧速率", | 701 | "Streaming FPS": "流式传输帧速率", |
| 686 | "Update speed of streamed text.": "流文本的更新速度。", | 702 | "Update speed of streamed text.": "文本流的更新速度。", |
| 687 | "Example Messages Behavior": "示例消息行为", | 703 | "Example Messages Behavior": "示例消息行为", |
| 688 | "Gradual push-out": "逐渐推出", | 704 | "Gradual push-out": "逐渐推出", |
| 689 | "Always include examples": "始终包含示例", | 705 | "Always include examples": "始终包含示例", |
| @@ -692,7 +708,7 @@ | |||
| 692 | "Disabled": "已禁用", | 708 | "Disabled": "已禁用", |
| 693 | "Automatic (PC)": "自动(PC)", | 709 | "Automatic (PC)": "自动(PC)", |
| 694 | "Press Send to continue": "按发送键以继续", | 710 | "Press Send to continue": "按发送键以继续", |
| 695 | "Show a button in the input area to ask the AI to continue (extend) its last message": "在输入区域中显示一个按钮,询问AI是否继续(延长)其上一条消息", | 711 | "Show a button in the input area to ask the AI to continue (extend) its last message": "在输入区域中显示一个按钮,要求AI继续(延长)其上一条消息", |
| 696 | "Quick 'Continue' button": "快速“继续”按钮", | 712 | "Quick 'Continue' button": "快速“继续”按钮", |
| 697 | "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "在聊天窗口的最后一条信息上显示箭头按钮,以生成AI的其他回复选项。适用于电脑和手机端。", | 713 | "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "在聊天窗口的最后一条信息上显示箭头按钮,以生成AI的其他回复选项。适用于电脑和手机端。", |
| 698 | "Swipes": "刷新回复按钮", | 714 | "Swipes": "刷新回复按钮", |
| @@ -708,11 +724,11 @@ | |||
| 708 | "Render Formulas": "渲染公式", | 724 | "Render Formulas": "渲染公式", |
| 709 | "Disallow embedded media from other domains in chat messages": "禁止在聊天消息中嵌入来自其他域的媒体。", | 725 | "Disallow embedded media from other domains in chat messages": "禁止在聊天消息中嵌入来自其他域的媒体。", |
| 710 | "Forbid External Media": "禁止外部媒体", | 726 | "Forbid External Media": "禁止外部媒体", |
| 711 | "Allow {{char}}: in bot messages": "在机器人消息中允许 {{char}}:", | 727 | "Allow {{char}}: in bot messages": "在机器人消息中允许 {{char}}: ", |
| 712 | "Allow {{user}}: in bot messages": "在机器人消息中允许 {{user}}:", | 728 | "Allow {{user}}: in bot messages": "在机器人消息中允许 {{user}}: ", |
| 713 | "Skip encoding and characters in message text, allowing a subset of HTML markup as well as Markdown": "跳过消息文本中的编码和字符,允许一部分HTML标记以及Markdown", | 729 | "Skip encoding and characters in message text, allowing a subset of HTML markup as well as Markdown": "跳过消息文本中的编码和字符,允许一部分HTML标记以及Markdown", |
| 714 | "Show tags in responses": "在响应中显示标签", | 730 | "Show tags in responses": "在响应中显示标签", |
| 715 | "Allow AI messages in groups to contain lines spoken by other group members": "允许组中的AI消息包含其他组成员说的话", | 731 | "Allow AI messages in groups to contain lines spoken by other group members": "允许群组中的AI消息包含其他组成员说的话", |
| 716 | "Relax message trim in Groups": "放松群组中的消息修剪", | 732 | "Relax message trim in Groups": "放松群组中的消息修剪", |
| 717 | "Log prompts to console": "将提示词记录到控制台", | 733 | "Log prompts to console": "将提示词记录到控制台", |
| 718 | "Requests logprobs from the API for the Token Probabilities feature": "从API请求对数概率数据,用于实现词符概率功能。", | 734 | "Requests logprobs from the API for the Token Probabilities feature": "从API请求对数概率数据,用于实现词符概率功能。", |
| @@ -723,12 +739,12 @@ | |||
| 723 | "Minimum generated message length": "生成的消息的最小长度", | 739 | "Minimum generated message length": "生成的消息的最小长度", |
| 724 | "If the generated message is shorter than this, trigger an auto-swipe": "如果生成的消息短于此长度,则触发自动滑动", | 740 | "If the generated message is shorter than this, trigger an auto-swipe": "如果生成的消息短于此长度,则触发自动滑动", |
| 725 | "Blacklisted words": "黑名单词语", | 741 | "Blacklisted words": "黑名单词语", |
| 726 | "words you dont want generated separated by comma ','": "不想生成的单词,用逗号','分隔", | 742 | "words you dont want generated separated by comma ','": "不想生成的词语,用逗号','分隔", |
| 727 | "Blacklisted word count to swipe": "触发滑动的黑名单词语数量", | 743 | "Blacklisted word count to swipe": "触发滑动的黑名单词语数量", |
| 728 | "Minimum number of blacklisted words detected to trigger an auto-swipe": "触发自动滑动刷新回复所需检测到的最少违禁词数量。", | 744 | "Minimum number of blacklisted words detected to trigger an auto-swipe": "触发自动滑动刷新回复所需检测到的最少违禁词数量。", |
| 729 | "AutoComplete Settings": "自动补全设置", | 745 | "AutoComplete Settings": "自动补全设置", |
| 730 | "Automatically hide details": "自动隐藏详细信息", | 746 | "Automatically hide details": "自动隐藏详细信息", |
| 731 | "Determines how entries are found for autocomplete.": "确定如何找到自动完成的条目。", | 747 | "Determines how entries are found for autocomplete.": "确定如何找到自动补全的条目。", |
| 732 | "Autocomplete Matching": "匹配", | 748 | "Autocomplete Matching": "匹配", |
| 733 | "Starts with": "以此开始:", | 749 | "Starts with": "以此开始:", |
| 734 | "Includes": "包括", | 750 | "Includes": "包括", |
| @@ -767,26 +783,26 @@ | |||
| 767 | "Auto-connect": "自动连接", | 783 | "Auto-connect": "自动连接", |
| 768 | "Extras API URL": "附加 API URL", | 784 | "Extras API URL": "附加 API URL", |
| 769 | "Extras API key (optional)": "扩展API密钥(可选)", | 785 | "Extras API key (optional)": "扩展API密钥(可选)", |
| 770 | "Persona Management": "人设管理", | 786 | "Persona Management": "用户角色管理", |
| 771 | "How do I use this?": "怎样使用?", | 787 | "How do I use this?": "怎样使用?", |
| 772 | "Click for stats!": "点击查看统计!", | 788 | "Click for stats!": "点击查看统计!", |
| 773 | "Usage Stats": "使用统计", | 789 | "Usage Stats": "使用统计", |
| 774 | "Backup your personas to a file": "将我的角色备份到文件中", | 790 | "Backup your personas to a file": "将用户角色备份到文件中", |
| 775 | "Backup": "备份", | 791 | "Backup": "备份", |
| 776 | "Restore your personas from a file": "从文件中恢复我的角色", | 792 | "Restore your personas from a file": "从文件中恢复用户角色", |
| 777 | "Restore": "恢复", | 793 | "Restore": "恢复", |
| 778 | "Create a dummy persona": "创建空人设", | 794 | "Create a dummy persona": "创建空白用户角色", |
| 779 | "Create": "创建", | 795 | "Create": "创建", |
| 780 | "Toggle grid view": "切换网格视图", | 796 | "Toggle grid view": "切换网格视图", |
| 781 | "No persona description": "[没有说明]", | 797 | "No persona description": "[没有描述]", |
| 782 | "Name": "名称", | 798 | "Name": "名称", |
| 783 | "Enter your name": "输入您的名字", | 799 | "Enter your name": "输入您的名字", |
| 784 | "Click to set a new User Name": "点击设置新的用户名", | 800 | "Click to set a new User Name": "点击设置新的用户名", |
| 785 | "Click to lock your selected persona to the current chat. Click again to remove the lock.": "单击以将您选择的我的角色锁定到当前聊天。再次单击以移除锁定。", | 801 | "Click to lock your selected persona to the current chat. Click again to remove the lock.": "单击以将您选择的用户角色锁定到当前聊天。再次单击以移除锁定。", |
| 786 | "Click to set user name for all messages": "点击为所有消息设置用户名", | 802 | "Click to set user name for all messages": "点击为所有消息设置用户名", |
| 787 | "Persona Description": "人设描述", | 803 | "Persona Description": "用户角色描述", |
| 788 | "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "示例:[{{user}}是一个28岁的罗马尼亚猫娘。]", | 804 | "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "示例:[{{user}}是一个28岁的罗马尼亚猫娘。]", |
| 789 | "Tokens persona description": "人设描述词符数", | 805 | "Tokens persona description": "用户角色描述词符数", |
| 790 | "Position:": "位置:", | 806 | "Position:": "位置:", |
| 791 | "In Story String / Prompt Manager": "在故事字符串/提示词管理器中", | 807 | "In Story String / Prompt Manager": "在故事字符串/提示词管理器中", |
| 792 | "Top of Author's Note": "作者注的顶部", | 808 | "Top of Author's Note": "作者注的顶部", |
| @@ -797,7 +813,7 @@ | |||
| 797 | "System": "系统", | 813 | "System": "系统", |
| 798 | "User": "用户", | 814 | "User": "用户", |
| 799 | "Assistant": "助手", | 815 | "Assistant": "助手", |
| 800 | "Show notifications on switching personas": "切换人设时显示通知", | 816 | "Show notifications on switching personas": "切换用户角色时显示通知", |
| 801 | "Character Management": "角色管理", | 817 | "Character Management": "角色管理", |
| 802 | "Locked = Character Management panel will stay open": "锁定 = 角色管理面板将保持打开状态", | 818 | "Locked = Character Management panel will stay open": "锁定 = 角色管理面板将保持打开状态", |
| 803 | "Select/Create Characters": "选择/创建角色", | 819 | "Select/Create Characters": "选择/创建角色", |
| @@ -818,14 +834,14 @@ | |||
| 818 | "Character Lore": "角色世界书", | 834 | "Character Lore": "角色世界书", |
| 819 | "Chat Lore": "聊天知识", | 835 | "Chat Lore": "聊天知识", |
| 820 | "Export and Download": "导出并下载", | 836 | "Export and Download": "导出并下载", |
| 821 | "Duplicate Character": "创建角色副本", | 837 | "Duplicate Character": "复制角色", |
| 822 | "Create Character": "创建角色", | 838 | "Create Character": "创建角色", |
| 823 | "Delete Character": "删除角色", | 839 | "Delete Character": "删除角色", |
| 824 | "More...": "更多...", | 840 | "More...": "更多...", |
| 825 | "Link to World Info": "链接到世界书", | 841 | "Link to World Info": "链接到世界书", |
| 826 | "Import Card Lore": "导入人物卡的世界书", | 842 | "Import Card Lore": "导入角色卡的世界书", |
| 827 | "Scenario Override": "场景覆盖", | 843 | "Scenario Override": "场景覆盖", |
| 828 | "Convert to Persona": "转换为 Persona", | 844 | "Convert to Persona": "转换为用户角色", |
| 829 | "Rename": "重命名", | 845 | "Rename": "重命名", |
| 830 | "Link to Source": "来源链接", | 846 | "Link to Source": "来源链接", |
| 831 | "Replace / Update": "替换 / 更新", | 847 | "Replace / Update": "替换 / 更新", |
| @@ -850,12 +866,12 @@ | |||
| 850 | "List order": "列表顺序", | 866 | "List order": "列表顺序", |
| 851 | "Group generation handling mode": "群组生成处理模式", | 867 | "Group generation handling mode": "群组生成处理模式", |
| 852 | "Swap character cards": "交换角色卡", | 868 | "Swap character cards": "交换角色卡", |
| 853 | "Join character cards (exclude muted)": "加入角色卡(不包括静音)", | 869 | "Join character cards (exclude muted)": "加入角色卡(不包括被禁言的)", |
| 854 | "Join character cards (include muted)": "加入角色卡(包括静音)", | 870 | "Join character cards (include muted)": "加入角色卡(包括被禁言的)", |
| 855 | "Inserted before each part of the joined fields.": "插入到连接字段的每个部分之前。", | 871 | "Inserted before each part of the joined fields.": "插入到加入字段的每个部分之前。", |
| 856 | "Join Prefix": "加入前缀", | 872 | "Join Prefix": "加入前缀", |
| 857 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "当选择“合并角色卡”时,角色的所有相应字段将被合并在一起。这意味着在故事字符串中,例如,所有角色描述都将合并为一个大文本。如果您希望将这些字段分开,可以在此处定义前缀或后缀。此值支持普通宏,还会将 {{char}} 替换为相关角色的名称,将 <FIELDNAME> 替换为部分的名称(例如:描述、个性、场景等)", | 873 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "当选择“合并角色卡”时,角色的所有相应字段将被合并在一起。这意味着在故事字符串中,例如,所有角色描述都将合并为一个大文本。如果您希望将这些字段分开,可以在此处定义前缀或后缀。此值支持普通宏,还会将 {{char}} 替换为相关角色的名称,将 <FIELDNAME> 替换为部分的名称(例如:描述、个性、场景等)", |
| 858 | "Inserted after each part of the joined fields.": "插入到连接字段的每个部分之后。", | 874 | "Inserted after each part of the joined fields.": "插入到加入字段的每个部分之后。", |
| 859 | "Join Suffix": "加入后缀", | 875 | "Join Suffix": "加入后缀", |
| 860 | "Set a group chat scenario": "设置群组聊天场景", | 876 | "Set a group chat scenario": "设置群组聊天场景", |
| 861 | "Click to allow/forbid the use of external media for this group.": "单击以允许/禁止该组使用外部媒体。", | 877 | "Click to allow/forbid the use of external media for this group.": "单击以允许/禁止该组使用外部媒体。", |
| @@ -863,7 +879,7 @@ | |||
| 863 | "Allow self responses": "允许自我回复", | 879 | "Allow self responses": "允许自我回复", |
| 864 | "Auto Mode": "自动模式", | 880 | "Auto Mode": "自动模式", |
| 865 | "Auto Mode delay": "自动模式延迟", | 881 | "Auto Mode delay": "自动模式延迟", |
| 866 | "Hide Muted Member Sprites": "隐藏静音成员精灵", | 882 | "Hide Muted Member Sprites": "隐藏拼贴头像中被禁言的成员", |
| 867 | "Current Members": "当前成员", | 883 | "Current Members": "当前成员", |
| 868 | "Add Members": "添加成员", | 884 | "Add Members": "添加成员", |
| 869 | "Create New Character": "新建角色", | 885 | "Create New Character": "新建角色", |
| @@ -886,29 +902,31 @@ | |||
| 886 | "Bulk_edit_characters": "批量编辑角色", | 902 | "Bulk_edit_characters": "批量编辑角色", |
| 887 | "Bulk select all characters": "批量选择所有角色", | 903 | "Bulk select all characters": "批量选择所有角色", |
| 888 | "Bulk delete characters": "批量删除角色", | 904 | "Bulk delete characters": "批量删除角色", |
| 889 | "popup_text_save": "保存", | 905 | "popup-button-save": "保存", |
| 890 | "popup_text_yes": "是", | 906 | "popup-button-yes": "是", |
| 891 | "popup_text_no": "否", | 907 | "popup-button-no": "否", |
| 892 | "popup_text_cancel": "取消", | 908 | "popup-button-cancel": "取消", |
| 893 | "popup_text_import": "导入", | 909 | "popup-button-import": "导入", |
| 910 | "popup-button-crop": "裁剪", | ||
| 911 | "Close popup": "关闭弹出窗口", | ||
| 894 | "Advanced Defininitions": "高级定义", | 912 | "Advanced Defininitions": "高级定义", |
| 895 | "Prompt Overrides": "提示覆盖", | 913 | "Prompt Overrides": "提示词覆盖", |
| 896 | "(For Chat Completion and Instruct Mode)": "(用于聊天完成和指导模式)", | 914 | "(For Chat Completion and Instruct Mode)": "(用于聊天补全和指导模式)", |
| 897 | "Insert {{original}} into either box to include the respective default prompt from system settings.": "将{{original}}插入到任一框中,以包含系统设置中的相应默认提示词。", | 915 | "Insert {{original}} into either box to include the respective default prompt from system settings.": "将{{original}}插入到任一框中,以包含系统设置中的相应默认提示词。", |
| 898 | "Main Prompt": "主要提示词", | 916 | "Main Prompt": "主要提示词", |
| 899 | "Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "此处的任何内容都将替换用于此角色的默认主提示词。(v2规范:system_prompt)", | 917 | "Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "此处的任何内容都将替换用于此角色的默认主提示词。(v2规范:system_prompt)", |
| 900 | "Any contents here will replace the default Jailbreak Prompt used for this character. (v2 spec: post_history_instructions)": "此处的任何内容都将替换用于此角色的默认越狱提示词。(v2规范:post_history_instructions)", | 918 | "Any contents here will replace the default Jailbreak Prompt used for this character. (v2 spec: post_history_instructions)": "此处的任何内容都将替换用于此角色的默认越狱提示词。(v2规范:post_history_instructions)", |
| 901 | "Creator's Metadata (Not sent with the AI prompt)": "创作者的元数据(不与AI提示词一起发送)", | 919 | "Creator's Metadata (Not sent with the AI prompt)": "创作者的元数据(不与AI提示词一起发送)", |
| 902 | "Creator's Metadata": "创作者的元数据", | 920 | "Creator's Metadata": "创作者的元数据", |
| 903 | "(Not sent with the AI Prompt)": "(不随 AI 提示发送)", | 921 | "(Not sent with the AI Prompt)": "(不随 AI 提示词发送)", |
| 904 | "Everything here is optional": "这里的一切都是可选的", | 922 | "Everything here is optional": "这里的一切都是可选的", |
| 905 | "(Botmaker's name / Contact Info)": "(机器人制作者的姓名/联系信息)", | 923 | "(Botmaker's name / Contact Info)": "(角色制作者的姓名/联系信息)", |
| 906 | "(If you want to track character versions)": "(如果您想跟踪角色版本)", | 924 | "(If you want to track character versions)": "(如果您想跟踪角色版本)", |
| 907 | "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(描述机器人,提供使用技巧,或列出已经测试过的聊天模型。这将显示在角色列表中。)", | 925 | "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(描述角色,提供使用技巧,或列出已经测试过的聊天模型。这将显示在角色列表中。)", |
| 908 | "Tags to Embed": "嵌入的标签", | 926 | "Tags to Embed": "嵌入的标签", |
| 909 | "(Write a comma-separated list of tags)": "(编写一个以逗号分隔的标签列表。)", | 927 | "(Write a comma-separated list of tags)": "(编写一个以逗号分隔的标签列表。)", |
| 910 | "Personality summary": "个性摘要", | 928 | "Personality summary": "角色设定摘要", |
| 911 | "(A brief description of the personality)": "(性格的简要描述)", | 929 | "(A brief description of the personality)": "(角色设定的简要描述)", |
| 912 | "Scenario": "情景", | 930 | "Scenario": "情景", |
| 913 | "(Circumstances and context of the interaction)": "(交互的情况和背景)", | 931 | "(Circumstances and context of the interaction)": "(交互的情况和背景)", |
| 914 | "Character's Note": "角色备注", | 932 | "Character's Note": "角色备注", |
| @@ -936,16 +954,16 @@ | |||
| 936 | "Chat Scenario Override": "聊天场景覆盖", | 954 | "Chat Scenario Override": "聊天场景覆盖", |
| 937 | "Remove": "移除", | 955 | "Remove": "移除", |
| 938 | "Type here...": "在此处输入...", | 956 | "Type here...": "在此处输入...", |
| 939 | "Chat Lorebook": "聊天 Lorebook", | 957 | "Chat Lorebook": "聊天知识书", |
| 940 | "Chat Lorebook for": "聊天 Lorebook", | 958 | "Chat Lorebook for": "聊天知识书", |
| 941 | "chat_world_template_txt": "选定的世界信息将绑定到此聊天。生成 AI 回复时,\n它将与全球和角色传说书中的条目相结合。", | 959 | "chat_world_template_txt": "选定的世界信息将绑定到此聊天。生成 AI 回复时,\n它将与全球和角色传说书中的条目相结合。", |
| 942 | "Select a World Info file for": "选择一个世界书文件给", | 960 | "Select a World Info file for": "选择一个世界书文件给", |
| 943 | "Primary Lorebook": "主要世界书", | 961 | "Primary Lorebook": "主要知识书", |
| 944 | "A selected World Info will be bound to this character as its own Lorebook.": "所选的世界书将会于该角色绑定,作为该角色自己的世界书", | 962 | "A selected World Info will be bound to this character as its own Lorebook.": "所选的世界信息将会于该角色绑定,作为该角色自己的知识书", |
| 945 | "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "在生成AI回复时,它将与全局世界书选择器中的条目相结合。", | 963 | "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "在生成AI回复时,它将与全局世界信息选择器中的条目相结合。", |
| 946 | "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "导出角色还将导出嵌入在JSON数据中的所选世界书文件。", | 964 | "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "导出角色还将导出嵌入在JSON数据中的所选知识书文件。", |
| 947 | "Additional Lorebooks": "附加世界书", | 965 | "Additional Lorebooks": "附加知识书", |
| 948 | "Associate one or more auxillary Lorebooks with this character.": "将一个或多个辅助世界书与此角色关联。", | 966 | "Associate one or more auxillary Lorebooks with this character.": "将一个或多个辅助知识书与此角色关联。", |
| 949 | "NOTE: These choices are optional and won't be preserved on character export!": "注意:这些选项是可选的,并且不会在角色导出时被一并导出!", | 967 | "NOTE: These choices are optional and won't be preserved on character export!": "注意:这些选项是可选的,并且不会在角色导出时被一并导出!", |
| 950 | "Rename chat file": "重命名聊天文件", | 968 | "Rename chat file": "重命名聊天文件", |
| 951 | "Export JSONL chat file": "导出JSONL聊天文件", | 969 | "Export JSONL chat file": "导出JSONL聊天文件", |
| @@ -955,7 +973,7 @@ | |||
| 955 | "Use tag as folder": "标记为文件夹", | 973 | "Use tag as folder": "标记为文件夹", |
| 956 | "Delete tag": "删除标签", | 974 | "Delete tag": "删除标签", |
| 957 | "Entry Title/Memo": "条目标题/备忘录", | 975 | "Entry Title/Memo": "条目标题/备忘录", |
| 958 | "WI Entry Status:🔵 Constant🟢 Normal🔗 Vectorized❌ Disabled": "WI 条目状态:🔵 常量 🟢 正常 🔗 矢量化 ❌ 已禁用", | 976 | "WI Entry Status:🔵 Constant🟢 Normal🔗 Vectorized❌ Disabled": "世界信息条目状态:🔵 常量 🟢 正常 🔗 矢量化 ❌ 已禁用", |
| 959 | "WI_Entry_Status_Constant": "常量", | 977 | "WI_Entry_Status_Constant": "常量", |
| 960 | "WI_Entry_Status_Normal": "普通", | 978 | "WI_Entry_Status_Normal": "普通", |
| 961 | "WI_Entry_Status_Vectorized": "矢量化", | 979 | "WI_Entry_Status_Vectorized": "矢量化", |
| @@ -972,7 +990,7 @@ | |||
| 972 | "at Depth AI": "@D 🤖", | 990 | "at Depth AI": "@D 🤖", |
| 973 | "Depth": "深度", | 991 | "Depth": "深度", |
| 974 | "Order:": "顺序:", | 992 | "Order:": "顺序:", |
| 975 | "Order": "顺序:", | 993 | "Order": "顺序", |
| 976 | "Trigger %:": "触发 %:", | 994 | "Trigger %:": "触发 %:", |
| 977 | "Probability": "可能性", | 995 | "Probability": "可能性", |
| 978 | "Duplicate world info entry": "重复的世界信息条目", | 996 | "Duplicate world info entry": "重复的世界信息条目", |
| @@ -1003,15 +1021,20 @@ | |||
| 1003 | "Prevent further recursion (this entry will not activate others)": "防止进一步递归(本条目将不会激活其他条目)", | 1021 | "Prevent further recursion (this entry will not activate others)": "防止进一步递归(本条目将不会激活其他条目)", |
| 1004 | "Delay until recursion (this entry can only be activated on recursive checking)": "延迟到递归(本条目只能在递归检查时激活)", | 1022 | "Delay until recursion (this entry can only be activated on recursive checking)": "延迟到递归(本条目只能在递归检查时激活)", |
| 1005 | "What this keyword should mean to the AI, sent verbatim": "这个关键词对AI的含义,逐字发送", | 1023 | "What this keyword should mean to the AI, sent verbatim": "这个关键词对AI的含义,逐字发送", |
| 1024 | "Inclusion Group": "包含组", | ||
| 1025 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "包含组可确保每次仅激活组中的一项(如果触发了多项)。支持多个逗号分隔的组。文档:世界信息 - 包含组", | ||
| 1026 | "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.": "优先考虑此条目:选中后,此条目在所有选择中优先考虑。如果优先考虑多个条目,则选择“顺序”最高的条目。", | ||
| 1027 | "Prioritize": "确定优先级", | ||
| 1028 | "Only one entry with the same label will be activated": "只有一个带有相同标签的条目将被激活", | ||
| 1029 | "A relative likelihood of entry activation within the group": "组内进入激活的相对可能性", | ||
| 1030 | "Group Weight": "组权重", | ||
| 1031 | "Sticky entries will stay active for N messages after being triggered.": "粘性条目在被触发后将保持活跃状态 N 条消息。", | ||
| 1032 | "Sticky": "粘性", | ||
| 1033 | "Entries with a cooldown can't be activated N messages after being triggered.": "具有冷却时间的条目在触发后 N 条消息内无法被激活。", | ||
| 1034 | "Cooldown": "冷却", | ||
| 1006 | "Filter to Character(s)": "应用到角色", | 1035 | "Filter to Character(s)": "应用到角色", |
| 1007 | "Character Exclusion": "反选角色", | 1036 | "Character Exclusion": "反选角色", |
| 1008 | "-- Characters not found --": "-- 未找到角色 --", | 1037 | "-- Characters not found --": "-- 未找到角色 --", |
| 1009 | "Inclusion Group": "包含群组", | ||
| 1010 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "包含组可确保每次仅激活组中的一项(如果触发了多项)。支持多个逗号分隔的组。文档:世界信息 - 包含组", | ||
| 1011 | "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.": "优先考虑此条目:选中后,此条目在所有选择中优先考虑。如果优先考虑多个条目,则选择“顺序”最高的条目。", | ||
| 1012 | "Only one entry with the same label will be activated": "只有一个带有相同标签的条目将被激活", | ||
| 1013 | "A relative likelihood of entry activation within the group": "组内进入激活的相对可能性", | ||
| 1014 | "Group Weight": "群组权重", | ||
| 1015 | "Selective": "选择性", | 1038 | "Selective": "选择性", |
| 1016 | "Use Probability": "使用概率", | 1039 | "Use Probability": "使用概率", |
| 1017 | "Add Memo": "添加备忘录", | 1040 | "Add Memo": "添加备忘录", |
| @@ -1019,18 +1042,18 @@ | |||
| 1019 | "close": "关闭", | 1042 | "close": "关闭", |
| 1020 | "prompt_manager_edit": "编辑", | 1043 | "prompt_manager_edit": "编辑", |
| 1021 | "prompt_manager_name": "姓名", | 1044 | "prompt_manager_name": "姓名", |
| 1022 | "A name for this prompt.": "此提示的名称。", | 1045 | "A name for this prompt.": "此提示词的名称。", |
| 1023 | "To whom this message will be attributed.": "此消息应归于谁。", | 1046 | "To whom this message will be attributed.": "此消息应归于谁。", |
| 1024 | "AI Assistant": "AI助手", | 1047 | "AI Assistant": "AI助手", |
| 1025 | "prompt_manager_position": "位置", | 1048 | "prompt_manager_position": "位置", |
| 1026 | "Injection position. Next to other prompts (relative) or in-chat (absolute).": "注入位置。其他提示旁边(相对)或在聊天中(绝对)。", | 1049 | "Injection position. Next to other prompts (relative) or in-chat (absolute).": "注入位置。其他提示词旁边(相对)或在聊天中(绝对)。", |
| 1027 | "prompt_manager_relative": "相对", | 1050 | "prompt_manager_relative": "相对", |
| 1028 | "prompt_manager_absolute": "绝对", | 1051 | "prompt_manager_absolute": "绝对", |
| 1029 | "prompt_manager_depth": "深度", | 1052 | "prompt_manager_depth": "深度", |
| 1030 | "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入深度。0 = 在最后一条消息之后,1 = 在最后一条消息之前,等等。", | 1053 | "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "注入深度。0 = 在最后一条消息之后,1 = 在最后一条消息之前,等等。", |
| 1031 | "Prompt": "提示词", | 1054 | "Prompt": "提示词", |
| 1032 | "The prompt to be sent.": "要发送的提示。", | 1055 | "The prompt to be sent.": "要发送的提示词。", |
| 1033 | "This prompt cannot be overridden by character cards, even if overrides are preferred.": "即使选择覆盖,此提示也不能被角色卡覆盖。", | 1056 | "This prompt cannot be overridden by character cards, even if overrides are preferred.": "即使选择覆盖,此提示词也不能被角色卡覆盖。", |
| 1034 | "prompt_manager_forbid_overrides": "禁止覆盖", | 1057 | "prompt_manager_forbid_overrides": "禁止覆盖", |
| 1035 | "reset": "重置", | 1058 | "reset": "重置", |
| 1036 | "save": "保存", | 1059 | "save": "保存", |
| @@ -1070,11 +1093,11 @@ | |||
| 1070 | "onboarding_import": "导入", | 1093 | "onboarding_import": "导入", |
| 1071 | "from supported sources or view": "来自受支持的来源或查看", | 1094 | "from supported sources or view": "来自受支持的来源或查看", |
| 1072 | "Sample characters": "示例角色", | 1095 | "Sample characters": "示例角色", |
| 1073 | "Your Persona": "您的人设", | 1096 | "Your Persona": "您的用户角色", |
| 1074 | "Before you get started, you must select a persona name.": "在开始之前,您必须选择一个人设名称。", | 1097 | "Before you get started, you must select a persona name.": "在开始之前,您必须选择一个用户角色名称。", |
| 1075 | "welcome_message_part_8": "您可随时通过以下方式更改此设置:", | 1098 | "welcome_message_part_8": "您可随时通过", |
| 1076 | "welcome_message_part_9": "图标。", | 1099 | "welcome_message_part_9": "图标来更改此设置。", |
| 1077 | "Persona Name:": "人设名称:", | 1100 | "Persona Name:": "用户角色名称:", |
| 1078 | "Temporarily disable automatic replies from this character": "暂时禁用此角色的自动回复", | 1101 | "Temporarily disable automatic replies from this character": "暂时禁用此角色的自动回复", |
| 1079 | "Enable automatic replies from this character": "启用此角色的自动回复", | 1102 | "Enable automatic replies from this character": "启用此角色的自动回复", |
| 1080 | "Trigger a message from this character": "从此角色触发消息", | 1103 | "Trigger a message from this character": "从此角色触发消息", |
| @@ -1083,10 +1106,12 @@ | |||
| 1083 | "View character card": "查看角色卡片", | 1106 | "View character card": "查看角色卡片", |
| 1084 | "Remove from group": "从群组中移除", | 1107 | "Remove from group": "从群组中移除", |
| 1085 | "Add to group": "添加到群组中", | 1108 | "Add to group": "添加到群组中", |
| 1086 | "Alternate Greetings": "交替问候", | 1109 | "Alternate Greetings": "额外问候语", |
| 1087 | "Alternate_Greetings_desc": "开始新聊天时,这些按钮将在第一条消息上显示为滑动按钮。\n群组成员可以选择其中一个按钮来发起对话。", | 1110 | "Alternate_Greetings_desc": "开始新聊天时,这些按钮将显示为第一条消息的滑动选项。\n群组成员可以选择其中之一来发起对话。", |
| 1088 | "Alternate Greetings Hint": "单击按钮即可开始!", | 1111 | "alternate_greetings_hint_1": "点击", |
| 1089 | "(This will be the first message from the character that starts every chat)": "(这将是角色在每次聊天开始时发送的第一条消息。)", | 1112 | "alternate_greetings_hint_2": "按钮即可开始!", |
| 1113 | "Alternate Greeting #": "额外问候语 #", | ||
| 1114 | "(This will be the first message from the character that starts every chat)": "(这将是角色在每次聊天开始时发送的第一条消息)", | ||
| 1090 | "Forbid Media Override explanation": "当前角色/群组在聊天中使用外部媒体的能力。", | 1115 | "Forbid Media Override explanation": "当前角色/群组在聊天中使用外部媒体的能力。", |
| 1091 | "Forbid Media Override subtitle": "媒体:图像、视频、音频。外部:不在本地服务器上托管。", | 1116 | "Forbid Media Override subtitle": "媒体:图像、视频、音频。外部:不在本地服务器上托管。", |
| 1092 | "Always forbidden": "始终禁止", | 1117 | "Always forbidden": "始终禁止", |
| @@ -1096,13 +1121,13 @@ | |||
| 1096 | "Unique to this chat": "此聊天独有", | 1121 | "Unique to this chat": "此聊天独有", |
| 1097 | "Checkpoints inherit the Note from their parent, and can be changed individually after that.": "检查点从其父级继承注释,之后可以单独更改。", | 1122 | "Checkpoints inherit the Note from their parent, and can be changed individually after that.": "检查点从其父级继承注释,之后可以单独更改。", |
| 1098 | "Include in World Info Scanning": "纳入世界信息扫描", | 1123 | "Include in World Info Scanning": "纳入世界信息扫描", |
| 1099 | "Before Main Prompt / Story String": "主提示/故事线之前", | 1124 | "Before Main Prompt / Story String": "主提示词/故事线之前", |
| 1100 | "After Main Prompt / Story String": "主提示/故事线之后", | 1125 | "After Main Prompt / Story String": "主提示词/故事线之后", |
| 1101 | "as": "作为", | 1126 | "as": "作为", |
| 1102 | "Insertion Frequency": "插入频率", | 1127 | "Insertion Frequency": "插入频率", |
| 1103 | "(0 = Disable, 1 = Always)": "(0 = 禁用,1 = 始终)", | 1128 | "(0 = Disable, 1 = Always)": "(0 = 禁用,1 = 始终)", |
| 1104 | "User inputs until next insertion:": "用户输入直到下一次插入:", | 1129 | "User inputs until next insertion:": "用户输入直到下一次插入:", |
| 1105 | "Character Author's Note (Private)": "人物作者注(私人)", | 1130 | "Character Author's Note (Private)": "人物作者注(私有)", |
| 1106 | "Won't be shared with the character card on export.": "导出时不会与角色卡共享。", | 1131 | "Won't be shared with the character card on export.": "导出时不会与角色卡共享。", |
| 1107 | "Will be automatically added as the author's note for this character. Will be used in groups, but can't be modified when a group chat is open.": "会自动添加为该角色的作者注解,在群聊中使用,但群聊开启时无法修改。", | 1132 | "Will be automatically added as the author's note for this character. Will be used in groups, but can't be modified when a group chat is open.": "会自动添加为该角色的作者注解,在群聊中使用,但群聊开启时无法修改。", |
| 1108 | "Use character author's note": "使用角色作者的注释", | 1133 | "Use character author's note": "使用角色作者的注释", |
| @@ -1112,19 +1137,19 @@ | |||
| 1112 | "Chat CFG": "聊天CFG", | 1137 | "Chat CFG": "聊天CFG", |
| 1113 | "1 = disabled": "1 = 已禁用", | 1138 | "1 = disabled": "1 = 已禁用", |
| 1114 | "write short replies, write replies using past tense": "写简短的回复,用过去时写回复", | 1139 | "write short replies, write replies using past tense": "写简短的回复,用过去时写回复", |
| 1115 | "Positive Prompt": "积极提示", | 1140 | "Positive Prompt": "正面提示词", |
| 1116 | "Use character CFG scales": "使用字符 CFG 尺度", | 1141 | "Use character CFG scales": "单独为各个角色设置CFG缩放", |
| 1117 | "Character CFG": "角色配置", | 1142 | "Character CFG": "角色CFG配置", |
| 1118 | "Will be automatically added as the CFG for this character.": "将自动添加为该角色的 CFG。", | 1143 | "Will be automatically added as the CFG for this character.": "将自动添加为该角色的 CFG。", |
| 1119 | "Global CFG": "全球CFG", | 1144 | "Global CFG": "全局CFG", |
| 1120 | "Will be used as the default CFG options for every chat unless overridden.": "除非被覆盖,否则将用作每次聊天的默认 CFG 选项。", | 1145 | "Will be used as the default CFG options for every chat unless overridden.": "除非被覆盖,否则将用作每次聊天的默认 CFG 选项。", |
| 1121 | "CFG Prompt Cascading": "CFG 提示级联", | 1146 | "CFG Prompt Cascading": "CFG 提示词级联", |
| 1122 | "Combine positive/negative prompts from other boxes.": "结合来自其他框的正面/负面提示。", | 1147 | "Combine positive/negative prompts from other boxes.": "结合来自其他框的正面/负面提示词。", |
| 1123 | "For example, ticking the chat, global, and character boxes combine all negative prompts into a comma-separated string.": "例如,勾选聊天、全局和角色框会将所有负面提示组合成以逗号分隔的字符串。", | 1148 | "For example, ticking the chat, global, and character boxes combine all negative prompts into a comma-separated string.": "例如,勾选聊天、全局和角色框会将所有负面提示词组合成以逗号分隔的字符串。", |
| 1124 | "Always Include": "始终包含", | 1149 | "Always Include": "始终包含", |
| 1125 | "Chat Negatives": "聊天负面信息", | 1150 | "Chat Negatives": "聊天负面信息", |
| 1126 | "Character Negatives": "性格缺点", | 1151 | "Character Negatives": "性格缺点", |
| 1127 | "Global Negatives": "全球负面消息", | 1152 | "Global Negatives": "全局负面信息", |
| 1128 | "Custom Separator:": "自定义分隔符:", | 1153 | "Custom Separator:": "自定义分隔符:", |
| 1129 | "Insertion Depth:": "插入深度:", | 1154 | "Insertion Depth:": "插入深度:", |
| 1130 | "Token Probabilities": "词符概率", | 1155 | "Token Probabilities": "词符概率", |
| @@ -1132,8 +1157,8 @@ | |||
| 1132 | "Not connected to API!": "未连接到API!", | 1157 | "Not connected to API!": "未连接到API!", |
| 1133 | "Type a message, or /? for help": "键入消息,或 /? 获取帮助", | 1158 | "Type a message, or /? for help": "键入消息,或 /? 获取帮助", |
| 1134 | "Continue script execution": "继续执行脚本", | 1159 | "Continue script execution": "继续执行脚本", |
| 1135 | "Pause script execution": "暂停脚本执行", | 1160 | "Pause script execution": "暂停执行脚本", |
| 1136 | "Abort script execution": "中止脚本执行", | 1161 | "Abort script execution": "中止执行脚本", |
| 1137 | "Abort request": "中止请求", | 1162 | "Abort request": "中止请求", |
| 1138 | "Continue the last message": "继续上一条消息", | 1163 | "Continue the last message": "继续上一条消息", |
| 1139 | "Send a message": "发送消息", | 1164 | "Send a message": "发送消息", |
| @@ -1150,15 +1175,17 @@ | |||
| 1150 | "Impersonate": "AI 帮答", | 1175 | "Impersonate": "AI 帮答", |
| 1151 | "Continue": "继续", | 1176 | "Continue": "继续", |
| 1152 | "Bind user name to that avatar": "将用户名称绑定到该头像", | 1177 | "Bind user name to that avatar": "将用户名称绑定到该头像", |
| 1153 | "Change persona image": "更改人设头像", | 1178 | "Change persona image": "更改用户角色头像", |
| 1154 | "Select this as default persona for the new chats.": "选择此项作为新聊天的默认人设。", | 1179 | "Select this as default persona for the new chats.": "选择此项作为新聊天的默认用户角色。", |
| 1155 | "Delete persona": "删除人设", | 1180 | "Delete persona": "删除用户角色", |
| 1156 | "These characters are the winners of character design contests and have outstandable quality.": "这些角色都是角色设计大赛的获奖者,品质非常出色。", | 1181 | "These characters are the winners of character design contests and have outstandable quality.": "这些角色都是角色设计大赛的获奖者,品质非常出色。", |
| 1157 | "Contest Winners": "比赛获胜者", | 1182 | "Contest Winners": "比赛获胜者", |
| 1158 | "These characters are the finalists of character design contests and have remarkable quality.": "这些角色都是角色设计大赛的入围作品,品质十分出色。", | 1183 | "These characters are the finalists of character design contests and have remarkable quality.": "这些角色都是角色设计大赛的入围作品,品质十分出色。", |
| 1159 | "Featured Characters": "特色角色", | 1184 | "Featured Characters": "特色角色", |
| 1185 | "Download Extensions & Assets": "下载扩展和资源菜单", | ||
| 1186 | "Assets URL": "资产网址", | ||
| 1187 | "Characters": "人物", | ||
| 1160 | "Attach a File": "附加文件", | 1188 | "Attach a File": "附加文件", |
| 1161 | "Open Data Bank": "开放数据库", | ||
| 1162 | "Enter a URL or the ID of a Fandom wiki page to scrape:": "输入要抓取的 Fandom wiki 页面的 URL 或 ID:", | 1189 | "Enter a URL or the ID of a Fandom wiki page to scrape:": "输入要抓取的 Fandom wiki 页面的 URL 或 ID:", |
| 1163 | "Examples:": "例:", | 1190 | "Examples:": "例:", |
| 1164 | "Example:": "例:", | 1191 | "Example:": "例:", |
| @@ -1166,7 +1193,8 @@ | |||
| 1166 | "All articles will be concatenated into a single file.": "所有文章将被合并为一个文件。", | 1193 | "All articles will be concatenated into a single file.": "所有文章将被合并为一个文件。", |
| 1167 | "File per article": "每篇文章的文件数", | 1194 | "File per article": "每篇文章的文件数", |
| 1168 | "Each article will be saved as a separate file.": "不推荐。每篇文章将保存为单独的文件。", | 1195 | "Each article will be saved as a separate file.": "不推荐。每篇文章将保存为单独的文件。", |
| 1169 | "Data Bank": "数据银行", | 1196 | "Open Data Bank": "打开数据库", |
| 1197 | "Data Bank": "数据库", | ||
| 1170 | "These files will be available for extensions that support attachments (e.g. Vector Storage).": "这些文件将可用于支持附件的扩展(例如 Vector Storage)。", | 1198 | "These files will be available for extensions that support attachments (e.g. Vector Storage).": "这些文件将可用于支持附件的扩展(例如 Vector Storage)。", |
| 1171 | "Supported file types: Plain Text, PDF, Markdown, HTML, EPUB.": "支持的文件类型:纯文本、PDF、Markdown、HTML、EPUB。", | 1199 | "Supported file types: Plain Text, PDF, Markdown, HTML, EPUB.": "支持的文件类型:纯文本、PDF、Markdown、HTML、EPUB。", |
| 1172 | "Drag and drop files here to upload.": "将文件拖放到此处进行上传。", | 1200 | "Drag and drop files here to upload.": "将文件拖放到此处进行上传。", |
| @@ -1179,48 +1207,95 @@ | |||
| 1179 | "Bulk Edit": "批量编辑", | 1207 | "Bulk Edit": "批量编辑", |
| 1180 | "Select All": "全选", | 1208 | "Select All": "全选", |
| 1181 | "Select None": "清空选择", | 1209 | "Select None": "清空选择", |
| 1210 | "Disable": "禁用", | ||
| 1211 | "Enable": "启用", | ||
| 1182 | "Global Attachments": "全局附件", | 1212 | "Global Attachments": "全局附件", |
| 1183 | "These files are available for all characters in all chats.": "这些文件可供所有聊天中的所有角色使用。", | 1213 | "These files are available for all characters in all chats.": "这些文件可供所有聊天中的所有角色使用。", |
| 1184 | "Character Attachments": "角色附件", | 1214 | "Character Attachments": "角色附件", |
| 1185 | "These files are available the current character in all chats they are in.": "当前角色可以在其参与的所有聊天中找到这些文件。", | 1215 | "These files are available for the current character in all chats they are in.": "当前角色可以在其所在的所有聊天中使用这些文件。", |
| 1186 | "Saved locally. Not exported.": "已本地保存。未导出。", | 1216 | "Saved locally. Not exported.": "已本地保存。未导出。", |
| 1187 | "Chat Attachments": "聊天附件", | 1217 | "Chat Attachments": "聊天附件", |
| 1188 | "These files are available to all characters in the current chat.": "当前聊天中的所有角色都可以使用这些文件。", | 1218 | "These files are available for all characters in the current chat.": "这些文件可供当前聊天中的所有角色使用。", |
| 1189 | "Enter a base URL of the MediaWiki to scrape.": "输入要抓取的 MediaWiki 的基本 URL。", | 1219 | "Enter a base URL of the MediaWiki to scrape.": "输入要抓取的 MediaWiki 的基本 URL。", |
| 1190 | "Don't include the page name!": "不要包含页面名称!", | 1220 | "Don't include the page name!": "不要包含页面名称!", |
| 1191 | "Enter web URLs to scrape (one per line):": "输入要抓取的网址(每行一个):", | 1221 | "Enter web URLs to scrape (one per line):": "输入要抓取的网址(每行一个):", |
| 1192 | "Enter a video URL to download its transcript.": "输入视频 URL 或 ID 即可下载其文本。", | 1222 | "Enter a video URL to download its transcript.": "输入视频 URL 或 ID 即可下载其文本。", |
| 1193 | "Expression API": "本地\n附加\nLLM", | 1223 | "Image Captioning": "图像描述", |
| 1194 | "Fallback Expression": "回落表达式", | 1224 | "Source": "来源", |
| 1225 | "Local": "本地", | ||
| 1226 | "Multimodal (OpenAI / Anthropic / llama / Google)": "多模式(OpenAI / Anthropic / llama / Google)", | ||
| 1227 | "Extras": "更多", | ||
| 1228 | "Horde": "Horde", | ||
| 1229 | "API": "API", | ||
| 1230 | "Text Generation WebUI (oobabooga)": "文本生成 WebUI (oobabooga)", | ||
| 1231 | "Model": "模型", | ||
| 1232 | "currently_selected": "[当前选定]", | ||
| 1233 | "currently_loaded": "[当前正在加载]", | ||
| 1234 | "Allow reverse proxy": "允许反向代理", | ||
| 1235 | "Hint:": "提示:", | ||
| 1236 | "Set your API keys and endpoints in the 'API Connections' tab first.": "首先在“API 连接”选项卡中设置您的 API 密钥和端点。", | ||
| 1237 | "Caption Prompt": "图像描述提示词", | ||
| 1238 | "Ask every time": "每次都询问", | ||
| 1239 | "Message Template": "消息模板", | ||
| 1240 | "(use _space": "(使用", | ||
| 1241 | "macro)": "宏指令)", | ||
| 1242 | "Edit captions before saving": "保存前编辑标题", | ||
| 1243 | "Character Expressions": "角色表情", | ||
| 1244 | "Translate text to English before classification": "分类之前将文本翻译成英文", | ||
| 1245 | "Show default images (emojis) if sprite missing": "如果表情包缺失,则显示默认图像(表情符号)", | ||
| 1246 | "Image Type - talkinghead (extras)": "图像类型 - 说话头像(附加内容)", | ||
| 1247 | "Classifier API": "分类器 API", | ||
| 1248 | "Select the API for classifying expressions.": "选择用于对表达式进行分类的API。", | ||
| 1249 | "LLM": "大语言模型", | ||
| 1250 | "LLM Prompt": "大语言模型提示词", | ||
| 1251 | "Will be used if the API doesn't support JSON schemas or function calling.": "如果 API 不支持 JSON 模式或函数调用,则会使用它。", | ||
| 1252 | "Default / Fallback Expression": "默认/后备表达式", | ||
| 1253 | "Set the default and fallback expression being used when no matching expression is found.": "设置在未找到匹配表达式时使用的默认表达式和后备表达式。", | ||
| 1254 | "Fallback Expression": "后备表达式", | ||
| 1255 | "Custom Expressions": "自定义表达式", | ||
| 1256 | "Can be set manually or with an _space": "可以手动设置或使用", | ||
| 1257 | "space_ slash command.": "快捷命令来设置。", | ||
| 1258 | "Open a chat to see the character expressions.": "打开聊天即可查看人物表情。", | ||
| 1259 | "You are in offline mode. Click on the image below to set the expression.": "您处于离线模式。点击下方图片即可设置表情。", | ||
| 1260 | "Sprite Folder Override": "表情文件夹覆盖", | ||
| 1261 | "Use a forward slash to specify a subfolder. Example: _space": "使用正斜杠指定子文件夹。例如:", | ||
| 1262 | "Upload sprite pack (ZIP)": "上传表情包 (ZIP)", | ||
| 1263 | "Remove all image overrides": "删除所有图片覆盖", | ||
| 1264 | "Create new folder in the _space": "创建新文件夹到", | ||
| 1265 | "folder of your user data directory and name it as the name of the character.": "用户数据目录的文件夹并将其命名为角色的名称。", | ||
| 1266 | "Put images with expressions there. File names should follow the pattern:": "将带有表情的图像放在那里。文件名应遵循以下模式:", | ||
| 1267 | "expression_label_pattern": "[表达式标签].[图像格式]", | ||
| 1268 | "Sprite set:": "表情集:", | ||
| 1269 | "ext_sum_title": "总结", | ||
| 1195 | "ext_sum_with": "总结如下:", | 1270 | "ext_sum_with": "总结如下:", |
| 1196 | "ext_sum_main_api": "主要 API", | 1271 | "ext_sum_main_api": "主要 API", |
| 1197 | "ext_sum_current_summary": "当前摘要:", | 1272 | "ext_sum_current_summary": "当前摘要:", |
| 1198 | "ext_sum_restore_previous": "恢复上一个", | 1273 | "ext_sum_restore_previous": "恢复上一个", |
| 1199 | "ext_sum_memory_placeholder": "摘要将在这里生成...", | 1274 | "ext_sum_memory_placeholder": "摘要将在这里生成...", |
| 1200 | "Trigger a summary update right now.": "现在总结", | 1275 | "ext_sum_force_tip": "立即触发摘要更新。", |
| 1201 | "ext_sum_force_text": "现在总结", | 1276 | "ext_sum_force_text": "现在总结", |
| 1202 | "Disable automatic summary updates. While paused, the summary remains as-is. You can still force an update by pressing the Summarize now button (which is only available with the Main API).": "禁用自动摘要更新。暂停时,摘要保持原样。您仍然可以通过按“立即汇总”按钮(仅适用于主 API)强制更新。", | 1277 | "Disable automatic summary updates. While paused, the summary remains as-is. You can still force an update by pressing the Summarize now button (which is only available with the Main API).": "禁用自动摘要更新。暂停时,摘要保持原样。您仍然可以通过按“立即汇总”按钮(仅适用于主 API)强制更新。", |
| 1203 | "ext_sum_pause": "暂停", | 1278 | "ext_sum_pause": "暂停", |
| 1204 | "Omit World Info and Author's Note from text to be summarized. Only has an effect when using the Main API. The Extras API always omits WI/AN.": "从要总结的文本中省略世界信息和作者注释。仅在使用主 API 时有效。附加 API 始终省略世界书/作者注。", | 1279 | "Omit World Info and Author's Note from text to be summarized. Only has an effect when using the Main API. The Extras API always omits WI/AN.": "从要总结的文本中省略世界信息和作者注释。仅在使用主 API 时有效。附加 API 始终省略世界书/作者注。", |
| 1205 | "ext_sum_no_wi_an": "无世界书/作者注", | 1280 | "ext_sum_no_wi_an": "无世界书/作者注", |
| 1206 | "ext_sum_settings_tip": "编辑摘要提示、插入位置等。", | 1281 | "ext_sum_settings_tip": "编辑摘要提示词、插入位置等。", |
| 1207 | "ext_sum_settings": "摘要设置", | 1282 | "ext_sum_settings": "摘要设置", |
| 1208 | "ext_sum_prompt_builder": "提示生成器", | 1283 | "ext_sum_prompt_builder": "提示词生成器", |
| 1209 | "ext_sum_prompt_builder_1_desc": "扩展将使用尚未汇总的消息构建自己的提示。阻止聊天,直到生成摘要为止。", | 1284 | "ext_sum_prompt_builder_1_desc": "扩展将使用尚未汇总的消息构建自己的提示词。阻止聊天,直到生成摘要为止。", |
| 1210 | "ext_sum_prompt_builder_1": "原始,阻塞", | 1285 | "ext_sum_prompt_builder_1": "原始,阻塞", |
| 1211 | "ext_sum_prompt_builder_2_desc": "扩展将使用尚未汇总的消息构建自己的提示。在生成摘要时不会阻止聊天。并非所有后端都支持此模式。", | 1286 | "ext_sum_prompt_builder_2_desc": "扩展将使用尚未汇总的消息构建自己的提示词。在生成摘要时不会阻止聊天。并非所有后端都支持此模式。", |
| 1212 | "ext_sum_prompt_builder_2": "原始,非阻塞", | 1287 | "ext_sum_prompt_builder_2": "原始,非阻塞", |
| 1213 | "ext_sum_prompt_builder_3_desc": "扩展将使用常规主提示生成器并将摘要请求添加为其作为最后的系统消息。", | 1288 | "ext_sum_prompt_builder_3_desc": "扩展将使用常规主提示词生成器并将摘要请求添加为其作为最后的系统消息。", |
| 1214 | "ext_sum_prompt_builder_3": "经典,阻塞", | 1289 | "ext_sum_prompt_builder_3": "经典,阻塞", |
| 1215 | "Summary Prompt": "摘要提示", | 1290 | "Summary Prompt": "摘要提示词", |
| 1216 | "ext_sum_restore_default_prompt_tip": "恢复默认提示", | 1291 | "ext_sum_restore_default_prompt_tip": "恢复默认提示词", |
| 1217 | "ext_sum_prompt_placeholder": "该提示将被发送给 AI,以请求生成摘要。{{words}} 将解析为“字数”参数。", | 1292 | "ext_sum_prompt_placeholder": "该提示词将被发送给 AI,以请求生成摘要。{{words}} 将解析为“字数”参数。", |
| 1218 | "ext_sum_target_length_1": "目标摘要长度", | 1293 | "ext_sum_target_length_1": "目标摘要长度", |
| 1219 | "ext_sum_target_length_2": "(", | 1294 | "ext_sum_target_length_2": "(", |
| 1220 | "ext_sum_target_length_3": "字)", | 1295 | "ext_sum_target_length_3": "字)", |
| 1221 | "ext_sum_api_response_length_1": "API 响应长度", | 1296 | "ext_sum_api_response_length_1": "API 响应长度", |
| 1222 | "ext_sum_api_response_length_2": "(", | 1297 | "ext_sum_api_response_length_2": "(", |
| 1223 | "ext_sum_api_response_length_3": "词符", | 1298 | "ext_sum_api_response_length_3": "个词符)", |
| 1224 | "ext_sum_0_default": "0 = 默认", | 1299 | "ext_sum_0_default": "0 = 默认", |
| 1225 | "ext_sum_raw_max_msg": "[原始] 每个请求的最大消息数", | 1300 | "ext_sum_raw_max_msg": "[原始] 每个请求的最大消息数", |
| 1226 | "ext_sum_0_unlimited": "0 = 无限制", | 1301 | "ext_sum_0_unlimited": "0 = 无限制", |
| @@ -1229,20 +1304,55 @@ | |||
| 1229 | "ext_sum_update_every_messages_2": "消息", | 1304 | "ext_sum_update_every_messages_2": "消息", |
| 1230 | "ext_sum_0_disable": "0 = 禁用", | 1305 | "ext_sum_0_disable": "0 = 禁用", |
| 1231 | "ext_sum_auto_adjust_desc": "尝试根据聊天指标自动调整间隔。", | 1306 | "ext_sum_auto_adjust_desc": "尝试根据聊天指标自动调整间隔。", |
| 1232 | "ext_sum_update_every_words_1": "更新间隔", | 1307 | "ext_sum_update_every_words_1": "更新间隔(", |
| 1233 | "ext_sum_update_every_words_2": "字", | 1308 | "ext_sum_update_every_words_2": "字)", |
| 1234 | "ext_sum_both_sliders": "如果两个滑块都不为零,则两者都将按照各自的间隔触发摘要更新。", | 1309 | "ext_sum_both_sliders": "如果两个滑块都不为零,则两者都将按照各自的间隔触发摘要更新。", |
| 1235 | "ext_sum_injection_template": "插入模板", | 1310 | "ext_sum_injection_template": "插入模板", |
| 1236 | "ext_sum_memory_template_placeholder": "{{summary}} 将解析当前摘要内容。", | 1311 | "ext_sum_memory_template_placeholder": "{{summary}} 将解析当前摘要内容。", |
| 1237 | "ext_sum_injection_position": "插入位置", | 1312 | "ext_sum_injection_position": "插入位置", |
| 1238 | "How many messages before the current end of the chat.": "当前聊天结束前还有多少条消息。", | 1313 | "How many messages before the current end of the chat.": "当前聊天结束前还有多少条消息。", |
| 1314 | "Labels and Message": "标签和信息", | ||
| 1315 | "Label": "标签", | ||
| 1316 | "Title": "标题", | ||
| 1317 | "(tooltip, leave empty to show message or /command)": "(工具提示,留空以显示消息或/命令)", | ||
| 1318 | "Message / Command:": "消息/命令:", | ||
| 1319 | "Word wrap": "自动换行", | ||
| 1320 | "Tab size:": "标签大小:", | ||
| 1321 | "Ctrl+Enter to execute": "Ctrl+Enter 执行", | ||
| 1322 | "Context Menu": "上下文菜单", | ||
| 1323 | "Chaining:": "链接:", | ||
| 1324 | "Auto-Execute": "自动执行", | ||
| 1325 | "Don't trigger auto-execute": "不触发自动执行", | ||
| 1326 | "Invisible (auto-execute only)": "隐形(仅自动执行)", | ||
| 1327 | "Execute on startup": "启动时执行", | ||
| 1328 | "Execute on user message": "根据用户消息执行", | ||
| 1329 | "Execute on AI message": "根据 AI 消息执行", | ||
| 1330 | "Execute on chat change": "聊天内容改变时执行", | ||
| 1331 | "Execute on group member draft": "起草群组成员时执行", | ||
| 1332 | "Automation ID:": "自动化标识", | ||
| 1333 | "Testing": "测试", | ||
| 1334 | "Execute": "执行", | ||
| 1335 | "Quick Reply": "快速回复", | ||
| 1336 | "Enable Quick Replies": "启用快速回复", | ||
| 1337 | "Combine Quick Replies": "合并快速回复", | ||
| 1338 | "Global Quick Reply Sets": "全局快速回复集", | ||
| 1339 | "Chat Quick Reply Sets": "聊天快速回复集", | ||
| 1340 | "Edit Quick Replies": "编辑快速回复", | ||
| 1341 | "Disable Send (Insert Into Input Field)": "禁用发送(插入输入字段)", | ||
| 1342 | "Place Quick Reply Before Input": "在输入前放置快速回复", | ||
| 1343 | "Inject user input automatically": "自动注入用户输入", | ||
| 1344 | "(if disabled, use ": "(如果禁用,使用", | ||
| 1345 | "macro for manual injection)": "宏用于手动注入)", | ||
| 1239 | "ext_regex_title": "正则", | 1346 | "ext_regex_title": "正则", |
| 1347 | "ext_regex_new_global_script_desc": "新的全局正则表达式脚本", | ||
| 1240 | "ext_regex_new_global_script": "新建全局正则", | 1348 | "ext_regex_new_global_script": "新建全局正则", |
| 1349 | "ext_regex_new_scoped_script_desc": "新的作用域正则表达式脚本", | ||
| 1241 | "ext_regex_new_scoped_script": "新建局部正则", | 1350 | "ext_regex_new_scoped_script": "新建局部正则", |
| 1242 | "ext_regex_import_script": "导入正则", | 1351 | "ext_regex_import_script": "导入正则", |
| 1243 | "ext_regex_global_scripts": "全局正则脚本", | 1352 | "ext_regex_global_scripts": "全局正则脚本", |
| 1244 | "ext_regex_global_scripts_desc": "影响所有角色,保存在本地设定中", | 1353 | "ext_regex_global_scripts_desc": "影响所有角色,保存在本地设定中", |
| 1245 | "ext_regex_scoped_scripts": "局部正则脚本", | 1354 | "ext_regex_scoped_scripts": "局部正则脚本", |
| 1355 | "ext_regex_allow_scoped": "允许使用范围正则表达式", | ||
| 1246 | "ext_regex_scoped_scripts_desc": "只影响当前角色,保存在角色卡片中", | 1356 | "ext_regex_scoped_scripts_desc": "只影响当前角色,保存在角色卡片中", |
| 1247 | "Regex Editor": "正则表达式编辑器", | 1357 | "Regex Editor": "正则表达式编辑器", |
| 1248 | "Test Mode": "测试模式", | 1358 | "Test Mode": "测试模式", |
| @@ -1260,17 +1370,17 @@ | |||
| 1260 | "ext_regex_affects": "影响", | 1370 | "ext_regex_affects": "影响", |
| 1261 | "ext_regex_user_input": "用户输入", | 1371 | "ext_regex_user_input": "用户输入", |
| 1262 | "ext_regex_ai_output": "AI输出", | 1372 | "ext_regex_ai_output": "AI输出", |
| 1263 | "Slash Commands": "斜线命令", | 1373 | "Slash Commands": "快捷命令", |
| 1264 | "ext_regex_min_depth_desc": "当应用于提示或显示时,仅影响深度至少为 N 级的消息。0 = 最后一条消息,1 = 倒数第二条消息等。仅计算 WI 条目 @Depth 和可用消息,即非隐藏或系统消息。", | 1374 | "ext_regex_min_depth_desc": "当应用于提示或显示时,仅影响深度至少为 N 级的消息。0 = 最后一条消息,1 = 倒数第二条消息等。仅计算 WI 条目 @Depth 和可用消息,即非隐藏或系统消息。", |
| 1265 | "Min Depth": "最小深度", | 1375 | "Min Depth": "最小深度", |
| 1266 | "ext_regex_min_depth_placeholder": "无限", | 1376 | "ext_regex_min_depth_placeholder": "无限", |
| 1267 | "ext_regex_max_depth_desc": "当应用于提示或显示时,仅影响深度不超过 N 级的消息。0 = 最后一条消息,1 = 倒数第二条消息等。仅计算 WI 条目 @Depth 和可用消息,即非隐藏或系统消息。", | 1377 | "ext_regex_max_depth_desc": "当应用于提示词或显示时,仅影响深度不超过 N 级的消息。0 = 最后一条消息,1 = 倒数第二条消息等。仅计算世界信息条目 @Depth 和可用消息,即非隐藏或系统消息。", |
| 1268 | "ext_regex_other_options": "其他选项", | 1378 | "ext_regex_other_options": "其他选项", |
| 1269 | "Only Format Display": "仅格式显示", | 1379 | "Only Format Display": "仅格式显示", |
| 1270 | "ext_regex_only_format_prompt_desc": "聊天记录不会改变,只有在请求发送时(生成时)才会出现提示。", | 1380 | "ext_regex_only_format_prompt_desc": "聊天记录不会改变,只有在请求发送时(生成时)才会出现提示词。", |
| 1271 | "Only Format Prompt (?)": "仅格式提示", | 1381 | "Only Format Prompt (?)": "仅格式提示词", |
| 1272 | "Run On Edit": "运行编辑", | 1382 | "Run On Edit": "在编辑时运行", |
| 1273 | "ext_regex_substitute_regex_desc": "在运行 Find Regex 之前,替换 {{macros}}", | 1383 | "ext_regex_substitute_regex_desc": "在运行正则表达式查找之前,替换 {{macros}}", |
| 1274 | "Substitute Regex": "替代正则表达式", | 1384 | "Substitute Regex": "替代正则表达式", |
| 1275 | "ext_regex_import_target": "导入至:", | 1385 | "ext_regex_import_target": "导入至:", |
| 1276 | "ext_regex_disable_script": "禁用脚本", | 1386 | "ext_regex_disable_script": "禁用脚本", |
| @@ -1280,7 +1390,7 @@ | |||
| 1280 | "ext_regex_move_to_scoped": "移至作用域脚本", | 1390 | "ext_regex_move_to_scoped": "移至作用域脚本", |
| 1281 | "ext_regex_export_script": "导出脚本", | 1391 | "ext_regex_export_script": "导出脚本", |
| 1282 | "ext_regex_delete_script": "删除脚本", | 1392 | "ext_regex_delete_script": "删除脚本", |
| 1283 | "Trigger Stable Diffusion": "触发稳定扩散", | 1393 | "Trigger Stable Diffusion": "触发Stable Diffusion", |
| 1284 | "sd_Yourself": "你自己", | 1394 | "sd_Yourself": "你自己", |
| 1285 | "sd_Your_Face": "你的脸", | 1395 | "sd_Your_Face": "你的脸", |
| 1286 | "sd_Me": "我", | 1396 | "sd_Me": "我", |
| @@ -1289,17 +1399,19 @@ | |||
| 1289 | "sd_Raw_Last_Message": "原始最后一条消息", | 1399 | "sd_Raw_Last_Message": "原始最后一条消息", |
| 1290 | "sd_Background": "背景", | 1400 | "sd_Background": "背景", |
| 1291 | "Image Generation": "图像生成", | 1401 | "Image Generation": "图像生成", |
| 1292 | "sd_refine_mode": "允许在将提示发送到生成 API 之前手动编辑提示", | 1402 | "sd_refine_mode": "允许在将提示词发送到生成 API 之前手动编辑提示词", |
| 1293 | "sd_refine_mode_txt": "生成之前编辑提示", | 1403 | "sd_refine_mode_txt": "生成之前编辑提示词", |
| 1294 | "sd_interactive_mode": "发送消息时自动生成图像,例如“给我发一张猫的照片”。", | 1404 | "sd_interactive_mode": "发送消息时自动生成图像,例如“给我发一张猫的照片”。", |
| 1295 | "sd_interactive_mode_txt": "交互模式", | 1405 | "sd_interactive_mode_txt": "交互模式", |
| 1296 | "sd_multimodal_captioning": "使用多模式字幕根据用户和角色的头像生成提示。", | 1406 | "sd_multimodal_captioning": "使用多模式字幕根据用户和角色的头像生成提示词。", |
| 1297 | "sd_multimodal_captioning_txt": "使用多模式字幕来描绘肖像", | 1407 | "sd_multimodal_captioning_txt": "使用多模式字幕来描绘肖像", |
| 1298 | "sd_expand": "使用文本生成模型自动扩展提示", | 1408 | "sd_free_extend": "使用当前选择的 LLM 自动扩展自由模式主题提示(不是肖像或背景)。", |
| 1299 | "sd_expand_txt": "自动增强提示", | 1409 | "sd_free_extend_txt": "延长自由模式提示", |
| 1410 | "sd_free_extend_small": "(交互/命令)", | ||
| 1411 | "sd_expand": "使用文本生成模型自动扩展提示词", | ||
| 1412 | "sd_expand_txt": "自动增强提示词", | ||
| 1300 | "sd_snap": "快照生成请求具有强制纵横比(肖像、背景)到最接近已知分辨率,同时尝试保留绝对像素数(推荐用于 SDXL)。", | 1413 | "sd_snap": "快照生成请求具有强制纵横比(肖像、背景)到最接近已知分辨率,同时尝试保留绝对像素数(推荐用于 SDXL)。", |
| 1301 | "sd_snap_txt": "自动调整分辨率", | 1414 | "sd_snap_txt": "自动调整分辨率", |
| 1302 | "Source": "来源", | ||
| 1303 | "sd_auto_url": "例如:{{auto_url}}", | 1415 | "sd_auto_url": "例如:{{auto_url}}", |
| 1304 | "Authentication (optional)": "身份验证(可选)", | 1416 | "Authentication (optional)": "身份验证(可选)", |
| 1305 | "Example: username:password": "例:用户名:密码", | 1417 | "Example: username:password": "例:用户名:密码", |
| @@ -1312,7 +1424,7 @@ | |||
| 1312 | "The server must be accessible from the SillyTavern host machine.": "必须能够从 SillyTavern 主机访问该服务器。", | 1424 | "The server must be accessible from the SillyTavern host machine.": "必须能够从 SillyTavern 主机访问该服务器。", |
| 1313 | "Hint: Save an API key in Horde KoboldAI API settings to use it here.": "提示:在 Horde KoboldAI API 设置中保存一个 API 密钥以便在此处使用它。", | 1425 | "Hint: Save an API key in Horde KoboldAI API settings to use it here.": "提示:在 Horde KoboldAI API 设置中保存一个 API 密钥以便在此处使用它。", |
| 1314 | "Allow NSFW images from Horde": "允许 Horde 的 NSFW 图片", | 1426 | "Allow NSFW images from Horde": "允许 Horde 的 NSFW 图片", |
| 1315 | "Sanitize prompts (recommended)": "净化提示(推荐)", | 1427 | "Sanitize prompts (recommended)": "净化提示词(推荐)", |
| 1316 | "Automatically adjust generation parameters to ensure free image generations.": "自动调整生成参数,确保图像生成自由。", | 1428 | "Automatically adjust generation parameters to ensure free image generations.": "自动调整生成参数,确保图像生成自由。", |
| 1317 | "Avoid spending Anlas": "避免花费 Anlas", | 1429 | "Avoid spending Anlas": "避免花费 Anlas", |
| 1318 | "Opus tier": "(作品层)", | 1430 | "Opus tier": "(作品层)", |
| @@ -1324,45 +1436,110 @@ | |||
| 1324 | "HD": "高清", | 1436 | "HD": "高清", |
| 1325 | "sd_comfy_url": "例如:{{comfy_url}}", | 1437 | "sd_comfy_url": "例如:{{comfy_url}}", |
| 1326 | "Open workflow editor": "打开工作流编辑器", | 1438 | "Open workflow editor": "打开工作流编辑器", |
| 1327 | "Create new workflow": "创建新的工作流程", | 1439 | "Create new workflow": "创建新的工作流", |
| 1328 | "Delete workflow": "删除工作流", | 1440 | "Delete workflow": "删除工作流", |
| 1329 | "Enhance": "提高", | 1441 | "Enhance": "提高", |
| 1330 | "Refine": "优化", | 1442 | "Refine": "优化", |
| 1331 | "Decrisper": "破译者", | 1443 | "Sampling method": "采样方法", |
| 1444 | "Scheduler": "调度器", | ||
| 1445 | "Resolution": "分辨率", | ||
| 1446 | "Upscaler": "图像扩大器", | ||
| 1332 | "Sampling steps": "采样步数()", | 1447 | "Sampling steps": "采样步数()", |
| 1333 | "Width": "宽度()", | 1448 | "Width": "宽度()", |
| 1334 | "Height": "高度()", | 1449 | "Height": "高度()", |
| 1335 | "Resolution": "解决", | 1450 | "Swap width and height": "交换宽度和高度", |
| 1336 | "Model": "模型", | 1451 | "Upscale by": "扩大倍数", |
| 1337 | "Sampling method": "采样方法", | 1452 | "Denoising strength": "去噪强度", |
| 1338 | "Karras (not all samplers supported)": "Karras(并非所有采样器都受支持)", | 1453 | "Hires steps (2nd pass)": "高清修复步数(第二遍)", |
| 1454 | "CLIP Skip": "片段跳过", | ||
| 1455 | "Restore Faces": "面部修复", | ||
| 1456 | "Hires. Fix": "高清修复", | ||
| 1457 | "Karras": "Karras", | ||
| 1458 | "Not all samplers supported.": "并非所有采样器都受支持。", | ||
| 1339 | "SMEA versions of samplers are modified to perform better at high resolution.": "SMEA 版本的采样器经过修改,在高分辨率下性能更佳。", | 1459 | "SMEA versions of samplers are modified to perform better at high resolution.": "SMEA 版本的采样器经过修改,在高分辨率下性能更佳。", |
| 1340 | "SMEA": "中小企业协会", | 1460 | "SMEA": "中小企业协会", |
| 1341 | "DYN variants of SMEA samplers often lead to more varied output, but may fail at very high resolutions.": "SMEA 采样器的 DYN 变体通常会产生更加多样化的输出,但在非常高的分辨率下可能会失败。", | 1461 | "DYN variants of SMEA samplers often lead to more varied output, but may fail at very high resolutions.": "SMEA 采样器的 DYN 变体通常会产生更加多样化的输出,但在非常高的分辨率下可能会失败。", |
| 1342 | "DYN": "动态", | 1462 | "DYN": "动态", |
| 1343 | "Scheduler": "调度器", | 1463 | "Decrisper": "去伪器", |
| 1344 | "Restore Faces": "恢复面孔", | 1464 | "(-1 for random)": "(-1 为随机)", |
| 1345 | "Hires. Fix": "招聘。修复", | 1465 | "Preset for prompt prefix and negative prompt": "提示词前缀和负面提示词的预设", |
| 1346 | "Upscaler": "升频器", | ||
| 1347 | "Upscale by": "高档的", | ||
| 1348 | "Denoising strength": "去噪强度", | ||
| 1349 | "Hires steps (2nd pass)": "雇用员工步骤(第二遍)", | ||
| 1350 | "Preset for prompt prefix and negative prompt": "提示前缀和否定提示的预设", | ||
| 1351 | "Style": "风格", | 1466 | "Style": "风格", |
| 1352 | "Save style": "保存样式", | 1467 | "Save style": "保存风格", |
| 1353 | "Delete style": "删除样式", | 1468 | "Delete style": "删除风格", |
| 1354 | "Common prompt prefix": "常见提示前缀", | 1469 | "Common prompt prefix": "常见提示词前缀", |
| 1355 | "sd_prompt_prefix_placeholder": "使用 {prompt} 指定生成的提示插入的位置", | 1470 | "sd_prompt_prefix_placeholder": "使用 {prompt} 指定生成的提示词插入的位置", |
| 1356 | "Negative common prompt prefix": "否定常见提示前缀", | 1471 | "Negative common prompt prefix": "常见负面提示词前缀", |
| 1357 | "Character-specific prompt prefix": "特定字符的提示前缀", | 1472 | "Character-specific prompt prefix": "特定角色的提示词前缀", |
| 1358 | "Won't be used in groups.": "不可供群聊使用。", | 1473 | "Won't be used in groups.": "不可供群聊使用。", |
| 1359 | "sd_character_prompt_placeholder": "描述当前选定角色的任何特征。将添加在常见提示前缀后。\n示例:女性、绿眼睛、棕色头发、粉色衬衫", | 1474 | "sd_character_prompt_placeholder": "描述当前选定角色的任何特征。将添加在常见提示词前缀后。\n示例:女性、绿眼睛、棕色头发、粉色衬衫", |
| 1360 | "Character-specific negative prompt prefix": "特定字符的否定提示前缀", | 1475 | "Character-specific negative prompt prefix": "特定角色的负面提示词前缀", |
| 1361 | "sd_character_negative_prompt_placeholder": "所选角色不应出现的任何特征。将添加在负面常见提示前缀后。\n示例:珠宝、鞋子、眼镜", | 1476 | "sd_character_negative_prompt_placeholder": "所选角色不应出现的任何特征。将添加在常见负面提示词前缀后。\n示例:珠宝、鞋子、眼镜", |
| 1362 | "Shareable": "可共享", | 1477 | "Shareable": "可共享", |
| 1478 | "Chat Message Visibility (by source)": "聊天消息可见性(按来源)", | ||
| 1479 | "Uncheck to hide the extension's messages in chat prompts.": "取消选中可在聊天提示中隐藏扩展消息。", | ||
| 1480 | "Extensions Menu": "扩展菜单", | ||
| 1481 | "Slash Command": "快捷命令", | ||
| 1482 | "Interactive Mode": "交互模式", | ||
| 1363 | "Image Prompt Templates": "图像提示模板", | 1483 | "Image Prompt Templates": "图像提示模板", |
| 1484 | "ext_translate_btn_chat": "翻译聊天", | ||
| 1485 | "ext_translate_btn_input": "翻译输入", | ||
| 1486 | "ext_translate_delete_confirm_1": "你确定吗?", | ||
| 1487 | "ext_translate_delete_confirm_2": "这将从当前聊天中的所有消息中删除翻译文本。此操作无法撤消。", | ||
| 1488 | "ext_translate_title": "聊天翻译", | ||
| 1489 | "ext_translate_auto_mode": "自动模式", | ||
| 1490 | "ext_translate_mode_none": "没有任何", | ||
| 1491 | "ext_translate_mode_responses": "翻译回复", | ||
| 1492 | "ext_translate_mode_inputs": "翻译输入", | ||
| 1493 | "ext_translate_mode_both": "翻译两者", | ||
| 1494 | "ext_translate_mode_provider": "提供者", | ||
| 1495 | "ext_translate_target_lang": "目标语言", | ||
| 1496 | "ext_translate_clear": "清空设置", | ||
| 1497 | "Audio Playback Speed": "音频播放速度", | ||
| 1498 | "Vector Storage": "向量存储", | ||
| 1499 | "Vectorization Source": "向量化源", | ||
| 1500 | "Local (Transformers)": "本地(Transformers)", | ||
| 1501 | "Vectorization Model": "向量化模型", | ||
| 1502 | "Keep model in memory": "将模型保存在内存中", | ||
| 1503 | "Hint: Set the URL in the API connection settings.": "提示:在 API 连接设置中设置 URL。", | ||
| 1504 | "The server MUST be started with the --embedding flag to use this feature!": "服务器必须使用 --embedding 标志启动才能使用此功能!", | ||
| 1364 | "Vectors Model Warning": "建议在聊天过程中更改模型时清除向量。否则会导致结果不理想。", | 1505 | "Vectors Model Warning": "建议在聊天过程中更改模型时清除向量。否则会导致结果不理想。", |
| 1506 | "NomicAI API Key": "NomicAI API 密钥", | ||
| 1507 | "Query messages": "查询消息", | ||
| 1508 | "Score threshold": "分数阈值", | ||
| 1509 | "Chunk boundary": "区块边界", | ||
| 1510 | "World Info settings": "世界信息设置", | ||
| 1511 | "Enable for World Info": "启用世界信息", | ||
| 1512 | "Enabled for all entries": "对所有条目启用", | ||
| 1513 | "Checked: all entries except ❌ status can be activated.": "勾选:除❌状态外的所有条目均可激活。", | ||
| 1514 | "Unchecked: only entries with ❌ status can be activated.": "未选中:只有具有🔗状态的条目才可以被激活。", | ||
| 1515 | "Max Entries": "最大条目数", | ||
| 1516 | "File vectorization settings": "文件向量化设置", | ||
| 1517 | "Enable for files": "为文件启用", | ||
| 1365 | "Translate files into English before processing": "处理之前将文件翻译成英文", | 1518 | "Translate files into English before processing": "处理之前将文件翻译成英文", |
| 1519 | "Message attachments": "消息附件", | ||
| 1520 | "Size threshold (KB)": "大小阈值 (KB)", | ||
| 1521 | "Chunk size (chars)": "块大小(字符)", | ||
| 1522 | "Chunk overlap (%)": "块重叠 (%)", | ||
| 1523 | "Retrieve chunks": "检索块", | ||
| 1524 | "Data Bank files": "数据库文件", | ||
| 1525 | "Injection Template": "注入模板", | ||
| 1526 | "Injection Position": "注射位置", | ||
| 1527 | "Vectorize All": "全部矢量化", | ||
| 1528 | "Purge Vectors": "清除向量", | ||
| 1529 | "Chat vectorization settings": "聊天矢量化设置", | ||
| 1530 | "Enabled for chat messages": "已启用聊天消息", | ||
| 1531 | "Retain#": "保持#", | ||
| 1532 | "Insert#": "插入#", | ||
| 1533 | "Vector Summarization": "向量摘要", | ||
| 1534 | "Summarize chat messages for vector generation": "汇总聊天消息以生成向量", | ||
| 1535 | "Warning: This will slow down vector generation drastically, as all messages have to be summarized first.": "警告:这将大大减慢向量生成速度,因为必须先汇总所有消息。", | ||
| 1536 | "Summarize chat messages when sending": "发送时总结聊天消息", | ||
| 1537 | "Warning: This might cause your sent messages to take a bit to process and slow down response time.": "警告:这可能会导致您发送的消息需要一点时间来处理并减慢响应时间。", | ||
| 1538 | "Main API": "主要 API", | ||
| 1539 | "Extras API": "附加 API", | ||
| 1540 | "Only used when Main API is selected.": "仅在选择主 API 时使用。", | ||
| 1541 | "Old messages are vectorized gradually as you chat. To process all previous messages, click the button below.": "随着您聊天,旧消息会逐渐矢量化。\n要处理所有以前的消息,请单击下面的按钮。", | ||
| 1542 | "View Stats": "查看统计数据", | ||
| 1366 | "Manager Users": "管理用户", | 1543 | "Manager Users": "管理用户", |
| 1367 | "New User": "新用户", | 1544 | "New User": "新用户", |
| 1368 | "Status:": "地位:", | 1545 | "Status:": "地位:", |
| @@ -1375,20 +1552,108 @@ | |||
| 1375 | "Current Password:": "当前密码:", | 1552 | "Current Password:": "当前密码:", |
| 1376 | "New Password:": "新密码:", | 1553 | "New Password:": "新密码:", |
| 1377 | "Confirm New Password:": "确认新密码:", | 1554 | "Confirm New Password:": "确认新密码:", |
| 1555 | "Import Tags For _begin": "为", | ||
| 1556 | "Import Tags For _end": "导入标签", | ||
| 1557 | "Click remove on any tag to remove it from this import.<br />Select one of the import options to finish importing the tags.": "单击任意标签上的“删除”可将其从本次导入中删除。\n选择其中一个导入选项以完成标签的导入。", | ||
| 1558 | "Existing Tags": "现有标签", | ||
| 1559 | "New Tags": "新标签", | ||
| 1560 | "Folder Tags": "文件夹标签", | ||
| 1561 | "The following tags will be auto-imported based on the currently selected folders": "根据当前选定的文件夹将自动导入以下标签", | ||
| 1562 | "Remember my choice": "记住我的选择", | ||
| 1563 | "Remember the chosen import option If anything besides 'Cancel' is selected, this dialog will not show up anymore. To change this, go to the settings and modify \"Tag Import Option\". If the \"Import\" option is chosen, the global setting will stay on \"Ask\".": "记住所选的导入选项\n如果选择了“取消”以外的任何选项,此对话框将不再显示。\n要更改此设置,请转到设置并修改“标签导入选项”。\n\n如果选择了“导入”选项,则全局设置将保留为“询问”。", | ||
| 1564 | "Import None": "不导入", | ||
| 1565 | "Import All": "全部导入", | ||
| 1566 | "Import Existing": "导入现有", | ||
| 1567 | "Import tags button": "导入", | ||
| 1568 | "Include Body Parameters": "包括主体参数", | ||
| 1569 | "custom_include_body_desc": "聊天完成请求主体中要包含的参数(YAML 对象)\n\n示例:\n- top_k:20\n- repetition_penalty:1.1", | ||
| 1570 | "Exclude Body Parameters": "排除主体参数", | ||
| 1571 | "custom_exclude_body_desc": "要从聊天完成请求主体中排除的参数(YAML 数组)\n\n示例:\n- frequency_penalty\n- presence_penalty", | ||
| 1572 | "Include Request Headers": "包含请求标头", | ||
| 1573 | "custom_include_headers_desc": "聊天完成请求的附加标头(YAML 对象)\n\n示例:\n- CustomHeader:自定义值\n- AnotherHeader:自定义值", | ||
| 1378 | "Debug Warning": "此类别中的功能仅供高级用户使用。如果您不确定后果,请不要点击任何内容。", | 1574 | "Debug Warning": "此类别中的功能仅供高级用户使用。如果您不确定后果,请不要点击任何内容。", |
| 1379 | "Execute": "执行", | ||
| 1380 | "Are you sure you want to delete this user?": "您确定要删除该用户吗?", | 1575 | "Are you sure you want to delete this user?": "您确定要删除该用户吗?", |
| 1381 | "Deleting:": "删除:", | 1576 | "Deleting:": "删除:", |
| 1382 | "Also wipe user data.": "也清空用户数据。", | 1577 | "Also wipe user data.": "也清空用户数据。", |
| 1383 | "Warning:": "警告:", | 1578 | "Warning:": "警告:", |
| 1384 | "This action is irreversible.": "此操作不可逆。", | 1579 | "This action is irreversible.": "此操作不可逆。", |
| 1385 | "Type the user's handle below to confirm:": "在下面输入用户的名称以确认:", | 1580 | "Type the user's handle below to confirm:": "在下面输入用户的名称以确认:", |
| 1581 | "help_format_1": "文本格式化命令:", | ||
| 1582 | "help_format_2": "*文本*", | ||
| 1583 | "help_format_3": "显示为", | ||
| 1584 | "help_format_4": "斜体", | ||
| 1585 | "help_format_5": "**文本**", | ||
| 1586 | "help_format_6": "显示为", | ||
| 1587 | "help_format_7": "大胆的", | ||
| 1588 | "help_format_8": "***文本***", | ||
| 1589 | "help_format_9": "显示为", | ||
| 1590 | "help_format_10": "粗斜体", | ||
| 1591 | "help_format_11": "__文本__", | ||
| 1592 | "help_format_12": "显示为", | ||
| 1593 | "help_format_13": "强调", | ||
| 1594 | "help_format_14": "~~文本~~", | ||
| 1595 | "help_format_15": "显示为", | ||
| 1596 | "help_format_16": "删除线", | ||
| 1597 | "help_format_17": "[文本](网址)", | ||
| 1598 | "help_format_18": "显示为", | ||
| 1599 | "help_format_19": "超级链接", | ||
| 1600 | "help_format_20": "", | ||
| 1601 | "help_format_21": "显示为图像", | ||
| 1602 | "help_format_22": "```文本```", | ||
| 1603 | "help_format_23": "显示为代码块(反引号之间允许换行)", | ||
| 1604 | "help_format_like_this": "像这样", | ||
| 1605 | "help_format_24": "`文本`", | ||
| 1606 | "help_format_25": "显示为", | ||
| 1607 | "help_format_26": "内联代码", | ||
| 1608 | "help_format_27": "> 文本", | ||
| 1609 | "help_format_28": "显示为块引用(请注意 > 后面的空格)", | ||
| 1610 | "help_format_29": "# 文本", | ||
| 1611 | "help_format_30": "显示为大标题(注意空格)", | ||
| 1612 | "help_format_32": "## 文本", | ||
| 1613 | "help_format_33": "显示为中等标题(注意空格)", | ||
| 1614 | "help_format_35": "### 文本", | ||
| 1615 | "help_format_36": "显示为小标题(注意空格)", | ||
| 1616 | "help_format_38": "$$ 文本 $$", | ||
| 1617 | "help_format_39": "呈现 LaTeX 公式(如果启用)", | ||
| 1618 | "help_format_40": "$文本$", | ||
| 1619 | "help_format_41": "呈现 AsciiMath 公式(如果启用)", | ||
| 1620 | "help_1": "您好!请选择您想要详细了解的帮助主题:", | ||
| 1621 | "help_2": "斜线命令", | ||
| 1622 | "help_or": "或者", | ||
| 1623 | "help_3": "格式化", | ||
| 1624 | "help_4": "热键", | ||
| 1625 | "help_5": "{{宏}}", | ||
| 1626 | "help_6": "还有其他问题吗?", | ||
| 1627 | "help_7": "SillyTavern 官方文档网站", | ||
| 1628 | "help_8": "有更多信息!", | ||
| 1629 | "help_hotkeys_0": "热键/按键绑定", | ||
| 1630 | "help_hotkeys_1": "向上", | ||
| 1631 | "help_hotkeys_2": "编辑聊天中的最后一条消息", | ||
| 1632 | "help_hotkeys_3": "Ctrl+向上", | ||
| 1633 | "help_hotkeys_4": "编辑聊天中的最后一条用户消息", | ||
| 1634 | "help_hotkeys_5": "左边", | ||
| 1635 | "help_hotkeys_6": "向左滑动", | ||
| 1636 | "help_hotkeys_7": "正确的", | ||
| 1637 | "help_hotkeys_8": "向右滑动(注意:当聊天栏中输入内容时,滑动热键将被禁用)", | ||
| 1638 | "help_hotkeys_9": "进入", | ||
| 1639 | "help_hotkeys_10": "(选中聊天栏)", | ||
| 1640 | "help_hotkeys_10_1": "向 AI 发送消息", | ||
| 1641 | "help_hotkeys_11": "Ctrl+Enter", | ||
| 1642 | "help_hotkeys_12": "重新生成最后的 AI 响应", | ||
| 1643 | "help_hotkeys_13": "Alt+Enter", | ||
| 1644 | "help_hotkeys_14": "继续上一次AI响应", | ||
| 1645 | "help_hotkeys_15": "逃脱", | ||
| 1646 | "help_hotkeys_16": "停止 AI 响应生成、关闭 UI 面板、取消消息编辑", | ||
| 1647 | "help_hotkeys_17": "Ctrl+Shift+向上", | ||
| 1648 | "help_hotkeys_18": "滚动到上下文行", | ||
| 1649 | "help_hotkeys_19": "Ctrl+Shift+向下", | ||
| 1650 | "help_hotkeys_20": "滚动聊天到底部", | ||
| 1386 | "Import Characters": "导入角色", | 1651 | "Import Characters": "导入角色", |
| 1387 | "Enter the URL of the content to import": "输入要导入的内容的URL", | 1652 | "Enter the URL of the content to import": "输入要导入的内容的URL", |
| 1388 | "Supported sources:": "支持的来源:", | 1653 | "Supported sources:": "支持的来源:", |
| 1389 | "char_import_1": "Chub 角色(直链或ID)", | 1654 | "char_import_1": "Chub 角色(直链或ID)", |
| 1390 | "char_import_example": "例子:", | 1655 | "char_import_example": "例子:", |
| 1391 | "char_import_2": "Chub Lorebook(直链或ID)", | 1656 | "char_import_2": "Chub 知识书(直链或ID)", |
| 1392 | "char_import_3": "JanitorAI 角色(直链或UUID)", | 1657 | "char_import_3": "JanitorAI 角色(直链或UUID)", |
| 1393 | "char_import_4": "Pygmalion.chat 角色(直链或UUID)", | 1658 | "char_import_4": "Pygmalion.chat 角色(直链或UUID)", |
| 1394 | "char_import_5": "AICharacterCard.com 角色(直链或ID)", | 1659 | "char_import_5": "AICharacterCard.com 角色(直链或ID)", |
| @@ -1397,10 +1662,93 @@ | |||
| 1397 | "char_import_8": "RisuRealm 角色(直链)", | 1662 | "char_import_8": "RisuRealm 角色(直链)", |
| 1398 | "Supports importing multiple characters.": "支持导入多个角色。", | 1663 | "Supports importing multiple characters.": "支持导入多个角色。", |
| 1399 | "Write each URL or ID into a new line.": "将每个 URL 或 ID 写入新行。", | 1664 | "Write each URL or ID into a new line.": "将每个 URL 或 ID 写入新行。", |
| 1665 | "System-wide Replacement Macros (in order of evaluation):": "系统范围的替换宏(按评估顺序):", | ||
| 1666 | "help_macros_1": "仅适用于斜线命令批处理。替换为上一个命令的返回结果。", | ||
| 1667 | "help_macros_2": "仅插入一个换行符。", | ||
| 1668 | "help_macros_3": "修剪此宏周围的换行符。", | ||
| 1669 | "help_macros_4": "没有操作,只是一个空字符串。", | ||
| 1670 | "help_macros_5": "API 设置中定义的全局提示。仅在高级定义提示覆盖中有效。", | ||
| 1671 | "help_macros_6": "用户输入", | ||
| 1672 | "help_macros_7": "角色的主提示覆盖", | ||
| 1673 | "help_macros_8": "角色越狱提示覆盖", | ||
| 1674 | "help_macros_9": "角色描述", | ||
| 1675 | "help_macros_10": "人物性格", | ||
| 1676 | "help_macros_11": "角色场景", | ||
| 1677 | "help_macros_12": "您当前的角色描述", | ||
| 1678 | "help_macros_13": "角色对话示例", | ||
| 1679 | "help_macros_14": "未格式化的对话示例", | ||
| 1680 | "(only for Story String)": "(仅适用于故事字符串)", | ||
| 1681 | "help_macros_15": "您当前的 Persona 用户名", | ||
| 1682 | "help_macros_16": "角色的名字", | ||
| 1683 | "help_macros_17": "角色的版本号", | ||
| 1684 | "help_macros_18": "以逗号分隔的群组成员名称列表或单人聊天中的角色名称。别名:{{charIfNotGroup}}", | ||
| 1685 | "help_macros_19": "当前选定的 API 的文本生成模型名称。", | ||
| 1686 | "Can be inaccurate!": "可能不准确!", | ||
| 1687 | "help_macros_20": "最新聊天消息的文本。", | ||
| 1688 | "help_macros_lastUser": "最后的用户聊天消息文本。", | ||
| 1689 | "help_macros_lastChar": "最后的角色聊天消息文本。", | ||
| 1690 | "help_macros_21": "最新聊天消息的索引号。对于斜线命令批处理很有用。", | ||
| 1691 | "help_macros_22": "上下文中包含的第一条消息的 ID。要求在当前会话中至少运行一次生成。", | ||
| 1692 | "help_macros_23": "最后一条聊天消息中当前滑动的 ID(以 1 为基数)。如果最后一条消息是用户或提示隐藏的,则为空字符串。", | ||
| 1693 | "help_macros_24": "最后一条聊天消息中的滑动次数。如果最后一条消息是用户隐藏或提示隐藏的,则为空字符串。", | ||
| 1694 | "help_macros_25": "您可以在此处留言,宏将被替换为空白内容。AI 看不到。", | ||
| 1695 | "help_macros_26": "当前时间", | ||
| 1696 | "help_macros_27": "当前日期", | ||
| 1697 | "help_macros_28": "当前工作日", | ||
| 1698 | "help_macros_29": "当前 ISO 时间(24 小时制)", | ||
| 1699 | "help_macros_30": "当前 ISO 日期 (YYYY-MM-DD)", | ||
| 1700 | "help_macros_31": "指定格式的当前日期/时间,例如德国日期/时间:", | ||
| 1701 | "help_macros_32": "指定 UTC 时区偏移量的当前时间,例如 UTC-4 或 UTC+2", | ||
| 1702 | "help_macros_33": "time1 和 time2 之间的时间差。接受时间和日期宏。(例如:{{timeDiff::{{isodate}} {{time}}::2024/5/11 12:30:00}})", | ||
| 1703 | "help_macros_34": "距离上次用户消息发送的时间", | ||
| 1704 | "help_macros_35": "为 AI 设置行为偏差,直到下一个用户输入。文本周围的引号很重要。", | ||
| 1705 | "help_macros_36": "掷骰子。(例如:", | ||
| 1706 | "space_ will roll a 6-sided dice and return a number between 1 and 6)": "将掷一个 6 面骰子并返回 1 到 6 之间的数字)", | ||
| 1707 | "help_macros_37": "从列表中返回一个随机项目。(例如:", | ||
| 1708 | "space_ will return 1 of the 4 numbers at random. Works with text lists too.": "将随机返回 4 个数字中的 1 个。也适用于文本列表。", | ||
| 1709 | "help_macros_38": "随机的替代语法允许在列表项中使用逗号。", | ||
| 1710 | "help_macros_39": "从列表中随机挑选一项。工作原理与 {{random}} 相同,具有相同的语法选项,但一旦挑选,挑选将一直持续到本次聊天,不会在连续消息和提示处理中重新滚动。", | ||
| 1711 | "help_macros_40": "如果使用文本生成 WebUI 后端,则动态地将引号中的文本添加到禁用单词序列中。对其他后端不执行任何操作。可以在任何地方使用(角色描述、WI、AN 等)。文本周围的引号很重要。", | ||
| 1712 | "Instruct Mode and Context Template Macros:": "指导模式和上下文模板宏:", | ||
| 1713 | "(enabled in the Advanced Formatting settings)": "(在高级格式设置中启用)", | ||
| 1714 | "help_macros_41": "令牌中允许的最大提示长度 = (上下文大小 - 响应长度)", | ||
| 1715 | "help_macros_42": "上下文模板示例对话分隔符", | ||
| 1716 | "help_macros_43": "上下文模板聊天开始行", | ||
| 1717 | "help_macros_44": "主系统提示(如果选择,则覆盖字符提示,或 instructSystemPrompt)", | ||
| 1718 | "help_macros_45": "指示系统提示", | ||
| 1719 | "help_macros_46": "指示系统提示前缀序列", | ||
| 1720 | "help_macros_47": "指示系统提示后缀序列", | ||
| 1721 | "help_macros_48": "指示用户前缀序列", | ||
| 1722 | "help_macros_49": "指示用户后缀序列", | ||
| 1723 | "help_macros_50": "指导助理前缀序列", | ||
| 1724 | "help_macros_51": "指导助理后缀序列", | ||
| 1725 | "help_macros_52": "指导助理第一个输出序列", | ||
| 1726 | "help_macros_53": "指导助手最后输出序列", | ||
| 1727 | "help_macros_54": "指示系统消息前缀序列", | ||
| 1728 | "help_macros_55": "指示系统消息后缀序列", | ||
| 1729 | "help_macros_56": "指示系统指令前缀", | ||
| 1730 | "help_macros_57": "指示第一个用户消息填充器", | ||
| 1731 | "help_macros_58": "指示停止顺序", | ||
| 1732 | "Chat variables Macros:": "聊天变量宏:", | ||
| 1733 | "Local variables = unique to the current chat": "局部变量 = 当前聊天所独有", | ||
| 1734 | "Global variables = works in any chat for any character": "全局变量 = 适用于任何角色的任何聊天", | ||
| 1735 | "Scoped variables = works in STscript": "范围变量 = 在 STscript 中有效", | ||
| 1736 | "help_macros_59": "替换为局部变量“name”的值", | ||
| 1737 | "help_macros_60": "替换为空字符串,将局部变量“name”设置为“value”", | ||
| 1738 | "help_macros_61": "替换为空字符串,将“increment”的数值添加到局部变量“name”", | ||
| 1739 | "help_macros_62": "替换为变量“name”的值增加 1 的结果", | ||
| 1740 | "help_macros_63": "替换为变量“name”的值减 1 的结果", | ||
| 1741 | "help_macros_64": "替换为全局变量“name”的值", | ||
| 1742 | "help_macros_65": "替换为空字符串,将全局变量“name”设置为“value”", | ||
| 1743 | "help_macros_66": "替换为空字符串,将“increment”的数值添加到全局变量“name”", | ||
| 1744 | "help_macros_67": "替换为全局变量“name”的值增加 1 的结果", | ||
| 1745 | "help_macros_68": "替换为全局变量“name”的值减 1 的结果", | ||
| 1746 | "help_macros_69": "替换为范围变量“name”的值", | ||
| 1747 | "help_macros_70": "用范围变量“name”的索引处的项目值(对于数组/列表或对象/字典)替换", | ||
| 1400 | "Export for character": "导出角色", | 1748 | "Export for character": "导出角色", |
| 1401 | "Export prompts for this character, including their order.": "导出此角色的提示,包括其顺序。", | 1749 | "Export prompts for this character, including their order.": "导出此角色的提示词,包括其顺序。", |
| 1402 | "Export all": "全部导出", | 1750 | "Export all": "全部导出", |
| 1403 | "Export all your prompts to a file": "将所有提示导出到文件", | 1751 | "Export all your prompts to a file": "将所有提示词导出到文件", |
| 1404 | "Insert prompt": "插入提示词", | 1752 | "Insert prompt": "插入提示词", |
| 1405 | "Delete prompt": "删除提示词", | 1753 | "Delete prompt": "删除提示词", |
| 1406 | "Import a prompt list": "导入提示词列表", | 1754 | "Import a prompt list": "导入提示词列表", |
| @@ -1439,16 +1787,15 @@ | |||
| 1439 | "Reset Code:": "重置代码:", | 1787 | "Reset Code:": "重置代码:", |
| 1440 | "Want to update?": "获取最新版本", | 1788 | "Want to update?": "获取最新版本", |
| 1441 | "How to start chatting?": "如何快速开始聊天?", | 1789 | "How to start chatting?": "如何快速开始聊天?", |
| 1442 | "Click ": "点击", | 1790 | "Click _space": "点击", |
| 1443 | "and select a": "并选择一个", | 1791 | "and select a": "并选择一个", |
| 1444 | "Chat API": "聊天API", | 1792 | "Chat API": "聊天API", |
| 1445 | "and pick a character.": "并选择一个角色。", | 1793 | "and pick a character.": "并选择一个角色。", |
| 1446 | "You can browse a list of bundled characters in the": "您可以在", | 1794 | "You can browse a list of bundled characters in the": "您可以在", |
| 1447 | "Download Extensions & Assets": "下载扩展和资源菜单", | 1795 | "menu within": "中浏览角色包列表", |
| 1448 | "menu within": "中浏览已捆绑的角色列表", | ||
| 1449 | "Confused or lost?": "获取更多帮助?", | 1796 | "Confused or lost?": "获取更多帮助?", |
| 1450 | "click these icons!": "点击这些图标!", | 1797 | "click these icons!": "点击这些图标!", |
| 1451 | "in the chat bar": "在聊天框中", | 1798 | "in the chat bar": "到聊天框里", |
| 1452 | "SillyTavern Documentation Site": "SillyTavern帮助文档", | 1799 | "SillyTavern Documentation Site": "SillyTavern帮助文档", |
| 1453 | "Extras Installation Guide": "扩展安装指南", | 1800 | "Extras Installation Guide": "扩展安装指南", |
| 1454 | "Still have questions?": "仍有疑问?", | 1801 | "Still have questions?": "仍有疑问?", |
| @@ -854,7 +854,7 @@ | |||
| 854 | "Join character cards (include muted)": "加入角色人物卡(包括靜音)", | 854 | "Join character cards (include muted)": "加入角色人物卡(包括靜音)", |
| 855 | "Inserted before each part of the joined fields.": "插入在合併欄位的每一部分之前。", | 855 | "Inserted before each part of the joined fields.": "插入在合併欄位的每一部分之前。", |
| 856 | "Join Prefix": "加入前綴", | 856 | "Join Prefix": "加入前綴", |
| 857 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.\rThis means that in the story string for example all character descriptions will be joined to one big text.\rIf you want those fields to be separated, you can define a prefix or suffix here.\r\rThis value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "當選擇“加入角色卡”時,角色的所有對應欄位將連接在一起。\r這意味著,例如在故事字串中,所有角色描述都將連接到一個大文字中。\r如果您希望分隔這些字段,可以在此處定義前綴或後綴。\r\r該值支援普通宏,並且還將 {{char}} 替換為相關字元的名稱,並將 <FIELDNAME> 替換為部分的名稱(例如:描述、個性、場景等)", | 857 | "When 'Join character cards' is selected, all respective fields of the characters are being joined together.This means that in the story string for example all character descriptions will be joined to one big text.If you want those fields to be separated, you can define a prefix or suffix here.This value supports normal macros and will also replace {{char}} with the relevant char's name and <FIELDNAME> with the name of the part (e.g.: description, personality, scenario, etc.)": "當選擇“加入角色卡”時,角色的所有對應欄位將連接在一起。\r這意味著,例如在故事字串中,所有角色描述都將連接到一個大文字中。\r如果您希望分隔這些字段,可以在此處定義前綴或後綴。\r\r該值支援普通宏,並且還將 {{char}} 替換為相關字元的名稱,並將 <FIELDNAME> 替換為部分的名稱(例如:描述、個性、場景等)", |
| 858 | "Inserted after each part of the joined fields.": "插入在合併欄位的每一部分之後。", | 858 | "Inserted after each part of the joined fields.": "插入在合併欄位的每一部分之後。", |
| 859 | "Join Suffix": "加入後綴", | 859 | "Join Suffix": "加入後綴", |
| 860 | "Set a group chat scenario": "設定群組聊天情境", | 860 | "Set a group chat scenario": "設定群組聊天情境", |
| @@ -886,11 +886,11 @@ | |||
| 886 | "Bulk_edit_characters": "批量編輯角色人物\n\n點選以切換角色人物\nShift + 點選以選擇/取消選擇一範圍的角色人物\n右鍵以查看動作", | 886 | "Bulk_edit_characters": "批量編輯角色人物\n\n點選以切換角色人物\nShift + 點選以選擇/取消選擇一範圍的角色人物\n右鍵以查看動作", |
| 887 | "Bulk select all characters": "全選所有角色人物", | 887 | "Bulk select all characters": "全選所有角色人物", |
| 888 | "Bulk delete characters": "批量刪除角色人物", | 888 | "Bulk delete characters": "批量刪除角色人物", |
| 889 | "popup_text_save": "儲存", | 889 | "popup-button-save": "儲存", |
| 890 | "popup_text_yes": "是", | 890 | "popup-button-yes": "是", |
| 891 | "popup_text_no": "否", | 891 | "popup-button-no": "否", |
| 892 | "popup_text_cancel": "取消", | 892 | "popup-button-cancel": "取消", |
| 893 | "popup_text_import": "匯入", | 893 | "popup-button-import": "匯入", |
| 894 | "Advanced Defininitions": "- 進階定義", | 894 | "Advanced Defininitions": "- 進階定義", |
| 895 | "Prompt Overrides": "提示詞覆寫", | 895 | "Prompt Overrides": "提示詞覆寫", |
| 896 | "(For Chat Completion and Instruct Mode)": "(用於聊天補充和指令模式)", | 896 | "(For Chat Completion and Instruct Mode)": "(用於聊天補充和指令模式)", |
| @@ -1007,8 +1007,8 @@ | |||
| 1007 | "Character Exclusion": "角色人物排除", | 1007 | "Character Exclusion": "角色人物排除", |
| 1008 | "-- Characters not found --": "-- 未找到角色人物 --", | 1008 | "-- Characters not found --": "-- 未找到角色人物 --", |
| 1009 | "Inclusion Group": "包含的群組", | 1009 | "Inclusion Group": "包含的群組", |
| 1010 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.\r\rDocumentation: World Info - Inclusion Group": "如果觸發多個條目,包含群組可確保一次僅啟動一組中的一個條目。\r支援多個以逗號分隔的群組。\r\r文件:世界資訊 - 包容性集團", | 1010 | "Inclusion Groups ensure only one entry from a group is activated at a time, if multiple are triggered.Documentation: World Info - Inclusion Group": "如果觸發多個條目,包含群組可確保一次僅啟動一組中的一個條目。\r支援多個以逗號分隔的群組。\r\r文件:世界資訊 - 包容性集團", |
| 1011 | "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如果有多個優先級,則選擇「順序」最高的一個。", | 1011 | "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.": "優先考慮此條目:選取後,此條目將在所有選擇中優先。\r如果有多個優先級,則選擇「順序」最高的一個。", |
| 1012 | "Only one entry with the same label will be activated": "僅會啟用具有相同標籤的一個條目", | 1012 | "Only one entry with the same label will be activated": "僅會啟用具有相同標籤的一個條目", |
| 1013 | "A relative likelihood of entry activation within the group": "群組內條目啟用的相對可能性", | 1013 | "A relative likelihood of entry activation within the group": "群組內條目啟用的相對可能性", |
| 1014 | "Group Weight": "群組權重", | 1014 | "Group Weight": "群組權重", |
| @@ -1439,7 +1439,7 @@ | |||
| 1439 | "Reset Code:": "重設驗證碼:", | 1439 | "Reset Code:": "重設驗證碼:", |
| 1440 | "Want to update?": "想要更新嗎?", | 1440 | "Want to update?": "想要更新嗎?", |
| 1441 | "How to start chatting?": "如何開始聊天?", | 1441 | "How to start chatting?": "如何開始聊天?", |
| 1442 | "Click ": "點選", | 1442 | "Click _space": "點選", |
| 1443 | "and select a": "並選擇一個", | 1443 | "and select a": "並選擇一個", |
| 1444 | "Chat API": "聊天 API", | 1444 | "Chat API": "聊天 API", |
| 1445 | "and pick a character.": "並選擇一個角色人物。", | 1445 | "and pick a character.": "並選擇一個角色人物。", |
| @@ -26,6 +26,7 @@ | |||
| 26 | <link rel="stylesheet" type="text/css" href="css/login.css"> | 26 | <link rel="stylesheet" type="text/css" href="css/login.css"> |
| 27 | <link rel="manifest" crossorigin="use-credentials" href="manifest.json"> | 27 | <link rel="manifest" crossorigin="use-credentials" href="manifest.json"> |
| 28 | <link href="webfonts/NotoSans/stylesheet.css" rel="stylesheet"> | 28 | <link href="webfonts/NotoSans/stylesheet.css" rel="stylesheet"> |
| 29 | <link href="webfonts/NotoSansMono/stylesheet.css" rel="stylesheet"> | ||
| 29 | <!-- fontawesome webfonts--> | 30 | <!-- fontawesome webfonts--> |
| 30 | <link href="css/fontawesome.min.css" rel="stylesheet"> | 31 | <link href="css/fontawesome.min.css" rel="stylesheet"> |
| 31 | <link href="css/solid.min.css" rel="stylesheet"> | 32 | <link href="css/solid.min.css" rel="stylesheet"> |
| @@ -22,7 +22,7 @@ import { | |||
| 22 | parseTabbyLogprobs, | 22 | parseTabbyLogprobs, |
| 23 | } from './scripts/textgen-settings.js'; | 23 | } from './scripts/textgen-settings.js'; |
| 24 | 24 | ||
| 25 | const { MANCER, TOGETHERAI, OOBA, VLLM, APHRODITE, TABBY, OLLAMA, INFERMATICAI, DREAMGEN, OPENROUTER } = textgen_types; | 25 | const { MANCER, TOGETHERAI, OOBA, VLLM, APHRODITE, TABBY, OLLAMA, INFERMATICAI, DREAMGEN, OPENROUTER, FEATHERLESS } = textgen_types; |
| 26 | 26 | ||
| 27 | import { | 27 | import { |
| 28 | world_info, | 28 | world_info, |
| @@ -154,12 +154,12 @@ import { | |||
| 154 | isValidUrl, | 154 | isValidUrl, |
| 155 | ensureImageFormatSupported, | 155 | ensureImageFormatSupported, |
| 156 | flashHighlight, | 156 | flashHighlight, |
| 157 | checkOverwriteExistingData, | 157 | isTrueBoolean, |
| 158 | } from './scripts/utils.js'; | 158 | } from './scripts/utils.js'; |
| 159 | import { debounce_timeout } from './scripts/constants.js'; | 159 | import { debounce_timeout } from './scripts/constants.js'; |
| 160 | 160 | ||
| 161 | import { ModuleWorkerWrapper, doDailyExtensionUpdatesCheck, extension_settings, getContext, loadExtensionSettings, renderExtensionTemplate, renderExtensionTemplateAsync, runGenerationInterceptors, saveMetadataDebounced, writeExtensionField } from './scripts/extensions.js'; | 161 | import { ModuleWorkerWrapper, doDailyExtensionUpdatesCheck, extension_settings, getContext, loadExtensionSettings, renderExtensionTemplate, renderExtensionTemplateAsync, runGenerationInterceptors, saveMetadataDebounced, writeExtensionField } from './scripts/extensions.js'; |
| 162 | import { COMMENT_NAME_DEFAULT, executeSlashCommands, executeSlashCommandsOnChatInput, getSlashCommandsHelp, isExecutingCommandsFromChatInput, pauseScriptExecution, processChatSlashCommands, registerSlashCommand, stopScriptExecution } from './scripts/slash-commands.js'; | 162 | import { COMMENT_NAME_DEFAULT, executeSlashCommands, executeSlashCommandsOnChatInput, getSlashCommandsHelp, initDefaultSlashCommands, isExecutingCommandsFromChatInput, pauseScriptExecution, processChatSlashCommands, registerSlashCommand, stopScriptExecution } from './scripts/slash-commands.js'; |
| 163 | import { | 163 | import { |
| 164 | tag_map, | 164 | tag_map, |
| 165 | tags, | 165 | tags, |
| @@ -175,11 +175,12 @@ import { | |||
| 175 | createTagMapFromList, | 175 | createTagMapFromList, |
| 176 | renameTagKey, | 176 | renameTagKey, |
| 177 | importTags, | 177 | importTags, |
| 178 | tag_filter_types, | 178 | tag_filter_type, |
| 179 | compareTagsForSort, | 179 | compareTagsForSort, |
| 180 | initTags, | 180 | initTags, |
| 181 | applyTagsOnCharacterSelect, | 181 | applyTagsOnCharacterSelect, |
| 182 | applyTagsOnGroupSelect, | 182 | applyTagsOnGroupSelect, |
| 183 | tag_import_setting, | ||
| 183 | } from './scripts/tags.js'; | 184 | } from './scripts/tags.js'; |
| 184 | import { | 185 | import { |
| 185 | SECRET_KEYS, | 186 | SECRET_KEYS, |
| @@ -208,7 +209,7 @@ import { | |||
| 208 | instruct_presets, | 209 | instruct_presets, |
| 209 | selectContextPreset, | 210 | selectContextPreset, |
| 210 | } from './scripts/instruct-mode.js'; | 211 | } from './scripts/instruct-mode.js'; |
| 211 | import { initLocales } from './scripts/i18n.js'; | 212 | import { initLocales, t, translate } from './scripts/i18n.js'; |
| 212 | import { getFriendlyTokenizerName, getTokenCount, getTokenCountAsync, getTokenizerModel, initTokenizers, saveTokenCache } from './scripts/tokenizers.js'; | 213 | import { getFriendlyTokenizerName, getTokenCount, getTokenCountAsync, getTokenizerModel, initTokenizers, saveTokenCache } from './scripts/tokenizers.js'; |
| 213 | import { | 214 | import { |
| 214 | user_avatar, | 215 | user_avatar, |
| @@ -222,19 +223,24 @@ import { | |||
| 222 | import { getBackgrounds, initBackgrounds, loadBackgroundSettings, background_settings } from './scripts/backgrounds.js'; | 223 | import { getBackgrounds, initBackgrounds, loadBackgroundSettings, background_settings } from './scripts/backgrounds.js'; |
| 223 | import { hideLoader, showLoader } from './scripts/loader.js'; | 224 | import { hideLoader, showLoader } from './scripts/loader.js'; |
| 224 | import { BulkEditOverlay, CharacterContextMenu } from './scripts/BulkEditOverlay.js'; | 225 | import { BulkEditOverlay, CharacterContextMenu } from './scripts/BulkEditOverlay.js'; |
| 225 | import { loadMancerModels, loadOllamaModels, loadTogetherAIModels, loadInfermaticAIModels, loadOpenRouterModels, loadVllmModels, loadAphroditeModels, loadDreamGenModels } from './scripts/textgen-models.js'; | 226 | import { loadFeatherlessModels, loadMancerModels, loadOllamaModels, loadTogetherAIModels, loadInfermaticAIModels, loadOpenRouterModels, loadVllmModels, loadAphroditeModels, loadDreamGenModels } from './scripts/textgen-models.js'; |
| 226 | import { appendFileContent, hasPendingFileAttachment, populateFileAttachment, decodeStyleTags, encodeStyleTags, isExternalMediaAllowed, getCurrentEntityId } from './scripts/chats.js'; | 227 | import { appendFileContent, hasPendingFileAttachment, populateFileAttachment, decodeStyleTags, encodeStyleTags, isExternalMediaAllowed, getCurrentEntityId } from './scripts/chats.js'; |
| 227 | import { initPresetManager } from './scripts/preset-manager.js'; | 228 | import { initPresetManager } from './scripts/preset-manager.js'; |
| 228 | import { evaluateMacros } from './scripts/macros.js'; | 229 | import { MacrosParser, evaluateMacros } from './scripts/macros.js'; |
| 229 | import { currentUser, setUserControls } from './scripts/user.js'; | 230 | import { currentUser, setUserControls } from './scripts/user.js'; |
| 230 | import { POPUP_TYPE, callGenericPopup } from './scripts/popup.js'; | 231 | import { POPUP_RESULT, POPUP_TYPE, Popup, callGenericPopup, fixToastrForDialogs } from './scripts/popup.js'; |
| 231 | import { renderTemplate, renderTemplateAsync } from './scripts/templates.js'; | 232 | import { renderTemplate, renderTemplateAsync } from './scripts/templates.js'; |
| 232 | import { ScraperManager } from './scripts/scrapers.js'; | 233 | import { ScraperManager } from './scripts/scrapers.js'; |
| 233 | import { SlashCommandParser } from './scripts/slash-commands/SlashCommandParser.js'; | 234 | import { SlashCommandParser } from './scripts/slash-commands/SlashCommandParser.js'; |
| 234 | import { SlashCommand } from './scripts/slash-commands/SlashCommand.js'; | 235 | import { SlashCommand } from './scripts/slash-commands/SlashCommand.js'; |
| 235 | import { ARGUMENT_TYPE, SlashCommandArgument } from './scripts/slash-commands/SlashCommandArgument.js'; | 236 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from './scripts/slash-commands/SlashCommandArgument.js'; |
| 236 | import { SlashCommandBrowser } from './scripts/slash-commands/SlashCommandBrowser.js'; | 237 | import { SlashCommandBrowser } from './scripts/slash-commands/SlashCommandBrowser.js'; |
| 237 | import { initCustomSelectedSamplers, validateDisabledSamplers } from './scripts/samplerSelect.js'; | 238 | import { initCustomSelectedSamplers, validateDisabledSamplers } from './scripts/samplerSelect.js'; |
| 239 | import { DragAndDropHandler } from './scripts/dragdrop.js'; | ||
| 240 | import { INTERACTABLE_CONTROL_CLASS, initKeyboard } from './scripts/keyboard.js'; | ||
| 241 | import { initDynamicStyles } from './scripts/dynamic-styles.js'; | ||
| 242 | import { SlashCommandEnumValue, enumTypes } from './scripts/slash-commands/SlashCommandEnumValue.js'; | ||
| 243 | import { enumIcons } from './scripts/slash-commands/SlashCommandCommonEnumsProvider.js'; | ||
| 238 | 244 | ||
| 239 | //exporting functions and vars for mods | 245 | //exporting functions and vars for mods |
| 240 | export { | 246 | export { |
| @@ -263,6 +269,19 @@ showLoader(); | |||
| 263 | // Yoink preloader entirely; it only exists to cover up unstyled content while loading JS | 269 | // Yoink preloader entirely; it only exists to cover up unstyled content while loading JS |
| 264 | document.getElementById('preloader').remove(); | 270 | document.getElementById('preloader').remove(); |
| 265 | 271 | ||
| 272 | // Configure toast library: | ||
| 273 | toastr.options.escapeHtml = true; // Prevent raw HTML inserts | ||
| 274 | toastr.options.timeOut = 4000; // How long the toast will display without user interaction | ||
| 275 | toastr.options.extendedTimeOut = 10000; // How long the toast will display after a user hovers over it | ||
| 276 | toastr.options.progressBar = true; // Visually indicate how long before a toast expires. | ||
| 277 | toastr.options.closeButton = true; // enable a close button | ||
| 278 | toastr.options.positionClass = 'toast-top-center'; // Where to position the toast container | ||
| 279 | toastr.options.onHidden = () => { | ||
| 280 | // If we have any dialog still open, the last "hidden" toastr will remove the toastr-container. We need to keep it alive inside the dialog though | ||
| 281 | // so the toasts still show up inside there. | ||
| 282 | fixToastrForDialogs(); | ||
| 283 | }; | ||
| 284 | |||
| 266 | // Allow target="_blank" in links | 285 | // Allow target="_blank" in links |
| 267 | DOMPurify.addHook('afterSanitizeAttributes', function (node) { | 286 | DOMPurify.addHook('afterSanitizeAttributes', function (node) { |
| 268 | if ('target' in node) { | 287 | if ('target' in node) { |
| @@ -389,6 +408,7 @@ export const event_types = { | |||
| 389 | MESSAGE_EDITED: 'message_edited', | 408 | MESSAGE_EDITED: 'message_edited', |
| 390 | MESSAGE_DELETED: 'message_deleted', | 409 | MESSAGE_DELETED: 'message_deleted', |
| 391 | MESSAGE_UPDATED: 'message_updated', | 410 | MESSAGE_UPDATED: 'message_updated', |
| 411 | MESSAGE_FILE_EMBEDDED: 'message_file_embedded', | ||
| 392 | IMPERSONATE_READY: 'impersonate_ready', | 412 | IMPERSONATE_READY: 'impersonate_ready', |
| 393 | CHAT_CHANGED: 'chat_id_changed', | 413 | CHAT_CHANGED: 'chat_id_changed', |
| 394 | GENERATION_STARTED: 'generation_started', | 414 | GENERATION_STARTED: 'generation_started', |
| @@ -415,7 +435,9 @@ export const event_types = { | |||
| 415 | CHARACTER_MESSAGE_RENDERED: 'character_message_rendered', | 435 | CHARACTER_MESSAGE_RENDERED: 'character_message_rendered', |
| 416 | FORCE_SET_BACKGROUND: 'force_set_background', | 436 | FORCE_SET_BACKGROUND: 'force_set_background', |
| 417 | CHAT_DELETED: 'chat_deleted', | 437 | CHAT_DELETED: 'chat_deleted', |
| 438 | CHAT_CREATED: 'chat_created', | ||
| 418 | GROUP_CHAT_DELETED: 'group_chat_deleted', | 439 | GROUP_CHAT_DELETED: 'group_chat_deleted', |
| 440 | GROUP_CHAT_CREATED: 'group_chat_created', | ||
| 419 | GENERATE_BEFORE_COMBINE_PROMPTS: 'generate_before_combine_prompts', | 441 | GENERATE_BEFORE_COMBINE_PROMPTS: 'generate_before_combine_prompts', |
| 420 | GENERATE_AFTER_COMBINE_PROMPTS: 'generate_after_combine_prompts', | 442 | GENERATE_AFTER_COMBINE_PROMPTS: 'generate_after_combine_prompts', |
| 421 | GROUP_MEMBER_DRAFTED: 'group_member_drafted', | 443 | GROUP_MEMBER_DRAFTED: 'group_member_drafted', |
| @@ -433,6 +455,7 @@ export const event_types = { | |||
| 433 | OPEN_CHARACTER_LIBRARY: 'open_character_library', | 455 | OPEN_CHARACTER_LIBRARY: 'open_character_library', |
| 434 | LLM_FUNCTION_TOOL_REGISTER: 'llm_function_tool_register', | 456 | LLM_FUNCTION_TOOL_REGISTER: 'llm_function_tool_register', |
| 435 | LLM_FUNCTION_TOOL_CALL: 'llm_function_tool_call', | 457 | LLM_FUNCTION_TOOL_CALL: 'llm_function_tool_call', |
| 458 | ONLINE_STATUS_CHANGED: 'online_status_changed', | ||
| 436 | }; | 459 | }; |
| 437 | 460 | ||
| 438 | export const eventSource = new EventEmitter(); | 461 | export const eventSource = new EventEmitter(); |
| @@ -492,9 +515,6 @@ let optionsPopper = Popper.createPopper(document.getElementById('options_button' | |||
| 492 | let exportPopper = Popper.createPopper(document.getElementById('export_button'), document.getElementById('export_format_popup'), { | 515 | let exportPopper = Popper.createPopper(document.getElementById('export_button'), document.getElementById('export_format_popup'), { |
| 493 | placement: 'left', | 516 | placement: 'left', |
| 494 | }); | 517 | }); |
| 495 | let rawPromptPopper = Popper.createPopper(document.getElementById('dialogue_popup'), document.getElementById('rawPromptPopup'), { | ||
| 496 | placement: 'right', | ||
| 497 | }); | ||
| 498 | 518 | ||
| 499 | // Saved here for performance reasons | 519 | // Saved here for performance reasons |
| 500 | const messageTemplate = $('#message_template .mes'); | 520 | const messageTemplate = $('#message_template .mes'); |
| @@ -504,16 +524,20 @@ let dialogueResolve = null; | |||
| 504 | let dialogueCloseStop = false; | 524 | let dialogueCloseStop = false; |
| 505 | export let chat_metadata = {}; | 525 | export let chat_metadata = {}; |
| 506 | export let streamingProcessor = null; | 526 | export let streamingProcessor = null; |
| 507 | export let crop_data = undefined; | 527 | let crop_data = undefined; |
| 508 | let is_delete_mode = false; | 528 | let is_delete_mode = false; |
| 509 | let fav_ch_checked = false; | 529 | let fav_ch_checked = false; |
| 510 | let scrollLock = false; | 530 | let scrollLock = false; |
| 511 | export let abortStatusCheck = new AbortController(); | 531 | export let abortStatusCheck = new AbortController(); |
| 532 | let charDragDropHandler = null; | ||
| 512 | 533 | ||
| 513 | /** @type {number} The debounce timeout used for chat/settings save. debounce_timeout.long: 1.000 ms */ | 534 | /** @type {debounce_timeout} The debounce timeout used for chat/settings save. debounce_timeout.long: 1.000 ms */ |
| 514 | const durationSaveEdit = debounce_timeout.relaxed; | 535 | export const DEFAULT_SAVE_EDIT_TIMEOUT = debounce_timeout.relaxed; |
| 515 | export const saveSettingsDebounced = debounce(() => saveSettings(), durationSaveEdit); | 536 | /** @type {debounce_timeout} The debounce timeout used for printing. debounce_timeout.quick: 100 ms */ |
| 516 | export const saveCharacterDebounced = debounce(() => $('#create_button').trigger('click'), durationSaveEdit); | 537 | export const DEFAULT_PRINT_TIMEOUT = debounce_timeout.quick; |
| 538 | |||
| 539 | export const saveSettingsDebounced = debounce(() => saveSettings(), DEFAULT_SAVE_EDIT_TIMEOUT); | ||
| 540 | export const saveCharacterDebounced = debounce(() => $('#create_button').trigger('click'), DEFAULT_SAVE_EDIT_TIMEOUT); | ||
| 517 | 541 | ||
| 518 | /** | 542 | /** |
| 519 | * Prints the character list in a debounced fashion without blocking, with a delay of 100 milliseconds. | 543 | * Prints the character list in a debounced fashion without blocking, with a delay of 100 milliseconds. |
| @@ -521,7 +545,7 @@ export const saveCharacterDebounced = debounce(() => $('#create_button').trigger | |||
| 521 | * | 545 | * |
| 522 | * The printing will also always reprint all filter options of the global list, to keep them up to date. | 546 | * The printing will also always reprint all filter options of the global list, to keep them up to date. |
| 523 | */ | 547 | */ |
| 524 | export const printCharactersDebounced = debounce(() => { printCharacters(false); }, debounce_timeout.quick); | 548 | export const printCharactersDebounced = debounce(() => { printCharacters(false); }, DEFAULT_PRINT_TIMEOUT); |
| 525 | 549 | ||
| 526 | /** | 550 | /** |
| 527 | * @enum {string} System message types | 551 | * @enum {string} System message types |
| @@ -744,8 +768,19 @@ const per_page_default = 50; | |||
| 744 | 768 | ||
| 745 | var is_advanced_char_open = false; | 769 | var is_advanced_char_open = false; |
| 746 | 770 | ||
| 747 | export let menu_type = ''; //what is selected in the menu | 771 | /** |
| 772 | * The type of the right menu | ||
| 773 | * @typedef {'characters' | 'character_edit' | 'create' | 'group_edit' | 'group_create' | '' } MenuType | ||
| 774 | */ | ||
| 775 | |||
| 776 | /** | ||
| 777 | * The type of the right menu that is currently open | ||
| 778 | * @type {MenuType} | ||
| 779 | */ | ||
| 780 | export let menu_type = ''; | ||
| 781 | |||
| 748 | export let selected_button = ''; //which button pressed | 782 | export let selected_button = ''; //which button pressed |
| 783 | |||
| 749 | //create pole save | 784 | //create pole save |
| 750 | let create_save = { | 785 | let create_save = { |
| 751 | name: '', | 786 | name: '', |
| @@ -874,7 +909,10 @@ async function firstLoadInit() { | |||
| 874 | await getSystemMessages(); | 909 | await getSystemMessages(); |
| 875 | sendSystemMessage(system_message_types.WELCOME); | 910 | sendSystemMessage(system_message_types.WELCOME); |
| 876 | await getSettings(); | 911 | await getSettings(); |
| 912 | initKeyboard(); | ||
| 913 | initDynamicStyles(); | ||
| 877 | initTags(); | 914 | initTags(); |
| 915 | initDefaultSlashCommands(); | ||
| 878 | await getUserAvatars(true, user_avatar); | 916 | await getUserAvatars(true, user_avatar); |
| 879 | await getCharacters(); | 917 | await getCharacters(); |
| 880 | await getBackgrounds(); | 918 | await getBackgrounds(); |
| @@ -901,7 +939,7 @@ function cancelStatusCheck() { | |||
| 901 | export function displayOnlineStatus() { | 939 | export function displayOnlineStatus() { |
| 902 | if (online_status == 'no_connection') { | 940 | if (online_status == 'no_connection') { |
| 903 | $('.online_status_indicator').removeClass('success'); | 941 | $('.online_status_indicator').removeClass('success'); |
| 904 | $('.online_status_text').text('No connection...'); | 942 | $('.online_status_text').text($('#API-status-top').attr('no_connection_text')); |
| 905 | } else { | 943 | } else { |
| 906 | $('.online_status_indicator').addClass('success'); | 944 | $('.online_status_indicator').addClass('success'); |
| 907 | $('.online_status_text').text(online_status); | 945 | $('.online_status_text').text(online_status); |
| @@ -914,6 +952,8 @@ export function displayOnlineStatus() { | |||
| 914 | */ | 952 | */ |
| 915 | export function setAnimationDuration(ms = null) { | 953 | export function setAnimationDuration(ms = null) { |
| 916 | animation_duration = ms ?? ANIMATION_DURATION_DEFAULT; | 954 | animation_duration = ms ?? ANIMATION_DURATION_DEFAULT; |
| 955 | // Set CSS variable to document | ||
| 956 | document.documentElement.style.setProperty('--animation-duration', `${animation_duration}ms`); | ||
| 917 | } | 957 | } |
| 918 | 958 | ||
| 919 | export function setActiveCharacter(entityOrKey) { | 959 | export function setActiveCharacter(entityOrKey) { |
| @@ -1013,10 +1053,10 @@ export async function clearItemizedPrompts() { | |||
| 1013 | async function getStatusHorde() { | 1053 | async function getStatusHorde() { |
| 1014 | try { | 1054 | try { |
| 1015 | const hordeStatus = await checkHordeStatus(); | 1055 | const hordeStatus = await checkHordeStatus(); |
| 1016 | online_status = hordeStatus ? 'Connected' : 'no_connection'; | 1056 | setOnlineStatus(hordeStatus ? 'Connected' : 'no_connection'); |
| 1017 | } | 1057 | } |
| 1018 | catch { | 1058 | catch { |
| 1019 | online_status = 'no_connection'; | 1059 | setOnlineStatus('no_connection'); |
| 1020 | } | 1060 | } |
| 1021 | 1061 | ||
| 1022 | return resultCheckStatus(); | 1062 | return resultCheckStatus(); |
| @@ -1027,7 +1067,7 @@ async function getStatusKobold() { | |||
| 1027 | 1067 | ||
| 1028 | if (!endpoint) { | 1068 | if (!endpoint) { |
| 1029 | console.warn('No endpoint for status check'); | 1069 | console.warn('No endpoint for status check'); |
| 1030 | online_status = 'no_connection'; | 1070 | setOnlineStatus('no_connection'); |
| 1031 | return resultCheckStatus(); | 1071 | return resultCheckStatus(); |
| 1032 | } | 1072 | } |
| 1033 | 1073 | ||
| @@ -1044,7 +1084,7 @@ async function getStatusKobold() { | |||
| 1044 | 1084 | ||
| 1045 | const data = await response.json(); | 1085 | const data = await response.json(); |
| 1046 | 1086 | ||
| 1047 | online_status = data?.model ?? 'no_connection'; | 1087 | setOnlineStatus(data?.model ?? 'no_connection'); |
| 1048 | 1088 | ||
| 1049 | if (!data.koboldUnitedVersion) { | 1089 | if (!data.koboldUnitedVersion) { |
| 1050 | throw new Error('Missing mandatory Kobold version in data:', data); | 1090 | throw new Error('Missing mandatory Kobold version in data:', data); |
| @@ -1062,7 +1102,7 @@ async function getStatusKobold() { | |||
| 1062 | } | 1102 | } |
| 1063 | } catch (err) { | 1103 | } catch (err) { |
| 1064 | console.error('Error getting status', err); | 1104 | console.error('Error getting status', err); |
| 1065 | online_status = 'no_connection'; | 1105 | setOnlineStatus('no_connection'); |
| 1066 | } | 1106 | } |
| 1067 | 1107 | ||
| 1068 | return resultCheckStatus(); | 1108 | return resultCheckStatus(); |
| @@ -1075,12 +1115,12 @@ async function getStatusTextgen() { | |||
| 1075 | 1115 | ||
| 1076 | if (!endpoint) { | 1116 | if (!endpoint) { |
| 1077 | console.warn('No endpoint for status check'); | 1117 | console.warn('No endpoint for status check'); |
| 1078 | online_status = 'no_connection'; | 1118 | setOnlineStatus('no_connection'); |
| 1079 | return resultCheckStatus(); | 1119 | return resultCheckStatus(); |
| 1080 | } | 1120 | } |
| 1081 | 1121 | ||
| 1082 | if (textgen_settings.type == OOBA && textgen_settings.bypass_status_check) { | 1122 | if (textgen_settings.type == OOBA && textgen_settings.bypass_status_check) { |
| 1083 | online_status = 'Status check bypassed'; | 1123 | setOnlineStatus('Status check bypassed'); |
| 1084 | return resultCheckStatus(); | 1124 | return resultCheckStatus(); |
| 1085 | } | 1125 | } |
| 1086 | 1126 | ||
| @@ -1100,34 +1140,37 @@ async function getStatusTextgen() { | |||
| 1100 | 1140 | ||
| 1101 | if (textgen_settings.type === MANCER) { | 1141 | if (textgen_settings.type === MANCER) { |
| 1102 | loadMancerModels(data?.data); | 1142 | loadMancerModels(data?.data); |
| 1103 | online_status = textgen_settings.mancer_model; | 1143 | setOnlineStatus(textgen_settings.mancer_model); |
| 1104 | } else if (textgen_settings.type === TOGETHERAI) { | 1144 | } else if (textgen_settings.type === TOGETHERAI) { |
| 1105 | loadTogetherAIModels(data?.data); | 1145 | loadTogetherAIModels(data?.data); |
| 1106 | online_status = textgen_settings.togetherai_model; | 1146 | setOnlineStatus(textgen_settings.togetherai_model); |
| 1107 | } else if (textgen_settings.type === OLLAMA) { | 1147 | } else if (textgen_settings.type === OLLAMA) { |
| 1108 | loadOllamaModels(data?.data); | 1148 | loadOllamaModels(data?.data); |
| 1109 | online_status = textgen_settings.ollama_model || 'Connected'; | 1149 | setOnlineStatus(textgen_settings.ollama_model || 'Connected'); |
| 1110 | } else if (textgen_settings.type === INFERMATICAI) { | 1150 | } else if (textgen_settings.type === INFERMATICAI) { |
| 1111 | loadInfermaticAIModels(data?.data); | 1151 | loadInfermaticAIModels(data?.data); |
| 1112 | online_status = textgen_settings.infermaticai_model; | 1152 | setOnlineStatus(textgen_settings.infermaticai_model); |
| 1113 | } else if (textgen_settings.type === DREAMGEN) { | 1153 | } else if (textgen_settings.type === DREAMGEN) { |
| 1114 | loadDreamGenModels(data?.data); | 1154 | loadDreamGenModels(data?.data); |
| 1115 | online_status = textgen_settings.dreamgen_model; | 1155 | setOnlineStatus(textgen_settings.dreamgen_model); |
| 1116 | } else if (textgen_settings.type === OPENROUTER) { | 1156 | } else if (textgen_settings.type === OPENROUTER) { |
| 1117 | loadOpenRouterModels(data?.data); | 1157 | loadOpenRouterModels(data?.data); |
| 1118 | online_status = textgen_settings.openrouter_model; | 1158 | setOnlineStatus(textgen_settings.openrouter_model); |
| 1119 | } else if (textgen_settings.type === VLLM) { | 1159 | } else if (textgen_settings.type === VLLM) { |
| 1120 | loadVllmModels(data?.data); | 1160 | loadVllmModels(data?.data); |
| 1121 | online_status = textgen_settings.vllm_model; | 1161 | setOnlineStatus(textgen_settings.vllm_model); |
| 1122 | } else if (textgen_settings.type === APHRODITE) { | 1162 | } else if (textgen_settings.type === APHRODITE) { |
| 1123 | loadAphroditeModels(data?.data); | 1163 | loadAphroditeModels(data?.data); |
| 1124 | online_status = textgen_settings.aphrodite_model; | 1164 | setOnlineStatus(textgen_settings.aphrodite_model); |
| 1165 | } else if (textgen_settings.type === FEATHERLESS) { | ||
| 1166 | loadFeatherlessModels(data?.data); | ||
| 1167 | setOnlineStatus(textgen_settings.featherless_model); | ||
| 1125 | } else { | 1168 | } else { |
| 1126 | online_status = data?.result; | 1169 | setOnlineStatus(data?.result); |
| 1127 | } | 1170 | } |
| 1128 | 1171 | ||
| 1129 | if (!online_status) { | 1172 | if (!online_status) { |
| 1130 | online_status = 'no_connection'; | 1173 | setOnlineStatus('no_connection'); |
| 1131 | } | 1174 | } |
| 1132 | 1175 | ||
| 1133 | // Determine instruct mode preset | 1176 | // Determine instruct mode preset |
| @@ -1139,7 +1182,7 @@ async function getStatusTextgen() { | |||
| 1139 | } | 1182 | } |
| 1140 | } catch (err) { | 1183 | } catch (err) { |
| 1141 | console.error('Error getting status', err); | 1184 | console.error('Error getting status', err); |
| 1142 | online_status = 'no_connection'; | 1185 | setOnlineStatus('no_connection'); |
| 1143 | } | 1186 | } |
| 1144 | 1187 | ||
| 1145 | return resultCheckStatus(); | 1188 | return resultCheckStatus(); |
| @@ -1153,9 +1196,9 @@ async function getStatusNovel() { | |||
| 1153 | throw new Error('Could not load subscription data'); | 1196 | throw new Error('Could not load subscription data'); |
| 1154 | } | 1197 | } |
| 1155 | 1198 | ||
| 1156 | online_status = getNovelTier(); | 1199 | setOnlineStatus(getNovelTier()); |
| 1157 | } catch { | 1200 | } catch { |
| 1158 | online_status = 'no_connection'; | 1201 | setOnlineStatus('no_connection'); |
| 1159 | } | 1202 | } |
| 1160 | 1203 | ||
| 1161 | resultCheckStatus(); | 1204 | resultCheckStatus(); |
| @@ -1309,8 +1352,8 @@ export async function printCharacters(fullRefresh = false) { | |||
| 1309 | verifyCharactersSearchSortRule(); | 1352 | verifyCharactersSearchSortRule(); |
| 1310 | 1353 | ||
| 1311 | // We are actually always reprinting filters, as it "doesn't hurt", and this way they are always up to date | 1354 | // We are actually always reprinting filters, as it "doesn't hurt", and this way they are always up to date |
| 1312 | printTagFilters(tag_filter_types.character); | 1355 | printTagFilters(tag_filter_type.character); |
| 1313 | printTagFilters(tag_filter_types.group_member); | 1356 | printTagFilters(tag_filter_type.group_member); |
| 1314 | 1357 | ||
| 1315 | // We are also always reprinting the lists on character/group edit window, as these ones doesn't get updated otherwise | 1358 | // We are also always reprinting the lists on character/group edit window, as these ones doesn't get updated otherwise |
| 1316 | applyTagsOnCharacterSelect(); | 1359 | applyTagsOnCharacterSelect(); |
| @@ -1331,7 +1374,7 @@ export async function printCharacters(fullRefresh = false) { | |||
| 1331 | nextText: '>', | 1374 | nextText: '>', |
| 1332 | formatNavigator: PAGINATION_TEMPLATE, | 1375 | formatNavigator: PAGINATION_TEMPLATE, |
| 1333 | showNavigator: true, | 1376 | showNavigator: true, |
| 1334 | callback: function (data) { | 1377 | callback: function (/** @type {Entity[]} */ data) { |
| 1335 | $(listId).empty(); | 1378 | $(listId).empty(); |
| 1336 | if (power_user.bogus_folders && isBogusFolderOpen()) { | 1379 | if (power_user.bogus_folders && isBogusFolderOpen()) { |
| 1337 | $(listId).append(getBackBlock()); | 1380 | $(listId).append(getBackBlock()); |
| @@ -1351,7 +1394,7 @@ export async function printCharacters(fullRefresh = false) { | |||
| 1351 | displayCount++; | 1394 | displayCount++; |
| 1352 | break; | 1395 | break; |
| 1353 | case 'tag': | 1396 | case 'tag': |
| 1354 | $(listId).append(getTagBlock(i.item, i.entities, i.hidden)); | 1397 | $(listId).append(getTagBlock(i.item, i.entities, i.hidden, i.isUseless)); |
| 1355 | break; | 1398 | break; |
| 1356 | } | 1399 | } |
| 1357 | } | 1400 | } |
| @@ -1405,8 +1448,9 @@ function verifyCharactersSearchSortRule() { | |||
| 1405 | * @property {Character|Group|import('./scripts/tags.js').Tag|*} item - The item | 1448 | * @property {Character|Group|import('./scripts/tags.js').Tag|*} item - The item |
| 1406 | * @property {string|number} id - The id | 1449 | * @property {string|number} id - The id |
| 1407 | * @property {'character'|'group'|'tag'} type - The type of this entity (character, group, tag) | 1450 | * @property {'character'|'group'|'tag'} type - The type of this entity (character, group, tag) |
| 1408 | * @property {Entity[]} [entities] - An optional list of entities relevant for this item | 1451 | * @property {Entity[]?} [entities=null] - An optional list of entities relevant for this item |
| 1409 | * @property {number} [hidden] - An optional number representing how many hidden entities this entity contains | 1452 | * @property {number?} [hidden=null] - An optional number representing how many hidden entities this entity contains |
| 1453 | * @property {boolean?} [isUseless=null] - Specifies if the entity is useless (not relevant, but should still be displayed for consistency) and should be displayed greyed out | ||
| 1410 | */ | 1454 | */ |
| 1411 | 1455 | ||
| 1412 | /** | 1456 | /** |
| @@ -1501,6 +1545,15 @@ export function getEntitiesList({ doFilter = false, doSort = true } = {}) { | |||
| 1501 | } | 1545 | } |
| 1502 | } | 1546 | } |
| 1503 | 1547 | ||
| 1548 | // Final step, updating some properties after the last filter run | ||
| 1549 | const nonTagEntitiesCount = entities.filter(entity => entity.type !== 'tag').length; | ||
| 1550 | for (const entity of entities) { | ||
| 1551 | if (entity.type === 'tag') { | ||
| 1552 | if (entity.entities?.length == nonTagEntitiesCount) entity.isUseless = true; | ||
| 1553 | } | ||
| 1554 | } | ||
| 1555 | |||
| 1556 | // Sort before returning if requested | ||
| 1504 | if (doSort) { | 1557 | if (doSort) { |
| 1505 | sortEntitiesList(entities); | 1558 | sortEntitiesList(entities); |
| 1506 | } | 1559 | } |
| @@ -2026,14 +2079,23 @@ export function updateMessageBlock(messageId, message) { | |||
| 2026 | appendMediaToMessage(message, messageElement); | 2079 | appendMediaToMessage(message, messageElement); |
| 2027 | } | 2080 | } |
| 2028 | 2081 | ||
| 2029 | export function appendMediaToMessage(mes, messageElement) { | 2082 | /** |
| 2083 | * Appends image or file to the message element. | ||
| 2084 | * @param {object} mes Message object | ||
| 2085 | * @param {JQuery<HTMLElement>} messageElement Message element | ||
| 2086 | * @param {boolean} [adjustScroll=true] Whether to adjust the scroll position after appending the media | ||
| 2087 | */ | ||
| 2088 | export function appendMediaToMessage(mes, messageElement, adjustScroll = true) { | ||
| 2030 | // Add image to message | 2089 | // Add image to message |
| 2031 | if (mes.extra?.image) { | 2090 | if (mes.extra?.image) { |
| 2032 | const chatHeight = $('#chat').prop('scrollHeight'); | 2091 | const chatHeight = $('#chat').prop('scrollHeight'); |
| 2033 | const image = messageElement.find('.mes_img'); | 2092 | const image = messageElement.find('.mes_img'); |
| 2034 | const text = messageElement.find('.mes_text'); | 2093 | const text = messageElement.find('.mes_text'); |
| 2035 | const isInline = !!mes.extra?.inline_image; | 2094 | const isInline = !!mes.extra?.inline_image; |
| 2036 | image.on('load', function () { | 2095 | image.off('load').on('load', function () { |
| 2096 | if (!adjustScroll) { | ||
| 2097 | return; | ||
| 2098 | } | ||
| 2037 | const scrollPosition = $('#chat').scrollTop(); | 2099 | const scrollPosition = $('#chat').scrollTop(); |
| 2038 | const newChatHeight = $('#chat').prop('scrollHeight'); | 2100 | const newChatHeight = $('#chat').prop('scrollHeight'); |
| 2039 | const diff = newChatHeight - chatHeight; | 2101 | const diff = newChatHeight - chatHeight; |
| @@ -2074,7 +2136,7 @@ export function addCopyToCodeBlocks(messageElement) { | |||
| 2074 | hljs.highlightElement(codeBlocks.get(i)); | 2136 | hljs.highlightElement(codeBlocks.get(i)); |
| 2075 | if (navigator.clipboard !== undefined) { | 2137 | if (navigator.clipboard !== undefined) { |
| 2076 | const copyButton = document.createElement('i'); | 2138 | const copyButton = document.createElement('i'); |
| 2077 | copyButton.classList.add('fa-solid', 'fa-copy', 'code-copy'); | 2139 | copyButton.classList.add('fa-solid', 'fa-copy', 'code-copy', 'interactable'); |
| 2078 | copyButton.title = 'Copy code'; | 2140 | copyButton.title = 'Copy code'; |
| 2079 | codeBlocks.get(i).appendChild(copyButton); | 2141 | codeBlocks.get(i).appendChild(copyButton); |
| 2080 | copyButton.addEventListener('pointerup', function (event) { | 2142 | copyButton.addEventListener('pointerup', function (event) { |
| @@ -2309,14 +2371,29 @@ export function scrollChatToBottom() { | |||
| 2309 | /** | 2371 | /** |
| 2310 | * Substitutes {{macro}} parameters in a string. | 2372 | * Substitutes {{macro}} parameters in a string. |
| 2311 | * @param {string} content - The string to substitute parameters in. | 2373 | * @param {string} content - The string to substitute parameters in. |
| 2374 | * @param {Record<string,any>} additionalMacro - Additional environment variables for substitution. | ||
| 2375 | * @returns {string} The string with substituted parameters. | ||
| 2376 | */ | ||
| 2377 | export function substituteParamsExtended(content, additionalMacro = {}) { | ||
| 2378 | return substituteParams(content, undefined, undefined, undefined, undefined, true, additionalMacro); | ||
| 2379 | } | ||
| 2380 | |||
| 2381 | /** | ||
| 2382 | * Substitutes {{macro}} parameters in a string. | ||
| 2383 | * @param {string} content - The string to substitute parameters in. | ||
| 2312 | * @param {string} [_name1] - The name of the user. Uses global name1 if not provided. | 2384 | * @param {string} [_name1] - The name of the user. Uses global name1 if not provided. |
| 2313 | * @param {string} [_name2] - The name of the character. Uses global name2 if not provided. | 2385 | * @param {string} [_name2] - The name of the character. Uses global name2 if not provided. |
| 2314 | * @param {string} [_original] - The original message for {{original}} substitution. | 2386 | * @param {string} [_original] - The original message for {{original}} substitution. |
| 2315 | * @param {string} [_group] - The group members list for {{group}} substitution. | 2387 | * @param {string} [_group] - The group members list for {{group}} substitution. |
| 2316 | * @param {boolean} [_replaceCharacterCard] - Whether to replace character card macros. | 2388 | * @param {boolean} [_replaceCharacterCard] - Whether to replace character card macros. |
| 2389 | * @param {Record<string,any>} [additionalMacro] - Additional environment variables for substitution. | ||
| 2317 | * @returns {string} The string with substituted parameters. | 2390 | * @returns {string} The string with substituted parameters. |
| 2318 | */ | 2391 | */ |
| 2319 | export function substituteParams(content, _name1, _name2, _original, _group, _replaceCharacterCard = true) { | 2392 | export function substituteParams(content, _name1, _name2, _original, _group, _replaceCharacterCard = true, additionalMacro = {}) { |
| 2393 | if (!content) { | ||
| 2394 | return ''; | ||
| 2395 | } | ||
| 2396 | |||
| 2320 | const environment = {}; | 2397 | const environment = {}; |
| 2321 | 2398 | ||
| 2322 | if (typeof _original === 'string') { | 2399 | if (typeof _original === 'string') { |
| @@ -2366,6 +2443,10 @@ export function substituteParams(content, _name1, _name2, _original, _group, _re | |||
| 2366 | environment.group = environment.charIfNotGroup = getGroupValue(); | 2443 | environment.group = environment.charIfNotGroup = getGroupValue(); |
| 2367 | environment.model = getGeneratingModel(); | 2444 | environment.model = getGeneratingModel(); |
| 2368 | 2445 | ||
| 2446 | if (additionalMacro && typeof additionalMacro === 'object') { | ||
| 2447 | Object.assign(environment, additionalMacro); | ||
| 2448 | } | ||
| 2449 | |||
| 2369 | return evaluateMacros(content, environment); | 2450 | return evaluateMacros(content, environment); |
| 2370 | } | 2451 | } |
| 2371 | 2452 | ||
| @@ -3333,6 +3414,10 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro | |||
| 3333 | let regexedMessage = getRegexedString(message, regexType, options); | 3414 | let regexedMessage = getRegexedString(message, regexType, options); |
| 3334 | regexedMessage = await appendFileContent(chatItem, regexedMessage); | 3415 | regexedMessage = await appendFileContent(chatItem, regexedMessage); |
| 3335 | 3416 | ||
| 3417 | if (chatItem?.extra?.append_title && chatItem?.extra?.title) { | ||
| 3418 | regexedMessage = `${regexedMessage}\n\n${chatItem.extra.title}`; | ||
| 3419 | } | ||
| 3420 | |||
| 3336 | return { | 3421 | return { |
| 3337 | ...chatItem, | 3422 | ...chatItem, |
| 3338 | mes: regexedMessage, | 3423 | mes: regexedMessage, |
| @@ -3389,7 +3474,7 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro | |||
| 3389 | * @returns {string[]} Examples array with block heading | 3474 | * @returns {string[]} Examples array with block heading |
| 3390 | */ | 3475 | */ |
| 3391 | function parseMesExamples(examplesStr) { | 3476 | function parseMesExamples(examplesStr) { |
| 3392 | if (examplesStr.length === 0) { | 3477 | if (examplesStr.length === 0 || examplesStr === '<START>') { |
| 3393 | return []; | 3478 | return []; |
| 3394 | } | 3479 | } |
| 3395 | 3480 | ||
| @@ -4659,21 +4744,18 @@ function addChatsSeparator(mesSendString) { | |||
| 4659 | } | 4744 | } |
| 4660 | } | 4745 | } |
| 4661 | 4746 | ||
| 4662 | async function DupeChar() { | 4747 | async function duplicateCharacter() { |
| 4663 | if (!this_chid) { | 4748 | if (!this_chid) { |
| 4664 | toastr.warning('You must first select a character to duplicate!'); | 4749 | toastr.warning('You must first select a character to duplicate!'); |
| 4665 | return; | 4750 | return ''; |
| 4666 | } | 4751 | } |
| 4667 | 4752 | ||
| 4668 | const confirmMessage = ` | 4753 | const confirmMessage = $(await renderTemplateAsync('duplicateConfirm')); |
| 4669 | <h3>Are you sure you want to duplicate this character?</h3> | 4754 | const confirm = await callGenericPopup(confirmMessage, POPUP_TYPE.CONFIRM); |
| 4670 | <span>If you just want to start a new chat with the same character, use "Start new chat" option in the bottom-left options menu.</span><br><br>`; | ||
| 4671 | |||
| 4672 | const confirm = await callPopup(confirmMessage, 'confirm'); | ||
| 4673 | 4755 | ||
| 4674 | if (!confirm) { | 4756 | if (!confirm) { |
| 4675 | console.log('User cancelled duplication'); | 4757 | console.log('User cancelled duplication'); |
| 4676 | return; | 4758 | return ''; |
| 4677 | } | 4759 | } |
| 4678 | 4760 | ||
| 4679 | const body = { avatar_url: characters[this_chid].avatar }; | 4761 | const body = { avatar_url: characters[this_chid].avatar }; |
| @@ -4686,8 +4768,10 @@ async function DupeChar() { | |||
| 4686 | toastr.success('Character Duplicated'); | 4768 | toastr.success('Character Duplicated'); |
| 4687 | const data = await response.json(); | 4769 | const data = await response.json(); |
| 4688 | await eventSource.emit(event_types.CHARACTER_DUPLICATED, { oldAvatar: body.avatar_url, newAvatar: data.path }); | 4770 | await eventSource.emit(event_types.CHARACTER_DUPLICATED, { oldAvatar: body.avatar_url, newAvatar: data.path }); |
| 4689 | getCharacters(); | 4771 | await getCharacters(); |
| 4690 | } | 4772 | } |
| 4773 | |||
| 4774 | return ''; | ||
| 4691 | } | 4775 | } |
| 4692 | 4776 | ||
| 4693 | export async function itemizedParams(itemizedPrompts, thisPromptSet) { | 4777 | export async function itemizedParams(itemizedPrompts, thisPromptSet) { |
| @@ -4822,14 +4906,44 @@ async function promptItemize(itemizedPrompts, requestedMesId) { | |||
| 4822 | 4906 | ||
| 4823 | const params = await itemizedParams(itemizedPrompts, thisPromptSet); | 4907 | const params = await itemizedParams(itemizedPrompts, thisPromptSet); |
| 4824 | 4908 | ||
| 4825 | if (params.this_main_api == 'openai') { | 4909 | const template = params.this_main_api == 'openai' |
| 4826 | const template = await renderTemplateAsync('itemizationChat', params); | 4910 | ? await renderTemplateAsync('itemizationChat', params) |
| 4827 | callPopup(template, 'text'); | 4911 | : await renderTemplateAsync('itemizationText', params); |
| 4828 | 4912 | ||
| 4829 | } else { | 4913 | const popup = new Popup(template, POPUP_TYPE.TEXT); |
| 4830 | const template = await renderTemplateAsync('itemizationText', params); | 4914 | |
| 4831 | callPopup(template, 'text'); | 4915 | popup.dlg.querySelector('#copyPromptToClipboard').addEventListener('click', function () { |
| 4916 | let rawPrompt = itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt; | ||
| 4917 | let rawPromptValues = rawPrompt; | ||
| 4918 | |||
| 4919 | if (Array.isArray(rawPrompt)) { | ||
| 4920 | rawPromptValues = rawPrompt.map(x => x.content).join('\n'); | ||
| 4832 | } | 4921 | } |
| 4922 | |||
| 4923 | navigator.clipboard.writeText(rawPromptValues); | ||
| 4924 | toastr.info('Copied!'); | ||
| 4925 | }); | ||
| 4926 | |||
| 4927 | popup.dlg.querySelector('#showRawPrompt').addEventListener('click', function () { | ||
| 4928 | //console.log(itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt); | ||
| 4929 | console.log(PromptArrayItemForRawPromptDisplay); | ||
| 4930 | console.log(itemizedPrompts); | ||
| 4931 | console.log(itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt); | ||
| 4932 | |||
| 4933 | let rawPrompt = itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt; | ||
| 4934 | let rawPromptValues = rawPrompt; | ||
| 4935 | |||
| 4936 | if (Array.isArray(rawPrompt)) { | ||
| 4937 | rawPromptValues = rawPrompt.map(x => x.content).join('\n'); | ||
| 4938 | } | ||
| 4939 | |||
| 4940 | //let DisplayStringifiedPrompt = JSON.stringify(itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt).replace(/\n+/g, '<br>'); | ||
| 4941 | const rawPromptWrapper = document.getElementById('rawPromptWrapper'); | ||
| 4942 | rawPromptWrapper.innerText = rawPromptValues; | ||
| 4943 | $('#rawPromptPopup').slideToggle(); | ||
| 4944 | }); | ||
| 4945 | |||
| 4946 | await popup.show(); | ||
| 4833 | } | 4947 | } |
| 4834 | 4948 | ||
| 4835 | function setInContextMessages(lastmsg, type) { | 4949 | function setInContextMessages(lastmsg, type) { |
| @@ -4961,6 +5075,7 @@ function parseAndSaveLogprobs(data, continueFrom) { | |||
| 4961 | logprobs = data?.completion_probabilities?.map(x => parseTextgenLogprobs(x.content, [x])) || null; | 5075 | logprobs = data?.completion_probabilities?.map(x => parseTextgenLogprobs(x.content, [x])) || null; |
| 4962 | } break; | 5076 | } break; |
| 4963 | case textgen_types.VLLM: | 5077 | case textgen_types.VLLM: |
| 5078 | case textgen_types.INFERMATICAI: | ||
| 4964 | case textgen_types.APHRODITE: | 5079 | case textgen_types.APHRODITE: |
| 4965 | case textgen_types.MANCER: | 5080 | case textgen_types.MANCER: |
| 4966 | case textgen_types.TABBY: { | 5081 | case textgen_types.TABBY: { |
| @@ -5017,7 +5132,7 @@ function extractMultiSwipes(data, type) { | |||
| 5017 | return swipes; | 5132 | return swipes; |
| 5018 | } | 5133 | } |
| 5019 | 5134 | ||
| 5020 | if (main_api === 'openai' || (main_api === 'textgenerationwebui' && [MANCER, VLLM, APHRODITE, TABBY].includes(textgen_settings.type))) { | 5135 | if (main_api === 'openai' || (main_api === 'textgenerationwebui' && [MANCER, VLLM, APHRODITE, TABBY, INFERMATICAI].includes(textgen_settings.type))) { |
| 5021 | if (!Array.isArray(data.choices)) { | 5136 | if (!Array.isArray(data.choices)) { |
| 5022 | return swipes; | 5137 | return swipes; |
| 5023 | } | 5138 | } |
| @@ -5408,8 +5523,14 @@ export function resetChatState() { | |||
| 5408 | characters.length = 0; | 5523 | characters.length = 0; |
| 5409 | } | 5524 | } |
| 5410 | 5525 | ||
| 5526 | /** | ||
| 5527 | * | ||
| 5528 | * @param {'characters' | 'character_edit' | 'create' | 'group_edit' | 'group_create'} value | ||
| 5529 | */ | ||
| 5411 | export function setMenuType(value) { | 5530 | export function setMenuType(value) { |
| 5412 | menu_type = value; | 5531 | menu_type = value; |
| 5532 | // Allow custom CSS to see which menu type is active | ||
| 5533 | document.getElementById('right-nav-panel').dataset.menuType = menu_type; | ||
| 5413 | } | 5534 | } |
| 5414 | 5535 | ||
| 5415 | export function setExternalAbortController(controller) { | 5536 | export function setExternalAbortController(controller) { |
| @@ -5424,9 +5545,17 @@ export function setCharacterName(value) { | |||
| 5424 | name2 = value; | 5545 | name2 = value; |
| 5425 | } | 5546 | } |
| 5426 | 5547 | ||
| 5548 | /** | ||
| 5549 | * Sets the API connection status of the application | ||
| 5550 | * @param {string|'no_connection'} value Connection status value | ||
| 5551 | */ | ||
| 5427 | export function setOnlineStatus(value) { | 5552 | export function setOnlineStatus(value) { |
| 5553 | const previousStatus = online_status; | ||
| 5428 | online_status = value; | 5554 | online_status = value; |
| 5429 | displayOnlineStatus(); | 5555 | displayOnlineStatus(); |
| 5556 | if (previousStatus !== online_status) { | ||
| 5557 | eventSource.emitAndWait(event_types.ONLINE_STATUS_CHANGED, online_status); | ||
| 5558 | } | ||
| 5430 | } | 5559 | } |
| 5431 | 5560 | ||
| 5432 | export function setEditedMessageId(value) { | 5561 | export function setEditedMessageId(value) { |
| @@ -5448,7 +5577,7 @@ export async function renameCharacter(name = null, { silent = false, renameChats | |||
| 5448 | } | 5577 | } |
| 5449 | 5578 | ||
| 5450 | const oldAvatar = characters[this_chid].avatar; | 5579 | const oldAvatar = characters[this_chid].avatar; |
| 5451 | const newValue = name || await callPopup('<h3>New name:</h3>', 'input', characters[this_chid].name); | 5580 | const newValue = name || await callGenericPopup('<h3>New name:</h3>', POPUP_TYPE.INPUT, characters[this_chid].name); |
| 5452 | 5581 | ||
| 5453 | if (!newValue) { | 5582 | if (!newValue) { |
| 5454 | toastr.warning('No character name provided.', 'Rename Character'); | 5583 | toastr.warning('No character name provided.', 'Rename Character'); |
| @@ -5664,6 +5793,7 @@ export async function saveChat(chat_name, withMetadata, mesId) { | |||
| 5664 | contentType: 'application/json', | 5793 | contentType: 'application/json', |
| 5665 | success: function (data) { }, | 5794 | success: function (data) { }, |
| 5666 | error: function (jqXHR, exception) { | 5795 | error: function (jqXHR, exception) { |
| 5796 | toastr.error('Check the server connection and reload the page to prevent data loss.', 'Chat could not be saved'); | ||
| 5667 | console.log(exception); | 5797 | console.log(exception); |
| 5668 | console.log(jqXHR); | 5798 | console.log(jqXHR); |
| 5669 | }, | 5799 | }, |
| @@ -5676,17 +5806,20 @@ async function read_avatar_load(input) { | |||
| 5676 | create_save.avatar = input.files; | 5806 | create_save.avatar = input.files; |
| 5677 | } | 5807 | } |
| 5678 | 5808 | ||
| 5809 | crop_data = undefined; | ||
| 5679 | const file = input.files[0]; | 5810 | const file = input.files[0]; |
| 5680 | const fileData = await getBase64Async(file); | 5811 | const fileData = await getBase64Async(file); |
| 5681 | 5812 | ||
| 5682 | if (!power_user.never_resize_avatars) { | 5813 | if (!power_user.never_resize_avatars) { |
| 5683 | $('#dialogue_popup').addClass('large_dialogue_popup wide_dialogue_popup'); | 5814 | const dlg = new Popup('Set the crop position of the avatar image', POPUP_TYPE.CROP, '', { cropImage: fileData }); |
| 5684 | const croppedImage = await callPopup(getCropPopup(fileData), 'avatarToCrop'); | 5815 | const croppedImage = await dlg.show(); |
| 5816 | |||
| 5685 | if (!croppedImage) { | 5817 | if (!croppedImage) { |
| 5686 | return; | 5818 | return; |
| 5687 | } | 5819 | } |
| 5688 | 5820 | ||
| 5689 | $('#avatar_load_preview').attr('src', croppedImage); | 5821 | crop_data = dlg.cropData; |
| 5822 | $('#avatar_load_preview').attr('src', String(croppedImage)); | ||
| 5690 | } else { | 5823 | } else { |
| 5691 | $('#avatar_load_preview').attr('src', fileData); | 5824 | $('#avatar_load_preview').attr('src', fileData); |
| 5692 | } | 5825 | } |
| @@ -5696,7 +5829,7 @@ async function read_avatar_load(input) { | |||
| 5696 | } | 5829 | } |
| 5697 | 5830 | ||
| 5698 | await createOrEditCharacter(); | 5831 | await createOrEditCharacter(); |
| 5699 | await delay(durationSaveEdit); | 5832 | await delay(DEFAULT_SAVE_EDIT_TIMEOUT); |
| 5700 | 5833 | ||
| 5701 | const formData = new FormData($('#form_create').get(0)); | 5834 | const formData = new FormData($('#form_create').get(0)); |
| 5702 | await fetch(getThumbnailUrl('avatar', formData.get('avatar_url')), { | 5835 | await fetch(getThumbnailUrl('avatar', formData.get('avatar_url')), { |
| @@ -5729,18 +5862,11 @@ async function read_avatar_load(input) { | |||
| 5729 | } | 5862 | } |
| 5730 | } | 5863 | } |
| 5731 | 5864 | ||
| 5732 | export function getCropPopup(src) { | ||
| 5733 | return `<h3>Set the crop position of the avatar image and click Accept to confirm.</h3> | ||
| 5734 | <div id='avatarCropWrap'> | ||
| 5735 | <img id='avatarToCrop' src='${src}'> | ||
| 5736 | </div>`; | ||
| 5737 | } | ||
| 5738 | |||
| 5739 | export function getThumbnailUrl(type, file) { | 5865 | export function getThumbnailUrl(type, file) { |
| 5740 | return `/thumbnail?type=${type}&file=${encodeURIComponent(file)}`; | 5866 | return `/thumbnail?type=${type}&file=${encodeURIComponent(file)}`; |
| 5741 | } | 5867 | } |
| 5742 | 5868 | ||
| 5743 | export function buildAvatarList(block, entities, { templateId = 'inline_avatar_template', empty = true, selectable = false, highlightFavs = true } = {}) { | 5869 | export function buildAvatarList(block, entities, { templateId = 'inline_avatar_template', empty = true, interactable = false, highlightFavs = true } = {}) { |
| 5744 | if (empty) { | 5870 | if (empty) { |
| 5745 | block.empty(); | 5871 | block.empty(); |
| 5746 | } | 5872 | } |
| @@ -5775,8 +5901,8 @@ export function buildAvatarList(block, entities, { templateId = 'inline_avatar_t | |||
| 5775 | avatarTemplate.attr('title', `[Group] ${entity.item.name}`); | 5901 | avatarTemplate.attr('title', `[Group] ${entity.item.name}`); |
| 5776 | } | 5902 | } |
| 5777 | 5903 | ||
| 5778 | if (selectable) { | 5904 | if (interactable) { |
| 5779 | avatarTemplate.addClass('selectable'); | 5905 | avatarTemplate.addClass(INTERACTABLE_CONTROL_CLASS); |
| 5780 | avatarTemplate.toggleClass('character_select', entity.type === 'character'); | 5906 | avatarTemplate.toggleClass('character_select', entity.type === 'character'); |
| 5781 | avatarTemplate.toggleClass('group_select', entity.type === 'group'); | 5907 | avatarTemplate.toggleClass('group_select', entity.type === 'group'); |
| 5782 | } | 5908 | } |
| @@ -5826,11 +5952,13 @@ export async function getChat() { | |||
| 5826 | 5952 | ||
| 5827 | async function getChatResult() { | 5953 | async function getChatResult() { |
| 5828 | name2 = characters[this_chid].name; | 5954 | name2 = characters[this_chid].name; |
| 5955 | let freshChat = false; | ||
| 5829 | if (chat.length === 0) { | 5956 | if (chat.length === 0) { |
| 5830 | const message = getFirstMessage(); | 5957 | const message = getFirstMessage(); |
| 5831 | if (message.mes) { | 5958 | if (message.mes) { |
| 5832 | chat.push(message); | 5959 | chat.push(message); |
| 5833 | await saveChatConditional(); | 5960 | await saveChatConditional(); |
| 5961 | freshChat = true; | ||
| 5834 | } | 5962 | } |
| 5835 | } | 5963 | } |
| 5836 | await loadItemizedPrompts(getCurrentChatId()); | 5964 | await loadItemizedPrompts(getCurrentChatId()); |
| @@ -5838,6 +5966,7 @@ async function getChatResult() { | |||
| 5838 | select_selected_character(this_chid); | 5966 | select_selected_character(this_chid); |
| 5839 | 5967 | ||
| 5840 | await eventSource.emit(event_types.CHAT_CHANGED, (getCurrentChatId())); | 5968 | await eventSource.emit(event_types.CHAT_CHANGED, (getCurrentChatId())); |
| 5969 | if (freshChat) await eventSource.emit(event_types.CHAT_CREATED); | ||
| 5841 | 5970 | ||
| 5842 | if (chat.length === 1) { | 5971 | if (chat.length === 1) { |
| 5843 | const chat_id = (chat.length - 1); | 5972 | const chat_id = (chat.length - 1); |
| @@ -5995,7 +6124,7 @@ export function changeMainAPI() { | |||
| 5995 | } | 6124 | } |
| 5996 | 6125 | ||
| 5997 | main_api = selectedVal; | 6126 | main_api = selectedVal; |
| 5998 | online_status = 'no_connection'; | 6127 | setOnlineStatus('no_connection'); |
| 5999 | 6128 | ||
| 6000 | if (main_api == 'openai' && oai_settings.chat_completion_source == chat_completion_sources.WINDOWAI) { | 6129 | if (main_api == 'openai' && oai_settings.chat_completion_source == chat_completion_sources.WINDOWAI) { |
| 6001 | $('#api_button_openai').trigger('click'); | 6130 | $('#api_button_openai').trigger('click'); |
| @@ -6791,7 +6920,7 @@ export function select_selected_character(chid) { | |||
| 6791 | //character select | 6920 | //character select |
| 6792 | //console.log('select_selected_character() -- starting with input of -- ' + chid + ' (name:' + characters[chid].name + ')'); | 6921 | //console.log('select_selected_character() -- starting with input of -- ' + chid + ' (name:' + characters[chid].name + ')'); |
| 6793 | select_rm_create(); | 6922 | select_rm_create(); |
| 6794 | menu_type = 'character_edit'; | 6923 | setMenuType('character_edit'); |
| 6795 | $('#delete_button').css('display', 'flex'); | 6924 | $('#delete_button').css('display', 'flex'); |
| 6796 | $('#export_button').css('display', 'flex'); | 6925 | $('#export_button').css('display', 'flex'); |
| 6797 | var display_name = characters[chid].name; | 6926 | var display_name = characters[chid].name; |
| @@ -6813,7 +6942,7 @@ export function select_selected_character(chid) { | |||
| 6813 | 6942 | ||
| 6814 | $('#add_avatar_button').val(''); | 6943 | $('#add_avatar_button').val(''); |
| 6815 | 6944 | ||
| 6816 | $('#character_popup_text_h3').text(characters[chid].name); | 6945 | $('#character_popup-button-h3').text(characters[chid].name); |
| 6817 | $('#character_name_pole').val(characters[chid].name); | 6946 | $('#character_name_pole').val(characters[chid].name); |
| 6818 | $('#description_textarea').val(characters[chid].description); | 6947 | $('#description_textarea').val(characters[chid].description); |
| 6819 | $('#character_world').val(characters[chid].data?.extensions?.world || ''); | 6948 | $('#character_world').val(characters[chid].data?.extensions?.world || ''); |
| @@ -6867,7 +6996,7 @@ export function select_selected_character(chid) { | |||
| 6867 | } | 6996 | } |
| 6868 | 6997 | ||
| 6869 | function select_rm_create() { | 6998 | function select_rm_create() { |
| 6870 | menu_type = 'create'; | 6999 | setMenuType('create'); |
| 6871 | 7000 | ||
| 6872 | //console.log('select_rm_Create() -- selected button: '+selected_button); | 7001 | //console.log('select_rm_Create() -- selected button: '+selected_button); |
| 6873 | if (selected_button == 'create') { | 7002 | if (selected_button == 'create') { |
| @@ -6890,7 +7019,7 @@ function select_rm_create() { | |||
| 6890 | //create text poles | 7019 | //create text poles |
| 6891 | $('#rm_button_back').css('display', ''); | 7020 | $('#rm_button_back').css('display', ''); |
| 6892 | $('#character_import_button').css('display', ''); | 7021 | $('#character_import_button').css('display', ''); |
| 6893 | $('#character_popup_text_h3').text('Create character'); | 7022 | $('#character_popup-button-h3').text('Create character'); |
| 6894 | $('#character_name_pole').val(create_save.name); | 7023 | $('#character_name_pole').val(create_save.name); |
| 6895 | $('#description_textarea').val(create_save.description); | 7024 | $('#description_textarea').val(create_save.description); |
| 6896 | $('#character_world').val(create_save.world); | 7025 | $('#character_world').val(create_save.world); |
| @@ -6928,7 +7057,7 @@ function select_rm_create() { | |||
| 6928 | 7057 | ||
| 6929 | function select_rm_characters() { | 7058 | function select_rm_characters() { |
| 6930 | const doFullRefresh = menu_type === 'characters'; | 7059 | const doFullRefresh = menu_type === 'characters'; |
| 6931 | menu_type = 'characters'; | 7060 | setMenuType('characters'); |
| 6932 | selectRightMenuWithAnimation('rm_characters_block'); | 7061 | selectRightMenuWithAnimation('rm_characters_block'); |
| 6933 | printCharacters(doFullRefresh); | 7062 | printCharacters(doFullRefresh); |
| 6934 | } | 7063 | } |
| @@ -7036,14 +7165,12 @@ function onScenarioOverrideRemoveClick() { | |||
| 7036 | * @param {string} type | 7165 | * @param {string} type |
| 7037 | * @param {string} inputValue - Value to set the input to. | 7166 | * @param {string} inputValue - Value to set the input to. |
| 7038 | * @param {PopupOptions} options - Options for the popup. | 7167 | * @param {PopupOptions} options - Options for the popup. |
| 7039 | * @typedef {{okButton?: string, rows?: number, wide?: boolean, large?: boolean, allowHorizontalScrolling?: boolean, allowVerticalScrolling?: boolean, cropAspect?: number }} PopupOptions - Options for the popup. | 7168 | * @typedef {{okButton?: string, rows?: number, wide?: boolean, wider?: boolean, large?: boolean, allowHorizontalScrolling?: boolean, allowVerticalScrolling?: boolean, cropAspect?: number }} PopupOptions - Options for the popup. |
| 7040 | * @returns | 7169 | * @returns |
| 7041 | */ | 7170 | */ |
| 7042 | export function callPopup(text, type, inputValue = '', { okButton, rows, wide, large, allowHorizontalScrolling, allowVerticalScrolling, cropAspect } = {}) { | 7171 | export function callPopup(text, type, inputValue = '', { okButton, rows, wide, wider, large, allowHorizontalScrolling, allowVerticalScrolling, cropAspect } = {}) { |
| 7043 | function getOkButtonText() { | 7172 | function getOkButtonText() { |
| 7044 | if (['avatarToCrop'].includes(popup_type)) { | 7173 | if (['text', 'alternate_greeting', 'char_not_selected'].includes(popup_type)) { |
| 7045 | return okButton ?? 'Accept'; | ||
| 7046 | } else if (['text', 'alternate_greeting', 'char_not_selected'].includes(popup_type)) { | ||
| 7047 | $dialoguePopupCancel.css('display', 'none'); | 7174 | $dialoguePopupCancel.css('display', 'none'); |
| 7048 | return okButton ?? 'Ok'; | 7175 | return okButton ?? 'Ok'; |
| 7049 | } else if (['delete_extension'].includes(popup_type)) { | 7176 | } else if (['delete_extension'].includes(popup_type)) { |
| @@ -7069,6 +7196,7 @@ export function callPopup(text, type, inputValue = '', { okButton, rows, wide, l | |||
| 7069 | const $shadowPopup = $('#shadow_popup'); | 7196 | const $shadowPopup = $('#shadow_popup'); |
| 7070 | 7197 | ||
| 7071 | $dialoguePopup.toggleClass('wide_dialogue_popup', !!wide) | 7198 | $dialoguePopup.toggleClass('wide_dialogue_popup', !!wide) |
| 7199 | .toggleClass('wider_dialogue_popup', !!wider) | ||
| 7072 | .toggleClass('large_dialogue_popup', !!large) | 7200 | .toggleClass('large_dialogue_popup', !!large) |
| 7073 | .toggleClass('horizontal_scrolling_dialogue_popup', !!allowHorizontalScrolling) | 7201 | .toggleClass('horizontal_scrolling_dialogue_popup', !!allowHorizontalScrolling) |
| 7074 | .toggleClass('vertical_scrolling_dialogue_popup', !!allowVerticalScrolling); | 7202 | .toggleClass('vertical_scrolling_dialogue_popup', !!allowVerticalScrolling); |
| @@ -7083,22 +7211,6 @@ export function callPopup(text, type, inputValue = '', { okButton, rows, wide, l | |||
| 7083 | $dialoguePopupInput.trigger('focus'); | 7211 | $dialoguePopupInput.trigger('focus'); |
| 7084 | } | 7212 | } |
| 7085 | 7213 | ||
| 7086 | if (popup_type == 'avatarToCrop') { | ||
| 7087 | // unset existing data | ||
| 7088 | crop_data = undefined; | ||
| 7089 | |||
| 7090 | $('#avatarToCrop').cropper({ | ||
| 7091 | aspectRatio: cropAspect ?? 2 / 3, | ||
| 7092 | autoCropArea: 1, | ||
| 7093 | viewMode: 2, | ||
| 7094 | rotatable: false, | ||
| 7095 | crop: function (event) { | ||
| 7096 | crop_data = event.detail; | ||
| 7097 | crop_data.want_resize = !power_user.never_resize_avatars; | ||
| 7098 | }, | ||
| 7099 | }); | ||
| 7100 | } | ||
| 7101 | |||
| 7102 | $shadowPopup.transition({ | 7214 | $shadowPopup.transition({ |
| 7103 | opacity: 1, | 7215 | opacity: 1, |
| 7104 | duration: animation_duration, | 7216 | duration: animation_duration, |
| @@ -7181,7 +7293,7 @@ export async function saveMetadata() { | |||
| 7181 | 7293 | ||
| 7182 | export async function saveChatConditional() { | 7294 | export async function saveChatConditional() { |
| 7183 | try { | 7295 | try { |
| 7184 | await waitUntilCondition(() => !isChatSaving, durationSaveEdit, 100); | 7296 | await waitUntilCondition(() => !isChatSaving, DEFAULT_SAVE_EDIT_TIMEOUT, 100); |
| 7185 | } catch { | 7297 | } catch { |
| 7186 | console.warn('Timeout waiting for chat to save'); | 7298 | console.warn('Timeout waiting for chat to save'); |
| 7187 | return; | 7299 | return; |
| @@ -7484,10 +7596,15 @@ function addAlternateGreeting(template, greeting, index, getArray) { | |||
| 7484 | template.find('.alternate_greetings_list').append(greetingBlock); | 7596 | template.find('.alternate_greetings_list').append(greetingBlock); |
| 7485 | } | 7597 | } |
| 7486 | 7598 | ||
| 7599 | /** | ||
| 7600 | * Creates or edits a character based on the form data. | ||
| 7601 | * @param {Event} [e] Event that triggered the function call. | ||
| 7602 | */ | ||
| 7487 | async function createOrEditCharacter(e) { | 7603 | async function createOrEditCharacter(e) { |
| 7488 | $('#rm_info_avatar').html(''); | 7604 | $('#rm_info_avatar').html(''); |
| 7489 | const formData = new FormData($('#form_create').get(0)); | 7605 | const formData = new FormData($('#form_create').get(0)); |
| 7490 | formData.set('fav', String(fav_ch_checked)); | 7606 | formData.set('fav', String(fav_ch_checked)); |
| 7607 | const isNewChat = e instanceof CustomEvent && e.type === 'newChat'; | ||
| 7491 | 7608 | ||
| 7492 | const rawFile = formData.get('avatar'); | 7609 | const rawFile = formData.get('avatar'); |
| 7493 | if (rawFile instanceof File) { | 7610 | if (rawFile instanceof File) { |
| @@ -7558,7 +7675,7 @@ async function createOrEditCharacter(e) { | |||
| 7558 | field.callback && field.callback(fieldValue); | 7675 | field.callback && field.callback(fieldValue); |
| 7559 | }); | 7676 | }); |
| 7560 | 7677 | ||
| 7561 | $('#character_popup_text_h3').text('Create character'); | 7678 | $('#character_popup-button-h3').text('Create character'); |
| 7562 | 7679 | ||
| 7563 | create_save.avatar = ''; | 7680 | create_save.avatar = ''; |
| 7564 | 7681 | ||
| @@ -7630,6 +7747,7 @@ async function createOrEditCharacter(e) { | |||
| 7630 | // Recreate the chat if it hasn't been used at least once (i.e. with continue). | 7747 | // Recreate the chat if it hasn't been used at least once (i.e. with continue). |
| 7631 | const message = getFirstMessage(); | 7748 | const message = getFirstMessage(); |
| 7632 | const shouldRegenerateMessage = | 7749 | const shouldRegenerateMessage = |
| 7750 | !isNewChat && | ||
| 7633 | message.mes && | 7751 | message.mes && |
| 7634 | !selected_group && | 7752 | !selected_group && |
| 7635 | !chat_metadata['tainted'] && | 7753 | !chat_metadata['tainted'] && |
| @@ -7691,6 +7809,8 @@ window['SillyTavern'].getContext = function () { | |||
| 7691 | activateSendButtons, | 7809 | activateSendButtons, |
| 7692 | deactivateSendButtons, | 7810 | deactivateSendButtons, |
| 7693 | saveReply, | 7811 | saveReply, |
| 7812 | substituteParams, | ||
| 7813 | substituteParamsExtended, | ||
| 7694 | registerSlashCommand: registerSlashCommand, | 7814 | registerSlashCommand: registerSlashCommand, |
| 7695 | executeSlashCommands: executeSlashCommands, | 7815 | executeSlashCommands: executeSlashCommands, |
| 7696 | timestampToMoment: timestampToMoment, | 7816 | timestampToMoment: timestampToMoment, |
| @@ -7698,6 +7818,8 @@ window['SillyTavern'].getContext = function () { | |||
| 7698 | * @deprecated Handlebars for extensions are no longer supported. | 7818 | * @deprecated Handlebars for extensions are no longer supported. |
| 7699 | */ | 7819 | */ |
| 7700 | registerHelper: () => { }, | 7820 | registerHelper: () => { }, |
| 7821 | registerMacro: MacrosParser.registerMacro.bind(MacrosParser), | ||
| 7822 | unregisterMacro: MacrosParser.unregisterMacro.bind(MacrosParser), | ||
| 7701 | registedDebugFunction: registerDebugFunction, | 7823 | registedDebugFunction: registerDebugFunction, |
| 7702 | /** | 7824 | /** |
| 7703 | * @deprecated Use renderExtensionTemplateAsync instead. | 7825 | * @deprecated Use renderExtensionTemplateAsync instead. |
| @@ -7718,6 +7840,8 @@ window['SillyTavern'].getContext = function () { | |||
| 7718 | messageFormatting: messageFormatting, | 7840 | messageFormatting: messageFormatting, |
| 7719 | shouldSendOnEnter: shouldSendOnEnter, | 7841 | shouldSendOnEnter: shouldSendOnEnter, |
| 7720 | isMobile: isMobile, | 7842 | isMobile: isMobile, |
| 7843 | t: t, | ||
| 7844 | translate: translate, | ||
| 7721 | tags: tags, | 7845 | tags: tags, |
| 7722 | tagMap: tag_map, | 7846 | tagMap: tag_map, |
| 7723 | menuType: menu_type, | 7847 | menuType: menu_type, |
| @@ -8187,6 +8311,11 @@ const CONNECT_API_MAP = { | |||
| 8187 | button: '#api_button_openai', | 8311 | button: '#api_button_openai', |
| 8188 | source: chat_completion_sources.GROQ, | 8312 | source: chat_completion_sources.GROQ, |
| 8189 | }, | 8313 | }, |
| 8314 | '01ai': { | ||
| 8315 | selected: 'openai', | ||
| 8316 | button: '#api_button_openai', | ||
| 8317 | source: chat_completion_sources.ZEROONEAI, | ||
| 8318 | }, | ||
| 8190 | 'infermaticai': { | 8319 | 'infermaticai': { |
| 8191 | selected: 'textgenerationwebui', | 8320 | selected: 'textgenerationwebui', |
| 8192 | button: '#api_button_textgenerationwebui', | 8321 | button: '#api_button_textgenerationwebui', |
| @@ -8202,6 +8331,11 @@ const CONNECT_API_MAP = { | |||
| 8202 | button: '#api_button_textgenerationwebui', | 8331 | button: '#api_button_textgenerationwebui', |
| 8203 | type: textgen_types.OPENROUTER, | 8332 | type: textgen_types.OPENROUTER, |
| 8204 | }, | 8333 | }, |
| 8334 | 'huggingface': { | ||
| 8335 | selected: 'textgenerationwebui', | ||
| 8336 | button: '#api_button_textgenerationwebui', | ||
| 8337 | type: textgen_types.HUGGINGFACE, | ||
| 8338 | }, | ||
| 8205 | }; | 8339 | }; |
| 8206 | 8340 | ||
| 8207 | async function selectContextCallback(_, name) { | 8341 | async function selectContextCallback(_, name) { |
| @@ -8244,10 +8378,12 @@ async function selectInstructCallback(_, name) { | |||
| 8244 | 8378 | ||
| 8245 | async function enableInstructCallback() { | 8379 | async function enableInstructCallback() { |
| 8246 | $('#instruct_enabled').prop('checked', true).trigger('change'); | 8380 | $('#instruct_enabled').prop('checked', true).trigger('change'); |
| 8381 | return ''; | ||
| 8247 | } | 8382 | } |
| 8248 | 8383 | ||
| 8249 | async function disableInstructCallback() { | 8384 | async function disableInstructCallback() { |
| 8250 | $('#instruct_enabled').prop('checked', false).trigger('change'); | 8385 | $('#instruct_enabled').prop('checked', false).trigger('change'); |
| 8386 | return ''; | ||
| 8251 | } | 8387 | } |
| 8252 | 8388 | ||
| 8253 | /** | 8389 | /** |
| @@ -8390,7 +8526,7 @@ async function importCharacter(file, preserveFileName = false) { | |||
| 8390 | 8526 | ||
| 8391 | await getCharacters(); | 8527 | await getCharacters(); |
| 8392 | select_rm_info('char_import', data.file_name, oldSelectedChar); | 8528 | select_rm_info('char_import', data.file_name, oldSelectedChar); |
| 8393 | if (power_user.import_card_tags) { | 8529 | if (power_user.tag_import_setting !== tag_import_setting.NONE) { |
| 8394 | let currentContext = getContext(); | 8530 | let currentContext = getContext(); |
| 8395 | let avatarFileName = `${data.file_name}.png`; | 8531 | let avatarFileName = `${data.file_name}.png`; |
| 8396 | let importedCharacter = currentContext.characters.find(character => character.avatar === avatarFileName); | 8532 | let importedCharacter = currentContext.characters.find(character => character.avatar === avatarFileName); |
| @@ -8421,9 +8557,63 @@ async function importFromURL(items, files) { | |||
| 8421 | } | 8557 | } |
| 8422 | } | 8558 | } |
| 8423 | 8559 | ||
| 8424 | async function doImpersonate(_, prompt) { | 8560 | async function doImpersonate(args, prompt) { |
| 8425 | $('#send_textarea').val(''); | 8561 | const options = prompt?.trim() ? { quiet_prompt: prompt.trim(), quietToLoud: true } : {}; |
| 8426 | $('#option_impersonate').trigger('click', { fromSlashCommand: true, additionalPrompt: prompt }); | 8562 | const shouldAwait = isTrueBoolean(args?.await); |
| 8563 | const outerPromise = new Promise((outerResolve) => setTimeout(async () => { | ||
| 8564 | try { | ||
| 8565 | await waitUntilCondition(() => !is_send_press && !is_group_generating, 10000, 100); | ||
| 8566 | } catch { | ||
| 8567 | console.warn('Timeout waiting for generation unlock'); | ||
| 8568 | toastr.warning('Cannot run /impersonate command while the reply is being generated.'); | ||
| 8569 | return ''; | ||
| 8570 | } | ||
| 8571 | |||
| 8572 | // Prevent generate recursion | ||
| 8573 | $('#send_textarea').val('')[0].dispatchEvent(new Event('input', { bubbles: true })); | ||
| 8574 | |||
| 8575 | outerResolve(new Promise(innerResolve => setTimeout(() => innerResolve(Generate('impersonate', options)), 1))); | ||
| 8576 | }, 1)); | ||
| 8577 | |||
| 8578 | if (shouldAwait) { | ||
| 8579 | const innerPromise = await outerPromise; | ||
| 8580 | await innerPromise; | ||
| 8581 | } | ||
| 8582 | |||
| 8583 | return ''; | ||
| 8584 | } | ||
| 8585 | |||
| 8586 | export async function doNewChat({ deleteCurrentChat = false } = {}) { | ||
| 8587 | //Make a new chat for selected character | ||
| 8588 | if ((!selected_group && this_chid == undefined) || menu_type == 'create') { | ||
| 8589 | return; | ||
| 8590 | } | ||
| 8591 | |||
| 8592 | //Fix it; New chat doesn't create while open create character menu | ||
| 8593 | await clearChat(); | ||
| 8594 | chat.length = 0; | ||
| 8595 | |||
| 8596 | chat_file_for_del = getCurrentChatDetails()?.sessionName; | ||
| 8597 | |||
| 8598 | // Make it easier to find in backups | ||
| 8599 | if (deleteCurrentChat) { | ||
| 8600 | await saveChatConditional(); | ||
| 8601 | } | ||
| 8602 | |||
| 8603 | if (selected_group) { | ||
| 8604 | await createNewGroupChat(selected_group); | ||
| 8605 | if (deleteCurrentChat) await deleteGroupChat(selected_group, chat_file_for_del); | ||
| 8606 | } | ||
| 8607 | else { | ||
| 8608 | //RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedDateTime; | ||
| 8609 | chat_metadata = {}; | ||
| 8610 | characters[this_chid].chat = `${name2} - ${humanizedDateTime()}`; | ||
| 8611 | $('#selected_chat_pole').val(characters[this_chid].chat); | ||
| 8612 | await getChat(); | ||
| 8613 | await createOrEditCharacter(new CustomEvent('newChat')); | ||
| 8614 | if (deleteCurrentChat) await delChat(chat_file_for_del + '.jsonl'); | ||
| 8615 | } | ||
| 8616 | |||
| 8427 | } | 8617 | } |
| 8428 | 8618 | ||
| 8429 | async function doDeleteChat() { | 8619 | async function doDeleteChat() { |
| @@ -8432,23 +8622,25 @@ async function doDeleteChat() { | |||
| 8432 | $(currentChatDeleteButton).trigger('click'); | 8622 | $(currentChatDeleteButton).trigger('click'); |
| 8433 | await delay(1); | 8623 | await delay(1); |
| 8434 | $('#dialogue_popup_ok').trigger('click', { fromSlashCommand: true }); | 8624 | $('#dialogue_popup_ok').trigger('click', { fromSlashCommand: true }); |
| 8625 | return ''; | ||
| 8435 | } | 8626 | } |
| 8436 | 8627 | ||
| 8437 | async function doRenameChat(_, chatName) { | 8628 | async function doRenameChat(_, chatName) { |
| 8438 | if (!chatName) { | 8629 | if (!chatName) { |
| 8439 | toastr.warning('Name must be provided as an argument to rename this chat.'); | 8630 | toastr.warning('Name must be provided as an argument to rename this chat.'); |
| 8440 | return; | 8631 | return ''; |
| 8441 | } | 8632 | } |
| 8442 | 8633 | ||
| 8443 | const currentChatName = getCurrentChatId(); | 8634 | const currentChatName = getCurrentChatId(); |
| 8444 | if (!currentChatName) { | 8635 | if (!currentChatName) { |
| 8445 | toastr.warning('No chat selected that can be renamed.'); | 8636 | toastr.warning('No chat selected that can be renamed.'); |
| 8446 | return; | 8637 | return ''; |
| 8447 | } | 8638 | } |
| 8448 | 8639 | ||
| 8449 | await renameChat(currentChatName, chatName); | 8640 | await renameChat(currentChatName, chatName); |
| 8450 | 8641 | ||
| 8451 | toastr.success(`Successfully renamed chat to: ${chatName}`); | 8642 | toastr.success(`Successfully renamed chat to: ${chatName}`); |
| 8643 | return ''; | ||
| 8452 | } | 8644 | } |
| 8453 | 8645 | ||
| 8454 | /** | 8646 | /** |
| @@ -8522,6 +8714,7 @@ function doCharListDisplaySwitch() { | |||
| 8522 | 8714 | ||
| 8523 | function doCloseChat() { | 8715 | function doCloseChat() { |
| 8524 | $('#option_close_chat').trigger('click'); | 8716 | $('#option_close_chat').trigger('click'); |
| 8717 | return ''; | ||
| 8525 | } | 8718 | } |
| 8526 | 8719 | ||
| 8527 | /** | 8720 | /** |
| @@ -8531,13 +8724,11 @@ function doCloseChat() { | |||
| 8531 | * it proceeds to delete character from UI and saves settings. | 8724 | * it proceeds to delete character from UI and saves settings. |
| 8532 | * In case of error during the fetch request, it logs the error details. | 8725 | * In case of error during the fetch request, it logs the error details. |
| 8533 | * | 8726 | * |
| 8534 | * @param {string} popup_type - The type of popup currently active. | ||
| 8535 | * @param {string} this_chid - The character ID to be deleted. | 8727 | * @param {string} this_chid - The character ID to be deleted. |
| 8536 | * @param {boolean} delete_chats - Whether to delete chats or not. | 8728 | * @param {boolean} delete_chats - Whether to delete chats or not. |
| 8537 | */ | 8729 | */ |
| 8538 | export async function handleDeleteCharacter(popup_type, this_chid, delete_chats) { | 8730 | export async function handleDeleteCharacter(this_chid, delete_chats) { |
| 8539 | if (popup_type !== 'del_ch' || | 8731 | if (!characters[this_chid]) { |
| 8540 | !characters[this_chid]) { | ||
| 8541 | return; | 8732 | return; |
| 8542 | } | 8733 | } |
| 8543 | 8734 | ||
| @@ -8583,6 +8774,8 @@ export async function deleteCharacter(characterKey, { deleteChats = true } = {}) | |||
| 8583 | await eventSource.emit(event_types.CHAT_DELETED, name); | 8774 | await eventSource.emit(event_types.CHAT_DELETED, name); |
| 8584 | } | 8775 | } |
| 8585 | } | 8776 | } |
| 8777 | |||
| 8778 | eventSource.emit(event_types.CHARACTER_DELETED, { id: this_chid, character: characters[this_chid] }); | ||
| 8586 | } | 8779 | } |
| 8587 | 8780 | ||
| 8588 | /** | 8781 | /** |
| @@ -8617,6 +8810,7 @@ async function removeCharacterFromUI(name, avatar, reloadCharacters = true) { | |||
| 8617 | 8810 | ||
| 8618 | function doTogglePanels() { | 8811 | function doTogglePanels() { |
| 8619 | $('#option_settings').trigger('click'); | 8812 | $('#option_settings').trigger('click'); |
| 8813 | return ''; | ||
| 8620 | } | 8814 | } |
| 8621 | 8815 | ||
| 8622 | function addDebugFunctions() { | 8816 | function addDebugFunctions() { |
| @@ -8704,26 +8898,29 @@ jQuery(async function () { | |||
| 8704 | await saveSettings(); | 8898 | await saveSettings(); |
| 8705 | await saveChatConditional(); | 8899 | await saveChatConditional(); |
| 8706 | toastr.success('Chat and settings saved.'); | 8900 | toastr.success('Chat and settings saved.'); |
| 8901 | return ''; | ||
| 8707 | } | 8902 | } |
| 8708 | 8903 | ||
| 8904 | // Collect all unique API names in an array | ||
| 8905 | const uniqueAPIs = [...new Set(Object.values(CONNECT_API_MAP).map(x => x.selected))]; | ||
| 8906 | |||
| 8709 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ | 8907 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 8710 | name: 'dupe', | 8908 | name: 'dupe', |
| 8711 | callback: DupeChar, | 8909 | callback: duplicateCharacter, |
| 8712 | helpString: 'Duplicates the currently selected character.', | 8910 | helpString: 'Duplicates the currently selected character.', |
| 8713 | })); | 8911 | })); |
| 8714 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ | 8912 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 8715 | name: 'api', | 8913 | name: 'api', |
| 8716 | callback: connectAPISlash, | 8914 | callback: connectAPISlash, |
| 8717 | namedArgumentList: [], | ||
| 8718 | unnamedArgumentList: [ | 8915 | unnamedArgumentList: [ |
| 8719 | new SlashCommandArgument( | 8916 | SlashCommandArgument.fromProps({ |
| 8720 | 'API to connect to', | 8917 | description: 'API to connect to', |
| 8721 | [ARGUMENT_TYPE.STRING], | 8918 | typeList: [ARGUMENT_TYPE.STRING], |
| 8722 | true, | 8919 | isRequired: false, |
| 8723 | false, | 8920 | enumList: Object.entries(CONNECT_API_MAP).map(([api, { selected }]) => |
| 8724 | null, | 8921 | new SlashCommandEnumValue(api, selected, enumTypes.getBasedOnIndex(uniqueAPIs.findIndex(x => x === selected)), |
| 8725 | Object.keys(CONNECT_API_MAP), | 8922 | selected[0].toUpperCase() ?? enumIcons.default)), |
| 8726 | ), | 8923 | }), |
| 8727 | ], | 8924 | ], |
| 8728 | helpString: ` | 8925 | helpString: ` |
| 8729 | <div> | 8926 | <div> |
| @@ -8739,6 +8936,16 @@ jQuery(async function () { | |||
| 8739 | name: 'impersonate', | 8936 | name: 'impersonate', |
| 8740 | callback: doImpersonate, | 8937 | callback: doImpersonate, |
| 8741 | aliases: ['imp'], | 8938 | aliases: ['imp'], |
| 8939 | namedArgumentList: [ | ||
| 8940 | new SlashCommandNamedArgument( | ||
| 8941 | 'await', | ||
| 8942 | 'Whether to await for the triggered generation before continuing', | ||
| 8943 | [ARGUMENT_TYPE.BOOLEAN], | ||
| 8944 | false, | ||
| 8945 | false, | ||
| 8946 | 'false', | ||
| 8947 | ), | ||
| 8948 | ], | ||
| 8742 | unnamedArgumentList: [ | 8949 | unnamedArgumentList: [ |
| 8743 | new SlashCommandArgument( | 8950 | new SlashCommandArgument( |
| 8744 | 'prompt', [ARGUMENT_TYPE.STRING], false, | 8951 | 'prompt', [ARGUMENT_TYPE.STRING], false, |
| @@ -8749,6 +8956,9 @@ jQuery(async function () { | |||
| 8749 | Calls an impersonation response, with an optional additional prompt. | 8956 | Calls an impersonation response, with an optional additional prompt. |
| 8750 | </div> | 8957 | </div> |
| 8751 | <div> | 8958 | <div> |
| 8959 | If <code>await=true</code> named argument is passed, the command will wait for the impersonation to end before continuing. | ||
| 8960 | </div> | ||
| 8961 | <div> | ||
| 8752 | <strong>Example:</strong> | 8962 | <strong>Example:</strong> |
| 8753 | <ul> | 8963 | <ul> |
| 8754 | <li> | 8964 | <li> |
| @@ -8799,11 +9009,12 @@ jQuery(async function () { | |||
| 8799 | name: 'instruct', | 9009 | name: 'instruct', |
| 8800 | callback: selectInstructCallback, | 9010 | callback: selectInstructCallback, |
| 8801 | returns: 'current preset', | 9011 | returns: 'current preset', |
| 8802 | namedArgumentList: [], | ||
| 8803 | unnamedArgumentList: [ | 9012 | unnamedArgumentList: [ |
| 8804 | new SlashCommandArgument( | 9013 | SlashCommandArgument.fromProps({ |
| 8805 | 'name', [ARGUMENT_TYPE.STRING], false, | 9014 | description: 'instruct preset name', |
| 8806 | ), | 9015 | typeList: [ARGUMENT_TYPE.STRING], |
| 9016 | enumProvider: () => instruct_presets.map(preset => new SlashCommandEnumValue(preset.name, null, enumTypes.enum, enumIcons.preset)), | ||
| 9017 | }), | ||
| 8807 | ], | 9018 | ], |
| 8808 | helpString: ` | 9019 | helpString: ` |
| 8809 | <div> | 9020 | <div> |
| @@ -8834,15 +9045,20 @@ jQuery(async function () { | |||
| 8834 | callback: selectContextCallback, | 9045 | callback: selectContextCallback, |
| 8835 | returns: 'template name', | 9046 | returns: 'template name', |
| 8836 | unnamedArgumentList: [ | 9047 | unnamedArgumentList: [ |
| 8837 | new SlashCommandArgument( | 9048 | SlashCommandArgument.fromProps({ |
| 8838 | 'name', [ARGUMENT_TYPE.STRING], false, | 9049 | description: 'context preset name', |
| 8839 | ), | 9050 | typeList: [ARGUMENT_TYPE.STRING], |
| 9051 | enumProvider: () => context_presets.map(preset => new SlashCommandEnumValue(preset.name, null, enumTypes.enum, enumIcons.preset)), | ||
| 9052 | }), | ||
| 8840 | ], | 9053 | ], |
| 8841 | helpString: 'Selects context template by name. Gets the current template if no name is provided', | 9054 | helpString: 'Selects context template by name. Gets the current template if no name is provided', |
| 8842 | })); | 9055 | })); |
| 8843 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ | 9056 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 8844 | name: 'chat-manager', | 9057 | name: 'chat-manager', |
| 8845 | callback: () => $('#option_select_chat').trigger('click'), | 9058 | callback: () => { |
| 9059 | $('#option_select_chat').trigger('click'); | ||
| 9060 | return ''; | ||
| 9061 | }, | ||
| 8846 | aliases: ['chat-history', 'manage-chats'], | 9062 | aliases: ['chat-history', 'manage-chats'], |
| 8847 | helpString: 'Opens the chat manager for the current character/group.', | 9063 | helpString: 'Opens the chat manager for the current character/group.', |
| 8848 | })); | 9064 | })); |
| @@ -8863,7 +9079,7 @@ jQuery(async function () { | |||
| 8863 | $('#send_textarea').on('focusin focus click', () => { | 9079 | $('#send_textarea').on('focusin focus click', () => { |
| 8864 | S_TAPreviouslyFocused = true; | 9080 | S_TAPreviouslyFocused = true; |
| 8865 | }); | 9081 | }); |
| 8866 | $('#options_button, #send_but, #option_regenerate, #option_continue, #mes_continue').on('click', () => { | 9082 | $('#send_but, #option_regenerate, #option_continue, #mes_continue').on('click', () => { |
| 8867 | if (S_TAPreviouslyFocused) { | 9083 | if (S_TAPreviouslyFocused) { |
| 8868 | $('#send_textarea').focus(); | 9084 | $('#send_textarea').focus(); |
| 8869 | } | 9085 | } |
| @@ -8919,7 +9135,6 @@ jQuery(async function () { | |||
| 8919 | 9135 | ||
| 8920 | $('#rm_button_settings').click(function () { | 9136 | $('#rm_button_settings').click(function () { |
| 8921 | selected_button = 'settings'; | 9137 | selected_button = 'settings'; |
| 8922 | menu_type = 'settings'; | ||
| 8923 | selectRightMenuWithAnimation('rm_api_block'); | 9138 | selectRightMenuWithAnimation('rm_api_block'); |
| 8924 | }); | 9139 | }); |
| 8925 | $('#rm_button_characters').click(function () { | 9140 | $('#rm_button_characters').click(function () { |
| @@ -9041,12 +9256,6 @@ jQuery(async function () { | |||
| 9041 | $('#dialogue_popup').removeClass('wide_dialogue_popup'); | 9256 | $('#dialogue_popup').removeClass('wide_dialogue_popup'); |
| 9042 | }, animation_duration); | 9257 | }, animation_duration); |
| 9043 | 9258 | ||
| 9044 | // $("#shadow_popup").css("opacity:", 0.0); | ||
| 9045 | |||
| 9046 | if (popup_type == 'avatarToCrop') { | ||
| 9047 | dialogueResolve($('#avatarToCrop').data('cropper').getCroppedCanvas().toDataURL('image/jpeg')); | ||
| 9048 | } | ||
| 9049 | |||
| 9050 | if (popup_type == 'del_chat') { | 9259 | if (popup_type == 'del_chat') { |
| 9051 | //close past chat popup | 9260 | //close past chat popup |
| 9052 | $('#select_chat_cross').trigger('click'); | 9261 | $('#select_chat_cross').trigger('click'); |
| @@ -9068,56 +9277,9 @@ jQuery(async function () { | |||
| 9068 | }, 2000); | 9277 | }, 2000); |
| 9069 | } | 9278 | } |
| 9070 | } | 9279 | } |
| 9071 | if (popup_type == 'del_ch') { | ||
| 9072 | const deleteChats = !!$('#del_char_checkbox').prop('checked'); | ||
| 9073 | eventSource.emit(event_types.CHARACTER_DELETED, { id: this_chid, character: characters[this_chid] }); | ||
| 9074 | await handleDeleteCharacter(popup_type, this_chid, deleteChats); | ||
| 9075 | } | ||
| 9076 | if (popup_type == 'alternate_greeting' && menu_type !== 'create') { | 9280 | if (popup_type == 'alternate_greeting' && menu_type !== 'create') { |
| 9077 | createOrEditCharacter(); | 9281 | createOrEditCharacter(); |
| 9078 | } | 9282 | } |
| 9079 | if (popup_type === 'del_group') { | ||
| 9080 | const groupId = $('#dialogue_popup').data('group_id'); | ||
| 9081 | |||
| 9082 | if (groupId) { | ||
| 9083 | deleteGroup(groupId); | ||
| 9084 | } | ||
| 9085 | } | ||
| 9086 | //Make a new chat for selected character | ||
| 9087 | if ( | ||
| 9088 | popup_type == 'new_chat' && | ||
| 9089 | (selected_group || this_chid !== undefined) && | ||
| 9090 | menu_type != 'create' | ||
| 9091 | ) { | ||
| 9092 | //Fix it; New chat doesn't create while open create character menu | ||
| 9093 | await clearChat(); | ||
| 9094 | chat.length = 0; | ||
| 9095 | |||
| 9096 | chat_file_for_del = getCurrentChatDetails()?.sessionName; | ||
| 9097 | const isDelChatCheckbox = document.getElementById('del_chat_checkbox')?.checked; | ||
| 9098 | |||
| 9099 | // Make it easier to find in backups | ||
| 9100 | if (isDelChatCheckbox) { | ||
| 9101 | await saveChatConditional(); | ||
| 9102 | } | ||
| 9103 | |||
| 9104 | if (selected_group) { | ||
| 9105 | await createNewGroupChat(selected_group); | ||
| 9106 | if (isDelChatCheckbox) await deleteGroupChat(selected_group, chat_file_for_del); | ||
| 9107 | } | ||
| 9108 | else { | ||
| 9109 | //RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedDateTime; | ||
| 9110 | chat_metadata = {}; | ||
| 9111 | characters[this_chid].chat = `${name2} - ${humanizedDateTime()}`; | ||
| 9112 | $('#selected_chat_pole').val(characters[this_chid].chat); | ||
| 9113 | await getChat(); | ||
| 9114 | await createOrEditCharacter(); | ||
| 9115 | if (isDelChatCheckbox) await delChat(chat_file_for_del + '.jsonl'); | ||
| 9116 | } | ||
| 9117 | } | ||
| 9118 | |||
| 9119 | rawPromptPopper.update(); | ||
| 9120 | $('#rawPromptPopup').hide(); | ||
| 9121 | 9283 | ||
| 9122 | if (dialogueResolve) { | 9284 | if (dialogueResolve) { |
| 9123 | if (popup_type == 'input') { | 9285 | if (popup_type == 'input') { |
| @@ -9163,15 +9325,27 @@ jQuery(async function () { | |||
| 9163 | 9325 | ||
| 9164 | $('#form_create').submit(createOrEditCharacter); | 9326 | $('#form_create').submit(createOrEditCharacter); |
| 9165 | 9327 | ||
| 9166 | $('#delete_button').on('click', function () { | 9328 | $('#delete_button').on('click', async function () { |
| 9167 | callPopup(` | 9329 | if (!this_chid) { |
| 9168 | <h3>Delete the character?</h3> | 9330 | toastr.warning('No character selected.'); |
| 9331 | return; | ||
| 9332 | } | ||
| 9333 | |||
| 9334 | let deleteChats = false; | ||
| 9335 | |||
| 9336 | const confirm = await Popup.show.confirm('Delete the character?', ` | ||
| 9169 | <b>THIS IS PERMANENT!<br><br> | 9337 | <b>THIS IS PERMANENT!<br><br> |
| 9170 | <label for="del_char_checkbox" class="checkbox_label justifyCenter"> | 9338 | <label for="del_char_checkbox" class="checkbox_label justifyCenter"> |
| 9171 | <input type="checkbox" id="del_char_checkbox" /> | 9339 | <input type="checkbox" id="del_char_checkbox" /> |
| 9172 | <small>Also delete the chat files</small> | 9340 | <small>Also delete the chat files</small> |
| 9173 | </label><br></b>`, 'del_ch', '', | 9341 | </label></b>`, { |
| 9174 | ); | 9342 | onClose: () => deleteChats = !!$('#del_char_checkbox').prop('checked'), |
| 9343 | }); | ||
| 9344 | if (!confirm) { | ||
| 9345 | return; | ||
| 9346 | } | ||
| 9347 | |||
| 9348 | await deleteCharacter(characters[this_chid].avatar, { deleteChats: deleteChats }); | ||
| 9175 | }); | 9349 | }); |
| 9176 | 9350 | ||
| 9177 | //////// OPTIMIZED ALL CHAR CREATION/EDITING TEXTAREA LISTENERS /////////////// | 9351 | //////// OPTIMIZED ALL CHAR CREATION/EDITING TEXTAREA LISTENERS /////////////// |
| @@ -9322,6 +9496,8 @@ jQuery(async function () { | |||
| 9322 | { id: 'api_key_openrouter-tg', secret: SECRET_KEYS.OPENROUTER }, | 9496 | { id: 'api_key_openrouter-tg', secret: SECRET_KEYS.OPENROUTER }, |
| 9323 | { id: 'api_key_koboldcpp', secret: SECRET_KEYS.KOBOLDCPP }, | 9497 | { id: 'api_key_koboldcpp', secret: SECRET_KEYS.KOBOLDCPP }, |
| 9324 | { id: 'api_key_llamacpp', secret: SECRET_KEYS.LLAMACPP }, | 9498 | { id: 'api_key_llamacpp', secret: SECRET_KEYS.LLAMACPP }, |
| 9499 | { id: 'api_key_featherless', secret: SECRET_KEYS.FEATHERLESS }, | ||
| 9500 | { id: 'api_key_huggingface', secret: SECRET_KEYS.HUGGINGFACE }, | ||
| 9325 | ]; | 9501 | ]; |
| 9326 | 9502 | ||
| 9327 | for (const key of keys) { | 9503 | for (const key of keys) { |
| @@ -9373,7 +9549,7 @@ jQuery(async function () { | |||
| 9373 | } | 9549 | } |
| 9374 | 9550 | ||
| 9375 | function isMouseOverButtonOrMenu() { | 9551 | function isMouseOverButtonOrMenu() { |
| 9376 | return menu.is(':hover') || button.is(':hover'); | 9552 | return menu.is(':hover, :focus-within') || button.is(':hover, :focus'); |
| 9377 | } | 9553 | } |
| 9378 | 9554 | ||
| 9379 | button.on('click', function () { | 9555 | button.on('click', function () { |
| @@ -9433,14 +9609,20 @@ jQuery(async function () { | |||
| 9433 | 9609 | ||
| 9434 | else if (id == 'option_start_new_chat') { | 9610 | else if (id == 'option_start_new_chat') { |
| 9435 | if ((selected_group || this_chid !== undefined) && !is_send_press) { | 9611 | if ((selected_group || this_chid !== undefined) && !is_send_press) { |
| 9436 | callPopup(` | 9612 | let deleteCurrentChat = false; |
| 9437 | <h3>Start new chat?</h3><br> | 9613 | const result = await Popup.show.confirm('Start new chat?', ` |
| 9438 | <label for="del_chat_checkbox" class="checkbox_label justifyCenter" | 9614 | <label for="del_chat_checkbox" class="checkbox_label justifyCenter" |
| 9439 | title="If necessary, you can later restore this chat file from the /backups folder"> | 9615 | title="If necessary, you can later restore this chat file from the /backups folder"> |
| 9440 | <input type="checkbox" id="del_chat_checkbox" /> | 9616 | <input type="checkbox" id="del_chat_checkbox" /> |
| 9441 | <small>Also delete the current chat file</small> | 9617 | <small>Also delete the current chat file</small> |
| 9442 | </label><br> | 9618 | </label>`, { |
| 9443 | `, 'new_chat', ''); | 9619 | onClose: () => deleteCurrentChat = !!$('#del_chat_checkbox').prop('checked'), |
| 9620 | }); | ||
| 9621 | if (!result) { | ||
| 9622 | return; | ||
| 9623 | } | ||
| 9624 | |||
| 9625 | await doNewChat({ deleteCurrentChat: deleteCurrentChat }); | ||
| 9444 | } | 9626 | } |
| 9445 | } | 9627 | } |
| 9446 | 9628 | ||
| @@ -9709,43 +9891,12 @@ jQuery(async function () { | |||
| 9709 | }); | 9891 | }); |
| 9710 | } | 9892 | } |
| 9711 | 9893 | ||
| 9712 | $(document).on('pointerup', '.mes_prompt', function () { | 9894 | $(document).on('pointerup', '.mes_prompt', async function () { |
| 9713 | let mesIdForItemization = $(this).closest('.mes').attr('mesId'); | 9895 | let mesIdForItemization = $(this).closest('.mes').attr('mesId'); |
| 9714 | console.log(`looking for mesID: ${mesIdForItemization}`); | 9896 | console.log(`looking for mesID: ${mesIdForItemization}`); |
| 9715 | if (itemizedPrompts.length !== undefined && itemizedPrompts.length !== 0) { | 9897 | if (itemizedPrompts.length !== undefined && itemizedPrompts.length !== 0) { |
| 9716 | promptItemize(itemizedPrompts, mesIdForItemization); | 9898 | await promptItemize(itemizedPrompts, mesIdForItemization); |
| 9717 | } | ||
| 9718 | }); | ||
| 9719 | |||
| 9720 | $(document).on('pointerup', '#copyPromptToClipboard', function () { | ||
| 9721 | let rawPrompt = itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt; | ||
| 9722 | let rawPromptValues = rawPrompt; | ||
| 9723 | |||
| 9724 | if (Array.isArray(rawPrompt)) { | ||
| 9725 | rawPromptValues = rawPrompt.map(x => x.content).join('\n'); | ||
| 9726 | } | ||
| 9727 | |||
| 9728 | navigator.clipboard.writeText(rawPromptValues); | ||
| 9729 | toastr.info('Copied!', '', { timeOut: 2000 }); | ||
| 9730 | }); | ||
| 9731 | |||
| 9732 | $(document).on('pointerup', '#showRawPrompt', function () { | ||
| 9733 | //console.log(itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt); | ||
| 9734 | console.log(PromptArrayItemForRawPromptDisplay); | ||
| 9735 | console.log(itemizedPrompts); | ||
| 9736 | console.log(itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt); | ||
| 9737 | |||
| 9738 | let rawPrompt = itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt; | ||
| 9739 | let rawPromptValues = rawPrompt; | ||
| 9740 | |||
| 9741 | if (Array.isArray(rawPrompt)) { | ||
| 9742 | rawPromptValues = rawPrompt.map(x => x.content).join('\n'); | ||
| 9743 | } | 9899 | } |
| 9744 | |||
| 9745 | //let DisplayStringifiedPrompt = JSON.stringify(itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt).replace(/\n+/g, '<br>'); | ||
| 9746 | $('#rawPromptWrapper').text(rawPromptValues); | ||
| 9747 | rawPromptPopper.update(); | ||
| 9748 | $('#rawPromptPopup').toggle(); | ||
| 9749 | }); | 9900 | }); |
| 9750 | 9901 | ||
| 9751 | //******************** | 9902 | //******************** |
| @@ -9952,7 +10103,7 @@ jQuery(async function () { | |||
| 9952 | }); | 10103 | }); |
| 9953 | 10104 | ||
| 9954 | $(document).on('click', '.mes_edit_copy', async function () { | 10105 | $(document).on('click', '.mes_edit_copy', async function () { |
| 9955 | const confirmation = await callPopup('Create a copy of this message?', 'confirm'); | 10106 | const confirmation = await callGenericPopup('Create a copy of this message?', POPUP_TYPE.CONFIRM); |
| 9956 | if (!confirmation) { | 10107 | if (!confirmation) { |
| 9957 | return; | 10108 | return; |
| 9958 | } | 10109 | } |
| @@ -9978,24 +10129,33 @@ jQuery(async function () { | |||
| 9978 | 10129 | ||
| 9979 | $(document).on('click', '.mes_edit_delete', async function (event, customData) { | 10130 | $(document).on('click', '.mes_edit_delete', async function (event, customData) { |
| 9980 | const fromSlashCommand = customData?.fromSlashCommand || false; | 10131 | const fromSlashCommand = customData?.fromSlashCommand || false; |
| 9981 | const swipeExists = (!Array.isArray(chat[this_edit_mes_id].swipes) || chat[this_edit_mes_id].swipes.length <= 1 || chat[this_edit_mes_id].is_user || parseInt(this_edit_mes_id) !== chat.length - 1); | 10132 | const canDeleteSwipe = (Array.isArray(chat[this_edit_mes_id].swipes) && chat[this_edit_mes_id].swipes.length > 1 && !chat[this_edit_mes_id].is_user && parseInt(this_edit_mes_id) === chat.length - 1); |
| 10133 | |||
| 10134 | let deleteOnlySwipe = false; | ||
| 9982 | if (power_user.confirm_message_delete && fromSlashCommand !== true) { | 10135 | if (power_user.confirm_message_delete && fromSlashCommand !== true) { |
| 9983 | const confirmation = swipeExists ? await callPopup('Are you sure you want to delete this message?', 'confirm') | 10136 | const result = await callGenericPopup('Are you sure you want to delete this message?', POPUP_TYPE.CONFIRM, null, { |
| 9984 | : await callPopup('<h3>Delete this...</h3> <select id=\'del_type\'><option value=\'swipe\'>Swipe</option><option value=\'message\'>Message</option></select>', 'confirm'); | 10137 | okButton: canDeleteSwipe ? 'Delete Swipe' : 'Delete Message', |
| 9985 | if (!confirmation) { | 10138 | cancelButton: 'Cancel', |
| 10139 | customButtons: canDeleteSwipe ? ['Delete Message'] : null, | ||
| 10140 | }); | ||
| 10141 | if (!result) { | ||
| 9986 | return; | 10142 | return; |
| 9987 | } | 10143 | } |
| 10144 | deleteOnlySwipe = canDeleteSwipe && result === 1; // Default button, not the custom one | ||
| 9988 | } | 10145 | } |
| 9989 | 10146 | ||
| 9990 | const mes = $(this).closest('.mes'); | 10147 | const messageElement = $(this).closest('.mes'); |
| 9991 | 10148 | if (!messageElement) { | |
| 9992 | if (!mes) { | ||
| 9993 | return; | 10149 | return; |
| 9994 | } | 10150 | } |
| 9995 | 10151 | ||
| 9996 | if ($('#del_type').val() === 'swipe') { | 10152 | if (deleteOnlySwipe) { |
| 9997 | const swipe_id = chat[this_edit_mes_id]['swipe_id']; | 10153 | const message = chat[this_edit_mes_id]; |
| 9998 | chat[this_edit_mes_id]['swipes'].splice(swipe_id, 1); | 10154 | const swipe_id = message.swipe_id; |
| 10155 | message.swipes.splice(swipe_id, 1); | ||
| 10156 | if (Array.isArray(message.swipe_info) && message.swipe_info.length) { | ||
| 10157 | message.swipe_info.splice(swipe_id, 1); | ||
| 10158 | } | ||
| 9999 | if (swipe_id > 0) { | 10159 | if (swipe_id > 0) { |
| 10000 | $('.swipe_left:last').click(); | 10160 | $('.swipe_left:last').click(); |
| 10001 | } else { | 10161 | } else { |
| @@ -10003,7 +10163,7 @@ jQuery(async function () { | |||
| 10003 | } | 10163 | } |
| 10004 | } else { | 10164 | } else { |
| 10005 | chat.splice(this_edit_mes_id, 1); | 10165 | chat.splice(this_edit_mes_id, 1); |
| 10006 | mes.remove(); | 10166 | messageElement.remove(); |
| 10007 | } | 10167 | } |
| 10008 | 10168 | ||
| 10009 | let startFromZero = Number(this_edit_mes_id) === 0; | 10169 | let startFromZero = Number(this_edit_mes_id) === 0; |
| @@ -10134,7 +10294,7 @@ jQuery(async function () { | |||
| 10134 | }); | 10294 | }); |
| 10135 | 10295 | ||
| 10136 | $('#dupe_button').click(async function () { | 10296 | $('#dupe_button').click(async function () { |
| 10137 | await DupeChar(); | 10297 | await duplicateCharacter(); |
| 10138 | }); | 10298 | }); |
| 10139 | 10299 | ||
| 10140 | $(document).on('click', '.select_chat_block, .bookmark_link, .mes_bookmark', async function () { | 10300 | $(document).on('click', '.select_chat_block, .bookmark_link, .mes_bookmark', async function () { |
| @@ -10273,7 +10433,7 @@ jQuery(async function () { | |||
| 10273 | '#character_cross', | 10433 | '#character_cross', |
| 10274 | '#avatar-and-name-block', | 10434 | '#avatar-and-name-block', |
| 10275 | '#shadow_popup', | 10435 | '#shadow_popup', |
| 10276 | '.shadow_popup', | 10436 | '.popup', |
| 10277 | '#world_popup', | 10437 | '#world_popup', |
| 10278 | '.ui-widget', | 10438 | '.ui-widget', |
| 10279 | '.text_pole', | 10439 | '.text_pole', |
| @@ -10484,7 +10644,7 @@ jQuery(async function () { | |||
| 10484 | } | 10644 | } |
| 10485 | } break; | 10645 | } break; |
| 10486 | case 'import_tags': { | 10646 | case 'import_tags': { |
| 10487 | await importTags(characters[this_chid]); | 10647 | await importTags(characters[this_chid], { forceShow: true }); |
| 10488 | } break; | 10648 | } break; |
| 10489 | /*case 'delete_button': | 10649 | /*case 'delete_button': |
| 10490 | popup_type = "del_ch"; | 10650 | popup_type = "del_ch"; |
| @@ -10578,7 +10738,7 @@ jQuery(async function () { | |||
| 10578 | const html = await renderTemplateAsync('importCharacters'); | 10738 | const html = await renderTemplateAsync('importCharacters'); |
| 10579 | 10739 | ||
| 10580 | /** @type {string?} */ | 10740 | /** @type {string?} */ |
| 10581 | const input = await callGenericPopup(html, POPUP_TYPE.INPUT, '', { wider: true, okButton: $('#shadow_popup_template').attr('popup_text_import'), rows: 4 }); | 10741 | const input = await callGenericPopup(html, POPUP_TYPE.INPUT, '', { wider: true, okButton: $('#popup_template').attr('popup-button-import'), rows: 4 }); |
| 10582 | 10742 | ||
| 10583 | if (!input) { | 10743 | if (!input) { |
| 10584 | console.debug('Custom content import cancelled'); | 10744 | console.debug('Custom content import cancelled'); |
| @@ -10633,32 +10793,12 @@ jQuery(async function () { | |||
| 10633 | } | 10793 | } |
| 10634 | }); | 10794 | }); |
| 10635 | 10795 | ||
| 10636 | const $dropzone = $(document.body); | 10796 | charDragDropHandler = new DragAndDropHandler('body', async (files, event) => { |
| 10637 | |||
| 10638 | $dropzone.on('dragover', (event) => { | ||
| 10639 | event.preventDefault(); | ||
| 10640 | event.stopPropagation(); | ||
| 10641 | $dropzone.addClass('dragover'); | ||
| 10642 | }); | ||
| 10643 | |||
| 10644 | $dropzone.on('dragleave', (event) => { | ||
| 10645 | event.preventDefault(); | ||
| 10646 | event.stopPropagation(); | ||
| 10647 | $dropzone.removeClass('dragover'); | ||
| 10648 | }); | ||
| 10649 | |||
| 10650 | $dropzone.on('drop', async (event) => { | ||
| 10651 | event.preventDefault(); | ||
| 10652 | event.stopPropagation(); | ||
| 10653 | $dropzone.removeClass('dragover'); | ||
| 10654 | |||
| 10655 | const files = Array.from(event.originalEvent.dataTransfer.files); | ||
| 10656 | if (!files.length) { | 10797 | if (!files.length) { |
| 10657 | await importFromURL(event.originalEvent.dataTransfer.items, files); | 10798 | await importFromURL(event.originalEvent.dataTransfer.items, files); |
| 10658 | } | 10799 | } |
| 10659 | await processDroppedFiles(files); | 10800 | await processDroppedFiles(files); |
| 10660 | }); | 10801 | }, { noAnimation: true }); |
| 10661 | |||
| 10662 | 10802 | ||
| 10663 | $('#charListGridToggle').on('click', async () => { | 10803 | $('#charListGridToggle').on('click', async () => { |
| 10664 | doCharListDisplaySwitch(); | 10804 | doCharListDisplaySwitch(); |
| @@ -686,6 +686,23 @@ class PromptManager { | |||
| 686 | } | 686 | } |
| 687 | 687 | ||
| 688 | /** | 688 | /** |
| 689 | * Get the scroll position of the prompt manager | ||
| 690 | * @returns {number} - Scroll position of the prompt manager | ||
| 691 | */ | ||
| 692 | #getScrollPosition() { | ||
| 693 | return document.getElementById(this.configuration.prefix + 'prompt_manager')?.closest('.scrollableInner')?.scrollTop; | ||
| 694 | } | ||
| 695 | |||
| 696 | /** | ||
| 697 | * Set the scroll position of the prompt manager | ||
| 698 | * @param {number} scrollPosition - The scroll position to set | ||
| 699 | */ | ||
| 700 | #setScrollPosition(scrollPosition) { | ||
| 701 | if (scrollPosition === undefined || scrollPosition === null) return; | ||
| 702 | document.getElementById(this.configuration.prefix + 'prompt_manager')?.closest('.scrollableInner')?.scrollTo(0, scrollPosition); | ||
| 703 | } | ||
| 704 | |||
| 705 | /** | ||
| 689 | * Main rendering function | 706 | * Main rendering function |
| 690 | * | 707 | * |
| 691 | * @param afterTryGenerate - Whether a dry run should be attempted before rendering | 708 | * @param afterTryGenerate - Whether a dry run should be attempted before rendering |
| @@ -703,17 +720,21 @@ class PromptManager { | |||
| 703 | this.tryGenerate().finally(async () => { | 720 | this.tryGenerate().finally(async () => { |
| 704 | this.profileEnd('filling context'); | 721 | this.profileEnd('filling context'); |
| 705 | this.profileStart('render'); | 722 | this.profileStart('render'); |
| 723 | const scrollPosition = this.#getScrollPosition(); | ||
| 706 | await this.renderPromptManager(); | 724 | await this.renderPromptManager(); |
| 707 | await this.renderPromptManagerListItems(); | 725 | await this.renderPromptManagerListItems(); |
| 708 | this.makeDraggable(); | 726 | this.makeDraggable(); |
| 727 | this.#setScrollPosition(scrollPosition); | ||
| 709 | this.profileEnd('render'); | 728 | this.profileEnd('render'); |
| 710 | }); | 729 | }); |
| 711 | } else { | 730 | } else { |
| 712 | // Executed during live communication | 731 | // Executed during live communication |
| 713 | this.profileStart('render'); | 732 | this.profileStart('render'); |
| 733 | const scrollPosition = this.#getScrollPosition(); | ||
| 714 | await this.renderPromptManager(); | 734 | await this.renderPromptManager(); |
| 715 | await this.renderPromptManagerListItems(); | 735 | await this.renderPromptManagerListItems(); |
| 716 | this.makeDraggable(); | 736 | this.makeDraggable(); |
| 737 | this.#setScrollPosition(scrollPosition); | ||
| 717 | this.profileEnd('render'); | 738 | this.profileEnd('render'); |
| 718 | } | 739 | } |
| 719 | }).catch(() => { | 740 | }).catch(() => { |
| @@ -16,7 +16,6 @@ import { | |||
| 16 | eventSource, | 16 | eventSource, |
| 17 | menu_type, | 17 | menu_type, |
| 18 | substituteParams, | 18 | substituteParams, |
| 19 | callPopup, | ||
| 20 | sendTextareaMessage, | 19 | sendTextareaMessage, |
| 21 | } from '../script.js'; | 20 | } from '../script.js'; |
| 22 | 21 | ||
| @@ -39,6 +38,7 @@ import { textgen_types, textgenerationwebui_settings as textgen_settings, getTex | |||
| 39 | import { debounce_timeout } from './constants.js'; | 38 | import { debounce_timeout } from './constants.js'; |
| 40 | 39 | ||
| 41 | import Bowser from '../lib/bowser.min.js'; | 40 | import Bowser from '../lib/bowser.min.js'; |
| 41 | import { Popup } from './popup.js'; | ||
| 42 | 42 | ||
| 43 | var RPanelPin = document.getElementById('rm_button_panel_pin'); | 43 | var RPanelPin = document.getElementById('rm_button_panel_pin'); |
| 44 | var LPanelPin = document.getElementById('lm_button_panel_pin'); | 44 | var LPanelPin = document.getElementById('lm_button_panel_pin'); |
| @@ -303,7 +303,7 @@ export async function favsToHotswap() { | |||
| 303 | return; | 303 | return; |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | buildAvatarList(container, favs, { selectable: true, highlightFavs: false }); | 306 | buildAvatarList(container, favs, { interactable: true, highlightFavs: false }); |
| 307 | } | 307 | } |
| 308 | 308 | ||
| 309 | //changes input bar and send button display depending on connection status | 309 | //changes input bar and send button display depending on connection status |
| @@ -360,6 +360,7 @@ function RA_autoconnect(PrevApi) { | |||
| 360 | || (textgen_settings.type === textgen_types.INFERMATICAI && secret_state[SECRET_KEYS.INFERMATICAI]) | 360 | || (textgen_settings.type === textgen_types.INFERMATICAI && secret_state[SECRET_KEYS.INFERMATICAI]) |
| 361 | || (textgen_settings.type === textgen_types.DREAMGEN && secret_state[SECRET_KEYS.DREAMGEN]) | 361 | || (textgen_settings.type === textgen_types.DREAMGEN && secret_state[SECRET_KEYS.DREAMGEN]) |
| 362 | || (textgen_settings.type === textgen_types.OPENROUTER && secret_state[SECRET_KEYS.OPENROUTER]) | 362 | || (textgen_settings.type === textgen_types.OPENROUTER && secret_state[SECRET_KEYS.OPENROUTER]) |
| 363 | || (textgen_settings.type === textgen_types.FEATHERLESS && secret_state[SECRET_KEYS.FEATHERLESS]) | ||
| 363 | ) { | 364 | ) { |
| 364 | $('#api_button_textgenerationwebui').trigger('click'); | 365 | $('#api_button_textgenerationwebui').trigger('click'); |
| 365 | } | 366 | } |
| @@ -379,6 +380,7 @@ function RA_autoconnect(PrevApi) { | |||
| 379 | || (secret_state[SECRET_KEYS.COHERE] && oai_settings.chat_completion_source == chat_completion_sources.COHERE) | 380 | || (secret_state[SECRET_KEYS.COHERE] && oai_settings.chat_completion_source == chat_completion_sources.COHERE) |
| 380 | || (secret_state[SECRET_KEYS.PERPLEXITY] && oai_settings.chat_completion_source == chat_completion_sources.PERPLEXITY) | 381 | || (secret_state[SECRET_KEYS.PERPLEXITY] && oai_settings.chat_completion_source == chat_completion_sources.PERPLEXITY) |
| 381 | || (secret_state[SECRET_KEYS.GROQ] && oai_settings.chat_completion_source == chat_completion_sources.GROQ) | 382 | || (secret_state[SECRET_KEYS.GROQ] && oai_settings.chat_completion_source == chat_completion_sources.GROQ) |
| 383 | || (secret_state[SECRET_KEYS.ZEROONEAI] && oai_settings.chat_completion_source == chat_completion_sources.ZEROONEAI) | ||
| 382 | || (isValidUrl(oai_settings.custom_url) && oai_settings.chat_completion_source == chat_completion_sources.CUSTOM) | 384 | || (isValidUrl(oai_settings.custom_url) && oai_settings.chat_completion_source == chat_completion_sources.CUSTOM) |
| 383 | ) { | 385 | ) { |
| 384 | $('#api_button_openai').trigger('click'); | 386 | $('#api_button_openai').trigger('click'); |
| @@ -476,8 +478,8 @@ export function dragElement(elmnt) { | |||
| 476 | } | 478 | } |
| 477 | 479 | ||
| 478 | const style = getComputedStyle(target); | 480 | const style = getComputedStyle(target); |
| 479 | height = parseInt(style.height) | 481 | height = parseInt(style.height); |
| 480 | width = parseInt(style.width) | 482 | width = parseInt(style.width); |
| 481 | top = parseInt(style.top); | 483 | top = parseInt(style.top); |
| 482 | left = parseInt(style.left); | 484 | left = parseInt(style.left); |
| 483 | right = parseInt(style.right); | 485 | right = parseInt(style.right); |
| @@ -723,6 +725,10 @@ export function initRossMods() { | |||
| 723 | RA_autoconnect(); | 725 | RA_autoconnect(); |
| 724 | } | 726 | } |
| 725 | 727 | ||
| 728 | if (getParsedUA()?.os?.name === 'iOS') { | ||
| 729 | document.body.classList.add('ios'); | ||
| 730 | } | ||
| 731 | |||
| 726 | $('#main_api').change(function () { | 732 | $('#main_api').change(function () { |
| 727 | var PrevAPI = main_api; | 733 | var PrevAPI = main_api; |
| 728 | setTimeout(() => RA_autoconnect(PrevAPI), 100); | 734 | setTimeout(() => RA_autoconnect(PrevAPI), 100); |
| @@ -926,8 +932,8 @@ export function initRossMods() { | |||
| 926 | return false; | 932 | return false; |
| 927 | } | 933 | } |
| 928 | 934 | ||
| 929 | $(document).on('keydown', function (event) { | 935 | $(document).on('keydown', async function (event) { |
| 930 | processHotkeys(event.originalEvent); | 936 | await processHotkeys(event.originalEvent); |
| 931 | }); | 937 | }); |
| 932 | 938 | ||
| 933 | const hotkeyTargets = { | 939 | const hotkeyTargets = { |
| @@ -939,7 +945,7 @@ export function initRossMods() { | |||
| 939 | /** | 945 | /** |
| 940 | * @param {KeyboardEvent} event | 946 | * @param {KeyboardEvent} event |
| 941 | */ | 947 | */ |
| 942 | function processHotkeys(event) { | 948 | async function processHotkeys(event) { |
| 943 | //Enter to send when send_textarea in focus | 949 | //Enter to send when send_textarea in focus |
| 944 | if (document.activeElement == hotkeyTargets['send_textarea']) { | 950 | if (document.activeElement == hotkeyTargets['send_textarea']) { |
| 945 | const sendOnEnter = shouldSendOnEnter(); | 951 | const sendOnEnter = shouldSendOnEnter(); |
| @@ -1003,20 +1009,17 @@ export function initRossMods() { | |||
| 1003 | if (skipConfirm) { | 1009 | if (skipConfirm) { |
| 1004 | doRegenerate(); | 1010 | doRegenerate(); |
| 1005 | } else { | 1011 | } else { |
| 1006 | const popupText = ` | 1012 | let regenerateWithCtrlEnter = false; |
| 1007 | <div class="marginBot10">Are you sure you want to regenerate the latest message?</div> | 1013 | const result = await Popup.show.confirm('Regenerate Message', 'Are you sure you want to regenerate the latest message?', { |
| 1008 | <label class="checkbox_label justifyCenter" for="regenerateWithCtrlEnter"> | 1014 | customInputs: [{ id: 'regenerateWithCtrlEnter', label: 'Don\'t ask again' }], |
| 1009 | <input type="checkbox" id="regenerateWithCtrlEnter"> | 1015 | onClose: (popup) => regenerateWithCtrlEnter = popup.inputResults.get('regenerateWithCtrlEnter') ?? false, |
| 1010 | Don't ask again | 1016 | }); |
| 1011 | </label>`; | ||
| 1012 | callPopup(popupText, 'confirm').then(result => { | ||
| 1013 | if (!result) { | 1017 | if (!result) { |
| 1014 | return; | 1018 | return; |
| 1015 | } | 1019 | } |
| 1016 | const regenerateWithCtrlEnter = $('#regenerateWithCtrlEnter').prop('checked'); | 1020 | |
| 1017 | SaveLocal(skipConfirmKey, regenerateWithCtrlEnter); | 1021 | SaveLocal(skipConfirmKey, regenerateWithCtrlEnter); |
| 1018 | doRegenerate(); | 1022 | doRegenerate(); |
| 1019 | }); | ||
| 1020 | } | 1023 | } |
| 1021 | return; | 1024 | return; |
| 1022 | } else { | 1025 | } else { |
| @@ -1096,6 +1099,9 @@ export function initRossMods() { | |||
| 1096 | } | 1099 | } |
| 1097 | 1100 | ||
| 1098 | if (event.key == 'Escape') { //closes various panels | 1101 | if (event.key == 'Escape') { //closes various panels |
| 1102 | // Do not close panels if we are currently inside a popup | ||
| 1103 | if (Popup.util.isPopupOpen()) | ||
| 1104 | return; | ||
| 1099 | 1105 | ||
| 1100 | //dont override Escape hotkey functions from script.js | 1106 | //dont override Escape hotkey functions from script.js |
| 1101 | //"close edit box" and "cancel stream generation". | 1107 | //"close edit box" and "cancel stream generation". |
| @@ -38,6 +38,7 @@ const chara_note_position = { | |||
| 38 | function setNoteTextCommand(_, text) { | 38 | function setNoteTextCommand(_, text) { |
| 39 | $('#extension_floating_prompt').val(text).trigger('input'); | 39 | $('#extension_floating_prompt').val(text).trigger('input'); |
| 40 | toastr.success('Author\'s Note text updated'); | 40 | toastr.success('Author\'s Note text updated'); |
| 41 | return ''; | ||
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | function setNoteDepthCommand(_, text) { | 44 | function setNoteDepthCommand(_, text) { |
| @@ -50,6 +51,7 @@ function setNoteDepthCommand(_, text) { | |||
| 50 | 51 | ||
| 51 | $('#extension_floating_depth').val(Math.abs(value)).trigger('input'); | 52 | $('#extension_floating_depth').val(Math.abs(value)).trigger('input'); |
| 52 | toastr.success('Author\'s Note depth updated'); | 53 | toastr.success('Author\'s Note depth updated'); |
| 54 | return ''; | ||
| 53 | } | 55 | } |
| 54 | 56 | ||
| 55 | function setNoteIntervalCommand(_, text) { | 57 | function setNoteIntervalCommand(_, text) { |
| @@ -62,6 +64,7 @@ function setNoteIntervalCommand(_, text) { | |||
| 62 | 64 | ||
| 63 | $('#extension_floating_interval').val(Math.abs(value)).trigger('input'); | 65 | $('#extension_floating_interval').val(Math.abs(value)).trigger('input'); |
| 64 | toastr.success('Author\'s Note frequency updated'); | 66 | toastr.success('Author\'s Note frequency updated'); |
| 67 | return ''; | ||
| 65 | } | 68 | } |
| 66 | 69 | ||
| 67 | function setNotePositionCommand(_, text) { | 70 | function setNotePositionCommand(_, text) { |
| @@ -79,6 +82,7 @@ function setNotePositionCommand(_, text) { | |||
| 79 | 82 | ||
| 80 | $(`input[name="extension_floating_position"][value="${position}"]`).prop('checked', true).trigger('input'); | 83 | $(`input[name="extension_floating_position"][value="${position}"]`).prop('checked', true).trigger('input'); |
| 81 | toastr.info('Author\'s Note position updated'); | 84 | toastr.info('Author\'s Note position updated'); |
| 85 | return ''; | ||
| 82 | } | 86 | } |
| 83 | 87 | ||
| 84 | function updateSettings() { | 88 | function updateSettings() { |
| @@ -6,6 +6,7 @@ import { BlankAutoCompleteOption } from './BlankAutoCompleteOption.js'; | |||
| 6 | // eslint-disable-next-line no-unused-vars | 6 | // eslint-disable-next-line no-unused-vars |
| 7 | import { AutoCompleteNameResult } from './AutoCompleteNameResult.js'; | 7 | import { AutoCompleteNameResult } from './AutoCompleteNameResult.js'; |
| 8 | import { AutoCompleteSecondaryNameResult } from './AutoCompleteSecondaryNameResult.js'; | 8 | import { AutoCompleteSecondaryNameResult } from './AutoCompleteSecondaryNameResult.js'; |
| 9 | import { Popup, getTopmostModalLayer } from '../popup.js'; | ||
| 9 | 10 | ||
| 10 | /**@readonly*/ | 11 | /**@readonly*/ |
| 11 | /**@enum {Number}*/ | 12 | /**@enum {Number}*/ |
| @@ -386,11 +387,15 @@ export class AutoComplete { | |||
| 386 | // no result and no input? hide autocomplete | 387 | // no result and no input? hide autocomplete |
| 387 | return this.hide(); | 388 | return this.hide(); |
| 388 | } | 389 | } |
| 390 | if (this.effectiveParserResult instanceof AutoCompleteSecondaryNameResult && !this.effectiveParserResult.forceMatch) { | ||
| 391 | // no result and matching is no forced? hide autocomplete | ||
| 392 | return this.hide(); | ||
| 393 | } | ||
| 389 | // otherwise add "no match" notice | 394 | // otherwise add "no match" notice |
| 390 | const option = new BlankAutoCompleteOption( | 395 | const option = new BlankAutoCompleteOption( |
| 391 | this.name.length ? | 396 | this.name.length ? |
| 392 | this.effectiveParserResult.makeNoMatchText() | 397 | this.effectiveParserResult.makeNoMatchText() |
| 393 | : this.effectiveParserResult.makeNoOptionstext() | 398 | : this.effectiveParserResult.makeNoOptionsText() |
| 394 | , | 399 | , |
| 395 | ); | 400 | ); |
| 396 | this.result.push(option); | 401 | this.result.push(option); |
| @@ -438,7 +443,7 @@ export class AutoComplete { | |||
| 438 | } | 443 | } |
| 439 | this.dom.append(frag); | 444 | this.dom.append(frag); |
| 440 | this.updatePosition(); | 445 | this.updatePosition(); |
| 441 | document.body.append(this.domWrap); | 446 | getTopmostModalLayer().append(this.domWrap); |
| 442 | } else { | 447 | } else { |
| 443 | this.domWrap.remove(); | 448 | this.domWrap.remove(); |
| 444 | } | 449 | } |
| @@ -453,7 +458,7 @@ export class AutoComplete { | |||
| 453 | if (!this.isShowingDetails && this.isReplaceable) return this.detailsWrap.remove(); | 458 | if (!this.isShowingDetails && this.isReplaceable) return this.detailsWrap.remove(); |
| 454 | this.detailsDom.innerHTML = ''; | 459 | this.detailsDom.innerHTML = ''; |
| 455 | this.detailsDom.append(this.selectedItem?.renderDetails() ?? 'NO ITEM'); | 460 | this.detailsDom.append(this.selectedItem?.renderDetails() ?? 'NO ITEM'); |
| 456 | document.body.append(this.detailsWrap); | 461 | getTopmostModalLayer().append(this.detailsWrap); |
| 457 | this.updateDetailsPositionDebounced(); | 462 | this.updateDetailsPositionDebounced(); |
| 458 | } | 463 | } |
| 459 | 464 | ||
| @@ -469,7 +474,7 @@ export class AutoComplete { | |||
| 469 | const rect = {}; | 474 | const rect = {}; |
| 470 | rect[AUTOCOMPLETE_WIDTH.INPUT] = this.textarea.getBoundingClientRect(); | 475 | rect[AUTOCOMPLETE_WIDTH.INPUT] = this.textarea.getBoundingClientRect(); |
| 471 | rect[AUTOCOMPLETE_WIDTH.CHAT] = document.querySelector('#sheld').getBoundingClientRect(); | 476 | rect[AUTOCOMPLETE_WIDTH.CHAT] = document.querySelector('#sheld').getBoundingClientRect(); |
| 472 | rect[AUTOCOMPLETE_WIDTH.FULL] = document.body.getBoundingClientRect(); | 477 | rect[AUTOCOMPLETE_WIDTH.FULL] = getTopmostModalLayer().getBoundingClientRect(); |
| 473 | this.domWrap.style.setProperty('--bottom', `${window.innerHeight - rect[AUTOCOMPLETE_WIDTH.INPUT].top}px`); | 478 | this.domWrap.style.setProperty('--bottom', `${window.innerHeight - rect[AUTOCOMPLETE_WIDTH.INPUT].top}px`); |
| 474 | this.dom.style.setProperty('--bottom', `${window.innerHeight - rect[AUTOCOMPLETE_WIDTH.INPUT].top}px`); | 479 | this.dom.style.setProperty('--bottom', `${window.innerHeight - rect[AUTOCOMPLETE_WIDTH.INPUT].top}px`); |
| 475 | this.domWrap.style.bottom = `${window.innerHeight - rect[AUTOCOMPLETE_WIDTH.INPUT].top}px`; | 480 | this.domWrap.style.bottom = `${window.innerHeight - rect[AUTOCOMPLETE_WIDTH.INPUT].top}px`; |
| @@ -481,8 +486,8 @@ export class AutoComplete { | |||
| 481 | this.domWrap.style.setProperty('--leftOffset', `max(1vw, ${rect[power_user.stscript.autocomplete.width.left].left}px)`); | 486 | this.domWrap.style.setProperty('--leftOffset', `max(1vw, ${rect[power_user.stscript.autocomplete.width.left].left}px)`); |
| 482 | this.domWrap.style.setProperty('--rightOffset', `calc(100vw - min(99vw, ${rect[power_user.stscript.autocomplete.width.right].right}px)`); | 487 | this.domWrap.style.setProperty('--rightOffset', `calc(100vw - min(99vw, ${rect[power_user.stscript.autocomplete.width.right].right}px)`); |
| 483 | } | 488 | } |
| 484 | this.updateDetailsPosition(); | ||
| 485 | } | 489 | } |
| 490 | this.updateDetailsPosition(); | ||
| 486 | } | 491 | } |
| 487 | 492 | ||
| 488 | /** | 493 | /** |
| @@ -496,7 +501,7 @@ export class AutoComplete { | |||
| 496 | const rect = {}; | 501 | const rect = {}; |
| 497 | rect[AUTOCOMPLETE_WIDTH.INPUT] = this.textarea.getBoundingClientRect(); | 502 | rect[AUTOCOMPLETE_WIDTH.INPUT] = this.textarea.getBoundingClientRect(); |
| 498 | rect[AUTOCOMPLETE_WIDTH.CHAT] = document.querySelector('#sheld').getBoundingClientRect(); | 503 | rect[AUTOCOMPLETE_WIDTH.CHAT] = document.querySelector('#sheld').getBoundingClientRect(); |
| 499 | rect[AUTOCOMPLETE_WIDTH.FULL] = document.body.getBoundingClientRect(); | 504 | rect[AUTOCOMPLETE_WIDTH.FULL] = getTopmostModalLayer().getBoundingClientRect(); |
| 500 | if (this.isReplaceable) { | 505 | if (this.isReplaceable) { |
| 501 | this.detailsWrap.classList.remove('full'); | 506 | this.detailsWrap.classList.remove('full'); |
| 502 | const selRect = this.selectedItem.dom.children[0].getBoundingClientRect(); | 507 | const selRect = this.selectedItem.dom.children[0].getBoundingClientRect(); |
| @@ -592,7 +597,7 @@ export class AutoComplete { | |||
| 592 | } | 597 | } |
| 593 | this.clone.style.position = 'fixed'; | 598 | this.clone.style.position = 'fixed'; |
| 594 | this.clone.style.visibility = 'hidden'; | 599 | this.clone.style.visibility = 'hidden'; |
| 595 | document.body.append(this.clone); | 600 | getTopmostModalLayer().append(this.clone); |
| 596 | const mo = new MutationObserver(muts=>{ | 601 | const mo = new MutationObserver(muts=>{ |
| 597 | if (muts.find(it=>Array.from(it.removedNodes).includes(this.textarea))) { | 602 | if (muts.find(it=>Array.from(it.removedNodes).includes(this.textarea))) { |
| 598 | this.clone.remove(); | 603 | this.clone.remove(); |
| @@ -745,8 +750,10 @@ export class AutoComplete { | |||
| 745 | } | 750 | } |
| 746 | // autocomplete shown or not, cursor anywhere | 751 | // autocomplete shown or not, cursor anywhere |
| 747 | switch (evt.key) { | 752 | switch (evt.key) { |
| 753 | // The first is a non-breaking space, the second is a regular space. | ||
| 754 | case ' ': | ||
| 748 | case ' ': { | 755 | case ' ': { |
| 749 | if (evt.ctrlKey) { | 756 | if (evt.ctrlKey || evt.altKey) { |
| 750 | if (this.isActive && this.isReplaceable) { | 757 | if (this.isActive && this.isReplaceable) { |
| 751 | // ctrl-space to toggle details for selected item | 758 | // ctrl-space to toggle details for selected item |
| 752 | this.toggleDetails(); | 759 | this.toggleDetails(); |
| @@ -754,6 +761,8 @@ export class AutoComplete { | |||
| 754 | // ctrl-space to force show autocomplete | 761 | // ctrl-space to force show autocomplete |
| 755 | this.show(false, true); | 762 | this.show(false, true); |
| 756 | } | 763 | } |
| 764 | evt.preventDefault(); | ||
| 765 | evt.stopPropagation(); | ||
| 757 | return; | 766 | return; |
| 758 | } | 767 | } |
| 759 | break; | 768 | break; |
| @@ -10,7 +10,7 @@ export class AutoCompleteNameResult { | |||
| 10 | /**@type {AutoCompleteOption[]} */ optionList = []; | 10 | /**@type {AutoCompleteOption[]} */ optionList = []; |
| 11 | /**@type {boolean} */ canBeQuoted = false; | 11 | /**@type {boolean} */ canBeQuoted = false; |
| 12 | /**@type {()=>string} */ makeNoMatchText = ()=>`No matches found for "${this.name}"`; | 12 | /**@type {()=>string} */ makeNoMatchText = ()=>`No matches found for "${this.name}"`; |
| 13 | /**@type {()=>string} */ makeNoOptionstext = ()=>'No options'; | 13 | /**@type {()=>string} */ makeNoOptionsText = ()=>'No options'; |
| 14 | 14 | ||
| 15 | 15 | ||
| 16 | /** | 16 | /** |
| @@ -27,7 +27,7 @@ export class AutoCompleteNameResult { | |||
| 27 | this.optionList = optionList; | 27 | this.optionList = optionList; |
| 28 | this.canBeQuoted = canBeQuoted; | 28 | this.canBeQuoted = canBeQuoted; |
| 29 | this.noMatchText = makeNoMatchText ?? this.makeNoMatchText; | 29 | this.noMatchText = makeNoMatchText ?? this.makeNoMatchText; |
| 30 | this.noOptionstext = makeNoOptionsText ?? this.makeNoOptionstext; | 30 | this.noOptionstext = makeNoOptionsText ?? this.makeNoOptionsText; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | 33 | ||
| @@ -6,6 +6,7 @@ import { AutoCompleteFuzzyScore } from './AutoCompleteFuzzyScore.js'; | |||
| 6 | export class AutoCompleteOption { | 6 | export class AutoCompleteOption { |
| 7 | /**@type {string}*/ name; | 7 | /**@type {string}*/ name; |
| 8 | /**@type {string}*/ typeIcon; | 8 | /**@type {string}*/ typeIcon; |
| 9 | /**@type {string}*/ type; | ||
| 9 | /**@type {number}*/ nameOffset = 0; | 10 | /**@type {number}*/ nameOffset = 0; |
| 10 | /**@type {AutoCompleteFuzzyScore}*/ score; | 11 | /**@type {AutoCompleteFuzzyScore}*/ score; |
| 11 | /**@type {string}*/ replacer; | 12 | /**@type {string}*/ replacer; |
| @@ -24,9 +25,10 @@ export class AutoCompleteOption { | |||
| 24 | /** | 25 | /** |
| 25 | * @param {string} name | 26 | * @param {string} name |
| 26 | */ | 27 | */ |
| 27 | constructor(name, typeIcon = ' ') { | 28 | constructor(name, typeIcon = ' ', type = '') { |
| 28 | this.name = name; | 29 | this.name = name; |
| 29 | this.typeIcon = typeIcon; | 30 | this.typeIcon = typeIcon; |
| 31 | this.type = type; | ||
| 30 | } | 32 | } |
| 31 | 33 | ||
| 32 | 34 | ||
| @@ -141,6 +143,11 @@ export class AutoCompleteOption { | |||
| 141 | } | 143 | } |
| 142 | li.append(specs); | 144 | li.append(specs); |
| 143 | } | 145 | } |
| 146 | const stopgap = document.createElement('span'); { | ||
| 147 | stopgap.classList.add('stopgap'); | ||
| 148 | stopgap.textContent = ''; | ||
| 149 | li.append(stopgap); | ||
| 150 | } | ||
| 144 | const help = document.createElement('span'); { | 151 | const help = document.createElement('span'); { |
| 145 | help.classList.add('help'); | 152 | help.classList.add('help'); |
| 146 | const content = document.createElement('span'); { | 153 | const content = document.createElement('span'); { |
| @@ -181,6 +188,7 @@ export class AutoCompleteOption { | |||
| 181 | let li; | 188 | let li; |
| 182 | li = this.makeItem(this.name, this.typeIcon, true); | 189 | li = this.makeItem(this.name, this.typeIcon, true); |
| 183 | li.setAttribute('data-name', this.name); | 190 | li.setAttribute('data-name', this.name); |
| 191 | li.setAttribute('data-option-type', this.type); | ||
| 184 | return li; | 192 | return li; |
| 185 | } | 193 | } |
| 186 | 194 | ||
| @@ -2,4 +2,5 @@ import { AutoCompleteNameResult } from './AutoCompleteNameResult.js'; | |||
| 2 | 2 | ||
| 3 | export class AutoCompleteSecondaryNameResult extends AutoCompleteNameResult { | 3 | export class AutoCompleteSecondaryNameResult extends AutoCompleteNameResult { |
| 4 | /**@type {boolean}*/ isRequired = false; | 4 | /**@type {boolean}*/ isRequired = false; |
| 5 | /**@type {boolean}*/ forceMatch = true; | ||
| 5 | } | 6 | } |
| @@ -95,7 +95,7 @@ function onLockBackgroundClick(e) { | |||
| 95 | 95 | ||
| 96 | if (!chatName) { | 96 | if (!chatName) { |
| 97 | toastr.warning('Select a chat to lock the background for it'); | 97 | toastr.warning('Select a chat to lock the background for it'); |
| 98 | return; | 98 | return ''; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | const relativeBgImage = getUrlParameter(this); | 101 | const relativeBgImage = getUrlParameter(this); |
| @@ -103,6 +103,7 @@ function onLockBackgroundClick(e) { | |||
| 103 | saveBackgroundMetadata(relativeBgImage); | 103 | saveBackgroundMetadata(relativeBgImage); |
| 104 | setCustomBackground(); | 104 | setCustomBackground(); |
| 105 | highlightLockedBackground(); | 105 | highlightLockedBackground(); |
| 106 | return ''; | ||
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | function onUnlockBackgroundClick(e) { | 109 | function onUnlockBackgroundClick(e) { |
| @@ -110,6 +111,7 @@ function onUnlockBackgroundClick(e) { | |||
| 110 | removeBackgroundMetadata(); | 111 | removeBackgroundMetadata(); |
| 111 | unsetCustomBackground(); | 112 | unsetCustomBackground(); |
| 112 | highlightLockedBackground(); | 113 | highlightLockedBackground(); |
| 114 | return ''; | ||
| 113 | } | 115 | } |
| 114 | 116 | ||
| 115 | function hasCustomBackground() { | 117 | function hasCustomBackground() { |
| @@ -319,7 +321,7 @@ async function autoBackgroundCommand() { | |||
| 319 | const options = bgTitles.map(x => ({ element: x, text: x.innerText.trim() })).filter(x => x.text.length > 0); | 321 | const options = bgTitles.map(x => ({ element: x, text: x.innerText.trim() })).filter(x => x.text.length > 0); |
| 320 | if (options.length == 0) { | 322 | if (options.length == 0) { |
| 321 | toastr.warning('No backgrounds to choose from. Please upload some images to the "backgrounds" folder.'); | 323 | toastr.warning('No backgrounds to choose from. Please upload some images to the "backgrounds" folder.'); |
| 322 | return; | 324 | return ''; |
| 323 | } | 325 | } |
| 324 | 326 | ||
| 325 | const list = options.map(option => `- ${option.text}`).join('\n'); | 327 | const list = options.map(option => `- ${option.text}`).join('\n'); |
| @@ -330,11 +332,12 @@ async function autoBackgroundCommand() { | |||
| 330 | 332 | ||
| 331 | if (bestMatch.length == 0) { | 333 | if (bestMatch.length == 0) { |
| 332 | toastr.warning('No match found. Please try again.'); | 334 | toastr.warning('No match found. Please try again.'); |
| 333 | return; | 335 | return ''; |
| 334 | } | 336 | } |
| 335 | 337 | ||
| 336 | console.debug('Automatically choosing background:', bestMatch); | 338 | console.debug('Automatically choosing background:', bestMatch); |
| 337 | bestMatch[0].item.element.click(); | 339 | bestMatch[0].item.element.click(); |
| 340 | return ''; | ||
| 338 | } | 341 | } |
| 339 | 342 | ||
| 340 | export async function getBackgrounds() { | 343 | export async function getBackgrounds() { |
| @@ -24,6 +24,7 @@ import { | |||
| 24 | saveGroupBookmarkChat, | 24 | saveGroupBookmarkChat, |
| 25 | selected_group, | 25 | selected_group, |
| 26 | } from './group-chats.js'; | 26 | } from './group-chats.js'; |
| 27 | import { Popup } from './popup.js'; | ||
| 27 | import { createTagMapFromList } from './tags.js'; | 28 | import { createTagMapFromList } from './tags.js'; |
| 28 | 29 | ||
| 29 | import { | 30 | import { |
| @@ -239,8 +240,7 @@ async function convertSoloToGroupChat() { | |||
| 239 | return; | 240 | return; |
| 240 | } | 241 | } |
| 241 | 242 | ||
| 242 | const confirm = await callPopup('Are you sure you want to convert this chat to a group chat?', 'confirm'); | 243 | const confirm = await Popup.show.confirm('Convert to group chat', 'Are you sure you want to convert this chat to a group chat?<br />This cannot be reverted.'); |
| 243 | |||
| 244 | if (!confirm) { | 244 | if (!confirm) { |
| 245 | return; | 245 | return; |
| 246 | } | 246 | } |
| @@ -336,6 +336,7 @@ async function convertSoloToGroupChat() { | |||
| 336 | 336 | ||
| 337 | if (!createChatResponse.ok) { | 337 | if (!createChatResponse.ok) { |
| 338 | console.error('Group chat creation unsuccessful'); | 338 | console.error('Group chat creation unsuccessful'); |
| 339 | toastr.error('Group chat creation unsuccessful'); | ||
| 339 | return; | 340 | return; |
| 340 | } | 341 | } |
| 341 | 342 | ||
| @@ -94,6 +94,9 @@ function enableBulkSelect() { | |||
| 94 | }); | 94 | }); |
| 95 | $(el).prepend(checkbox); | 95 | $(el).prepend(checkbox); |
| 96 | }); | 96 | }); |
| 97 | $('#rm_print_characters_block.group_overlay_mode_select .bogus_folder_select, #rm_print_characters_block.group_overlay_mode_select .group_select') | ||
| 98 | .addClass('disabled'); | ||
| 99 | |||
| 97 | $('#rm_print_characters_block').addClass('bulk_select'); | 100 | $('#rm_print_characters_block').addClass('bulk_select'); |
| 98 | // We also need to disable the default click event for the character_select divs | 101 | // We also need to disable the default click event for the character_select divs |
| 99 | $(document).on('click', '.bulk_select_checkbox', function (event) { | 102 | $(document).on('click', '.bulk_select_checkbox', function (event) { |
| @@ -106,6 +109,8 @@ function enableBulkSelect() { | |||
| 106 | */ | 109 | */ |
| 107 | function disableBulkSelect() { | 110 | function disableBulkSelect() { |
| 108 | $('.bulk_select_checkbox').remove(); | 111 | $('.bulk_select_checkbox').remove(); |
| 112 | $('#rm_print_characters_block.group_overlay_mode_select .bogus_folder_select, #rm_print_characters_block.group_overlay_mode_select .group_select') | ||
| 113 | .removeClass('disabled'); | ||
| 109 | $('#rm_print_characters_block').removeClass('bulk_select'); | 114 | $('#rm_print_characters_block').removeClass('bulk_select'); |
| 110 | } | 115 | } |
| 111 | 116 | ||
| @@ -4,7 +4,6 @@ import css from '../lib/css-parser.mjs'; | |||
| 4 | import { | 4 | import { |
| 5 | addCopyToCodeBlocks, | 5 | addCopyToCodeBlocks, |
| 6 | appendMediaToMessage, | 6 | appendMediaToMessage, |
| 7 | callPopup, | ||
| 8 | characters, | 7 | characters, |
| 9 | chat, | 8 | chat, |
| 10 | eventSource, | 9 | eventSource, |
| @@ -35,8 +34,10 @@ import { | |||
| 35 | extractTextFromOffice, | 34 | extractTextFromOffice, |
| 36 | } from './utils.js'; | 35 | } from './utils.js'; |
| 37 | import { extension_settings, renderExtensionTemplateAsync, saveMetadataDebounced } from './extensions.js'; | 36 | import { extension_settings, renderExtensionTemplateAsync, saveMetadataDebounced } from './extensions.js'; |
| 38 | import { POPUP_RESULT, POPUP_TYPE, callGenericPopup } from './popup.js'; | 37 | import { POPUP_RESULT, POPUP_TYPE, Popup, callGenericPopup } from './popup.js'; |
| 39 | import { ScraperManager } from './scrapers.js'; | 38 | import { ScraperManager } from './scrapers.js'; |
| 39 | import { DragAndDropHandler } from './dragdrop.js'; | ||
| 40 | import { renderTemplateAsync } from './templates.js'; | ||
| 40 | 41 | ||
| 41 | /** | 42 | /** |
| 42 | * @typedef {Object} FileAttachment | 43 | * @typedef {Object} FileAttachment |
| @@ -184,18 +185,19 @@ export async function populateFileAttachment(message, inputId = 'file_form_input | |||
| 184 | const file = fileInput.files[0]; | 185 | const file = fileInput.files[0]; |
| 185 | if (!file) return; | 186 | if (!file) return; |
| 186 | 187 | ||
| 188 | const slug = getStringHash(file.name); | ||
| 189 | const fileNamePrefix = `${Date.now()}_${slug}`; | ||
| 187 | const fileBase64 = await getBase64Async(file); | 190 | const fileBase64 = await getBase64Async(file); |
| 188 | let base64Data = fileBase64.split(',')[1]; | 191 | let base64Data = fileBase64.split(',')[1]; |
| 189 | 192 | ||
| 190 | // If file is image | 193 | // If file is image |
| 191 | if (file.type.startsWith('image/')) { | 194 | if (file.type.startsWith('image/')) { |
| 192 | const extension = file.type.split('/')[1]; | 195 | const extension = file.type.split('/')[1]; |
| 193 | const imageUrl = await saveBase64AsFile(base64Data, name2, file.name, extension); | 196 | const imageUrl = await saveBase64AsFile(base64Data, name2, fileNamePrefix, extension); |
| 194 | message.extra.image = imageUrl; | 197 | message.extra.image = imageUrl; |
| 195 | message.extra.inline_image = true; | 198 | message.extra.inline_image = true; |
| 196 | } else { | 199 | } else { |
| 197 | const slug = getStringHash(file.name); | 200 | const uniqueFileName = `${fileNamePrefix}.txt`; |
| 198 | const uniqueFileName = `${Date.now()}_${slug}.txt`; | ||
| 199 | 201 | ||
| 200 | if (isConvertible(file.type)) { | 202 | if (isConvertible(file.type)) { |
| 201 | try { | 203 | try { |
| @@ -318,12 +320,10 @@ export function hasPendingFileAttachment() { | |||
| 318 | 320 | ||
| 319 | /** | 321 | /** |
| 320 | * Displays file information in the message sending form. | 322 | * Displays file information in the message sending form. |
| 323 | * @param {File} file File object | ||
| 321 | * @returns {Promise<void>} | 324 | * @returns {Promise<void>} |
| 322 | */ | 325 | */ |
| 323 | async function onFileAttach() { | 326 | async function onFileAttach(file) { |
| 324 | const fileInput = document.getElementById('file_form_input'); | ||
| 325 | if (!(fileInput instanceof HTMLInputElement)) return; | ||
| 326 | const file = fileInput.files[0]; | ||
| 327 | if (!file) return; | 327 | if (!file) return; |
| 328 | 328 | ||
| 329 | const isValid = await validateFile(file); | 329 | const isValid = await validateFile(file); |
| @@ -418,6 +418,7 @@ function embedMessageFile(messageId, messageBlock) { | |||
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | await populateFileAttachment(message, 'embed_file_input'); | 420 | await populateFileAttachment(message, 'embed_file_input'); |
| 421 | await eventSource.emit(event_types.MESSAGE_FILE_EMBEDDED, messageId); | ||
| 421 | appendMediaToMessage(message, messageBlock); | 422 | appendMediaToMessage(message, messageBlock); |
| 422 | await saveChatConditional(); | 423 | await saveChatConditional(); |
| 423 | } | 424 | } |
| @@ -523,7 +524,7 @@ async function openExternalMediaOverridesDialog() { | |||
| 523 | return; | 524 | return; |
| 524 | } | 525 | } |
| 525 | 526 | ||
| 526 | const template = $('#forbid_media_override_template > .forbid_media_override').clone(); | 527 | const template = $(await renderTemplateAsync('forbidMedia')); |
| 527 | template.find('.forbid_media_global_state_forbidden').toggle(power_user.forbid_external_media); | 528 | template.find('.forbid_media_global_state_forbidden').toggle(power_user.forbid_external_media); |
| 528 | template.find('.forbid_media_global_state_allowed').toggle(!power_user.forbid_external_media); | 529 | template.find('.forbid_media_global_state_allowed').toggle(!power_user.forbid_external_media); |
| 529 | 530 | ||
| @@ -537,7 +538,7 @@ async function openExternalMediaOverridesDialog() { | |||
| 537 | template.find('#forbid_media_override_global').prop('checked', true); | 538 | template.find('#forbid_media_override_global').prop('checked', true); |
| 538 | } | 539 | } |
| 539 | 540 | ||
| 540 | callPopup(template, 'text', '', { wide: false, large: false }); | 541 | callGenericPopup(template, POPUP_TYPE.TEXT, '', { wide: false, large: false }); |
| 541 | } | 542 | } |
| 542 | 543 | ||
| 543 | export function getCurrentEntityId() { | 544 | export function getCurrentEntityId() { |
| @@ -565,7 +566,7 @@ export function isExternalMediaAllowed() { | |||
| 565 | return !power_user.forbid_external_media; | 566 | return !power_user.forbid_external_media; |
| 566 | } | 567 | } |
| 567 | 568 | ||
| 568 | function enlargeMessageImage() { | 569 | async function enlargeMessageImage() { |
| 569 | const mesBlock = $(this).closest('.mes'); | 570 | const mesBlock = $(this).closest('.mes'); |
| 570 | const mesId = mesBlock.attr('mesid'); | 571 | const mesId = mesBlock.attr('mesid'); |
| 571 | const message = chat[mesId]; | 572 | const message = chat[mesId]; |
| @@ -579,14 +580,28 @@ function enlargeMessageImage() { | |||
| 579 | const img = document.createElement('img'); | 580 | const img = document.createElement('img'); |
| 580 | img.classList.add('img_enlarged'); | 581 | img.classList.add('img_enlarged'); |
| 581 | img.src = imgSrc; | 582 | img.src = imgSrc; |
| 583 | const imgHolder = document.createElement('div'); | ||
| 584 | imgHolder.classList.add('img_enlarged_holder'); | ||
| 585 | imgHolder.append(img); | ||
| 582 | const imgContainer = $('<div><pre><code></code></pre></div>'); | 586 | const imgContainer = $('<div><pre><code></code></pre></div>'); |
| 583 | imgContainer.prepend(img); | 587 | imgContainer.prepend(imgHolder); |
| 584 | imgContainer.addClass('img_enlarged_container'); | 588 | imgContainer.addClass('img_enlarged_container'); |
| 585 | imgContainer.find('code').addClass('txt').text(title); | 589 | imgContainer.find('code').addClass('txt').text(title); |
| 586 | const titleEmpty = !title || title.trim().length === 0; | 590 | const titleEmpty = !title || title.trim().length === 0; |
| 587 | imgContainer.find('pre').toggle(!titleEmpty); | 591 | imgContainer.find('pre').toggle(!titleEmpty); |
| 588 | addCopyToCodeBlocks(imgContainer); | 592 | addCopyToCodeBlocks(imgContainer); |
| 589 | callGenericPopup(imgContainer, POPUP_TYPE.TEXT, '', { wide: true, large: true }); | 593 | |
| 594 | const popup = new Popup(imgContainer, POPUP_TYPE.DISPLAY, '', { large: true, transparent: true }); | ||
| 595 | |||
| 596 | popup.dlg.style.width = 'unset'; | ||
| 597 | popup.dlg.style.height = 'unset'; | ||
| 598 | |||
| 599 | img.addEventListener('click', () => { | ||
| 600 | const shouldZoom = !img.classList.contains('zoomed'); | ||
| 601 | img.classList.toggle('zoomed', shouldZoom); | ||
| 602 | }); | ||
| 603 | |||
| 604 | await popup.show(); | ||
| 590 | } | 605 | } |
| 591 | 606 | ||
| 592 | async function deleteMessageImage() { | 607 | async function deleteMessageImage() { |
| @@ -601,6 +616,8 @@ async function deleteMessageImage() { | |||
| 601 | const message = chat[mesId]; | 616 | const message = chat[mesId]; |
| 602 | delete message.extra.image; | 617 | delete message.extra.image; |
| 603 | delete message.extra.inline_image; | 618 | delete message.extra.inline_image; |
| 619 | delete message.extra.title; | ||
| 620 | delete message.extra.append_title; | ||
| 604 | mesBlock.find('.mes_img_container').removeClass('img_extra'); | 621 | mesBlock.find('.mes_img_container').removeClass('img_extra'); |
| 605 | mesBlock.find('.mes_img').attr('src', ''); | 622 | mesBlock.find('.mes_img').attr('src', ''); |
| 606 | await saveChatConditional(); | 623 | await saveChatConditional(); |
| @@ -991,25 +1008,7 @@ async function openAttachmentManager() { | |||
| 991 | template.find('.chatAttachmentsName').text(chatName); | 1008 | template.find('.chatAttachmentsName').text(chatName); |
| 992 | } | 1009 | } |
| 993 | 1010 | ||
| 994 | function addDragAndDrop() { | 1011 | const dragDropHandler = new DragAndDropHandler('.popup', async (files, event) => { |
| 995 | $(document.body).on('dragover', '.dialogue_popup', (event) => { | ||
| 996 | event.preventDefault(); | ||
| 997 | event.stopPropagation(); | ||
| 998 | $(event.target).closest('.dialogue_popup').addClass('dragover'); | ||
| 999 | }); | ||
| 1000 | |||
| 1001 | $(document.body).on('dragleave', '.dialogue_popup', (event) => { | ||
| 1002 | event.preventDefault(); | ||
| 1003 | event.stopPropagation(); | ||
| 1004 | $(event.target).closest('.dialogue_popup').removeClass('dragover'); | ||
| 1005 | }); | ||
| 1006 | |||
| 1007 | $(document.body).on('drop', '.dialogue_popup', async (event) => { | ||
| 1008 | event.preventDefault(); | ||
| 1009 | event.stopPropagation(); | ||
| 1010 | $(event.target).closest('.dialogue_popup').removeClass('dragover'); | ||
| 1011 | |||
| 1012 | const files = Array.from(event.originalEvent.dataTransfer.files); | ||
| 1013 | let selectedTarget = ATTACHMENT_SOURCE.GLOBAL; | 1012 | let selectedTarget = ATTACHMENT_SOURCE.GLOBAL; |
| 1014 | const targets = getAvailableTargets(); | 1013 | const targets = getAvailableTargets(); |
| 1015 | 1014 | ||
| @@ -1027,13 +1026,6 @@ async function openAttachmentManager() { | |||
| 1027 | } | 1026 | } |
| 1028 | renderAttachments(); | 1027 | renderAttachments(); |
| 1029 | }); | 1028 | }); |
| 1030 | } | ||
| 1031 | |||
| 1032 | function removeDragAndDrop() { | ||
| 1033 | $(document.body).off('dragover', '.shadow_popup'); | ||
| 1034 | $(document.body).off('dragleave', '.shadow_popup'); | ||
| 1035 | $(document.body).off('drop', '.shadow_popup'); | ||
| 1036 | } | ||
| 1037 | 1029 | ||
| 1038 | let sortField = localStorage.getItem('DataBank_sortField') || 'created'; | 1030 | let sortField = localStorage.getItem('DataBank_sortField') || 'created'; |
| 1039 | let sortOrder = localStorage.getItem('DataBank_sortOrder') || 'desc'; | 1031 | let sortOrder = localStorage.getItem('DataBank_sortOrder') || 'desc'; |
| @@ -1056,7 +1048,8 @@ async function openAttachmentManager() { | |||
| 1056 | localStorage.setItem('DataBank_sortOrder', sortOrder); | 1048 | localStorage.setItem('DataBank_sortOrder', sortOrder); |
| 1057 | renderAttachments(); | 1049 | renderAttachments(); |
| 1058 | }); | 1050 | }); |
| 1059 | template.find('.bulkActionDelete').on('click', async () => { | 1051 | function handleBulkAction(action) { |
| 1052 | return async () => { | ||
| 1060 | const selectedAttachments = document.querySelectorAll('.attachmentListItemCheckboxContainer .attachmentListItemCheckbox:checked'); | 1053 | const selectedAttachments = document.querySelectorAll('.attachmentListItemCheckboxContainer .attachmentListItemCheckbox:checked'); |
| 1061 | 1054 | ||
| 1062 | if (selectedAttachments.length === 0) { | 1055 | if (selectedAttachments.length === 0) { |
| @@ -1064,13 +1057,15 @@ async function openAttachmentManager() { | |||
| 1064 | return; | 1057 | return; |
| 1065 | } | 1058 | } |
| 1066 | 1059 | ||
| 1067 | const confirm = await callGenericPopup('Are you sure you want to delete the selected attachments?', POPUP_TYPE.CONFIRM); | 1060 | if (action.confirmMessage) { |
| 1068 | 1061 | const confirm = await callGenericPopup(action.confirmMessage, POPUP_TYPE.CONFIRM); | |
| 1069 | if (confirm !== POPUP_RESULT.AFFIRMATIVE) { | 1062 | if (confirm !== POPUP_RESULT.AFFIRMATIVE) { |
| 1070 | return; | 1063 | return; |
| 1071 | } | 1064 | } |
| 1065 | } | ||
| 1072 | 1066 | ||
| 1073 | const attachments = getDataBankAttachments(); | 1067 | const includeDisabled = true; |
| 1068 | const attachments = getDataBankAttachments(includeDisabled); | ||
| 1074 | selectedAttachments.forEach(async (checkbox) => { | 1069 | selectedAttachments.forEach(async (checkbox) => { |
| 1075 | const listItem = checkbox.closest('.attachmentListItem'); | 1070 | const listItem = checkbox.closest('.attachmentListItem'); |
| 1076 | if (!(listItem instanceof HTMLElement)) { | 1071 | if (!(listItem instanceof HTMLElement)) { |
| @@ -1082,7 +1077,7 @@ async function openAttachmentManager() { | |||
| 1082 | if (!attachment) { | 1077 | if (!attachment) { |
| 1083 | return; | 1078 | return; |
| 1084 | } | 1079 | } |
| 1085 | await deleteAttachment(attachment, source, () => {}, false); | 1080 | await action.perform(attachment, source); |
| 1086 | }); | 1081 | }); |
| 1087 | 1082 | ||
| 1088 | document.querySelectorAll('.attachmentListItemCheckbox, .attachmentsBulkEditCheckbox').forEach(checkbox => { | 1083 | document.querySelectorAll('.attachmentListItemCheckbox, .attachmentsBulkEditCheckbox').forEach(checkbox => { |
| @@ -1092,7 +1087,22 @@ async function openAttachmentManager() { | |||
| 1092 | }); | 1087 | }); |
| 1093 | 1088 | ||
| 1094 | await renderAttachments(); | 1089 | await renderAttachments(); |
| 1095 | }); | 1090 | }; |
| 1091 | } | ||
| 1092 | |||
| 1093 | template.find('.bulkActionDisable').on('click', handleBulkAction({ | ||
| 1094 | perform: (attachment) => disableAttachment(attachment, () => { }), | ||
| 1095 | })); | ||
| 1096 | |||
| 1097 | template.find('.bulkActionEnable').on('click', handleBulkAction({ | ||
| 1098 | perform: (attachment) => enableAttachment(attachment, () => { }), | ||
| 1099 | })); | ||
| 1100 | |||
| 1101 | template.find('.bulkActionDelete').on('click', handleBulkAction({ | ||
| 1102 | confirmMessage: 'Are you sure you want to delete the selected attachments?', | ||
| 1103 | perform: async (attachment, source) => await deleteAttachment(attachment, source, () => { }, false), | ||
| 1104 | })); | ||
| 1105 | |||
| 1096 | template.find('.bulkActionSelectAll').on('click', () => { | 1106 | template.find('.bulkActionSelectAll').on('click', () => { |
| 1097 | $('.attachmentListItemCheckbox:visible').each((_, checkbox) => { | 1107 | $('.attachmentListItemCheckbox:visible').each((_, checkbox) => { |
| 1098 | if (checkbox instanceof HTMLInputElement) { | 1108 | if (checkbox instanceof HTMLInputElement) { |
| @@ -1111,11 +1121,10 @@ async function openAttachmentManager() { | |||
| 1111 | const cleanupFn = await renderButtons(); | 1121 | const cleanupFn = await renderButtons(); |
| 1112 | await verifyAttachments(); | 1122 | await verifyAttachments(); |
| 1113 | await renderAttachments(); | 1123 | await renderAttachments(); |
| 1114 | addDragAndDrop(); | 1124 | await callGenericPopup(template, POPUP_TYPE.TEXT, '', { wide: true, large: true, okButton: 'Close', allowVerticalScrolling: true }); |
| 1115 | await callGenericPopup(template, POPUP_TYPE.TEXT, '', { wide: true, large: true, okButton: 'Close' }); | ||
| 1116 | 1125 | ||
| 1117 | cleanupFn(); | 1126 | cleanupFn(); |
| 1118 | removeDragAndDrop(); | 1127 | dragDropHandler.destroy(); |
| 1119 | } | 1128 | } |
| 1120 | 1129 | ||
| 1121 | /** | 1130 | /** |
| @@ -1458,7 +1467,7 @@ jQuery(function () { | |||
| 1458 | }); | 1467 | }); |
| 1459 | } | 1468 | } |
| 1460 | 1469 | ||
| 1461 | callPopup(wrapper, 'text', '', { wide: true, large: true }); | 1470 | callGenericPopup(wrapper, POPUP_TYPE.TEXT, '', { wide: true, large: true }); |
| 1462 | }); | 1471 | }); |
| 1463 | 1472 | ||
| 1464 | $(document).on('click', 'body.documentstyle .mes .mes_text', function () { | 1473 | $(document).on('click', 'body.documentstyle .mes .mes_text', function () { |
| @@ -1496,8 +1505,28 @@ jQuery(function () { | |||
| 1496 | $(document).on('click', '.mes_img_enlarge', enlargeMessageImage); | 1505 | $(document).on('click', '.mes_img_enlarge', enlargeMessageImage); |
| 1497 | $(document).on('click', '.mes_img_delete', deleteMessageImage); | 1506 | $(document).on('click', '.mes_img_delete', deleteMessageImage); |
| 1498 | 1507 | ||
| 1499 | $('#file_form_input').on('change', onFileAttach); | 1508 | $('#file_form_input').on('change', async () => { |
| 1509 | const fileInput = document.getElementById('file_form_input'); | ||
| 1510 | if (!(fileInput instanceof HTMLInputElement)) return; | ||
| 1511 | const file = fileInput.files[0]; | ||
| 1512 | await onFileAttach(file); | ||
| 1513 | }); | ||
| 1500 | $('#file_form').on('reset', function () { | 1514 | $('#file_form').on('reset', function () { |
| 1501 | $('#file_form').addClass('displayNone'); | 1515 | $('#file_form').addClass('displayNone'); |
| 1502 | }); | 1516 | }); |
| 1517 | |||
| 1518 | document.getElementById('send_textarea').addEventListener('paste', async function (event) { | ||
| 1519 | if (event.clipboardData.files.length === 0) { | ||
| 1520 | return; | ||
| 1521 | } | ||
| 1522 | |||
| 1523 | event.preventDefault(); | ||
| 1524 | event.stopPropagation(); | ||
| 1525 | |||
| 1526 | const fileInput = document.getElementById('file_form_input'); | ||
| 1527 | if (!(fileInput instanceof HTMLInputElement)) return; | ||
| 1528 | |||
| 1529 | fileInput.files = event.clipboardData.files; | ||
| 1530 | await onFileAttach(fileInput.files[0]); | ||
| 1531 | }); | ||
| 1503 | }); | 1532 | }); |
| @@ -0,0 +1,107 @@ | |||
| 1 | import { debounce_timeout } from './constants.js'; | ||
| 2 | |||
| 3 | /** | ||
| 4 | * Drag and drop handler | ||
| 5 | * | ||
| 6 | * Can be used on any element, enabling drag&drop styling and callback on drop. | ||
| 7 | */ | ||
| 8 | export class DragAndDropHandler { | ||
| 9 | /** @private @type {JQuery.Selector} */ selector; | ||
| 10 | /** @private @type {(files: File[], event:JQuery.DropEvent<HTMLElement, undefined, any, any>) => void} */ onDropCallback; | ||
| 11 | /** @private @type {NodeJS.Timeout} Remark: Not actually NodeJS timeout, but it's close */ dragLeaveTimeout; | ||
| 12 | |||
| 13 | /** @private @type {boolean} */ noAnimation; | ||
| 14 | |||
| 15 | /** | ||
| 16 | * Create a DragAndDropHandler | ||
| 17 | * @param {JQuery.Selector} selector - The CSS selector for the elements to enable drag and drop | ||
| 18 | * @param {(files: File[], event:JQuery.DropEvent<HTMLElement, undefined, any, any>) => void} onDropCallback - The callback function to handle the drop event | ||
| 19 | */ | ||
| 20 | constructor(selector, onDropCallback, { noAnimation = false } = {}) { | ||
| 21 | this.selector = selector; | ||
| 22 | this.onDropCallback = onDropCallback; | ||
| 23 | this.dragLeaveTimeout = null; | ||
| 24 | |||
| 25 | this.noAnimation = noAnimation; | ||
| 26 | |||
| 27 | this.init(); | ||
| 28 | } | ||
| 29 | |||
| 30 | /** | ||
| 31 | * Destroy the drag and drop functionality | ||
| 32 | */ | ||
| 33 | destroy() { | ||
| 34 | if (this.selector === 'body') { | ||
| 35 | $(document.body).off('dragover', this.handleDragOver.bind(this)); | ||
| 36 | $(document.body).off('dragleave', this.handleDragLeave.bind(this)); | ||
| 37 | $(document.body).off('drop', this.handleDrop.bind(this)); | ||
| 38 | } else { | ||
| 39 | $(document.body).off('dragover', this.selector, this.handleDragOver.bind(this)); | ||
| 40 | $(document.body).off('dragleave', this.selector, this.handleDragLeave.bind(this)); | ||
| 41 | $(document.body).off('drop', this.selector, this.handleDrop.bind(this)); | ||
| 42 | } | ||
| 43 | |||
| 44 | $(this.selector).remove('drop_target no_animation'); | ||
| 45 | } | ||
| 46 | |||
| 47 | /** | ||
| 48 | * Initialize the drag and drop functionality | ||
| 49 | * Automatically called on construction | ||
| 50 | * @private | ||
| 51 | */ | ||
| 52 | init() { | ||
| 53 | if (this.selector === 'body') { | ||
| 54 | $(document.body).on('dragover', this.handleDragOver.bind(this)); | ||
| 55 | $(document.body).on('dragleave', this.handleDragLeave.bind(this)); | ||
| 56 | $(document.body).on('drop', this.handleDrop.bind(this)); | ||
| 57 | } else { | ||
| 58 | $(document.body).on('dragover', this.selector, this.handleDragOver.bind(this)); | ||
| 59 | $(document.body).on('dragleave', this.selector, this.handleDragLeave.bind(this)); | ||
| 60 | $(document.body).on('drop', this.selector, this.handleDrop.bind(this)); | ||
| 61 | } | ||
| 62 | |||
| 63 | $(this.selector).addClass('drop_target'); | ||
| 64 | if (this.noAnimation) $(this.selector).addClass('no_animation'); | ||
| 65 | } | ||
| 66 | |||
| 67 | /** | ||
| 68 | * @param {JQuery.DragOverEvent<HTMLElement, undefined, any, any>} event - The dragover event | ||
| 69 | * @private | ||
| 70 | */ | ||
| 71 | handleDragOver(event) { | ||
| 72 | event.preventDefault(); | ||
| 73 | event.stopPropagation(); | ||
| 74 | clearTimeout(this.dragLeaveTimeout); | ||
| 75 | $(this.selector).addClass('drop_target dragover'); | ||
| 76 | if (this.noAnimation) $(this.selector).addClass('no_animation'); | ||
| 77 | } | ||
| 78 | |||
| 79 | /** | ||
| 80 | * @param {JQuery.DragLeaveEvent<HTMLElement, undefined, any, any>} event - The dragleave event | ||
| 81 | * @private | ||
| 82 | */ | ||
| 83 | handleDragLeave(event) { | ||
| 84 | event.preventDefault(); | ||
| 85 | event.stopPropagation(); | ||
| 86 | |||
| 87 | // Debounce the removal of the class, so it doesn't "flicker" on dragging over | ||
| 88 | clearTimeout(this.dragLeaveTimeout); | ||
| 89 | this.dragLeaveTimeout = setTimeout(() => { | ||
| 90 | $(this.selector).removeClass('dragover'); | ||
| 91 | }, debounce_timeout.quick); | ||
| 92 | } | ||
| 93 | |||
| 94 | /** | ||
| 95 | * @param {JQuery.DropEvent<HTMLElement, undefined, any, any>} event - The drop event | ||
| 96 | * @private | ||
| 97 | */ | ||
| 98 | handleDrop(event) { | ||
| 99 | event.preventDefault(); | ||
| 100 | event.stopPropagation(); | ||
| 101 | clearTimeout(this.dragLeaveTimeout); | ||
| 102 | $(this.selector).removeClass('dragover'); | ||
| 103 | |||
| 104 | const files = Array.from(event.originalEvent.dataTransfer.files); | ||
| 105 | this.onDropCallback(files, event); | ||
| 106 | } | ||
| 107 | } | ||
| @@ -0,0 +1,162 @@ | |||
| 1 | /** @type {CSSStyleSheet} */ | ||
| 2 | let dynamicStyleSheet = null; | ||
| 3 | /** @type {CSSStyleSheet} */ | ||
| 4 | let dynamicExtensionStyleSheet = null; | ||
| 5 | |||
| 6 | /** | ||
| 7 | * An observer that will check if any new stylesheets are added to the head | ||
| 8 | * @type {MutationObserver} | ||
| 9 | */ | ||
| 10 | const observer = new MutationObserver(mutations => { | ||
| 11 | mutations.forEach(mutation => { | ||
| 12 | if (mutation.type !== 'childList') return; | ||
| 13 | |||
| 14 | mutation.addedNodes.forEach(node => { | ||
| 15 | if (node instanceof HTMLLinkElement && node.tagName === 'LINK' && node.rel === 'stylesheet') { | ||
| 16 | node.addEventListener('load', () => { | ||
| 17 | try { | ||
| 18 | applyDynamicFocusStyles(node.sheet); | ||
| 19 | } catch (e) { | ||
| 20 | console.warn('Failed to process new stylesheet:', e); | ||
| 21 | } | ||
| 22 | }); | ||
| 23 | } | ||
| 24 | }); | ||
| 25 | }); | ||
| 26 | }); | ||
| 27 | |||
| 28 | /** | ||
| 29 | * Generates dynamic focus styles based on the given stylesheet, taking its hover styles as reference | ||
| 30 | * | ||
| 31 | * @param {CSSStyleSheet} styleSheet - The stylesheet to process | ||
| 32 | * @param {object} [options] - Optional configuration options | ||
| 33 | * @param {boolean} [options.fromExtension=false] - Indicates if the styles are from an extension | ||
| 34 | */ | ||
| 35 | function applyDynamicFocusStyles(styleSheet, { fromExtension = false } = {}) { | ||
| 36 | /** @type {{baseSelector: string, rule: CSSStyleRule}[]} */ | ||
| 37 | const hoverRules = []; | ||
| 38 | /** @type {Set<string>} */ | ||
| 39 | const focusRules = new Set(); | ||
| 40 | |||
| 41 | const PLACEHOLDER = ':__PLACEHOLDER__'; | ||
| 42 | |||
| 43 | /** | ||
| 44 | * Processes the CSS rules and separates selectors for hover and focus | ||
| 45 | * @param {CSSRuleList} rules - The CSS rules to process | ||
| 46 | */ | ||
| 47 | function processRules(rules) { | ||
| 48 | Array.from(rules).forEach(rule => { | ||
| 49 | if (rule instanceof CSSImportRule) { | ||
| 50 | // Make sure that @import rules are processed recursively | ||
| 51 | processImportedStylesheet(rule.styleSheet); | ||
| 52 | } else if (rule instanceof CSSStyleRule) { | ||
| 53 | // Separate multiple selectors on a rule | ||
| 54 | const selectors = rule.selectorText.split(',').map(s => s.trim()); | ||
| 55 | |||
| 56 | // We collect all hover and focus rules to be able to later decide which hover rules don't have a matching focus rule | ||
| 57 | selectors.forEach(selector => { | ||
| 58 | const isHover = selector.includes(':hover'), isFocus = selector.includes(':focus'); | ||
| 59 | if (isHover && isFocus) { | ||
| 60 | // We currently do nothing here. Rules containing both hover and focus are very specific and should never be automatically touched | ||
| 61 | } | ||
| 62 | else if (isHover) { | ||
| 63 | const baseSelector = selector.replace(':hover', PLACEHOLDER).trim(); | ||
| 64 | hoverRules.push({ baseSelector, rule }); | ||
| 65 | } else if (isFocus) { | ||
| 66 | // We need to make sure that we remember all existing :focus, :focus-within and :focus-visible rules | ||
| 67 | const baseSelector = selector.replace(':focus-within', PLACEHOLDER).replace(':focus-visible', PLACEHOLDER).replace(':focus', PLACEHOLDER).trim(); | ||
| 68 | focusRules.add(baseSelector); | ||
| 69 | } | ||
| 70 | }); | ||
| 71 | } else if (rule instanceof CSSMediaRule || rule instanceof CSSSupportsRule) { | ||
| 72 | // Recursively process nested rules | ||
| 73 | processRules(rule.cssRules); | ||
| 74 | } | ||
| 75 | }); | ||
| 76 | } | ||
| 77 | |||
| 78 | /** | ||
| 79 | * Processes the CSS rules of an imported stylesheet recursively | ||
| 80 | * @param {CSSStyleSheet} sheet - The imported stylesheet to process | ||
| 81 | */ | ||
| 82 | function processImportedStylesheet(sheet) { | ||
| 83 | if (sheet && sheet.cssRules) { | ||
| 84 | processRules(sheet.cssRules); | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 88 | processRules(styleSheet.cssRules); | ||
| 89 | |||
| 90 | /** @type {CSSStyleSheet} */ | ||
| 91 | let targetStyleSheet = null; | ||
| 92 | |||
| 93 | // Now finally create the dynamic focus rules | ||
| 94 | hoverRules.forEach(({ baseSelector, rule }) => { | ||
| 95 | if (!focusRules.has(baseSelector)) { | ||
| 96 | // Only initialize the dynamic stylesheet if needed | ||
| 97 | targetStyleSheet ??= getDynamicStyleSheet({ fromExtension }); | ||
| 98 | |||
| 99 | // The closest keyboard-equivalent to :hover styling is utilizing the :focus-visible rule from modern browsers. | ||
| 100 | // It let's the browser decide whether a focus highlighting is expected and makes sense. | ||
| 101 | // So we take all :hover rules that don't have a manually defined focus rule yet, and create their | ||
| 102 | // :focus-visible counterpart, which will make the styling work the same for keyboard and mouse. | ||
| 103 | // If something like :focus-within or a more specific selector like `.blah:has(:focus-visible)` for elements inside, | ||
| 104 | // it should be manually defined in CSS. | ||
| 105 | const focusSelector = rule.selectorText.replace(/:hover/g, ':focus-visible'); | ||
| 106 | const focusRule = `${focusSelector} { ${rule.style.cssText} }`; | ||
| 107 | |||
| 108 | try { | ||
| 109 | targetStyleSheet.insertRule(focusRule, targetStyleSheet.cssRules.length); | ||
| 110 | } catch (e) { | ||
| 111 | console.warn('Failed to insert focus rule:', e); | ||
| 112 | } | ||
| 113 | } | ||
| 114 | }); | ||
| 115 | } | ||
| 116 | |||
| 117 | /** | ||
| 118 | * Retrieves the stylesheet that should be used for dynamic rules | ||
| 119 | * | ||
| 120 | * @param {object} options - The options object | ||
| 121 | * @param {boolean} [options.fromExtension=false] - Indicates whether the rules are coming from extensions | ||
| 122 | * @return {CSSStyleSheet} The dynamic stylesheet | ||
| 123 | */ | ||
| 124 | function getDynamicStyleSheet({ fromExtension = false } = {}) { | ||
| 125 | if (fromExtension) { | ||
| 126 | if (!dynamicExtensionStyleSheet) { | ||
| 127 | const styleSheetElement = document.createElement('style'); | ||
| 128 | styleSheetElement.setAttribute('id', 'dynamic-extension-styles'); | ||
| 129 | document.head.appendChild(styleSheetElement); | ||
| 130 | dynamicExtensionStyleSheet = styleSheetElement.sheet; | ||
| 131 | } | ||
| 132 | return dynamicExtensionStyleSheet; | ||
| 133 | } else { | ||
| 134 | if (!dynamicStyleSheet) { | ||
| 135 | const styleSheetElement = document.createElement('style'); | ||
| 136 | styleSheetElement.setAttribute('id', 'dynamic-styles'); | ||
| 137 | document.head.appendChild(styleSheetElement); | ||
| 138 | dynamicStyleSheet = styleSheetElement.sheet; | ||
| 139 | } | ||
| 140 | return dynamicStyleSheet; | ||
| 141 | } | ||
| 142 | } | ||
| 143 | |||
| 144 | /** | ||
| 145 | * Initializes dynamic styles for ST | ||
| 146 | */ | ||
| 147 | export function initDynamicStyles() { | ||
| 148 | // Start observing the head for any new added stylesheets | ||
| 149 | observer.observe(document.head, { | ||
| 150 | childList: true, | ||
| 151 | subtree: true | ||
| 152 | }); | ||
| 153 | |||
| 154 | // Process all stylesheets on initial load | ||
| 155 | Array.from(document.styleSheets).forEach(sheet => { | ||
| 156 | try { | ||
| 157 | applyDynamicFocusStyles(sheet, { fromExtension: sheet.href.toLowerCase().includes('scripts/extensions') }); | ||
| 158 | } catch (e) { | ||
| 159 | console.warn('Failed to process stylesheet on initial load:', e); | ||
| 160 | } | ||
| 161 | }); | ||
| 162 | } | ||
| @@ -1,5 +1,6 @@ | |||
| 1 | import { callPopup, eventSource, event_types, saveSettings, saveSettingsDebounced, getRequestHeaders, animation_duration } from '../script.js'; | 1 | import { eventSource, event_types, saveSettings, saveSettingsDebounced, getRequestHeaders, animation_duration } from '../script.js'; |
| 2 | import { hideLoader, showLoader } from './loader.js'; | 2 | import { hideLoader, showLoader } from './loader.js'; |
| 3 | import { POPUP_RESULT, POPUP_TYPE, Popup, callGenericPopup } from './popup.js'; | ||
| 3 | import { renderTemplate, renderTemplateAsync } from './templates.js'; | 4 | import { renderTemplate, renderTemplateAsync } from './templates.js'; |
| 4 | import { isSubsetOf, setValueByPath } from './utils.js'; | 5 | import { isSubsetOf, setValueByPath } from './utils.js'; |
| 5 | export { | 6 | export { |
| @@ -347,14 +348,12 @@ function autoConnectInputHandler() { | |||
| 347 | saveSettingsDebounced(); | 348 | saveSettingsDebounced(); |
| 348 | } | 349 | } |
| 349 | 350 | ||
| 350 | function addExtensionsButtonAndMenu() { | 351 | async function addExtensionsButtonAndMenu() { |
| 351 | const buttonHTML = | 352 | const buttonHTML = await renderTemplateAsync('wandButton'); |
| 352 | '<div id="extensionsMenuButton" style="display: none;" class="fa-solid fa-magic-wand-sparkles" title="Extras Extensions" /></div>'; | 353 | const extensionsMenuHTML = await renderTemplateAsync('wandMenu'); |
| 353 | const extensionsMenuHTML = '<div id="extensionsMenu" class="options-content" style="display: none;"></div>'; | ||
| 354 | 354 | ||
| 355 | $(document.body).append(extensionsMenuHTML); | 355 | $(document.body).append(extensionsMenuHTML); |
| 356 | 356 | $('#leftSendForm').append(buttonHTML); | |
| 357 | $('#leftSendForm').prepend(buttonHTML); | ||
| 358 | 357 | ||
| 359 | const button = $('#extensionsMenuButton'); | 358 | const button = $('#extensionsMenuButton'); |
| 360 | const dropdown = $('#extensionsMenu'); | 359 | const dropdown = $('#extensionsMenu'); |
| @@ -505,7 +504,7 @@ function addExtensionScript(name, manifest) { | |||
| 505 | * @param {boolean} isDisabled - Whether the extension is disabled or not. | 504 | * @param {boolean} isDisabled - Whether the extension is disabled or not. |
| 506 | * @param {boolean} isExternal - Whether the extension is external or not. | 505 | * @param {boolean} isExternal - Whether the extension is external or not. |
| 507 | * @param {string} checkboxClass - The class for the checkbox HTML element. | 506 | * @param {string} checkboxClass - The class for the checkbox HTML element. |
| 508 | * @return {string} - The HTML string that represents the extension. | 507 | * @return {Promise<string>} - The HTML string that represents the extension. |
| 509 | */ | 508 | */ |
| 510 | async function generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, checkboxClass) { | 509 | async function generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, checkboxClass) { |
| 511 | const displayName = manifest.display_name; | 510 | const displayName = manifest.display_name; |
| @@ -557,9 +556,11 @@ async function generateExtensionHtml(name, manifest, isActive, isDisabled, isExt | |||
| 557 | } else if (!isDisabled) { // Neither active nor disabled | 556 | } else if (!isDisabled) { // Neither active nor disabled |
| 558 | const requirements = new Set(manifest.requires); | 557 | const requirements = new Set(manifest.requires); |
| 559 | modules.forEach(x => requirements.delete(x)); | 558 | modules.forEach(x => requirements.delete(x)); |
| 559 | if (requirements.size > 0) { | ||
| 560 | const requirementsString = DOMPurify.sanitize([...requirements].join(', ')); | 560 | const requirementsString = DOMPurify.sanitize([...requirements].join(', ')); |
| 561 | extensionHtml += `<p>Missing modules: <span class="failure">${requirementsString}</span></p>`; | 561 | extensionHtml += `<p>Missing modules: <span class="failure">${requirementsString}</span></p>`; |
| 562 | } | 562 | } |
| 563 | } | ||
| 563 | 564 | ||
| 564 | return extensionHtml; | 565 | return extensionHtml; |
| 565 | } | 566 | } |
| @@ -633,7 +634,18 @@ async function showExtensionsDetails() { | |||
| 633 | ${htmlDefault} | 634 | ${htmlDefault} |
| 634 | ${htmlExternal} | 635 | ${htmlExternal} |
| 635 | `; | 636 | `; |
| 636 | popupPromise = callPopup(`<div class="extensions_info">${html}</div>`, 'text', '', { okButton: 'Close', wide: true, large: true }); | 637 | /** @type {import('./popup.js').CustomPopupButton} */ |
| 638 | const updateAllButton = { | ||
| 639 | text: 'Update all', | ||
| 640 | appendAtEnd: true, | ||
| 641 | action: async () => { | ||
| 642 | requiresReload = true; | ||
| 643 | await autoUpdateExtensions(true); | ||
| 644 | popup.complete(POPUP_RESULT.AFFIRMATIVE); | ||
| 645 | }, | ||
| 646 | }; | ||
| 647 | const popup = new Popup(`<div class="extensions_info">${html}</div>`, POPUP_TYPE.TEXT, '', { okButton: 'Close', wide: true, large: true, customButtons: [updateAllButton], allowVerticalScrolling: true }); | ||
| 648 | popupPromise = popup.show(); | ||
| 637 | } catch (error) { | 649 | } catch (error) { |
| 638 | toastr.error('Error loading extensions. See browser console for details.'); | 650 | toastr.error('Error loading extensions. See browser console for details.'); |
| 639 | console.error(error); | 651 | console.error(error); |
| @@ -702,8 +714,8 @@ async function updateExtension(extensionName, quiet) { | |||
| 702 | async function onDeleteClick() { | 714 | async function onDeleteClick() { |
| 703 | const extensionName = $(this).data('name'); | 715 | const extensionName = $(this).data('name'); |
| 704 | // use callPopup to create a popup for the user to confirm before delete | 716 | // use callPopup to create a popup for the user to confirm before delete |
| 705 | const confirmation = await callPopup(`Are you sure you want to delete ${extensionName}?`, 'delete_extension'); | 717 | const confirmation = await callGenericPopup(`Are you sure you want to delete ${extensionName}?`, POPUP_TYPE.CONFIRM, '', {}); |
| 706 | if (confirmation) { | 718 | if (confirmation === POPUP_RESULT.AFFIRMATIVE) { |
| 707 | await deleteExtension(extensionName); | 719 | await deleteExtension(extensionName); |
| 708 | } | 720 | } |
| 709 | } | 721 | } |
| @@ -799,7 +811,7 @@ async function loadExtensionSettings(settings, versionChanged) { | |||
| 799 | manifests = await getManifests(extensionNames); | 811 | manifests = await getManifests(extensionNames); |
| 800 | 812 | ||
| 801 | if (versionChanged) { | 813 | if (versionChanged) { |
| 802 | await autoUpdateExtensions(); | 814 | await autoUpdateExtensions(false); |
| 803 | } | 815 | } |
| 804 | 816 | ||
| 805 | await activateExtensions(); | 817 | await activateExtensions(); |
| @@ -862,7 +874,12 @@ async function checkForExtensionUpdates(force) { | |||
| 862 | } | 874 | } |
| 863 | } | 875 | } |
| 864 | 876 | ||
| 865 | async function autoUpdateExtensions() { | 877 | /** |
| 878 | * Updates all 3rd-party extensions that have auto-update enabled. | ||
| 879 | * @param {boolean} forceAll Force update all even if not auto-updating | ||
| 880 | * @returns {Promise<void>} | ||
| 881 | */ | ||
| 882 | async function autoUpdateExtensions(forceAll) { | ||
| 866 | if (!Object.values(manifests).some(x => x.auto_update)) { | 883 | if (!Object.values(manifests).some(x => x.auto_update)) { |
| 867 | return; | 884 | return; |
| 868 | } | 885 | } |
| @@ -870,7 +887,7 @@ async function autoUpdateExtensions() { | |||
| 870 | const banner = toastr.info('Auto-updating extensions. This may take several minutes.', 'Please wait...', { timeOut: 10000, extendedTimeOut: 10000 }); | 887 | const banner = toastr.info('Auto-updating extensions. This may take several minutes.', 'Please wait...', { timeOut: 10000, extendedTimeOut: 10000 }); |
| 871 | const promises = []; | 888 | const promises = []; |
| 872 | for (const [id, manifest] of Object.entries(manifests)) { | 889 | for (const [id, manifest] of Object.entries(manifests)) { |
| 873 | if (manifest.auto_update && id.startsWith('third-party')) { | 890 | if ((forceAll || manifest.auto_update) && id.startsWith('third-party')) { |
| 874 | console.debug(`Auto-updating 3rd-party extension: ${manifest.display_name} (${id})`); | 891 | console.debug(`Auto-updating 3rd-party extension: ${manifest.display_name} (${id})`); |
| 875 | promises.push(updateExtension(id.replace('third-party', ''), true)); | 892 | promises.push(updateExtension(id.replace('third-party', ''), true)); |
| 876 | } | 893 | } |
| @@ -961,8 +978,8 @@ export async function writeExtensionField(characterId, key, value) { | |||
| 961 | } | 978 | } |
| 962 | } | 979 | } |
| 963 | 980 | ||
| 964 | jQuery(function () { | 981 | jQuery(async function () { |
| 965 | addExtensionsButtonAndMenu(); | 982 | await addExtensionsButtonAndMenu(); |
| 966 | $('#extensionsMenuButton').css('display', 'flex'); | 983 | $('#extensionsMenuButton').css('display', 'flex'); |
| 967 | 984 | ||
| 968 | $('#extensions_connect').on('click', connectClickHandler); | 985 | $('#extensions_connect').on('click', connectClickHandler); |
| @@ -990,14 +1007,14 @@ jQuery(function () { | |||
| 990 | <p><b>Disclaimer:</b> Please be aware that using external extensions can have unintended side effects and may pose security risks. Always make sure you trust the source before importing an extension. We are not responsible for any damage caused by third-party extensions.</p> | 1007 | <p><b>Disclaimer:</b> Please be aware that using external extensions can have unintended side effects and may pose security risks. Always make sure you trust the source before importing an extension. We are not responsible for any damage caused by third-party extensions.</p> |
| 991 | <br> | 1008 | <br> |
| 992 | <p>Example: <tt> https://github.com/author/extension-name </tt></p>`; | 1009 | <p>Example: <tt> https://github.com/author/extension-name </tt></p>`; |
| 993 | const input = await callPopup(html, 'input'); | 1010 | const input = await callGenericPopup(html, POPUP_TYPE.INPUT, ''); |
| 994 | 1011 | ||
| 995 | if (!input) { | 1012 | if (!input) { |
| 996 | console.debug('Extension install cancelled'); | 1013 | console.debug('Extension install cancelled'); |
| 997 | return; | 1014 | return; |
| 998 | } | 1015 | } |
| 999 | 1016 | ||
| 1000 | const url = input.trim(); | 1017 | const url = String(input).trim(); |
| 1001 | await installExtension(url); | 1018 | await installExtension(url); |
| 1002 | }); | 1019 | }); |
| 1003 | }); | 1020 | }); |
| @@ -440,7 +440,7 @@ jQuery(async () => { | |||
| 440 | }); | 440 | }); |
| 441 | 441 | ||
| 442 | windowHtml.find('#assets_filters').hide(); | 442 | windowHtml.find('#assets_filters').hide(); |
| 443 | $('#extensions_settings').append(windowHtml); | 443 | $('#assets_container').append(windowHtml); |
| 444 | 444 | ||
| 445 | eventSource.on(event_types.OPEN_CHARACTER_LIBRARY, async (forceDefault) => { | 445 | eventSource.on(event_types.OPEN_CHARACTER_LIBRARY, async (forceDefault) => { |
| 446 | openCharacterBrowser(forceDefault); | 446 | openCharacterBrowser(forceDefault); |
| @@ -1,11 +1,11 @@ | |||
| 1 | <div id="assets_ui"> | 1 | <div id="assets_ui"> |
| 2 | <div class="inline-drawer"> | 2 | <div class="inline-drawer"> |
| 3 | <div class="inline-drawer-toggle inline-drawer-header"> | 3 | <div class="inline-drawer-toggle inline-drawer-header"> |
| 4 | <b>Download Extensions & Assets</b> | 4 | <b data-i18n="Download Extensions & Assets">Download Extensions & Assets</b> |
| 5 | <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div> | 5 | <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div> |
| 6 | </div> | 6 | </div> |
| 7 | <div class="inline-drawer-content"> | 7 | <div class="inline-drawer-content"> |
| 8 | <label for="assets-json-url-field">Assets URL</label> | 8 | <label for="assets-json-url-field" data-i18n="Assets URL">Assets URL</label> |
| 9 | <div class="assets-connect-div"> | 9 | <div class="assets-connect-div"> |
| 10 | <input id="assets-json-url-field" class="text_pole widthUnset flex1"> | 10 | <input id="assets-json-url-field" class="text_pole widthUnset flex1"> |
| 11 | <i id="assets-connect-button" class="menu_button fa-solid fa-plug-circle-exclamation fa-xl redOverlayGlow"></i> | 11 | <i id="assets-connect-button" class="menu_button fa-solid fa-plug-circle-exclamation fa-xl redOverlayGlow"></i> |
| @@ -16,7 +16,7 @@ | |||
| 16 | <input id="assets_search" class="text_pole flex1" placeholder="Search" type="search"> | 16 | <input id="assets_search" class="text_pole flex1" placeholder="Search" type="search"> |
| 17 | <div id="assets-characters-button" class="menu_button menu_button_icon"> | 17 | <div id="assets-characters-button" class="menu_button menu_button_icon"> |
| 18 | <i class="fa-solid fa-image-portrait"></i> | 18 | <i class="fa-solid fa-image-portrait"></i> |
| 19 | Characters | 19 | <span data-i18n="Characters">Characters</span> |
| 20 | </div> | 20 | </div> |
| 21 | </div> | 21 | </div> |
| 22 | <div class="inline-drawer-content" id="assets_menu"> | 22 | <div class="inline-drawer-content" id="assets_menu"> |
| @@ -0,0 +1,4 @@ | |||
| 1 | <div id="attachFile" class="list-group-item flex-container flexGap5" title="Attach a file or image to a current chat."> | ||
| 2 | <div class="fa-fw fa-solid fa-paperclip extensionsMenuExtensionButton"></div> | ||
| 3 | <span data-i18n="Attach a File">Attach a File</span> | ||
| 4 | </div> | ||
| @@ -2,6 +2,10 @@ import { deleteAttachment, getDataBankAttachments, getDataBankAttachmentsForSour | |||
| 2 | import { extension_settings, renderExtensionTemplateAsync } from '../../extensions.js'; | 2 | import { extension_settings, renderExtensionTemplateAsync } from '../../extensions.js'; |
| 3 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; | 3 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; |
| 4 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; | 4 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; |
| 5 | import { SlashCommandClosure } from '../../slash-commands/SlashCommandClosure.js'; | ||
| 6 | import { enumIcons } from '../../slash-commands/SlashCommandCommonEnumsProvider.js'; | ||
| 7 | import { SlashCommandEnumValue, enumTypes } from '../../slash-commands/SlashCommandEnumValue.js'; | ||
| 8 | import { SlashCommandExecutor } from '../../slash-commands/SlashCommandExecutor.js'; | ||
| 5 | import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; | 9 | import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; |
| 6 | 10 | ||
| 7 | /** | 11 | /** |
| @@ -193,12 +197,36 @@ async function enableDataBankAttachment(args, value) { | |||
| 193 | } | 197 | } |
| 194 | 198 | ||
| 195 | jQuery(async () => { | 199 | jQuery(async () => { |
| 196 | const buttons = await renderExtensionTemplateAsync('attachments', 'buttons', {}); | 200 | const manageButton = await renderExtensionTemplateAsync('attachments', 'manage-button', {}); |
| 197 | $('#extensionsMenu').prepend(buttons); | 201 | const attachButton = await renderExtensionTemplateAsync('attachments', 'attach-button', {}); |
| 202 | $('#data_bank_wand_container').append(manageButton); | ||
| 203 | $('#attach_file_wand_container').append(attachButton); | ||
| 204 | |||
| 205 | /** A collection of local enum providers for this context of data bank */ | ||
| 206 | const localEnumProviders = { | ||
| 207 | /** | ||
| 208 | * All attachments in the data bank based on the source argument. If not provided, defaults to 'chat'. | ||
| 209 | * @param {'name' | 'url'} returnField - Whether the enum should return the 'name' field or the 'url' | ||
| 210 | * @param {'chat' | 'character' | 'global' | ''} fallbackSource - The source to use if the source argument is not provided. Empty string to use all sources. | ||
| 211 | * */ | ||
| 212 | attachments: (returnField = 'name', fallbackSource = 'chat') => (/** @type {SlashCommandExecutor} */ executor) => { | ||
| 213 | const source = executor.namedArgumentList.find(it => it.name == 'source')?.value ?? fallbackSource; | ||
| 214 | if (source instanceof SlashCommandClosure) throw new Error('Argument \'source\' does not support closures'); | ||
| 215 | const attachments = getAttachments(source); | ||
| 216 | |||
| 217 | return attachments.map(attachment => new SlashCommandEnumValue( | ||
| 218 | returnField === 'name' ? attachment.name : attachment.url, | ||
| 219 | `${enumIcons.getStateIcon(!extension_settings.disabled_attachments.includes(attachment.url))} [${source}] ${returnField === 'url' ? attachment.name : attachment.url}`, | ||
| 220 | enumTypes.enum, enumIcons.file)); | ||
| 221 | }, | ||
| 222 | }; | ||
| 198 | 223 | ||
| 199 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ | 224 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 200 | name: 'db', | 225 | name: 'db', |
| 201 | callback: () => document.getElementById('manageAttachments')?.click(), | 226 | callback: () => { |
| 227 | document.getElementById('manageAttachments')?.click(); | ||
| 228 | return ''; | ||
| 229 | }, | ||
| 202 | aliases: ['databank', 'data-bank'], | 230 | aliases: ['databank', 'data-bank'], |
| 203 | helpString: 'Open the data bank', | 231 | helpString: 'Open the data bank', |
| 204 | })); | 232 | })); |
| @@ -224,7 +252,13 @@ jQuery(async () => { | |||
| 224 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, '', TYPES), | 252 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, '', TYPES), |
| 225 | ], | 253 | ], |
| 226 | unnamedArgumentList: [ | 254 | unnamedArgumentList: [ |
| 227 | new SlashCommandArgument('The name or URL of the attachment.', ARGUMENT_TYPE.STRING, true, false), | 255 | SlashCommandArgument.fromProps({ |
| 256 | description: 'The name or URL of the attachment.', | ||
| 257 | typeList: [ARGUMENT_TYPE.STRING], | ||
| 258 | isRequired: true, | ||
| 259 | acceptsMultiple: false, | ||
| 260 | enumProvider: localEnumProviders.attachments('name', ''), | ||
| 261 | }), | ||
| 228 | ], | 262 | ], |
| 229 | returns: ARGUMENT_TYPE.STRING, | 263 | returns: ARGUMENT_TYPE.STRING, |
| 230 | })); | 264 | })); |
| @@ -251,8 +285,18 @@ jQuery(async () => { | |||
| 251 | helpString: 'Update an attachment in the Data Bank, preserving its name. Returns a new URL of the attachment.', | 285 | helpString: 'Update an attachment in the Data Bank, preserving its name. Returns a new URL of the attachment.', |
| 252 | namedArgumentList: [ | 286 | namedArgumentList: [ |
| 253 | new SlashCommandNamedArgument('source', 'The source for the attachment.', ARGUMENT_TYPE.STRING, false, false, 'chat', TYPES), | 287 | new SlashCommandNamedArgument('source', 'The source for the attachment.', ARGUMENT_TYPE.STRING, false, false, 'chat', TYPES), |
| 254 | new SlashCommandNamedArgument('name', 'The name of the attachment.', ARGUMENT_TYPE.STRING, false, false), | 288 | SlashCommandNamedArgument.fromProps({ |
| 255 | new SlashCommandNamedArgument('url', 'The URL of the attachment to update.', ARGUMENT_TYPE.STRING, false, false), | 289 | name: 'name', |
| 290 | description: 'The name of the attachment.', | ||
| 291 | typeList: [ARGUMENT_TYPE.STRING], | ||
| 292 | enumProvider: localEnumProviders.attachments('name'), | ||
| 293 | }), | ||
| 294 | SlashCommandNamedArgument.fromProps({ | ||
| 295 | name: 'url', | ||
| 296 | description: 'The URL of the attachment.', | ||
| 297 | typeList: [ARGUMENT_TYPE.STRING], | ||
| 298 | enumProvider: localEnumProviders.attachments('url'), | ||
| 299 | }), | ||
| 256 | ], | 300 | ], |
| 257 | unnamedArgumentList: [ | 301 | unnamedArgumentList: [ |
| 258 | new SlashCommandArgument('The content of the file attachment.', ARGUMENT_TYPE.STRING, true, false), | 302 | new SlashCommandArgument('The content of the file attachment.', ARGUMENT_TYPE.STRING, true, false), |
| @@ -269,7 +313,12 @@ jQuery(async () => { | |||
| 269 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, '', TYPES), | 313 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, '', TYPES), |
| 270 | ], | 314 | ], |
| 271 | unnamedArgumentList: [ | 315 | unnamedArgumentList: [ |
| 272 | new SlashCommandArgument('The name or URL of the attachment.', ARGUMENT_TYPE.STRING, true, false), | 316 | SlashCommandArgument.fromProps({ |
| 317 | description: 'The name or URL of the attachment.', | ||
| 318 | typeList: [ARGUMENT_TYPE.STRING], | ||
| 319 | isRequired: true, | ||
| 320 | enumProvider: localEnumProviders.attachments('name', ''), | ||
| 321 | }), | ||
| 273 | ], | 322 | ], |
| 274 | })); | 323 | })); |
| 275 | 324 | ||
| @@ -282,7 +331,12 @@ jQuery(async () => { | |||
| 282 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, '', TYPES), | 331 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, '', TYPES), |
| 283 | ], | 332 | ], |
| 284 | unnamedArgumentList: [ | 333 | unnamedArgumentList: [ |
| 285 | new SlashCommandArgument('The name or URL of the attachment.', ARGUMENT_TYPE.STRING, true, false), | 334 | SlashCommandArgument.fromProps({ |
| 335 | description: 'The name or URL of the attachment.', | ||
| 336 | typeList: [ARGUMENT_TYPE.STRING], | ||
| 337 | isRequired: true, | ||
| 338 | enumProvider: localEnumProviders.attachments('name', ''), | ||
| 339 | }), | ||
| 286 | ], | 340 | ], |
| 287 | })); | 341 | })); |
| 288 | 342 | ||
| @@ -295,7 +349,12 @@ jQuery(async () => { | |||
| 295 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, 'chat', TYPES), | 349 | new SlashCommandNamedArgument('source', 'The source of the attachment.', ARGUMENT_TYPE.STRING, false, false, 'chat', TYPES), |
| 296 | ], | 350 | ], |
| 297 | unnamedArgumentList: [ | 351 | unnamedArgumentList: [ |
| 298 | new SlashCommandArgument('The name or URL of the attachment.', ARGUMENT_TYPE.STRING, true, false), | 352 | SlashCommandArgument.fromProps({ |
| 353 | description: 'The name or URL of the attachment.', | ||
| 354 | typeList: [ARGUMENT_TYPE.STRING], | ||
| 355 | isRequired: true, | ||
| 356 | enumProvider: localEnumProviders.attachments(), | ||
| 357 | }), | ||
| 299 | ], | 358 | ], |
| 300 | })); | 359 | })); |
| 301 | }); | 360 | }); |
| @@ -1,7 +1,4 @@ | |||
| 1 | <div id="attachFile" class="list-group-item flex-container flexGap5" title="Attach a file or image to a current chat."> | 1 | |
| 2 | <div class="fa-fw fa-solid fa-paperclip extensionsMenuExtensionButton"></div> | ||
| 3 | <span data-i18n="Attach a File">Attach a File</span> | ||
| 4 | </div> | ||
| 5 | 2 | ||
| 6 | <div id="manageAttachments" class="list-group-item flex-container flexGap5" title="View global, character, or data files."> | 3 | <div id="manageAttachments" class="list-group-item flex-container flexGap5" title="View global, character, or data files."> |
| 7 | <div class="fa-fw fa-solid fa-book-open-reader extensionsMenuExtensionButton"></div> | 4 | <div class="fa-fw fa-solid fa-book-open-reader extensionsMenuExtensionButton"></div> |
| @@ -53,6 +53,14 @@ | |||
| 53 | <i class="fa-solid fa-square"></i> | 53 | <i class="fa-solid fa-square"></i> |
| 54 | <span data-i18n="Select None">Select None</span> | 54 | <span data-i18n="Select None">Select None</span> |
| 55 | </div> | 55 | </div> |
| 56 | <div class="menu_button menu_button_icon bulkActionDisable" title="Disable selected attachments"> | ||
| 57 | <i class="fa-solid fa-comment-slash"></i> | ||
| 58 | <span data-i18n="Disable">Disable</span> | ||
| 59 | </div> | ||
| 60 | <div class="menu_button menu_button_icon bulkActionEnable" title="Enable selected attachments"> | ||
| 61 | <i class="fa-solid fa-comment"></i> | ||
| 62 | <span data-i18n="Enable">Enable</span> | ||
| 63 | </div> | ||
| 56 | <div class="menu_button menu_button_icon bulkActionDelete" title="Delete selected attachments"> | 64 | <div class="menu_button menu_button_icon bulkActionDelete" title="Delete selected attachments"> |
| 57 | <i class="fa-solid fa-trash"></i> | 65 | <i class="fa-solid fa-trash"></i> |
| 58 | <span data-i18n="Delete">Delete</span> | 66 | <span data-i18n="Delete">Delete</span> |
| @@ -88,8 +96,8 @@ | |||
| 88 | <div class="flex-container flexFlowColumn"> | 96 | <div class="flex-container flexFlowColumn"> |
| 89 | <strong><small class="characterAttachmentsName"></small></strong> | 97 | <strong><small class="characterAttachmentsName"></small></strong> |
| 90 | <small> | 98 | <small> |
| 91 | <span data-i18n="These files are available the current character in all chats they are in."> | 99 | <span data-i18n="These files are available for the current character in all chats they are in."> |
| 92 | These files are available the current character in all chats they are in. | 100 | These files are available for the current character in all chats they are in. |
| 93 | </span> | 101 | </span> |
| 94 | <span> | 102 | <span> |
| 95 | <span data-i18n="Saved locally. Not exported."> | 103 | <span data-i18n="Saved locally. Not exported."> |
| @@ -113,8 +121,8 @@ | |||
| 113 | </h3> | 121 | </h3> |
| 114 | <div class="flex-container flexFlowColumn"> | 122 | <div class="flex-container flexFlowColumn"> |
| 115 | <strong><small class="chatAttachmentsName"></small></strong> | 123 | <strong><small class="chatAttachmentsName"></small></strong> |
| 116 | <small data-i18n="These files are available to all characters in the current chat."> | 124 | <small data-i18n="These files are available for all characters in the current chat."> |
| 117 | These files are available to all characters in the current chat. | 125 | These files are available for all characters in the current chat. |
| 118 | </small> | 126 | </small> |
| 119 | </div> | 127 | </div> |
| 120 | <div class="chatAttachmentsList attachmentsList"></div> | 128 | <div class="chatAttachmentsList attachmentsList"></div> |
| @@ -1,6 +1,6 @@ | |||
| 1 | import { getBase64Async, isTrueBoolean, saveBase64AsFile } from '../../utils.js'; | 1 | import { ensureImageFormatSupported, getBase64Async, isTrueBoolean, saveBase64AsFile } from '../../utils.js'; |
| 2 | import { getContext, getApiUrl, doExtrasFetch, extension_settings, modules, renderExtensionTemplateAsync } from '../../extensions.js'; | 2 | import { getContext, getApiUrl, doExtrasFetch, extension_settings, modules, renderExtensionTemplateAsync } from '../../extensions.js'; |
| 3 | import { callPopup, getRequestHeaders, saveSettingsDebounced, substituteParams } from '../../../script.js'; | 3 | import { appendMediaToMessage, callPopup, eventSource, event_types, getRequestHeaders, saveChatConditional, saveSettingsDebounced, substituteParamsExtended } from '../../../script.js'; |
| 4 | import { getMessageTimeStamp } from '../../RossAscends-mods.js'; | 4 | import { getMessageTimeStamp } from '../../RossAscends-mods.js'; |
| 5 | import { SECRET_KEYS, secret_state } from '../../secrets.js'; | 5 | import { SECRET_KEYS, secret_state } from '../../secrets.js'; |
| 6 | import { getMultimodalCaption } from '../shared.js'; | 6 | import { getMultimodalCaption } from '../shared.js'; |
| @@ -8,6 +8,8 @@ import { textgen_types, textgenerationwebui_settings } from '../../textgen-setti | |||
| 8 | import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; | 8 | import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; |
| 9 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; | 9 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; |
| 10 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; | 10 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; |
| 11 | import { SlashCommandEnumValue } from '../../slash-commands/SlashCommandEnumValue.js'; | ||
| 12 | import { commonEnumProviders } from '../../slash-commands/SlashCommandCommonEnumsProvider.js'; | ||
| 11 | export { MODULE_NAME }; | 13 | export { MODULE_NAME }; |
| 12 | 14 | ||
| 13 | const MODULE_NAME = 'caption'; | 15 | const MODULE_NAME = 'caption'; |
| @@ -82,12 +84,11 @@ async function setSpinnerIcon() { | |||
| 82 | } | 84 | } |
| 83 | 85 | ||
| 84 | /** | 86 | /** |
| 85 | * Sends a captioned message to the chat. | 87 | * Wraps a caption with a message template. |
| 86 | * @param {string} caption Caption text | 88 | * @param {string} caption Raw caption |
| 87 | * @param {string} image Image URL | 89 | * @returns {Promise<string>} Wrapped caption |
| 88 | */ | 90 | */ |
| 89 | async function sendCaptionedMessage(caption, image) { | 91 | async function wrapCaptionTemplate(caption) { |
| 90 | const context = getContext(); | ||
| 91 | let template = extension_settings.caption.template || TEMPLATE_DEFAULT; | 92 | let template = extension_settings.caption.template || TEMPLATE_DEFAULT; |
| 92 | 93 | ||
| 93 | if (!/{{caption}}/i.test(template)) { | 94 | if (!/{{caption}}/i.test(template)) { |
| @@ -95,11 +96,11 @@ async function sendCaptionedMessage(caption, image) { | |||
| 95 | template += ' {{caption}}'; | 96 | template += ' {{caption}}'; |
| 96 | } | 97 | } |
| 97 | 98 | ||
| 98 | let messageText = substituteParams(template).replace(/{{caption}}/i, caption); | 99 | let messageText = substituteParamsExtended(template, { caption: caption }); |
| 99 | 100 | ||
| 100 | if (extension_settings.caption.refine_mode) { | 101 | if (extension_settings.caption.refine_mode) { |
| 101 | messageText = await callPopup( | 102 | messageText = await callPopup( |
| 102 | '<h3>Review and edit the generated message:</h3>Press "Cancel" to abort the caption sending.', | 103 | '<h3>Review and edit the generated caption:</h3>Press "Cancel" to abort the caption sending.', |
| 103 | 'input', | 104 | 'input', |
| 104 | messageText, | 105 | messageText, |
| 105 | { rows: 5, okButton: 'Send' }); | 106 | { rows: 5, okButton: 'Send' }); |
| @@ -109,6 +110,55 @@ async function sendCaptionedMessage(caption, image) { | |||
| 109 | } | 110 | } |
| 110 | } | 111 | } |
| 111 | 112 | ||
| 113 | return messageText; | ||
| 114 | } | ||
| 115 | |||
| 116 | /** | ||
| 117 | * Appends caption to an existing message. | ||
| 118 | * @param {Object} data Message data | ||
| 119 | * @returns {Promise<void>} | ||
| 120 | */ | ||
| 121 | async function captionExistingMessage(data) { | ||
| 122 | if (!(data?.extra?.image)) { | ||
| 123 | return; | ||
| 124 | } | ||
| 125 | |||
| 126 | const imageData = await fetch(data.extra.image); | ||
| 127 | const blob = await imageData.blob(); | ||
| 128 | const type = imageData.headers.get('Content-Type'); | ||
| 129 | const file = new File([blob], 'image.png', { type }); | ||
| 130 | const caption = await getCaptionForFile(file, null, true); | ||
| 131 | |||
| 132 | if (!caption) { | ||
| 133 | console.warn('Failed to generate a caption for the image.'); | ||
| 134 | return; | ||
| 135 | } | ||
| 136 | |||
| 137 | const wrappedCaption = await wrapCaptionTemplate(caption); | ||
| 138 | |||
| 139 | const messageText = String(data.mes).trim(); | ||
| 140 | |||
| 141 | if (!messageText) { | ||
| 142 | data.extra.inline_image = false; | ||
| 143 | data.mes = wrappedCaption; | ||
| 144 | data.extra.title = wrappedCaption; | ||
| 145 | } | ||
| 146 | else { | ||
| 147 | data.extra.inline_image = true; | ||
| 148 | data.extra.append_title = true; | ||
| 149 | data.extra.title = wrappedCaption; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | |||
| 153 | /** | ||
| 154 | * Sends a captioned message to the chat. | ||
| 155 | * @param {string} caption Caption text | ||
| 156 | * @param {string} image Image URL | ||
| 157 | */ | ||
| 158 | async function sendCaptionedMessage(caption, image) { | ||
| 159 | const messageText = await wrapCaptionTemplate(caption); | ||
| 160 | |||
| 161 | const context = getContext(); | ||
| 112 | const message = { | 162 | const message = { |
| 113 | name: context.name1, | 163 | name: context.name1, |
| 114 | is_user: true, | 164 | is_user: true, |
| @@ -272,7 +322,7 @@ async function getCaptionForFile(file, prompt, quiet) { | |||
| 272 | try { | 322 | try { |
| 273 | setSpinnerIcon(); | 323 | setSpinnerIcon(); |
| 274 | const context = getContext(); | 324 | const context = getContext(); |
| 275 | const fileData = await getBase64Async(file); | 325 | const fileData = await getBase64Async(await ensureImageFormatSupported(file)); |
| 276 | const base64Format = fileData.split(',')[0].split(';')[0].split('/')[1]; | 326 | const base64Format = fileData.split(',')[0].split(';')[0].split('/')[1]; |
| 277 | const base64Data = fileData.split(',')[1]; | 327 | const base64Data = fileData.split(',')[1]; |
| 278 | const { caption } = await doCaptionRequest(base64Data, fileData, prompt); | 328 | const { caption } = await doCaptionRequest(base64Data, fileData, prompt); |
| @@ -342,7 +392,7 @@ jQuery(async function () { | |||
| 342 | Generate Caption | 392 | Generate Caption |
| 343 | </div>`); | 393 | </div>`); |
| 344 | 394 | ||
| 345 | $('#extensionsMenu').prepend(sendButton); | 395 | $('#caption_wand_container').append(sendButton); |
| 346 | $(sendButton).on('click', () => { | 396 | $(sendButton).on('click', () => { |
| 347 | const hasCaptionModule = | 397 | const hasCaptionModule = |
| 348 | (modules.includes('caption') && extension_settings.caption.source === 'extras') || | 398 | (modules.includes('caption') && extension_settings.caption.source === 'extras') || |
| @@ -354,6 +404,7 @@ jQuery(async function () { | |||
| 354 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'llamacpp' && textgenerationwebui_settings.server_urls[textgen_types.LLAMACPP]) || | 404 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'llamacpp' && textgenerationwebui_settings.server_urls[textgen_types.LLAMACPP]) || |
| 355 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'ooba' && textgenerationwebui_settings.server_urls[textgen_types.OOBA]) || | 405 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'ooba' && textgenerationwebui_settings.server_urls[textgen_types.OOBA]) || |
| 356 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'koboldcpp' && textgenerationwebui_settings.server_urls[textgen_types.KOBOLDCPP]) || | 406 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'koboldcpp' && textgenerationwebui_settings.server_urls[textgen_types.KOBOLDCPP]) || |
| 407 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'vllm' && textgenerationwebui_settings.server_urls[textgen_types.VLLM]) || | ||
| 357 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'custom') || | 408 | (extension_settings.caption.source === 'multimodal' && extension_settings.caption.multimodal_api === 'custom') || |
| 358 | extension_settings.caption.source === 'local' || | 409 | extension_settings.caption.source === 'local' || |
| 359 | extension_settings.caption.source === 'horde'; | 410 | extension_settings.caption.source === 'horde'; |
| @@ -377,6 +428,12 @@ jQuery(async function () { | |||
| 377 | } | 428 | } |
| 378 | function switchMultimodalBlocks() { | 429 | function switchMultimodalBlocks() { |
| 379 | const isMultimodal = extension_settings.caption.source === 'multimodal'; | 430 | const isMultimodal = extension_settings.caption.source === 'multimodal'; |
| 431 | $('#caption_ollama_pull').on('click', (e) => { | ||
| 432 | const presetModel = extension_settings.caption.multimodal_model !== 'ollama_current' ? extension_settings.caption.multimodal_model : ''; | ||
| 433 | e.preventDefault(); | ||
| 434 | $('#ollama_download_model').trigger('click'); | ||
| 435 | $('#dialogue_popup_input').val(presetModel); | ||
| 436 | }); | ||
| 380 | $('#caption_multimodal_block').toggle(isMultimodal); | 437 | $('#caption_multimodal_block').toggle(isMultimodal); |
| 381 | $('#caption_prompt_block').toggle(isMultimodal); | 438 | $('#caption_prompt_block').toggle(isMultimodal); |
| 382 | $('#caption_multimodal_api').val(extension_settings.caption.multimodal_api); | 439 | $('#caption_multimodal_api').val(extension_settings.caption.multimodal_api); |
| @@ -400,8 +457,8 @@ jQuery(async function () { | |||
| 400 | }); | 457 | }); |
| 401 | } | 458 | } |
| 402 | async function addSettings() { | 459 | async function addSettings() { |
| 403 | const html = await renderExtensionTemplateAsync('caption', 'settings'); | 460 | const html = await renderExtensionTemplateAsync('caption', 'settings', { TEMPLATE_DEFAULT, PROMPT_DEFAULT }); |
| 404 | $('#extensions_settings2').append(html); | 461 | $('#caption_container').append(html); |
| 405 | } | 462 | } |
| 406 | 463 | ||
| 407 | await addSettings(); | 464 | await addSettings(); |
| @@ -414,6 +471,7 @@ jQuery(async function () { | |||
| 414 | $('#caption_refine_mode').prop('checked', !!(extension_settings.caption.refine_mode)); | 471 | $('#caption_refine_mode').prop('checked', !!(extension_settings.caption.refine_mode)); |
| 415 | $('#caption_allow_reverse_proxy').prop('checked', !!(extension_settings.caption.allow_reverse_proxy)); | 472 | $('#caption_allow_reverse_proxy').prop('checked', !!(extension_settings.caption.allow_reverse_proxy)); |
| 416 | $('#caption_prompt_ask').prop('checked', !!(extension_settings.caption.prompt_ask)); | 473 | $('#caption_prompt_ask').prop('checked', !!(extension_settings.caption.prompt_ask)); |
| 474 | $('#caption_auto_mode').prop('checked', !!(extension_settings.caption.auto_mode)); | ||
| 417 | $('#caption_source').val(extension_settings.caption.source); | 475 | $('#caption_source').val(extension_settings.caption.source); |
| 418 | $('#caption_prompt').val(extension_settings.caption.prompt); | 476 | $('#caption_prompt').val(extension_settings.caption.prompt); |
| 419 | $('#caption_template').val(extension_settings.caption.template); | 477 | $('#caption_template').val(extension_settings.caption.template); |
| @@ -439,17 +497,50 @@ jQuery(async function () { | |||
| 439 | extension_settings.caption.prompt_ask = $('#caption_prompt_ask').prop('checked'); | 497 | extension_settings.caption.prompt_ask = $('#caption_prompt_ask').prop('checked'); |
| 440 | saveSettingsDebounced(); | 498 | saveSettingsDebounced(); |
| 441 | }); | 499 | }); |
| 500 | $('#caption_auto_mode').on('input', () => { | ||
| 501 | extension_settings.caption.auto_mode = !!$('#caption_auto_mode').prop('checked'); | ||
| 502 | saveSettingsDebounced(); | ||
| 503 | }); | ||
| 504 | |||
| 505 | const onMessageEvent = async (index) => { | ||
| 506 | if (!extension_settings.caption.auto_mode) { | ||
| 507 | return; | ||
| 508 | } | ||
| 509 | |||
| 510 | const data = getContext().chat[index]; | ||
| 511 | await captionExistingMessage(data); | ||
| 512 | }; | ||
| 513 | |||
| 514 | eventSource.on(event_types.MESSAGE_SENT, onMessageEvent); | ||
| 515 | eventSource.on(event_types.MESSAGE_FILE_EMBEDDED, onMessageEvent); | ||
| 516 | |||
| 517 | $(document).on('click', '.mes_img_caption', async function () { | ||
| 518 | const animationClass = 'fa-fade'; | ||
| 519 | const messageBlock = $(this).closest('.mes'); | ||
| 520 | const messageImg = messageBlock.find('.mes_img'); | ||
| 521 | if (messageImg.hasClass(animationClass)) return; | ||
| 522 | messageImg.addClass(animationClass); | ||
| 523 | const index = Number(messageBlock.attr('mesid')); | ||
| 524 | const data = getContext().chat[index]; | ||
| 525 | await captionExistingMessage(data); | ||
| 526 | appendMediaToMessage(data, messageBlock, false); | ||
| 527 | await saveChatConditional(); | ||
| 528 | messageImg.removeClass(animationClass); | ||
| 529 | }); | ||
| 442 | 530 | ||
| 443 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'caption', | 531 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'caption', |
| 444 | callback: captionCommandCallback, | 532 | callback: captionCommandCallback, |
| 445 | returns: 'caption', | 533 | returns: 'caption', |
| 446 | namedArgumentList: [ | 534 | namedArgumentList: [ |
| 447 | new SlashCommandNamedArgument( | 535 | new SlashCommandNamedArgument( |
| 448 | 'quiet', 'suppress sending a captioned message', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false', ['true', 'false'], | 536 | 'quiet', 'suppress sending a captioned message', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false', |
| 449 | ), | ||
| 450 | new SlashCommandNamedArgument( | ||
| 451 | 'id', 'get image from a message with this ID', [ARGUMENT_TYPE.NUMBER], false, false, | ||
| 452 | ), | 537 | ), |
| 538 | SlashCommandNamedArgument.fromProps({ | ||
| 539 | name: 'id', | ||
| 540 | description: 'get image from a message with this ID', | ||
| 541 | typeList: [ARGUMENT_TYPE.NUMBER], | ||
| 542 | enumProvider: commonEnumProviders.messages(), | ||
| 543 | }), | ||
| 453 | ], | 544 | ], |
| 454 | unnamedArgumentList: [ | 545 | unnamedArgumentList: [ |
| 455 | new SlashCommandArgument( | 546 | new SlashCommandArgument( |
| @@ -471,4 +562,6 @@ jQuery(async function () { | |||
| 471 | </div> | 562 | </div> |
| 472 | `, | 563 | `, |
| 473 | })); | 564 | })); |
| 565 | |||
| 566 | document.body.classList.add('caption'); | ||
| 474 | }); | 567 | }); |
| @@ -2,38 +2,40 @@ | |||
| 2 | <div class="caption_settings"> | 2 | <div class="caption_settings"> |
| 3 | <div class="inline-drawer"> | 3 | <div class="inline-drawer"> |
| 4 | <div class="inline-drawer-toggle inline-drawer-header"> | 4 | <div class="inline-drawer-toggle inline-drawer-header"> |
| 5 | <b>Image Captioning</b> | 5 | <b data-i18n="Image Captioning">Image Captioning</b> |
| 6 | <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div> | 6 | <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div> |
| 7 | </div> | 7 | </div> |
| 8 | <div class="inline-drawer-content"> | 8 | <div class="inline-drawer-content"> |
| 9 | <label for="caption_source">Source</label> | 9 | <label for="caption_source" data-i18n="Source">Source</label> |
| 10 | <select id="caption_source" class="text_pole"> | 10 | <select id="caption_source" class="text_pole"> |
| 11 | <option value="local">Local</option> | 11 | <option value="local" data-i18n="Local">Local</option> |
| 12 | <option value="multimodal">Multimodal (OpenAI / Anthropic / llama / Google)</option> | 12 | <option value="multimodal" data-i18n="Multimodal (OpenAI / Anthropic / llama / Google)">Multimodal (OpenAI / Anthropic / llama / Google)</option> |
| 13 | <option value="extras">Extras</option> | 13 | <option value="extras" data-i18n="Extras">Extras</option> |
| 14 | <option value="horde">Horde</option> | 14 | <option value="horde" data-i18n="Horde">Horde</option> |
| 15 | </select> | 15 | </select> |
| 16 | <div id="caption_multimodal_block" class="flex-container wide100p"> | 16 | <div id="caption_multimodal_block" class="flex-container wide100p"> |
| 17 | <div class="flex1 flex-container flexFlowColumn flexNoGap"> | 17 | <div class="flex1 flex-container flexFlowColumn flexNoGap"> |
| 18 | <label for="caption_multimodal_api">API</label> | 18 | <label for="caption_multimodal_api" data-i18n="API">API</label> |
| 19 | <select id="caption_multimodal_api" class="flex1 text_pole"> | 19 | <select id="caption_multimodal_api" class="flex1 text_pole"> |
| 20 | <option value="anthropic">Anthropic</option> | 20 | <option value="anthropic">Anthropic</option> |
| 21 | <option value="custom">Custom (OpenAI-compatible)</option> | 21 | <option value="custom" data-i18n="Custom (OpenAI-compatible)">Custom (OpenAI-compatible)</option> |
| 22 | <option value="google">Google MakerSuite</option> | 22 | <option value="google">Google MakerSuite</option> |
| 23 | <option value="koboldcpp">KoboldCpp</option> | 23 | <option value="koboldcpp">KoboldCpp</option> |
| 24 | <option value="llamacpp">llama.cpp</option> | 24 | <option value="llamacpp">llama.cpp</option> |
| 25 | <option value="ollama">Ollama</option> | 25 | <option value="ollama">Ollama</option> |
| 26 | <option value="openai">OpenAI</option> | 26 | <option value="openai">OpenAI</option> |
| 27 | <option value="openrouter">OpenRouter</option> | 27 | <option value="openrouter">OpenRouter</option> |
| 28 | <option value="ooba">Text Generation WebUI (oobabooga)</option> | 28 | <option value="ooba" data-i18n="Text Generation WebUI (oobabooga)">Text Generation WebUI (oobabooga)</option> |
| 29 | <option value="vllm">vLLM</option> | ||
| 29 | </select> | 30 | </select> |
| 30 | </div> | 31 | </div> |
| 31 | <div class="flex1 flex-container flexFlowColumn flexNoGap"> | 32 | <div class="flex1 flex-container flexFlowColumn flexNoGap"> |
| 32 | <label for="caption_multimodal_model">Model</label> | 33 | <label for="caption_multimodal_model" data-i18n="Model">Model</label> |
| 33 | <select id="caption_multimodal_model" class="flex1 text_pole"> | 34 | <select id="caption_multimodal_model" class="flex1 text_pole"> |
| 34 | <option data-type="openai" value="gpt-4-vision-preview">gpt-4-vision-preview</option> | 35 | <option data-type="openai" value="gpt-4-vision-preview">gpt-4-vision-preview</option> |
| 35 | <option data-type="openai" value="gpt-4-turbo">gpt-4-turbo</option> | 36 | <option data-type="openai" value="gpt-4-turbo">gpt-4-turbo</option> |
| 36 | <option data-type="openai" value="gpt-4o">gpt-4o</option> | 37 | <option data-type="openai" value="gpt-4o">gpt-4o</option> |
| 38 | <option data-type="anthropic" value="claude-3-5-sonnet-20240620">claude-3-5-sonnet-20240620</option> | ||
| 37 | <option data-type="anthropic" value="claude-3-opus-20240229">claude-3-opus-20240229</option> | 39 | <option data-type="anthropic" value="claude-3-opus-20240229">claude-3-opus-20240229</option> |
| 38 | <option data-type="anthropic" value="claude-3-sonnet-20240229">claude-3-sonnet-20240229</option> | 40 | <option data-type="anthropic" value="claude-3-sonnet-20240229">claude-3-sonnet-20240229</option> |
| 39 | <option data-type="anthropic" value="claude-3-haiku-20240307">claude-3-haiku-20240307</option> | 41 | <option data-type="anthropic" value="claude-3-haiku-20240307">claude-3-haiku-20240307</option> |
| @@ -44,9 +46,11 @@ | |||
| 44 | <option data-type="openrouter" value="openai/gpt-4-turbo">openai/gpt-4-turbo</option> | 46 | <option data-type="openrouter" value="openai/gpt-4-turbo">openai/gpt-4-turbo</option> |
| 45 | <option data-type="openrouter" value="haotian-liu/llava-13b">haotian-liu/llava-13b</option> | 47 | <option data-type="openrouter" value="haotian-liu/llava-13b">haotian-liu/llava-13b</option> |
| 46 | <option data-type="openrouter" value="fireworks/firellava-13b">fireworks/firellava-13b</option> | 48 | <option data-type="openrouter" value="fireworks/firellava-13b">fireworks/firellava-13b</option> |
| 49 | <option data-type="openrouter" value="anthropic/claude-3.5-sonnet">anthropic/claude-3.5-sonnet</option> | ||
| 47 | <option data-type="openrouter" value="anthropic/claude-3-haiku">anthropic/claude-3-haiku</option> | 50 | <option data-type="openrouter" value="anthropic/claude-3-haiku">anthropic/claude-3-haiku</option> |
| 48 | <option data-type="openrouter" value="anthropic/claude-3-sonnet">anthropic/claude-3-sonnet</option> | 51 | <option data-type="openrouter" value="anthropic/claude-3-sonnet">anthropic/claude-3-sonnet</option> |
| 49 | <option data-type="openrouter" value="anthropic/claude-3-opus">anthropic/claude-3-opus</option> | 52 | <option data-type="openrouter" value="anthropic/claude-3-opus">anthropic/claude-3-opus</option> |
| 53 | <option data-type="openrouter" value="anthropic/claude-3.5-sonnet:beta">anthropic/claude-3.5-sonnet:beta</option> | ||
| 50 | <option data-type="openrouter" value="anthropic/claude-3-haiku:beta">anthropic/claude-3-haiku:beta</option> | 54 | <option data-type="openrouter" value="anthropic/claude-3-haiku:beta">anthropic/claude-3-haiku:beta</option> |
| 51 | <option data-type="openrouter" value="anthropic/claude-3-sonnet:beta">anthropic/claude-3-sonnet:beta</option> | 55 | <option data-type="openrouter" value="anthropic/claude-3-sonnet:beta">anthropic/claude-3-sonnet:beta</option> |
| 52 | <option data-type="openrouter" value="anthropic/claude-3-opus:beta">anthropic/claude-3-opus:beta</option> | 56 | <option data-type="openrouter" value="anthropic/claude-3-opus:beta">anthropic/claude-3-opus:beta</option> |
| @@ -54,36 +58,48 @@ | |||
| 54 | <option data-type="openrouter" value="google/gemini-pro-vision">google/gemini-pro-vision</option> | 58 | <option data-type="openrouter" value="google/gemini-pro-vision">google/gemini-pro-vision</option> |
| 55 | <option data-type="openrouter" value="google/gemini-flash-1.5">google/gemini-flash-1.5</option> | 59 | <option data-type="openrouter" value="google/gemini-flash-1.5">google/gemini-flash-1.5</option> |
| 56 | <option data-type="openrouter" value="liuhaotian/llava-yi-34b">liuhaotian/llava-yi-34b</option> | 60 | <option data-type="openrouter" value="liuhaotian/llava-yi-34b">liuhaotian/llava-yi-34b</option> |
| 57 | <option data-type="ollama" value="ollama_current">[Currently selected]</option> | 61 | <option data-type="ollama" value="ollama_current" data-i18n="currently_selected">[Currently selected]</option> |
| 58 | <option data-type="ollama" value="bakllava:latest">bakllava:latest</option> | 62 | <option data-type="ollama" value="bakllava">bakllava</option> |
| 59 | <option data-type="ollama" value="llava:latest">llava:latest</option> | 63 | <option data-type="ollama" value="llava">llava</option> |
| 60 | <option data-type="llamacpp" value="llamacpp_current">[Currently loaded]</option> | 64 | <option data-type="ollama" value="llava-llama3">llava-llama3</option> |
| 61 | <option data-type="ooba" value="ooba_current">[Currently loaded]</option> | 65 | <option data-type="ollama" value="llava-phi3">llava-phi3</option> |
| 62 | <option data-type="koboldcpp" value="koboldcpp_current">[Currently loaded]</option> | 66 | <option data-type="ollama" value="moondream">moondream</option> |
| 63 | <option data-type="custom" value="custom_current">[Currently selected]</option> | 67 | <option data-type="llamacpp" value="llamacpp_current" data-i18n="currently_loaded">[Currently loaded]</option> |
| 68 | <option data-type="ooba" value="ooba_current" data-i18n="currently_loaded">[Currently loaded]</option> | ||
| 69 | <option data-type="koboldcpp" value="koboldcpp_current" data-i18n="currently_loaded">[Currently loaded]</option> | ||
| 70 | <option data-type="vllm" value="vllm_current" data-i18n="currently_selected">[Currently selected]</option> | ||
| 71 | <option data-type="custom" value="custom_current" data-i18n="currently_selected">[Currently selected]</option> | ||
| 64 | </select> | 72 | </select> |
| 65 | </div> | 73 | </div> |
| 74 | <div data-type="ollama"> | ||
| 75 | The model must be downloaded first! Do it with the <code>ollama pull</code> command or <a href="#" id="caption_ollama_pull">click here</a>. | ||
| 76 | </div> | ||
| 66 | <label data-type="openai,anthropic,google" class="checkbox_label flexBasis100p" for="caption_allow_reverse_proxy" title="Allow using reverse proxy if defined and valid."> | 77 | <label data-type="openai,anthropic,google" class="checkbox_label flexBasis100p" for="caption_allow_reverse_proxy" title="Allow using reverse proxy if defined and valid."> |
| 67 | <input id="caption_allow_reverse_proxy" type="checkbox" class="checkbox"> | 78 | <input id="caption_allow_reverse_proxy" type="checkbox" class="checkbox"> |
| 68 | Allow reverse proxy | 79 | <span data-i18n="Allow reverse proxy">Allow reverse proxy</span> |
| 69 | </label> | 80 | </label> |
| 70 | <div class="flexBasis100p m-b-1"> | 81 | <div class="flexBasis100p m-b-1"> |
| 71 | <small><b>Hint:</b> Set your API keys and endpoints in the 'API Connections' tab first.</small> | 82 | <small><b data-i18n="Hint:">Hint:</b> <span data-i18n="Set your API keys and endpoints in the 'API Connections' tab first.">Set your API keys and endpoints in the 'API Connections' tab first.</span></small> |
| 72 | </div> | 83 | </div> |
| 73 | </div> | 84 | </div> |
| 74 | <div id="caption_prompt_block"> | 85 | <div id="caption_prompt_block"> |
| 75 | <label for="caption_prompt">Caption Prompt</label> | 86 | <label for="caption_prompt" data-i18n="Caption Prompt">Caption Prompt</label> |
| 76 | <textarea id="caption_prompt" class="text_pole" rows="1" placeholder="< Use default >">${PROMPT_DEFAULT}</textarea> | 87 | <textarea id="caption_prompt" class="text_pole" rows="1" placeholder="< Use default >">{{PROMPT_DEFAULT}}</textarea> |
| 77 | <label class="checkbox_label margin-bot-10px" for="caption_prompt_ask" title="Ask for a custom prompt every time an image is captioned."> | 88 | <label class="checkbox_label margin-bot-10px" for="caption_prompt_ask" title="Ask for a custom prompt every time an image is captioned."> |
| 78 | <input id="caption_prompt_ask" type="checkbox" class="checkbox"> | 89 | <input id="caption_prompt_ask" type="checkbox" class="checkbox"> |
| 79 | Ask every time | 90 | <span data-i18n="Ask every time">Ask every time</span> |
| 80 | </label> | 91 | </label> |
| 81 | </div> | 92 | </div> |
| 82 | <label for="caption_template">Message Template <small>(use <code>{{caption}}</code> macro)</small></label> | 93 | <label for="caption_template"><span data-i18n="Message Template">Message Template</span> <small><span data-i18n="(use _space">(use </span> <code>{{caption}}</code> <span data-i18n="macro)">macro)</span></small></label> |
| 83 | <textarea id="caption_template" class="text_pole" rows="2" placeholder="< Use default >">${TEMPLATE_DEFAULT}</textarea> | 94 | <textarea id="caption_template" class="text_pole" rows="2" placeholder="< Use default >">{{TEMPLATE_DEFAULT}}</textarea> |
| 95 | <label class="checkbox_label" for="caption_auto_mode"> | ||
| 96 | <input id="caption_auto_mode" type="checkbox" class="checkbox"> | ||
| 97 | <span data-i18n="Automatically caption images">Automatically caption images</span> | ||
| 98 | <i class="fa-solid fa-info-circle" title="Automatically caption images when they are pasted into the chat or attached to messages."></i> | ||
| 99 | </label> | ||
| 84 | <label class="checkbox_label margin-bot-10px" for="caption_refine_mode"> | 100 | <label class="checkbox_label margin-bot-10px" for="caption_refine_mode"> |
| 85 | <input id="caption_refine_mode" type="checkbox" class="checkbox"> | 101 | <input id="caption_refine_mode" type="checkbox" class="checkbox"> |
| 86 | Edit captions before saving | 102 | <span data-i18n="Edit captions before saving">Edit captions before saving</span> |
| 87 | </label> | 103 | </label> |
| 88 | </div> | 104 | </div> |
| 89 | </div> | 105 | </div> |
| @@ -1,4 +1,4 @@ | |||
| 1 | import { callPopup, eventSource, event_types, generateQuietPrompt, getRequestHeaders, online_status, saveSettingsDebounced, substituteParams } from '../../../script.js'; | 1 | import { callPopup, eventSource, event_types, generateQuietPrompt, getRequestHeaders, online_status, saveSettingsDebounced, substituteParams, substituteParamsExtended, system_message_types } from '../../../script.js'; |
| 2 | import { dragElement, isMobile } from '../../RossAscends-mods.js'; | 2 | import { dragElement, isMobile } from '../../RossAscends-mods.js'; |
| 3 | import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch, renderExtensionTemplateAsync } from '../../extensions.js'; | 3 | import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch, renderExtensionTemplateAsync } from '../../extensions.js'; |
| 4 | import { loadMovingUIState, power_user } from '../../power-user.js'; | 4 | import { loadMovingUIState, power_user } from '../../power-user.js'; |
| @@ -10,6 +10,8 @@ import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; | |||
| 10 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; | 10 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; |
| 11 | import { ARGUMENT_TYPE, SlashCommandArgument } from '../../slash-commands/SlashCommandArgument.js'; | 11 | import { ARGUMENT_TYPE, SlashCommandArgument } from '../../slash-commands/SlashCommandArgument.js'; |
| 12 | import { isFunctionCallingSupported } from '../../openai.js'; | 12 | import { isFunctionCallingSupported } from '../../openai.js'; |
| 13 | import { SlashCommandEnumValue, enumTypes } from '../../slash-commands/SlashCommandEnumValue.js'; | ||
| 14 | import { commonEnumProviders } from '../../slash-commands/SlashCommandCommonEnumsProvider.js'; | ||
| 13 | export { MODULE_NAME }; | 15 | export { MODULE_NAME }; |
| 14 | 16 | ||
| 15 | const MODULE_NAME = 'expressions'; | 17 | const MODULE_NAME = 'expressions'; |
| @@ -87,6 +89,7 @@ function getFallbackExpression() { | |||
| 87 | */ | 89 | */ |
| 88 | function toggleTalkingHeadCommand(_) { | 90 | function toggleTalkingHeadCommand(_) { |
| 89 | setTalkingHeadState(!extension_settings.expressions.talkinghead); | 91 | setTalkingHeadState(!extension_settings.expressions.talkinghead); |
| 92 | return String(extension_settings.expressions.talkinghead); | ||
| 90 | } | 93 | } |
| 91 | 94 | ||
| 92 | function isVisualNovelMode() { | 95 | function isVisualNovelMode() { |
| @@ -914,6 +917,7 @@ async function setSpriteSetCommand(_, folder) { | |||
| 914 | // moduleWorker(); | 917 | // moduleWorker(); |
| 915 | const vnMode = isVisualNovelMode(); | 918 | const vnMode = isVisualNovelMode(); |
| 916 | await sendExpressionCall(folder, lastExpression, true, vnMode); | 919 | await sendExpressionCall(folder, lastExpression, true, vnMode); |
| 920 | return ''; | ||
| 917 | } | 921 | } |
| 918 | 922 | ||
| 919 | async function classifyCommand(_, text) { | 923 | async function classifyCommand(_, text) { |
| @@ -935,7 +939,7 @@ async function classifyCommand(_, text) { | |||
| 935 | async function setSpriteSlashCommand(_, spriteId) { | 939 | async function setSpriteSlashCommand(_, spriteId) { |
| 936 | if (!spriteId) { | 940 | if (!spriteId) { |
| 937 | console.log('No sprite id provided'); | 941 | console.log('No sprite id provided'); |
| 938 | return; | 942 | return ''; |
| 939 | } | 943 | } |
| 940 | 944 | ||
| 941 | spriteId = spriteId.trim().toLowerCase(); | 945 | spriteId = spriteId.trim().toLowerCase(); |
| @@ -955,7 +959,7 @@ async function setSpriteSlashCommand(_, spriteId) { | |||
| 955 | 959 | ||
| 956 | if (!spriteItem) { | 960 | if (!spriteItem) { |
| 957 | console.log('No sprite found for search term ' + spriteId); | 961 | console.log('No sprite found for search term ' + spriteId); |
| 958 | return; | 962 | return ''; |
| 959 | } | 963 | } |
| 960 | 964 | ||
| 961 | label = spriteItem.label; | 965 | label = spriteItem.label; |
| @@ -963,6 +967,7 @@ async function setSpriteSlashCommand(_, spriteId) { | |||
| 963 | 967 | ||
| 964 | const vnMode = isVisualNovelMode(); | 968 | const vnMode = isVisualNovelMode(); |
| 965 | await sendExpressionCall(spriteFolderName, label, true, vnMode); | 969 | await sendExpressionCall(spriteFolderName, label, true, vnMode); |
| 970 | return label; | ||
| 966 | } | 971 | } |
| 967 | 972 | ||
| 968 | /** | 973 | /** |
| @@ -1008,8 +1013,7 @@ async function getLlmPrompt(labels) { | |||
| 1008 | } | 1013 | } |
| 1009 | 1014 | ||
| 1010 | const labelsString = labels.map(x => `"${x}"`).join(', '); | 1015 | const labelsString = labels.map(x => `"${x}"`).join(', '); |
| 1011 | const prompt = substituteParams(String(extension_settings.expressions.llmPrompt)) | 1016 | const prompt = substituteParamsExtended(String(extension_settings.expressions.llmPrompt), { labels: labelsString }); |
| 1012 | .replace(/{{labels}}/gi, labelsString); | ||
| 1013 | return prompt; | 1017 | return prompt; |
| 1014 | } | 1018 | } |
| 1015 | 1019 | ||
| @@ -1187,7 +1191,7 @@ function getLastCharacterMessage() { | |||
| 1187 | const reversedChat = context.chat.slice().reverse(); | 1191 | const reversedChat = context.chat.slice().reverse(); |
| 1188 | 1192 | ||
| 1189 | for (let mes of reversedChat) { | 1193 | for (let mes of reversedChat) { |
| 1190 | if (mes.is_user || mes.is_system) { | 1194 | if (mes.is_user || mes.is_system || mes.extra?.type === system_message_types.NARRATOR) { |
| 1191 | continue; | 1195 | continue; |
| 1192 | } | 1196 | } |
| 1193 | 1197 | ||
| @@ -1326,10 +1330,18 @@ async function renderFallbackExpressionPicker() { | |||
| 1326 | } | 1330 | } |
| 1327 | } | 1331 | } |
| 1328 | 1332 | ||
| 1333 | function getCachedExpressions() { | ||
| 1334 | if (!Array.isArray(expressionsList)) { | ||
| 1335 | return []; | ||
| 1336 | } | ||
| 1337 | |||
| 1338 | return [...expressionsList, ...extension_settings.expressions.custom].filter(onlyUnique); | ||
| 1339 | } | ||
| 1340 | |||
| 1329 | async function getExpressionsList() { | 1341 | async function getExpressionsList() { |
| 1330 | // Return cached list if available | 1342 | // Return cached list if available |
| 1331 | if (Array.isArray(expressionsList)) { | 1343 | if (Array.isArray(expressionsList)) { |
| 1332 | return [...expressionsList, ...extension_settings.expressions.custom].filter(onlyUnique); | 1344 | return getCachedExpressions(); |
| 1333 | } | 1345 | } |
| 1334 | 1346 | ||
| 1335 | /** | 1347 | /** |
| @@ -1917,7 +1929,7 @@ function migrateSettings() { | |||
| 1917 | } | 1929 | } |
| 1918 | async function addSettings() { | 1930 | async function addSettings() { |
| 1919 | const template = await renderExtensionTemplateAsync(MODULE_NAME, 'settings'); | 1931 | const template = await renderExtensionTemplateAsync(MODULE_NAME, 'settings'); |
| 1920 | $('#extensions_settings').append(template); | 1932 | $('#expressions_container').append(template); |
| 1921 | $('#expression_override_button').on('click', onClickExpressionOverrideButton); | 1933 | $('#expression_override_button').on('click', onClickExpressionOverrideButton); |
| 1922 | $('#expressions_show_default').on('input', onExpressionsShowDefaultInput); | 1934 | $('#expressions_show_default').on('input', onExpressionsShowDefaultInput); |
| 1923 | $('#expression_upload_pack_button').on('click', onClickExpressionUploadPackButton); | 1935 | $('#expression_upload_pack_button').on('click', onClickExpressionUploadPackButton); |
| @@ -2033,17 +2045,31 @@ function migrateSettings() { | |||
| 2033 | }); | 2045 | }); |
| 2034 | eventSource.on(event_types.MOVABLE_PANELS_RESET, updateVisualNovelModeDebounced); | 2046 | eventSource.on(event_types.MOVABLE_PANELS_RESET, updateVisualNovelModeDebounced); |
| 2035 | eventSource.on(event_types.GROUP_UPDATED, updateVisualNovelModeDebounced); | 2047 | eventSource.on(event_types.GROUP_UPDATED, updateVisualNovelModeDebounced); |
| 2036 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'sprite', | 2048 | |
| 2049 | const localEnumProviders = { | ||
| 2050 | expressions: () => getCachedExpressions().map(expression => { | ||
| 2051 | const isCustom = extension_settings.expressions.custom?.includes(expression); | ||
| 2052 | return new SlashCommandEnumValue(expression, null, isCustom ? enumTypes.name : enumTypes.enum, isCustom ? 'C' : 'D'); | ||
| 2053 | }), | ||
| 2054 | }; | ||
| 2055 | |||
| 2056 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ | ||
| 2057 | name: 'sprite', | ||
| 2037 | aliases: ['emote'], | 2058 | aliases: ['emote'], |
| 2038 | callback: setSpriteSlashCommand, | 2059 | callback: setSpriteSlashCommand, |
| 2039 | unnamedArgumentList: [ | 2060 | unnamedArgumentList: [ |
| 2040 | new SlashCommandArgument( | 2061 | SlashCommandArgument.fromProps({ |
| 2041 | 'spriteId', [ARGUMENT_TYPE.STRING], true, | 2062 | description: 'spriteId', |
| 2042 | ), | 2063 | typeList: [ARGUMENT_TYPE.STRING], |
| 2064 | isRequired: true, | ||
| 2065 | enumProvider: localEnumProviders.expressions, | ||
| 2066 | }), | ||
| 2043 | ], | 2067 | ], |
| 2044 | helpString: 'Force sets the sprite for the current character.', | 2068 | helpString: 'Force sets the sprite for the current character.', |
| 2069 | returns: 'label', | ||
| 2045 | })); | 2070 | })); |
| 2046 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'spriteoverride', | 2071 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 2072 | name: 'spriteoverride', | ||
| 2047 | aliases: ['costume'], | 2073 | aliases: ['costume'], |
| 2048 | callback: setSpriteSetCommand, | 2074 | callback: setSpriteSetCommand, |
| 2049 | unnamedArgumentList: [ | 2075 | unnamedArgumentList: [ |
| @@ -2053,22 +2079,29 @@ function migrateSettings() { | |||
| 2053 | ], | 2079 | ], |
| 2054 | helpString: 'Sets an override sprite folder for the current character. If the name starts with a slash or a backslash, selects a sub-folder in the character-named folder. Empty value to reset to default.', | 2080 | helpString: 'Sets an override sprite folder for the current character. If the name starts with a slash or a backslash, selects a sub-folder in the character-named folder. Empty value to reset to default.', |
| 2055 | })); | 2081 | })); |
| 2056 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'lastsprite', | 2082 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 2057 | callback: (_, value) => lastExpression[value.trim()] ?? '', | 2083 | name: 'lastsprite', |
| 2084 | callback: (_, value) => lastExpression[String(value).trim()] ?? '', | ||
| 2058 | returns: 'sprite', | 2085 | returns: 'sprite', |
| 2059 | unnamedArgumentList: [ | 2086 | unnamedArgumentList: [ |
| 2060 | new SlashCommandArgument( | 2087 | SlashCommandArgument.fromProps({ |
| 2061 | 'charName', [ARGUMENT_TYPE.STRING], true, | 2088 | description: 'character name', |
| 2062 | ), | 2089 | typeList: [ARGUMENT_TYPE.STRING], |
| 2090 | isRequired: true, | ||
| 2091 | enumProvider: commonEnumProviders.characters('character'), | ||
| 2092 | }), | ||
| 2063 | ], | 2093 | ], |
| 2064 | helpString: 'Returns the last set sprite / expression for the named character.', | 2094 | helpString: 'Returns the last set sprite / expression for the named character.', |
| 2065 | })); | 2095 | })); |
| 2066 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'th', | 2096 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 2097 | name: 'th', | ||
| 2067 | callback: toggleTalkingHeadCommand, | 2098 | callback: toggleTalkingHeadCommand, |
| 2068 | aliases: ['talkinghead'], | 2099 | aliases: ['talkinghead'], |
| 2069 | helpString: 'Character Expressions: toggles <i>Image Type - talkinghead (extras)</i> on/off.', | 2100 | helpString: 'Character Expressions: toggles <i>Image Type - talkinghead (extras)</i> on/off.', |
| 2101 | returns: ARGUMENT_TYPE.BOOLEAN, | ||
| 2070 | })); | 2102 | })); |
| 2071 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'classify', | 2103 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ |
| 2104 | name: 'classify', | ||
| 2072 | callback: classifyCommand, | 2105 | callback: classifyCommand, |
| 2073 | unnamedArgumentList: [ | 2106 | unnamedArgumentList: [ |
| 2074 | new SlashCommandArgument( | 2107 | new SlashCommandArgument( |
| @@ -1,65 +1,65 @@ | |||
| 1 | <div class="expression_settings"> | 1 | <div class="expression_settings"> |
| 2 | <div class="inline-drawer"> | 2 | <div class="inline-drawer"> |
| 3 | <div class="inline-drawer-toggle inline-drawer-header"> | 3 | <div class="inline-drawer-toggle inline-drawer-header"> |
| 4 | <b>Character Expressions</b> | 4 | <b data-i18n="Character Expressions">Character Expressions</b> |
| 5 | <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div> | 5 | <div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div> |
| 6 | </div> | 6 | </div> |
| 7 | 7 | ||
| 8 | <div class="inline-drawer-content"> | 8 | <div class="inline-drawer-content"> |
| 9 | <label class="checkbox_label" for="expression_translate" title="Use the selected API from Chat Translation extension settings."> | 9 | <label class="checkbox_label" for="expression_translate" title="Use the selected API from Chat Translation extension settings."> |
| 10 | <input id="expression_translate" type="checkbox"> | 10 | <input id="expression_translate" type="checkbox"> |
| 11 | <span>Translate text to English before classification</span> | 11 | <span data-i18n="Translate text to English before classification">Translate text to English before classification</span> |
| 12 | </label> | 12 | </label> |
| 13 | <label class="checkbox_label" for="expressions_show_default"> | 13 | <label class="checkbox_label" for="expressions_show_default"> |
| 14 | <input id="expressions_show_default" type="checkbox"> | 14 | <input id="expressions_show_default" type="checkbox"> |
| 15 | <span>Show default images (emojis) if sprite missing</span> | 15 | <span data-i18n="Show default images (emojis) if sprite missing">Show default images (emojis) if sprite missing</span> |
| 16 | </label> | 16 | </label> |
| 17 | <label id="image_type_block" class="checkbox_label" for="image_type_toggle"> | 17 | <label id="image_type_block" class="checkbox_label" for="image_type_toggle"> |
| 18 | <input id="image_type_toggle" type="checkbox"> | 18 | <input id="image_type_toggle" type="checkbox"> |
| 19 | <span>Image Type - talkinghead (extras)</span> | 19 | <span data-i18n="Image Type - talkinghead (extras)">Image Type - talkinghead (extras)</span> |
| 20 | </label> | 20 | </label> |
| 21 | <div class="expression_api_block m-b-1 m-t-1"> | 21 | <div class="expression_api_block m-b-1 m-t-1"> |
| 22 | <label for="expression_api">Classifier API</label> | 22 | <label for="expression_api" data-i18n="Classifier API">Classifier API</label> |
| 23 | <small>Select the API for classifying expressions.</small> | 23 | <small data-i18n="Select the API for classifying expressions.">Select the API for classifying expressions.</small> |
| 24 | <select id="expression_api" class="flex1 margin0"> | 24 | <select id="expression_api" class="flex1 margin0"> |
| 25 | <option value="0">Local</option> | 25 | <option value="0" data-i18n="Local">Local</option> |
| 26 | <option value="1">Extras</option> | 26 | <option value="1" data-i18n="Extras">Extras</option> |
| 27 | <option value="2">LLM</option> | 27 | <option value="2" data-i18n="LLM">LLM</option> |
| 28 | </select> | 28 | </select> |
| 29 | </div> | 29 | </div> |
| 30 | <div class="expression_llm_prompt_block m-b-1 m-t-1"> | 30 | <div class="expression_llm_prompt_block m-b-1 m-t-1"> |
| 31 | <label for="expression_llm_prompt" class="title_restorable"> | 31 | <label for="expression_llm_prompt" class="title_restorable"> |
| 32 | <span>LLM Prompt</span> | 32 | <span data-i18n="LLM Prompt">LLM Prompt</span> |
| 33 | <div id="expression_llm_prompt_restore" title="Restore default value" class="right_menu_button"> | 33 | <div id="expression_llm_prompt_restore" title="Restore default value" class="right_menu_button"> |
| 34 | <i class="fa-solid fa-clock-rotate-left fa-sm"></i> | 34 | <i class="fa-solid fa-clock-rotate-left fa-sm"></i> |
| 35 | </div> | 35 | </div> |
| 36 | </label> | 36 | </label> |
| 37 | <small>Will be used if the API doesn't support JSON schemas or function calling.</small> | 37 | <small data-i18n="Will be used if the API doesn't support JSON schemas or function calling.">Will be used if the API doesn't support JSON schemas or function calling.</small> |
| 38 | <textarea id="expression_llm_prompt" type="text" class="text_pole textarea_compact" rows="2" placeholder="Use {{labels}} special macro."></textarea> | 38 | <textarea id="expression_llm_prompt" type="text" class="text_pole textarea_compact" rows="2" placeholder="Use {{labels}} special macro."></textarea> |
| 39 | </div> | 39 | </div> |
| 40 | <div class="expression_fallback_block m-b-1 m-t-1"> | 40 | <div class="expression_fallback_block m-b-1 m-t-1"> |
| 41 | <label for="expression_fallback">Default / Fallback Expression</label> | 41 | <label for="expression_fallback" data-i18n="Default / Fallback Expression">Default / Fallback Expression</label> |
| 42 | <small>Set the default and fallback expression being used when no matching expression is found.</small> | 42 | <small data-i18n="Set the default and fallback expression being used when no matching expression is found.">Set the default and fallback expression being used when no matching expression is found.</small> |
| 43 | <select id="expression_fallback" class="flex1 margin0" data-i18n="Fallback Expression" placeholder="Fallback Expression"></select> | 43 | <select id="expression_fallback" class="flex1 margin0" data-i18n="Fallback Expression" placeholder="Fallback Expression"></select> |
| 44 | </div> | 44 | </div> |
| 45 | <div class="expression_custom_block m-b-1 m-t-1"> | 45 | <div class="expression_custom_block m-b-1 m-t-1"> |
| 46 | <label for="expression_custom">Custom Expressions</label> | 46 | <label for="expression_custom" data-i18n="Custom Expressions">Custom Expressions</label> |
| 47 | <small>Can be set manually or with an <tt>/emote</tt> slash command.</small> | 47 | <small><span data-i18n="Can be set manually or with an _space">Can be set manually or with an </span><tt>/emote</tt><span data-i18n="space_ slash command."> slash command.</span></small> |
| 48 | <div class="flex-container"> | 48 | <div class="flex-container"> |
| 49 | <select id="expression_custom" class="flex1 margin0"><select> | 49 | <select id="expression_custom" class="flex1 margin0"><select> |
| 50 | <i id="expression_custom_add" class="menu_button fa-solid fa-plus margin0" title="Add"></i> | 50 | <i id="expression_custom_add" class="menu_button fa-solid fa-plus margin0" title="Add"></i> |
| 51 | <i id="expression_custom_remove" class="menu_button fa-solid fa-xmark margin0" title="Remove"></i> | 51 | <i id="expression_custom_remove" class="menu_button fa-solid fa-xmark margin0" title="Remove"></i> |
| 52 | </div> | 52 | </div> |
| 53 | </div> | 53 | </div> |
| 54 | <div id="no_chat_expressions"> | 54 | <div id="no_chat_expressions" data-i18n="Open a chat to see the character expressions."> |
| 55 | Open a chat to see the character expressions. | 55 | Open a chat to see the character expressions. |
| 56 | </div> | 56 | </div> |
| 57 | <div id="open_chat_expressions"> | 57 | <div id="open_chat_expressions"> |
| 58 | <div class="offline_mode"> | 58 | <div class="offline_mode"> |
| 59 | <small>You are in offline mode. Click on the image below to set the expression.</small> | 59 | <small data-i18n="You are in offline mode. Click on the image below to set the expression.">You are in offline mode. Click on the image below to set the expression.</small> |
| 60 | </div> | 60 | </div> |
| 61 | <label for="expression_override">Sprite Folder Override</label> | 61 | <label for="expression_override" data-i18n="Sprite Folder Override">Sprite Folder Override</label> |
| 62 | <small>Use a forward slash to specify a subfolder. Example: <tt>Bob/formal</tt></small> | 62 | <small><span data-i18n="Use a forward slash to specify a subfolder. Example: _space">Use a forward slash to specify a subfolder. Example: </span><tt>Bob/formal</tt></small> |
| 63 | <div class="flex-container flexnowrap"> | 63 | <div class="flex-container flexnowrap"> |
| 64 | <input id="expression_override" type="text" class="text_pole" placeholder="Override folder name" /> | 64 | <input id="expression_override" type="text" class="text_pole" placeholder="Override folder name" /> |
| 65 | <input id="expression_override_button" class="menu_button" type="submit" value="Submit" /> | 65 | <input id="expression_override_button" class="menu_button" type="submit" value="Submit" /> |
| @@ -67,17 +67,17 @@ | |||
| 67 | <div class="expression_buttons flex-container spaceEvenly"> | 67 | <div class="expression_buttons flex-container spaceEvenly"> |
| 68 | <div id="expression_upload_pack_button" class="menu_button"> | 68 | <div id="expression_upload_pack_button" class="menu_button"> |
| 69 | <i class="fa-solid fa-file-zipper"></i> | 69 | <i class="fa-solid fa-file-zipper"></i> |
| 70 | <span>Upload sprite pack (ZIP)</span> | 70 | <span data-i18n="Upload sprite pack (ZIP)">Upload sprite pack (ZIP)</span> |
| 71 | </div> | 71 | </div> |
| 72 | <div id="expression_override_cleanup_button" class="menu_button"> | 72 | <div id="expression_override_cleanup_button" class="menu_button"> |
| 73 | <i class="fa-solid fa-trash-can"></i> | 73 | <i class="fa-solid fa-trash-can"></i> |
| 74 | <span>Remove all image overrides</span> | 74 | <span data-i18n="Remove all image overrides">Remove all image overrides</span> |
| 75 | </div> | 75 | </div> |
| 76 | </div> | 76 | </div> |
| 77 | <p class="hint"><b>Hint:</b> <i>Create new folder in the <b>/characters/</b> folder of your user data directory and name it as the name of the character. | 77 | <p class="hint"><b data-i18n="Hint:">Hint:</b> <i><span data-i18n="Create new folder in the _space">Create new folder in the </span><b>/characters/</b> <span data-i18n="folder of your user data directory and name it as the name of the character.">folder of your user data directory and name it as the name of the character.</span> |
| 78 | Put images with expressions there. File names should follow the pattern: <tt>[expression_label].[image_format]</tt></i></p> | 78 | <span data-i18n="Put images with expressions there. File names should follow the pattern:">Put images with expressions there. File names should follow the pattern: </span><tt data-i18n="expression_label_pattern">[expression_label].[image_format]</tt></i></p> |
| 79 | <h3 id="image_list_header"> | 79 | <h3 id="image_list_header"> |
| 80 | <strong>Sprite set:</strong> <span id="image_list_header_name"></span> | 80 | <strong data-i18n="Sprite set:">Sprite set:</strong> <span id="image_list_header_name"></span> |
| 81 | </h3> | 81 | </h3> |
| 82 | <div id="image_list"></div> | 82 | <div id="image_list"></div> |
| 83 | 83 | ||
| @@ -11,6 +11,8 @@ import { dragElement } from '../../RossAscends-mods.js'; | |||
| 11 | import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; | 11 | import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; |
| 12 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; | 12 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; |
| 13 | import { ARGUMENT_TYPE, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; | 13 | import { ARGUMENT_TYPE, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; |
| 14 | import { DragAndDropHandler } from '../../dragdrop.js'; | ||
| 15 | import { commonEnumProviders } from '../../slash-commands/SlashCommandCommonEnumsProvider.js'; | ||
| 14 | 16 | ||
| 15 | const extensionName = 'gallery'; | 17 | const extensionName = 'gallery'; |
| 16 | const extensionFolderPath = `scripts/extensions/${extensionName}/`; | 18 | const extensionFolderPath = `scripts/extensions/${extensionName}/`; |
| @@ -56,7 +58,8 @@ async function getGalleryItems(url) { | |||
| 56 | * @returns {Promise<void>} - Promise representing the completion of the gallery initialization. | 58 | * @returns {Promise<void>} - Promise representing the completion of the gallery initialization. |
| 57 | */ | 59 | */ |
| 58 | async function initGallery(items, url) { | 60 | async function initGallery(items, url) { |
| 59 | $('#dragGallery').nanogallery2({ | 61 | const gallery = $('#dragGallery'); |
| 62 | gallery.nanogallery2({ | ||
| 60 | 'items': items, | 63 | 'items': items, |
| 61 | thumbnailWidth: 'auto', | 64 | thumbnailWidth: 'auto', |
| 62 | thumbnailHeight: thumbnailHeight, | 65 | thumbnailHeight: thumbnailHeight, |
| @@ -80,44 +83,24 @@ async function initGallery(items, url) { | |||
| 80 | 83 | ||
| 81 | 84 | ||
| 82 | eventSource.on('resizeUI', function (elmntName) { | 85 | eventSource.on('resizeUI', function (elmntName) { |
| 83 | jQuery('#dragGallery').nanogallery2('resize'); | 86 | gallery.nanogallery2('resize'); |
| 84 | }); | 87 | }); |
| 85 | 88 | ||
| 86 | const dropZone = $('#dragGallery'); | 89 | const dragDropHandler = new DragAndDropHandler('#dragGallery', async (files, event) => { |
| 87 | //remove any existing handlers | 90 | let file = files[0]; |
| 88 | dropZone.off('dragover'); | 91 | uploadFile(file, url); // Added url parameter to know where to upload |
| 89 | dropZone.off('dragleave'); | ||
| 90 | dropZone.off('drop'); | ||
| 91 | |||
| 92 | // Set dropzone height to be the same as the parent | ||
| 93 | dropZone.css('height', dropZone.parent().css('height')); | ||
| 94 | |||
| 95 | // Initialize dropzone handlers | ||
| 96 | dropZone.on('dragover', function (e) { | ||
| 97 | e.stopPropagation(); // Ensure this event doesn't propagate | ||
| 98 | e.preventDefault(); | ||
| 99 | $(this).addClass('dragging'); // Add a CSS class to change appearance during drag-over | ||
| 100 | }); | 92 | }); |
| 101 | 93 | ||
| 102 | dropZone.on('dragleave', function (e) { | ||
| 103 | e.stopPropagation(); // Ensure this event doesn't propagate | ||
| 104 | $(this).removeClass('dragging'); | ||
| 105 | }); | ||
| 106 | 94 | ||
| 107 | dropZone.on('drop', function (e) { | 95 | // Set dropzone height to be the same as the parent |
| 108 | e.stopPropagation(); // Ensure this event doesn't propagate | 96 | gallery.css('height', gallery.parent().css('height')); |
| 109 | e.preventDefault(); | ||
| 110 | $(this).removeClass('dragging'); | ||
| 111 | let file = e.originalEvent.dataTransfer.files[0]; | ||
| 112 | uploadFile(file, url); // Added url parameter to know where to upload | ||
| 113 | }); | ||
| 114 | 97 | ||
| 115 | //let images populate first | 98 | //let images populate first |
| 116 | await delay(100); | 99 | await delay(100); |
| 117 | //unset the height (which must be getting set by the gallery library at some point) | 100 | //unset the height (which must be getting set by the gallery library at some point) |
| 118 | $('#dragGallery').css('height', 'unset'); | 101 | gallery.css('height', 'unset'); |
| 119 | //force a resize to make images display correctly | 102 | //force a resize to make images display correctly |
| 120 | jQuery('#dragGallery').nanogallery2('resize'); | 103 | gallery.nanogallery2('resize'); |
| 121 | } | 104 | } |
| 122 | 105 | ||
| 123 | /** | 106 | /** |
| @@ -419,7 +402,10 @@ function viewWithDragbox(items) { | |||
| 419 | // Registers a simple command for opening the char gallery. | 402 | // Registers a simple command for opening the char gallery. |
| 420 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'show-gallery', | 403 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'show-gallery', |
| 421 | aliases: ['sg'], | 404 | aliases: ['sg'], |
| 422 | callback: showGalleryCommand, | 405 | callback: () => { |
| 406 | showCharGallery(); | ||
| 407 | return ''; | ||
| 408 | }, | ||
| 423 | helpString: 'Shows the gallery.', | 409 | helpString: 'Shows the gallery.', |
| 424 | })); | 410 | })); |
| 425 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'list-gallery', | 411 | SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'list-gallery', |
| @@ -427,21 +413,22 @@ SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'list-gallery | |||
| 427 | callback: listGalleryCommand, | 413 | callback: listGalleryCommand, |
| 428 | returns: 'list of images', | 414 | returns: 'list of images', |
| 429 | namedArgumentList: [ | 415 | namedArgumentList: [ |
| 430 | new SlashCommandNamedArgument( | 416 | SlashCommandNamedArgument.fromProps({ |
| 431 | 'char', 'character name', [ARGUMENT_TYPE.STRING], false, | 417 | name: 'char', |
| 432 | ), | 418 | description: 'character name', |
| 433 | new SlashCommandNamedArgument( | 419 | typeList: [ARGUMENT_TYPE.STRING], |
| 434 | 'group', 'group name', [ARGUMENT_TYPE.STRING], false, | 420 | enumProvider: commonEnumProviders.characters('character'), |
| 435 | ), | 421 | }), |
| 422 | SlashCommandNamedArgument.fromProps({ | ||
| 423 | name: 'group', | ||
| 424 | description: 'group name', | ||
| 425 | typeList: [ARGUMENT_TYPE.STRING], | ||
| 426 | enumProvider: commonEnumProviders.characters('group'), | ||
| 427 | }), | ||
| 436 | ], | 428 | ], |
| 437 | helpString: 'List images in the gallery of the current char / group or a specified char / group.', | 429 | helpString: 'List images in the gallery of the current char / group or a specified char / group.', |
| 438 | })); | 430 | })); |
| 439 | 431 | ||
| 440 | |||
| 441 | function showGalleryCommand(args) { | ||
| 442 | showCharGallery(); | ||
| 443 | } | ||
| 444 | |||
| 445 | async function listGalleryCommand(args) { | 432 | async function listGalleryCommand(args) { |
| 446 | try { | 433 | try { |
| 447 | let url = args.char ?? (args.group ? groups.find(it=>it.name == args.group)?.id : null) ?? (selected_group || this_chid); | 434 | let url = args.char ?? (args.group ? groups.find(it=>it.name == args.group)?.id : null) ?? (selected_group || this_chid); |
| @@ -11,7 +11,7 @@ import { | |||
| 11 | generateQuietPrompt, | 11 | generateQuietPrompt, |
| 12 | is_send_press, | 12 | is_send_press, |
| 13 | saveSettingsDebounced, | 13 | saveSettingsDebounced, |
| 14 | substituteParams, | 14 | substituteParamsExtended, |
| 15 | generateRaw, | 15 | generateRaw, |
| 16 | getMaxContextSize, | 16 | getMaxContextSize, |
| 17 | } from '../../../script.js'; | 17 | } from '../../../script.js'; |
| @@ -24,6 +24,7 @@ import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js'; | |||
| 24 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; | 24 | import { SlashCommand } from '../../slash-commands/SlashCommand.js'; |
| 25 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; | 25 | import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js'; |
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Diff truncated