Merge branch 'staging' into fix/connRefusedErrMsg

70c45fb001a8c6800529bfb632450e93f0b15614

Cohee <18619528+Cohee1207@users.noreply.github.com>

21 files changed, +927 -392Showing whitespace changes
public/index.html+29 -23
@@ -91,9 +91,6 @@
9191 <div class="margin0 title_restorable standoutHeader">
9292 <strong>
9393 <span data-i18n="kobldpresets">Kobold Presets</span>
94- <a href="https://docs.sillytavern.app/usage/api-connections/koboldai/" class="notes-link" target="_blank">
95- <span class="fa-solid fa-circle-question note-link-span"></span>
96- </a>
9794 </strong>
9895
9996 <div class="flex-container gap3px">
@@ -1965,7 +1962,7 @@
19651962 </div>
19661963 </div>
19671964 </div>
19681965 <div class="range-block m-t-1" data-source="openai,openrouter,scale,custom">
19691966 <div id="logit_bias_openai" class="range-block-title openai_restorable" data-i18n="Logit Bias">
19701967 Logit Bias
19711968 </div>
@@ -2740,6 +2737,7 @@
27402737 </optgroup>
27412738 <optgroup label="GPT-4o">
27422739 <option value="gpt-4o">gpt-4o</option>
2740+ <option value="gpt-4o-2024-11-20">gpt-4o-2024-11-20</option>
27432741 <option value="gpt-4o-2024-08-06">gpt-4o-2024-08-06</option>
27442742 <option value="gpt-4o-2024-05-13">gpt-4o-2024-05-13</option>
27452743 <option value="chatgpt-4o-latest">chatgpt-4o-latest</option>
@@ -2979,6 +2977,7 @@
29792977 <option value="chat-bison-001">PaLM 2 Chat (Legacy)</option>
29802978 </optgroup>
29812979 <optgroup label="Subversions">
2980+ <option value="gemini-exp-1121">Gemini Experimental 2024-11-21</option>
29822981 <option value="gemini-exp-1114">Gemini Experimental 2024-11-14</option>
29832982 <option value="gemini-1.5-pro-exp-0801">Gemini 1.5 Pro Experiment 2024-08-01</option>
29842983 <option value="gemini-1.5-pro-exp-0827">Gemini 1.5 Pro Experiment 2024-08-27</option>
@@ -3159,6 +3158,8 @@
31593158 <h4 data-i18n="Cohere Model">Cohere Model</h4>
31603159 <select id="model_cohere_select">
31613160 <optgroup label="Stable">
3161+ <option value="c4ai-aya-expanse-32b">c4ai-aya-expanse-32b</option>
3162+ <option value="c4ai-aya-expanse-8b">c4ai-aya-expanse-8b</option>
31623163 <option value="c4ai-aya-23-35b">c4ai-aya-23-35b</option>
31633164 <option value="c4ai-aya-23-8b">c4ai-aya-23-8b</option>
31643165 <option value="command-light">command-light</option>
@@ -3270,8 +3271,14 @@
32703271 </div>
32713272 <div id="AdvancedFormatting" class="drawer-content">
32723273 <div class="flex-container alignItemsBaseline">
32733274 <h3 class="margin0 flex1" dataflex-i18n="Advancedcontainer FormattingalignItemsBaseline">
3275+ <span data-i18n="Advanced Formatting">
32743276 Advanced Formatting
3277+ </span>
3278+
3279+ <a href="https://docs.sillytavern.app/usage/prompts/" class="notes-link" target="_blank">
3280+ <span class="fa-solid fa-circle-question note-link-span"></span>
3281+ </a>
32753282 </h3>
32763283 <div class="flex-container">
32773284 <input id="af_master_import_file" type="file" hidden accept=".json" class="displayNone">
@@ -3291,9 +3298,12 @@
32913298 <h4 class="standoutHeader title_restorable">
32923299 <div>
32933300 <span data-i18n="Context Template">Context Template</span>
3294- <a href="https://docs.sillytavern.app/usage/core-concepts/advancedformatting/#context-template" class="notes-link" target="_blank">
3301+ </div>
3295- <span class="fa-solid fa-circle-question note-link-span"></span>
3302+ <div class="flex-container">
3296- </a>
3303+ <label for="context_derived" class="checkbox_label flex1" title="Derive from Model Metadata, if possible." data-i18n="[title]context_derived">
3304+ <input id="context_derived" type="checkbox" style="display:none;" />
3305+ <small><i class="fa-solid fa-bolt menu_button margin0"></i></small>
3306+ </label>
32973307 </div>
32983308 </h4>
32993309 <div class="flex-container" title="Select your current Context Template" data-i18n="[title]Select your current Context Template">
@@ -3390,11 +3400,12 @@
33903400 <h4 class="standoutHeader title_restorable justifySpaceBetween">
33913401 <div class="flex-container">
33923402 <span data-i18n="Instruct Template">Instruct Template</span>
3393- <a href="https://docs.sillytavern.app/usage/core-concepts/instructmode/" class="notes-link" target="_blank">
3394- <span class="fa-solid fa-circle-question note-link-span"></span>
3395- </a>
33963403 </div>
33973404 <div class="flex-container">
3405+ <label for="instruct_derived" class="checkbox_label flex1" title="Derive from Model Metadata, if possible." data-i18n="[title]instruct_derived">
3406+ <input id="instruct_derived" type="checkbox" style="display:none;" />
3407+ <small><i class="fa-solid fa-bolt menu_button margin0"></i></small>
3408+ </label>
33983409 <label for="instruct_bind_to_context" class="checkbox_label flex1" title="Bind to Context&#10If enabled, Context templates will be automatically selected based on selected Instruct template name or by preference." data-i18n="[title]instruct_bind_to_context">
33993410 <input id="instruct_bind_to_context" type="checkbox" style="display:none;" />
34003411 <small><i class="fa-solid fa-link menu_button margin0"></i></small>
@@ -3575,9 +3586,6 @@
35753586 <h4 class="standoutHeader title_restorable justifySpaceBetween">
35763587 <div class="flex-container">
35773588 <span data-i18n="System Prompt">System Prompt</span>
3578- <a href="https://docs.sillytavern.app/usage/core-concepts/advancedformatting/#system-prompt" class="notes-link" target="_blank">
3579- <span class="fa-solid fa-circle-question note-link-span"></span>
3580- </a>
35813589 </div>
35823590 <div class="flex-container">
35833591 <label id="sysprompt_enabled_label" for="sysprompt_enabled" class="checkbox_label flex1" title="Enable System Prompt" data-i18n="[title]sysprompt_enabled">
@@ -3645,7 +3653,7 @@
36453653 <div name="tokenizerSettingsBlock">
36463654 <div name="tokenizerSelectorBlock">
36473655 <h4 class="standoutHeader"><span data-i18n="Tokenizer">Tokenizer</span>
36483656 <a href="https://docs.sillytavern.app/usage/core-concepts/advancedformattingprompts/#tokenizer/" class="notes-link" target="_blank">
36493657 <span class="fa-solid fa-circle-question note-link-span"></span>
36503658 </a>
36513659 </h4>
@@ -3671,10 +3679,8 @@
36713679 </div>
36723680 <div class="range-block flex-container flexnowrap" name="tokenPaddingBlock">
36733681 <div class="range-block-title justifyLeft">
36743682 <small data-i18n="Token Padding" class="flex-container">Token Padding
3675- <a href="https://docs.sillytavern.app/usage/core-concepts/advancedformatting/#token-padding" class="notes-link" target="_blank">
3683+ Token Padding
3676- <span class="fa-solid fa-circle-question note-link-span"></span>
3677- </a>
36783684 </small>
36793685 </div>
36803686 <input id="token_padding" class="text_pole textarea_compact" type="number" min="-2048" max="2048" />
@@ -3732,7 +3738,7 @@
37323738 </div>
37333739 <h3 class="margin0">
37343740 <span data-i18n="Worlds/Lorebooks">Worlds/Lorebooks</span>
37353741 <a href="https://docs.sillytavern.app/usage/core-concepts/worldinfo/" class="notes-link" target="_blank">
37363742 <span class="fa-solid fa-circle-question note-link-span"></span>
37373743 </a>
37383744 </h3>
@@ -4259,7 +4265,7 @@
42594265 <audio id="audio_message_sound" src="sounds/message.mp3" hidden></audio>
42604266 <span>
42614267 <small data-i18n="Message Sound">Message Sound</small>
42624268 <a href="https://docs.sillytavern.app/usage/core-conceptsuser_settings/uicustomization/#message-sound" class="notes-link" target="_blank">
42634269 <span class="fa-solid fa-circle-question note-link-span"></span>
42644270 </a>
42654271 </span>
@@ -4476,7 +4482,7 @@
44764482 </div>
44774483 <div nane="AutoContiueBlock" class="inline-drawer wide100p flexFlowColumn">
44784484 <div class="inline-drawer-toggle inline-drawer-header userSettingsInnerExpandable" title="Automatically 'continue' a response if the model stopped before reaching a certain amount of tokens.">
44794485 <b><span data-i18n="Auto-swipeContinue">Auto-Continue</span></b>
44804486 <div class="fa-solid fa-circle-chevron-down inline-drawer-icon down"></div>
44814487 </div>
44824488 <div class="inline-drawer-content">
@@ -5791,7 +5797,7 @@
57915797 <div class="flex-container justifySpaceBetween">
57925798 <small for="group">
57935799 <span data-i18n="Inclusion Group">Inclusion Group</span>
57945800 <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.&#13;Supports multiple comma-separated groups.&#13;&#13;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">
57955801 <span class="fa-solid fa-circle-question note-link-span"></span>
57965802 </a>
57975803 </small>
public/locales/ko-kr.json+435 -252
@@ -1,13 +1,13 @@
11{
22 "Favorite": "가장 좋아하는",
33 "Tag": "꼬리표태그",
44 "Duplicate": "복제하다복제하기",
55 "Persona": "페르소나",
66 "Delete": "삭제",
77 "AI Response Configuration": "AI 응답 구성",
88 "AI Configuration panel will stay open": "AI 구성 패널이 열린 상태로 유지됩니다",
99 "clickslidertips": "수동으로 값을 입력하려면 클릭하세요.",
1010 "MAD LAB MODE ON": "매드랩미치광이 연구실 모드 켜짐",
1111 "Documentation on sampling parameters": "샘플링 매개 변수에 대한 문서",
1212 "kobldpresets": "코볼드 사전 설정",
1313 "guikoboldaisettings": "KoboldAI 인터페이스 설정",
@@ -24,26 +24,26 @@
2424 "AI Module": "AI 모듈",
2525 "Changes the style of the generated text.": "생성된 텍스트의 스타일을 변경합니다.",
2626 "No Module": "모듈 없음",
2727 "Instruct": "지시하다지시",
2828 "Prose Augmenter": "산문 증강기",
2929 "Text Adventure": "텍스트 어드벤처",
3030 "response legth(tokens)": "응답 길이 (토큰)",
3131 "Streaming": "스트리밍",
3232 "Streaming_desc": "생성되는대로 응답을 조금씩 표시하십시오표시하세요",
3333 "context size(tokens)": "컨텍스트 크기 (토큰)",
3434 "unlocked": "잠금 해제됨",
3535 "Only enable this if your model supports context sizes greater than 8192 tokens": "모델이 8192 토큰보다 큰 컨텍스트 크기를 지원하는 경우에만 활성화하십시오활성화하세요",
3636 "Max prompt cost:": "최대 프롬프트 비용:",
3737 "Display the response bit by bit as it is generated.": "생성되는 대답을 조금씩 표시합니다.",
3838 "When this is off, responses will be displayed all at once when they are complete.": "이 기능이 꺼져 있으면 대답은 완료되면 한 번에 모두 표시됩니다.",
3939 "Temperature": "온도",
4040 "rep.pen": "반복 패널티페널티",
4141 "Rep. Pen. Range.": "반복 벌칙페널티 범위",
4242 "Rep. Pen. Slope": "대표적 패널티페널티 기울기",
4343 "Rep. Pen. Freq.": "반복 벌칙페널티 빈도",
4444 "Rep. Pen. Presence": "반복 벌칙페널티 존재",
4545 "TFS": "TFS",
4646 "Phrase Repetition Penalty": "구절 반복 패널티페널티",
4747 "Off": "끄기",
4848 "Very light": "매우 가벼운",
4949 "Light": "가벼운",
@@ -51,17 +51,17 @@
5151 "Aggressive": "공격적",
5252 "Very aggressive": "매우 공격적",
5353 "Unlocked Context Size": "잠금 해제된 컨텍스트 크기",
5454 "Unrestricted maximum value for the context slider": "컨텍스트 슬라이더의슬라이더에 대한 제한 없는 최대값",
5555 "Context Size (tokens)": "컨텍스트 크기 (토큰)",
5656 "Max Response Length (tokens)": "최대 응답 길이 (토큰)",
5757 "Multiple swipes per generation": "세대당 다중 스와이프",
5858 "Enable OpenAI completion streaming": "OpenAI 완성 스트리밍 활성화",
5959 "Frequency Penalty": "빈도 패널티페널티",
6060 "Presence Penalty": "존재 패널티페널티",
6161 "Count Penalty": "카운트 페널티",
6262 "Top K": "상위 K",
6363 "Top P": "상위 P",
6464 "Repetition Penalty": "반복 벌칙페널티",
6565 "Min P": "최소 P",
6666 "Top A": "상위 A",
6767 "Quick Prompts Edit": "빠른 프롬프트 편집",
@@ -69,12 +69,12 @@
6969 "NSFW": "NSFW",
7070 "Jailbreak": "탈옥",
7171 "Utility Prompts": "유틸리티 프롬프트",
7272 "Impersonation prompt": "피소하는사칭 프롬프트",
7373 "Restore default prompt": "기본 프롬프트 복원",
7474 "Prompt that is used for Impersonation function": "피소사칭 기능에 사용되는 프롬프트",
7575 "World Info Format Template": "세계월드 정보인포 형식 템플릿",
7676 "Restore default format": "기본 형식 복원",
7777 "Wraps activated World Info entries before inserting into the prompt.": "프롬프트에 삽입하기 전에 활성화된 세계월드 정보인포 항목을 래핑합니다.",
7878 "scenario_format_template_part_1": "사용",
7979 "scenario_format_template_part_2": "내용이 삽입된 위치를 표시합니다.",
8080 "Scenario Format Template": "시나리오 형식 템플릿",
@@ -94,7 +94,7 @@
9494 "Replace empty message": "빈 메시지 대체",
9595 "Send this text instead of nothing when the text box is empty.": "텍스트 상자가 비어 있을 때 이 텍스트를 아무것도 없이 보내세요.",
9696 "Seed": "시드",
9797 "Set to get deterministic results. Use -1 for random seed.": "결정적인 결과를 얻으려면 설정하세요. 무작위 시드에는시드를 위해서는 -1을1 값을 사용합니다.",
9898 "Temperature controls the randomness in token selection": "온도는 토큰 선택에서의 무작위성을 제어합니다.",
9999 "Top_K_desc": "Top K는 선택할 수 있는 최대 상위 토큰 양을 설정합니다.",
100100 "Top_P_desc": "Top P (일명 핵심 샘플링)",
@@ -103,60 +103,60 @@
103103 "Min_P_desc": "Min P는 기본 최소 확률을 설정합니다.",
104104 "Top_A_desc": "Top A는 가장 높은 토큰 확률의 제곱에 기반하여 토큰 선택에 대한 임계값을 설정합니다.",
105105 "Tail_Free_Sampling_desc": "꼬리 제거 샘플링 (TFS)",
106106 "rep.pen range": "반복 패널티페널티 범위",
107107 "Mirostat": "미로스타트Mirostat",
108108 "Mode": "방법모드",
109109 "Mirostat_Mode_desc": "값이 0이면 Mirostat가 완전히 비활성화됩니다. 1은 Mirostat 1.0용이고 2는 Mirostat 2.0용입니다.",
110110 "Tau": "타우Tau",
111111 "Mirostat_Tau_desc": "Mirostat 출력의 가변성을 제어합니다.",
112112 "Eta": "에타Eta",
113113 "Mirostat_Eta_desc": "Mirostat의 학습률을 제어합니다.",
114114 "Ban EOS Token": "EOS 토큰 금지",
115115 "Ban_EOS_Token_desc": "KoboldCpp가 포함된 EOS(End-of-Sequence) 토큰(및 KoboldAI가 포함된 다른 토큰도 가능)을 금지합니다.\r스토리 작성에 적합하지만 채팅 및 교육 모드에는 사용하면 안 됩니다.",
116116 "GBNF Grammar": "GBNF 문법",
117117 "Type in the desired custom grammar": "원하는 사용자 정의 문법을 입력하세요.",
118118 "Samplers Order": "샘플러 순서",
119119 "Samplers will be applied in a top-down order. Use with caution.": "샘플러는 위에서 아래로 적용됩니다. 주의하여 사용하십시오사용하세요.",
120120 "Tail Free Sampling": "꼬리가Tail 자유로운Free 샘플링",
121121 "Load koboldcpp order": "코볼드kobold CPP 순서로 로드",
122122 "Preamble": "전문서두",
123123 "Use style tags to modify the writing style of the output.": "스타일 태그를 사용하여 출력의 쓰기 스타일을 수정하십시오수정하세요.",
124124 "Banned Tokens": "금지된 토큰",
125125 "Sequences you don't want to appear in the output. One per line.": "출력에 나타나지 않길 원하는 시퀀스입니다. 한 줄에 하나씩.",
126126 "Logit Bias": "로그Logit 비애편향",
127127 "Add": "추가",
128128 "Helps to ban or reenforce the usage of certain words": "특정 단어의 사용을 금지하거나 강화하는데 도움이 됩니다.",
129129 "CFG Scale": "CFG 스케일",
130130 "Negative Prompt": "부정적인부정적 프롬프트",
131131 "Add text here that would make the AI generate things you don't want in your outputs.": "AI가 출력에서 원하지 않는 것을 생성하도록하는 텍스트를 여기에 추가하십시오추가하세요.",
132132 "Used if CFG Scale is unset globally, per chat or character": "CFG 스케일이 전역적으로 설정되지 않은 경우, 사용됩니다. 채팅 또는 캐릭터 캐릭터마다 사용됩니다.",
133133 "Mirostat Tau": "미로스탯Mirostat 타우Tau",
134134 "Mirostat LR": "미로스타트Mirostat LR",
135135 "Min Length": "최소 길이",
136136 "Top K Sampling": "상위 K 샘플링",
137137 "Nucleus Sampling": "Nucleus 샘플링",
138138 "Top A Sampling": "상위 A 샘플링",
139139 "CFG": "CFG",
140140 "Neutralize Samplers": "샘플러 중화",
141141 "Set all samplers to their neutral/disabled state.": "모든 샘플러를 중립/비활성 상태로 설정하십시오설정하세요.",
142142 "Sampler Select": "샘플러 선택",
143143 "Customize displayed samplers or add custom samplers.": "표시된 샘플러를 사용자 정의하거나 사용자 정의 샘플러를 추가하세요.",
144144 "Epsilon Cutoff": "이프실론Epsilon 자르기",
145145 "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "Epsilon 절단은 토큰이 샘플링에서 제외되는 확률 하한선을 설정합니다.",
146146 "Eta Cutoff": "에타Eta 자르기",
147147 "Eta_Cutoff_desc": "에타Eta 절단은 특별한 에타Eta 샘플링 기술의 주요 매개 변수입니다.&#13;1e-4 단위로; 합리적인 값은 3입니다.&#13;비활성화하려면 0으로 설정하십시오설정하세요.&#13;자세한 내용은 Hewitt et al. (2022)의 Truncation Sampling as Language Model Desmoothing 논문을 참조하십시오참조하세요.",
148148 "rep.pen decay": "대표반복 페널티 부패붕괴",
149149 "Encoder Rep. Pen.": "인코더 반복 패널티페널티",
150150 "No Repeat Ngram Size": "반복 없는 N그램Ngram 크기",
151151 "Skew": "비스듬한",
152152 "Max Tokens Second": "초당 최대 토큰",
153153 "Smooth Sampling": "부드러운 샘플링",
154154 "Smooth_Sampling_desc": "2차/3차 변환을 사용하여 분포를 조정할 수 있습니다. 평활화 요소 값이 낮을수록 더 창의적이 됩니다. 일반적으로 0.2-0.3 사이가 가장 적합합니다(곡선 = 1로 가정). 평활화 곡선 값이 높을수록 곡선이 더 가파르게 변하고 확률이 낮은 선택을 더욱 적극적으로 처벌하게 됩니다. 1.0 곡선은 Smoothing Factor만 사용하는 것과 같습니다.",
155155 "Smoothing Factor": "평활화 요소",
156156 "Smoothing Curve": "평활화 곡선",
157157 "DRY_Repetition_Penalty_desc": "DRY는 입력의 끝을 이전에 입력에서 발생한 시퀀스로 확장하는 토큰에 페널티를 적용합니다. 비활성화하려면 승수를 0으로 설정하세요.",
158158 "DRY Repetition Penalty": "DRY 반복 페널티",
159159 "DRY_Multiplier_desc": "DRY를 활성화하려면 값 > 0으로 설정하십시오설정하세요. 가장 짧은 페널티를 받는 시퀀스에 대한 페널티의 크기를 제어합니다.",
160160 "Multiplier": "승수",
161161 "DRY_Base_desc": "시퀀스 길이가 증가함에 따라 페널티가 증가하는 속도를 제어합니다.",
162162 "Base": "베이스",
@@ -172,23 +172,23 @@
172172 "Maximum Temp": "최대 온도",
173173 "Exponent": "지수",
174174 "Mirostat (mode=1 is only for llama.cpp)": "Mirostat (mode=1은 llama.cpp 전용입니다)",
175- "Mirostat_desc": "미로스타트는 출력 헷갈림의 온도계입니다",
175+ "Mirostat_desc": "Mirostat은 언어 모델의 출력 텍스트의 복잡도(perplexity)를 직접 제어하여 더 자연스러운 텍스트를 생성하도록 하는 적응형 샘플링 알고리즘입니다",
176176 "Mirostat Mode": "미로스탯Mirostat 모드",
177177 "Variability parameter for Mirostat outputs": "미로스탯Mirostat 출력의 변동성 매개변수",
178178 "Mirostat Eta": "미로스탯Mirostat 에타Eta",
179179 "Learning rate of Mirostat": "미로스탯의Mirostat 학습률",
180180 "Beam search": "빔 검색",
181181 "Helpful tip coming soon.": "유용한 팁을 곧 알려드리겠습니다.",
182182 "Number of Beams": "빔의 수",
183183 "Length Penalty": "길이 패널티페널티",
184184 "Early Stopping": "조기 중지",
185185 "Contrastive search": "대조적 검색",
186186 "Penalty Alpha": "패널티페널티 알파",
187187 "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "대조적 검색 정규화 항의 강도입니다. CS를 비활성화하려면 0으로 설정하세요.",
188188 "Do Sample": "샘플",
189189 "Add BOS Token": "BOS 토큰 추가",
190190 "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "프롬프트의 시작 부분에 bos_token을 추가하십시오추가하세요. 이를 비활성화하면 응답이 더 창의적으로 될 수 있습니다.",
191191 "Ban the eos_token. This forces the model to never end the generation prematurely": "eos_token을 금지하십시오금지하세요. 이는 모델이 생성을 이르게 종료하지 않도록 합니다",
192192 "Ignore EOS Token": "EOS 토큰 무시",
193193 "Ignore the EOS Token even if it generates.": "EOS 토큰이 생성되더라도 무시하세요.",
194194 "Skip Special Tokens": "특수 토큰 건너뛰기",
@@ -210,25 +210,27 @@
210210 "llama.cpp only. Determines the order of samplers. If Mirostat mode is not 0, sampler order is ignored.": "llama.cpp만 가능합니다. 샘플러의 순서를 결정합니다. Mirostat 모드가 0이 아닌 경우 샘플러 순서는 무시됩니다.",
211211 "Sampler Priority": "샘플러 우선 순위",
212212 "Ooba only. Determines the order of samplers.": "Ooba 전용. 샘플러의 순서를 결정합니다.",
213213 "Character Names Behavior": "캐릭터 이름 행동동작",
214+ "[title]character_names_none": "캐릭터 이름 접두사를 추가하지 않습니다. 그룹 채팅에서는 좋지 않을 수 있으므로, 이 설정을 선택할 때는 주의해야 합니다.",
214215 "Helps the model to associate messages with characters.": "모델이 메시지를 캐릭터와 연관시키는 데 도움이 됩니다.",
215216 "None": "없음",
216- "character_names_default": "그룹 및 과거 페르소나는 제외됩니다. 그렇지 않으면 프롬프트에 이름을 제공해야 합니다.",
217+ "None (not injected)": "없음 (삽입되지 않음)",
218+ "character_names_default": "그룹과 과거 페르소나에 대해 접두사를 추가합니다. 그 외의 경우에는 프롬프트에 이름을 직접 제공해야 합니다.",
217219 "Don't add character names.": "캐릭터 이름을 추가하지 마세요.",
218220 "Completion": "완료 객체",
219221 "character_names_completion": "제한 사항이 적용됩니다. 라틴 영숫자알파벳, 숫자, 밑줄만 사용할 수사용 있습니다가능합니다. 모든 소스, 특히 Claude, MistralAI, Google에서 작동하지 않습니다.",
220222 "Add character names to completion objects.": "완성 개체에객체에 캐릭터 이름을 추가합니다.",
221223 "Message Content": "메시지 내용",
222224 "Prepend character names to message contents.": "메시지 내용 앞에 문자캐릭터의 이름을 추가합니다.",
223225 "Continue Postfix": "접미사 계속하기 접미사",
224226 "The next chunk of the continued message will be appended using this as a separator.": "계속되는 메시지의 다음 청크는 이를 구분 기호로 사용하여 추가됩니다.",
225227 "Space": "공간한 칸 띄우기",
226228 "Newline": "개행새로운 줄",
227229 "Double Newline": "이중 개행",
228230 "Wrap user messages in quotes before sending": "전송 전에 사용자 메시지를 따옴표로 둘러싸기",
229231 "Wrap in Quotes": "따옴표따옴표로 안에메시지 넣기감싸기",
230232 "Wrap entire user message in quotes before sending.": "전체 사용자 메시지를메시지 전체를 보내기 전에 따옴표로 묶으십시오감싸집니다.",
231233 "Leave off if you use quotes manually for speech.": "말하기 위해 수동으로 따옴표를 사용하는 경우 무시하십시오체크하지 마세요.",
232234 "Continue prefill": "사전 작성 계속",
233235 "Continue sends the last message as assistant role instead of system message with instruction.": "계속하면 지시와 함께 시스템 메시지 대신 마지막 메시지를 어시스턴트 역할로 보냅니다.",
234236 "Squash system messages": "시스템 메시지 압축",
@@ -239,7 +241,7 @@
239241 "image_inlining_hint_2": "메시지에 대한 조치 또는",
240242 "image_inlining_hint_3": "채팅에 이미지 파일을 첨부하는 메뉴입니다.",
241243 "Inline Image Quality": "인라인 이미지 품질",
242244 "openai_inline_image_quality_auto": "자동차자동",
243245 "openai_inline_image_quality_low": "낮은",
244246 "openai_inline_image_quality_high": "높은",
245247 "Use AI21 Tokenizer": "AI21 토크나이저 사용",
@@ -250,35 +252,35 @@
250252 "(Gemini 1.5 Pro/Flash only)": "(Gemini 1.5 Pro/Flash 전용)",
251253 "Merges_all_system_messages_desc_1": "비시스템 역할이 있는 첫 번째 메시지까지 모든 시스템 메시지를 병합하여",
252254 "Merges_all_system_messages_desc_2": "필드.",
253255 "Assistant Prefill": "어시스턴트 사전 작성프리필",
254256 "Start Claude's answer with...": "클로드의 답변 시작하기...",
255257 "Assistant Impersonation Prefill": "보조자 가장어시스턴트 미리사칭 채우기프리필",
256258 "Use system prompt (Claude 2.1+ only)": "시스템 프롬프트 사용 (클로드 2.1+ 전용)",
257259 "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "지원되는 모델에 대한 시스템 프롬프트를 보냅니다. 비활성화된 경우 사용자 메시지가 프롬프트의 처음에 추가됩니다.",
258260 "User first message": "사용자 첫 번째 메시지",
259261 "Restore User first message": "사용자사용자의 우선 번째 메시지 복원",
260262 "Human message": "인간의인간 메시지, 지시 등\n비어 있으면 아무것도 추가하지 않습니다. 즉, '사용자' 역할이 있는 새 프롬프트가 필요합니다.",
261263 "New preset": "새 프리셋",
262264 "Delete preset": "프리셋 삭제",
263265 "View / Edit bias preset": "바이어스 프리셋 보기/편집",
264266 "Add bias entry": "바이어스 항목 추가",
265267 "Most tokens have a leading space.": "대부분의 토큰에는 선행 공백이 있습니다.",
266268 "API Connections": "API 연결",
267269 "Text Completion": "텍스트Text 완성Completion",
268270 "Chat Completion": "채팅Chat 완료Completion",
269271 "NovelAI": "NovelAI",
270272 "KoboldAI Horde": "KoboldAI 호드Horde",
271273 "KoboldAI": "KoboldAI",
272274 "Avoid sending sensitive information to the Horde.": "민감한 정보를 호드에Horde에 보내지 마십시오않도록 합니다.",
273275 "Review the Privacy statement": "개인 정보 보호 정책 검토",
274276 "Register a Horde account for faster queue times": "더 빠른 대기 시간을시간 위해감축을 호드원한다면 Horde 계정을 등록하십시오등록하세요.",
275277 "Learn how to contribute your idle GPU cycles to the Horde": "여유로운 GPU 주기를 호드에Horde에 기여하는 방법 배우기",
276278 "Adjust context size to worker capabilities": "컨텍스트 크기를 작업자 기능에 맞게 조정하십시오조정합니다.",
277279 "Adjust response length to worker capabilities": "응답 길이를 작업자 기능에 맞게 조정하십시오조정합니다.",
278280 "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "승인된 작업자만을 대기열에 넣어 나쁜 응답을 처리할 수 있습니다. 응답 시간이 느려질 수 있습니다.",
279281 "Trusted workers only": "신뢰할 수 있는 작업자만 허용",
280282 "API key": "API 키",
281283 "Get it here:": "여기서여기에서 얻으세요:",
282284 "Register": "등록",
283285 "View my Kudos": "내 Kudos 보기",
284286 "Enter": "입력",
@@ -287,7 +289,7 @@
287289 "For privacy reasons, your API key will be hidden after you reload the page.": "개인 정보 보호를 위해 페이지를 다시로드한 후에는 API 키가 숨겨집니다.",
288290 "Models": "모델",
289291 "Refresh models": "모델 새로 고침",
290292 "-- Horde models not loaded --": "-- 호드Horde 모델 로드되지 않음 --",
291293 "Not connected...": "연결되지 않음...",
292294 "API url": "API URL",
293295 "Example: http://127.0.0.1:5000/api ": "예시: http://127.0.0.1:5000/api",
@@ -295,9 +297,9 @@
295297 "Cancel": "취소",
296298 "Novel API key": "NovelAPI 키",
297299 "Get your NovelAI API Key": "NovelAI API 키 가져오기",
298300 "Enter it in the box below": "아래 상자에칸에 복사한 API 키를 입력하세요.",
299301 "Novel AI Model": "Novel AI 모델",
300302 "No connection...": "연결 없음되지 않음...",
301303 "API Type": "API 유형",
302304 "Default (completions compatible)": "기본값 [OpenAI /완성 호환: oobabooga, LM Studio 등]",
303305 "TogetherAI API Key": "TogetherAI API 키",
@@ -310,10 +312,10 @@
310312 "Model Providers": "모델 제공자",
311313 "InfermaticAI API Key": "InfermaticAI API 키",
312314 "InfermaticAI Model": "InfermaticAI 모델",
313315 "DreamGen API key": "드림젠DreamGen API 키",
314316 "DreamGen Model": "드림젠DreamGen 모델",
315317 "Mancer API key": "Mancer API 키",
316318 "Mancer Model": "맨서Mancer 모델",
317319 "Make sure you run it with": "실행하는지 확인하세요",
318320 "flag": "깃발",
319321 "API key (optional)": "API 키 (선택 사항)",
@@ -325,8 +327,8 @@
325327 "Example: 127.0.0.1:8000": "예: http://127.0.0.1:8000",
326328 "vLLM Model": "vLLM 모델",
327329 "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine (OpenAI API의 래퍼 모드)",
328330 "Aphrodite API key": "아프로디테Aphrodite API 키",
329331 "Aphrodite Model": "아프로디테Aphrodite 모델",
330332 "ggerganov/llama.cpp": "ggerganov/llama.cpp (출력 서버)",
331333 "Example: 127.0.0.1:8080": "예: 127.0.0.1:8080",
332334 "Example: 127.0.0.1:11434": "예: 127.0.0.1:11434",
@@ -335,21 +337,23 @@
335337 "Tabby API key": "Tabby API 키",
336338 "koboldcpp API key (optional)": "koboldcpp API 키(선택사항)",
337339 "Example: 127.0.0.1:5001": "예: 127.0.0.1:5001",
338340 "Authorize": "승인하다승인하기",
339341 "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "OAuth 플로우를 사용하여 OpenRouter API 토큰을 가져옵니다. openrouter.ai로 리디렉션됩니다.",
342+ "Legacy API (pre-OAI, no streaming)": "레거시 API (OAI 이전, 스트리밍 없음)",
340343 "Bypass status check": "상태 확인 우회",
341344 "Chat Completion Source": "채팅 완성 소스근원",
342345 "Reverse Proxy": "역방향 프록시",
343346 "Proxy Presets": "프록시 사전 설정",
344347 "Saved addresses and passwords.": "저장된 주소와 비밀번호.",
345348 "Save Proxy": "프록시 저장",
346349 "Delete Proxy": "프록시 삭제",
347350 "Proxy Name": "프록시 이름",
351+ "Allow reverse proxy": "역방향 프록시 허용",
348352 "This will show up as your saved preset.": "이는 저장된 사전 설정으로 표시됩니다.",
349353 "Proxy Server URL": "프록시 서버 URL",
350354 "Alternative server URL (leave empty to use the default value).": "대체 서버 URL (기본값 사용을 원할 경우 비워 둡니다).",
351355 "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "이 상자에입력란에 어떤 것이든 입력하기 전에 반드시 실제 OAI API 키를 API 패널에서 제거하세요.",
352356 "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "개발진은 비공식 OpenAI 프록시를 사용하는 동안 발생하는 문제에 대한 지원을 제공할 수 없습니다.",
353357 "Doesn't work? Try adding": "작동하지 않나요? 추가해 보세요",
354358 "at the end!": "마지막에!",
355359 "Proxy Password": "프록시 비밀번호",
@@ -357,25 +361,30 @@
357361 "Peek a password": "비밀번호를 엿보세요",
358362 "OpenAI API key": "OpenAI API 키",
359363 "View API Usage Metrics": "API 사용 지표 보기",
360364 "Follow": "따르다OpenAI API 키를 얻으려면",
361365 "these directions": "이 지시 사항",
362366 "to get your OpenAI API key.": "OpenAI API 키를 얻으려면따르세요.",
363367 "Use Proxy password field instead. This input will be ignored.": "대신 \"프록시 비밀번호\" 필드를 사용하세요. 이 입력은 무시됩니다.",
364368 "OpenAI Model": "OpenAI 모델",
365369 "Bypass API status check": "API 상태 확인 우회",
366370 "Show External models (provided by API)": "외부 모델 표시 (API 제공)",
367371 "Get your key from": "다음에서 키를 받으세요",
368372 "Anthropic's developer console": "Anthropic의 개발자 콘솔",
373+ "Slack and Poe cookies will not work here, do not bother trying.": "Slack과 Poe 쿠키는 여기서 작동하지 않습니다. 시도하지 마세요.",
369374 "Claude Model": "Claude 모델",
370375 "Window AI Model": "Window AI 모델",
371376 "Model Order": "OpenRouter 모델 정렬",
372377 "Alphabetically": "알파벳순",
373378 "Price": "가격(가장 저렴)",
374379 "Context Size": "컨텍스트 크기",
375380 "Group by vendors": "공급업체별 그룹화",
376381 "Group by vendors Description": "OpenAI 모델을 한 그룹에 넣고, Anthropic 모델을 다른 그룹에 두는 등 정렬을 통해 결합할 수 있습니다.",
377382 "Allow fallback routes": "대체 경로fallback 허용",
378383 "Allow fallback routes Description": "선택한 모델이 요청을 처리할 수 없는 경우 대체 모델이 자동으로 선택됩니다.",
384+ "openrouter_force_instruct": "이 옵션은 오래되었으며 향후 제거될 예정입니다. 지시 형식을 사용하려면 대신 Text Completion API에서 OpenRouter로 전환하세요.",
385+ "LEGACY": "유산",
386+ "Force Instruct Mode formatting": "강제 지시 모드 형식",
387+ "Force_Instruct_Mode_formatting_Description": "Instruct Mode와 이 모드가 모두 활성화된 경우 프롬프트는 SillyTavern에 의해 현재 형식을 사용하여 형식화됩니다.\n 고급 형식 설정(시스템 프롬프트 지시 제외) 비활성화된 경우 프롬프트는 OpenRouter에 의해 형식화됩니다.",
379388 "Scale API Key": "Scale API 키",
380389 "Clear your cookie": "쿠키 지우기",
381390 "Alt Method": "대체 방법",
@@ -385,29 +394,30 @@
385394 "Google Model": "구글 모델",
386395 "MistralAI API Key": "MistralAI API 키",
387396 "MistralAI Model": "MistralAI 모델",
388397 "Groq API Key": "그로크Groq API 키",
389398 "Groq Model": "그로크Groq 모델",
390399 "Perplexity API Key": "Perplexity API 키",
391400 "Perplexity Model": "혼란Perplexity 모델",
392401 "Cohere API Key": "Cohere API 키",
393402 "Cohere Model": "Cohere 모델",
394403 "Custom Endpoint (Base URL)": "사용자 정의 엔드포인트(기본 URL)",
395404 "Custom API Key": "커스텀 API 키",
396405 "Available Models": "사용 가능한 모델",
397406 "Prompt Post-Processing": "신속한 후처리",
407+ "[title]API Connections;[no_connection_text]api_no_connection": "연결이 되지 않았습니다...",
398408 "Applies additional processing to the prompt before sending it to the API.": "API로 보내기 전에 프롬프트에 추가 처리를 적용합니다.",
399409 "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "짧은 테스트 메시지를 보내어 API 연결을 확인합니다. 이에 대해 유료 크레딧이 지급될지불될 것임을 인식하십시오있음을 인식하세요!",
400410 "Test Message": "테스트 메시지",
401411 "Auto-connect to Last Server": "마지막 서버에 자동으로 연결",
402412 "Missing key": "❌ 현재 누락저장된 키가 존재하지 않습니다.",
403413 "Key saved": "✔️ 키 저장됨.",
404414 "View hidden API keys": "숨겨진 API 키 보기",
405415 "AI Response Formatting": "AI 응답 형식 지정",
406416 "Advanced Formatting": "고급 서식",
407417 "Context Template": "컨텍스트 템플릿",
408418 "Auto-select this preset for Instruct Mode": "지시 모드에 대해 이 프리셋 자동 선택",
409419 "Story String": "이야기 문자열",
410420 "Example Separator": "예제예시 대화 구분자",
411421 "Chat Start": "채팅 시작",
412422 "Add Chat Start and Example Separator to a list of stopping strings.": "중지 문자열 목록에 채팅 시작 및 예제 구분 기호를 추가합니다.",
413423 "Use as Stop Strings": "중지 문자열로 사용",
@@ -415,10 +425,10 @@
415425 "Allow Jailbreak": "탈옥 허용",
416426 "Context Order": "컨텍스트 순서",
417427 "Summary": "요약",
418428 "Author's Note": "작성자작가 메모노트",
419429 "Example Dialogues": "예시 대화",
420430 "Hint": "힌트:",
421431 "In-Chat Position not affected": "요약 및 작성자작가 메모노트 주문은삽입 순서는 In-Chat 위치가 설정되지 않은 경우에만 영향을 받습니다.",
422432 "Instruct Mode": "지시 모드",
423433 "Enabled": "활성화됨",
424434 "instruct_bind_to_context": "활성화되면 선택한 지시 템플릿 이름이나 기본 설정에 따라 컨텍스트 템플릿이 자동으로 선택됩니다.",
@@ -426,7 +436,7 @@
426436 "Presets": "프리셋",
427437 "Auto-select this preset on API connection": "API 연결 시 이 프리셋 자동 선택",
428438 "Activation Regex": "활성화 정규식",
429439 "Wrap Sequences with Newline": "새 줄로 시퀀스 래핑감싸기",
430440 "Replace Macro in Sequences": "시퀀스에서 매크로 대체",
431441 "Skip Example Dialogues Formatting": "예제 대화 형식 건너뛰기",
432442 "Include Names": "이름 포함",
@@ -454,9 +464,9 @@
454464 "If enabled, System Sequences will be the same as User Sequences.": "이 기능을 활성화하면, 시스템 시퀀스가 ​​사용자 시퀀스와 동일해집니다.",
455465 "System same as User": "사용자와 동일한 시스템",
456466 "Misc. Sequences": "기타 시퀀스",
457467 "Inserted before the first Assistant's message.": "어시스턴트의 첫 번째 보조자의 메시지 앞에 삽입됩니다.",
458468 "First Assistant Prefix": "첫 번째 어시스턴트 접두어",
459469 "instruct_last_output_sequence": "마지막 보조자의어시스턴트 메시지 앞에 삽입되거나 AI 응답을 생성할 때 마지막 프롬프트 줄로 삽입됩니다(중립/시스템 역할 제외).",
460470 "Last Assistant Prefix": "마지막 어시스턴트 접두사",
461471 "Will be inserted as a last prompt line when using system/neutral generation.": "시스템/중립 생성을 사용할 때 마지막 프롬프트 라인으로 삽입됩니다.",
462472 "System Instruction Prefix": "시스템 명령어 접두사",
@@ -483,15 +493,15 @@
483493 "Custom Stopping Strings": "사용자 정의 중지 문자열",
484494 "JSON serialized array of strings": "문자열의 JSON 직렬화된 배열",
485495 "Replace Macro in Custom Stopping Strings": "사용자 정의 중단 문자열에서 매크로 교체",
486496 "Auto-Continue": "자동 계속계속하기",
487497 "Allow for Chat Completion APIs": "채팅 완성 API 허용",
488498 "Target length (tokens)": "대상 길이 (토큰)",
489499 "World Info": "세계월드 정보인포",
490500 "Locked = World Editor will stay open": "잠금 = 월드 편집기가 열린 상태로 유지됩니다",
491501 "Worlds/Lorebooks": "세계월드 인포/로어북",
492502 "Active World(s) for all chats": "모든 채팅에 대한 활성활성화된 세계월드 인포(들)",
493503 "-- World Info not found --": "-- 세계월드 정보를인포를 찾을 수 없음 --",
494504 "Global World Info/Lorebook activation settings": "글로벌 세계월드 정보인포/전설집로어북 활성화 설정",
495505 "Click to expand": "펼치려면 클릭하세요.",
496506 "Scan Depth": "스캔 깊이",
497507 "Context %": "컨텍스트 %",
@@ -513,22 +523,22 @@
513523 "Match Whole Words": "전체 단어 일치",
514524 "Only the entries with the most number of key matches will be selected for Inclusion Group filtering": "포함 그룹 필터링을 위해 키 일치 수가 가장 많은 항목만 선택됩니다.",
515525 "Use Group Scoring": "그룹 점수 사용",
516526 "Alert if your world info is greater than the allocated budget.": "귀하의 세계월드 정보가인포가 할당된 예산보다 큰 경우 경고합니다.",
517527 "Alert On Overflow": "오버플로우 알림",
518528 "New": "새로운새 월드인포",
519529 "or": "또는",
520530 "--- Pick to Edit ---": "--- 편집할 항목 선택 ---",
521531 "Rename World Info": "월드 정보인포 이름 바꾸기",
522532 "Open all Entries": "모든 항목 열기",
523533 "Close all Entries": "모든 항목 닫기",
524534 "New Entry": "새 항목",
525535 "Fill empty Memo/Titles with Keywords": "비어 있는 메모/제목을 키워드로 채우기",
526536 "Import World Info": "월드 정보인포 가져오기",
527537 "Export World Info": "월드 정보인포 내보내기",
528538 "Duplicate World Info": "월드 정보인포 복제",
529539 "Delete World Info": "월드 정보인포 삭제",
530540 "Search...": "검색...",
531541 "Search": "찾다찾기",
532542 "Priority": "우선 순위",
533543 "Custom": "사용자 정의",
534544 "Title A-Z": "제목 A-Z",
@@ -537,12 +547,12 @@
537547 "Tokens ↘": "토큰 ↘",
538548 "Depth ↗": "깊이 ↗",
539549 "Depth ↘": "깊이 ↘",
540550 "Order ↗": "주문순서 ↗",
541551 "Order ↘": "주문순서 ↘",
542552 "UID ↗": "UID ↗",
543553 "UID ↘": "UID ↘",
544554 "Trigger% ↗": "트리거발동 확률% ↗",
545555 "Trigger% ↘": "트리거발동 확률% ↘",
546556 "Refresh": "새로 고침",
547557 "User Settings": "사용자 설정",
548558 "Simple": "간단한",
@@ -558,7 +568,7 @@
558568 "Delete a theme": "테마 삭제",
559569 "Update a theme file": "테마 파일 업데이트",
560570 "Save as a new theme": "새 테마로 저장",
561571 "Avatar Style": "아바타캐릭터 프로필 스타일",
562572 "Circle": "원",
563573 "Square": "정사각형",
564574 "Rectangle": "사각형",
@@ -578,7 +588,7 @@
578588 "UI Border": "UI 테두리",
579589 "User Message Blur Tint": "사용자 메시지 흐림 틴트",
580590 "AI Message Blur Tint": "AI 메시지 흐림 틴트",
581591 "Chat Width": "채팅채팅창 폭",
582592 "Width of the main chat window in % of screen width": "화면 너비의 %로 표시되는 기본 채팅창 너비",
583593 "Font Scale": "글꼴 크기",
584594 "Font size": "글꼴 크기",
@@ -594,50 +604,53 @@
594604 "No Text Shadows": "텍스트 그림자 없음",
595605 "Reduce chat height, and put a static sprite behind the chat window": "채팅 높이를 줄이고, 채팅 창 뒤에 정적 스프라이트를 넣습니다",
596606 "Waifu Mode": "와이프 모드",
597607 "Always show the full list of the Message Actions context items for chat messages, instead of hiding them behind '...'": "채팅 메시지의 메시지 액션 컨텍스트 항목의 전체 목록을 항상 표시하십시오표시하세요. 대신 '...' 뒤에 숨기지 않습니다.",
598608 "Auto-Expand Message Actions": "메시지 액션 자동 확장",
599609 "Alternative UI for numeric sampling parameters with fewer steps": "단계가 적은 숫자 샘플링 매개변수에 대한 대체 UI",
600610 "Zen Sliders": "젠 슬라이더",
601611 "Entirely unrestrict all numeric sampling parameters": "모든 숫자 샘플링 매개변수를 완전히 제한하지 않음",
602612 "Mad Lab Mode": "미치광이 연구실 모드",
603613 "Time the AI's message generation, and show the duration in the chat log": "AI의 메시지 생성 시간을 측정하고, 채팅 로그에 지속 시간을 표시합니다",
604614 "Message Timer": "메시지 타이머도착 시간 측정",
605615 "Show a timestamp for each message in the chat log": "채팅 로그의 각 메시지에 타임스탬프 표시",
606616 "Chat Timestamps": "채팅 타임스탬프",
607617 "Show an icon for the API that generated the message": "메시지를 생성한 API에 대한 아이콘 표시",
608618 "Model Icon": "모델 아이콘 표시",
609619 "Show sequential message numbers in the chat log": "채팅 로그에 순차적인 메시지 번호 표시",
610620 "Message IDs": "메시지 ID",
611621 "Hide avatars in chat messages.": "채팅 메시지에서 아바타 숨김.",
612622 "Hide Chat Avatars": "채팅캐릭터 아바타프로필 숨기기",
613623 "Show the number of tokens in each message in the chat log": "채팅 로그의 각 메시지에 토큰 수 표시",
614624 "Show Message Token Count": "메시지 토큰 개수 표시",
615625 "Single-row message input area. Mobile only, no effect on PC": "한 줄짜리 메시지 입력 영역. 모바일 전용, PC에는 영향 없음",
616626 "Compact Input Area (Mobile)": "컴팩트한조그마한 입력 영역 (모바일)",
627+ "Swipe # for All Messages": "모든 스와이프 메시지에 대해 번호 매기기",
628+ "[title]Display swipe numbers for all messages, not just the last.": "마지막 메시지만이 아니라 모든 메시지에 대한 스와이프 번호를 표시합니다.",
617629 "In the Character Management panel, show quick selection buttons for favorited characters": "캐릭터 관리 패널에서 즐겨찾는 캐릭터에 대한 빠른 선택 버튼을 표시합니다",
618630 "Characters Hotswap": "캐릭터 핫스왑",
619631 "Enable magnification for zoomed avatar display.": "마우스 오버포인터를 아바타 위에 올려두면 아바타가 커지도록확대 설정하세요됩니다.",
620632 "Avatar Hover Magnification": "아바타마우스를 마우스오버올리면 아바타 확대",
621633 "Enables a magnification effect on hover when you display the zoomed avatar after clicking an avatar's image in chat.": "채팅에서 아바타 이미지를 클릭한 후 확대된 아바타를 표시할 때 마우스 오버 시 확대 효과를 활성화합니다.",
622634 "Show tagged character folders in the character list": "캐릭터 목록에서 태그가 지정된 캐릭터 폴더 표시",
623635 "Tags as Folders": "태그를 폴더로 설정",
624636 "Tags_as_Folders_desc": "최근 변경 사항: 태그는 태그 관리 메뉴에서 폴더로 표시되어야 폴더로 표시됩니다. 여기를 클릭해 불러오세요.",
637+ "Background Image": "채팅 배경 이미지",
625638 "Character Handling": "캐릭터 처리",
626639 "If set in the advanced character definitions, this field will be displayed in the characters list.": "고급 캐릭터 정의에서 설정된 경우 이 필드가 캐릭터 목록에 표시됩니다.",
627640 "Char List Subheader": "문자캐릭터 목록 하위 제목",
628641 "Character Version": "캐릭터 버전",
629642 "Created by": "작성자제작자",
630643 "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "퍼지 매칭을 사용하고 이름 하위 문자열뿐만 아니라 모든 데이터 필드로 목록에서 캐릭터를 검색합니다",
631644 "Advanced Character Search": "고급 캐릭터 검색",
632645 "If checked and the character card contains a prompt override (System Prompt), use that instead": "선택되어 있고 캐릭터 카드에 프롬프트 재정의 (시스템 프롬프트) 재정의가 포함 된 경우, 그것을 대신 사용하십시오사용합니다",
633646 "Prefer Character Card Prompt": "캐릭터 카드 프롬프트 선호",
634647 "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "선택되어 있고 캐릭터 카드에 탈옥 재정의 (게시 내역Post-History 지침지시)탈옥 재정의가 포함 된 경우, 그것을 대신 사용하십시오사용합니다.",
635648 "Prefer Character Card Jailbreak": "캐릭터 카드 탈옥 선호",
636649 "Avoid cropping and resizing imported character images. When off, crop/resize to 512x768": "가져온 캐릭터 이미지를 자르거나 크기를 조정하지 마세요. 꺼져 있으면 512x768로 자르거나 크기를 조정합니다.",
637650 "Never resize avatars": "아바타 크기 변경하지 않음",
638651 "Show actual file names on the disk, in the characters list display only": "실제 파일 이름을 디스크에 표시하며 캐릭터 목록 디스플레이에만",
639652 "Show avatar filenames": "아바타 파일 이름 표시",
640653 "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "캐릭터 가져오기시 내장된 카드 태그를 가져 오도록 요청하십시오요청하세요. 그렇지 않으면 내장된 태그가 무시됩니다",
641654 "Import Card Tags": "카드 태그 가져오기",
642655 "Hide character definitions from the editor panel behind a spoiler button": "스포일러 버튼 뒤에 편집기 패널에서 캐릭터 정의를 숨깁니다",
643656 "Spoiler Free Mode": "스포일러 무료 모드",
@@ -655,7 +668,7 @@
655668 "Background Sound Only": "배경 소리만",
656669 "Reduce the formatting requirements on API URLs": "API URL의 서식 요구 사항 감소",
657670 "Relaxed API URLS": "완화된 API URLS",
658671 "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "내장된 로어북이있는 모든 새 캐릭터에 대해 세계월드 정보인포/로어북을 가져 오도록 요청하십시오요청하세요. 선택 해제하면 대신 간단한 메시지가 표시됩니다",
659672 "Lorebook Import Dialog": "로어북 가져오기 대화 상자",
660673 "Restore unsaved user input on page refresh": "페이지 새로 고침시 저장되지 않은 사용자 입력 복원",
661674 "Restore User Input": "사용자 입력 복원",
@@ -675,8 +688,8 @@
675688 "Streaming FPS": "스트리밍 FPS",
676689 "Update speed of streamed text.": "스트리밍된 텍스트의 속도를 업데이트합니다.",
677690 "Example Messages Behavior": "예제 메시지 동작",
678691 "Gradual push-out": "토큰 초과 시 점진적 밀어내기",
679692 "Always include examples": "항상 컨텍스트에 예제 포함",
680693 "Never include examples": "절대로 예제 포함 안 함",
681694 "Send on Enter": "Enter로 전송",
682695 "Disabled": "비활성화됨",
@@ -693,7 +706,9 @@
693706 "Save edits to messages without confirmation as you type": "입력하는 동안 확인없이 메시지에 대한 편집 사항 저장",
694707 "Auto-save Message Edits": "메시지 편집 자동 저장",
695708 "Confirm message deletion": "메시지 삭제 확인",
696709 "Auto-fix Markdown": "Markdown마크다운 자동 수정",
710+ "Render LaTeX and AsciiMath equation notation in chat messages. Powered by KaTeX": "채팅 메시지에서 LaTeX 및 AsciiMath 방정식 표기법을 렌더링합니다. KaTeX 제공",
711+ "Render Formulas": "수식 렌더링",
697712 "Disallow embedded media from other domains in chat messages": "채팅 메시지에 다른 도메인의 삽입된 미디어를 허용하지 않습니다.",
698713 "Forbid External Media": "외부 미디어 금지",
699714 "Allow {{char}}: in bot messages": "봇 메시지에서 {{char}}: 허용",
@@ -732,8 +747,8 @@
732747 "entire chat width": "전체 채팅 폭",
733748 "full window width": "전체 창 너비",
734749 "STscript Settings": "STscript 설정",
735750 "Sets default flags for the STscript parser.": "STscript 파서Parser 기본 플래그 설정",
736751 "Parser Flags": "파서Parser 플래그 설정",
737752 "Switch to stricter escaping, allowing all delimiting characters to be escaped with a backslash, and backslashes to be escaped as well.": "모든 구분자를 백슬래시로 이스케이핑하고, 백슬래시 자체도 이스케이프할 수 있도록 엄격한 방식으로 전환합니다.",
738753 "STRICT_ESCAPING": "STRICT_ESCAPING",
739754 "Replace all {{getvar::}} and {{getglobalvar::}} macros with scoped variables to avoid double macro substitution.": "이중 매크로 대체를 방지하려면 모든 {{getvar::}} 및 {{getglobalvar::}} 매크로를 범위 변수로 바꾸세요.",
@@ -751,7 +766,7 @@
751766 "Manage extensions": "확장 프로그램 관리",
752767 "Import Extension From Git Repo": "Git 리포지토리에서 확장 프로그램 가져오기",
753768 "Install extension": "확장 프로그램 설치",
754769 "Extras API:": "추가외부 API:",
755770 "Auto-connect": "자동 연결",
756771 "Extras API URL": "엑스트라 API URL",
757772 "Extras API key (optional)": "Extras API 키 (선택 사항)",
@@ -769,20 +784,21 @@
769784 "No persona description": "[설명 없음]",
770785 "Name": "이름",
771786 "Enter your name": "이름을 입력하세요",
772787 "Click to set a new User Name": "새 사용자 이름 설정을 클릭하세요저장합니다.",
773788 "Click to lock your selected persona to the current chat. Click again to remove the lock.": "선택한 페르소나를 현재 채팅에 잠그려면 클릭하세요. 잠금을 제거하려면 다시 클릭하세요.",
774789 "Click to set user name for all messages": "모든 메시지에메시지를 현재 선택된 사용자 이름을이름으로 설정하려면 클릭하세요",
775790 "Persona Description": "페르소나 설명",
776791 "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "예: [{{user}}는 28세의 루마니아 고양이 소녀입니다.]",
777792 "Tokens persona description": "토큰 페르소나 설명 토큰",
778793 "Position:": "위치:",
794+ "None (disabled)": "없음 (비활성화됨)",
779795 "In Story String / Prompt Manager": "이야기 문자열 / 프롬프트 관리자",
780796 "Top of Author's Note": "작성자의작가 주석노트 상단",
781797 "Bottom of Author's Note": "작성자의작가 주석노트 하단",
782798 "In-chat @ Depth": "채팅 내 @ Depth",
783799 "Depth:": "깊이:",
784800 "Role:": "역할:",
785801 "System": "체계시스템",
786802 "User": "사용자",
787803 "Assistant": "어시스턴트",
788804 "Show notifications on switching personas": "페르소나 전환시 알림 표시",
@@ -803,15 +819,15 @@
803819 "Click to select a new avatar for this character": "이 캐릭터의 새 아바타를 선택하려면 클릭하세요",
804820 "Add to Favorites": "즐겨찾기에 추가",
805821 "Advanced Definition": "고급 정의",
806822 "Character Lore": "캐릭터 이야기로어북",
807823 "Chat Lore": "채팅 이야기로어북",
808824 "Export and Download": "내보내기 및 다운로드",
809825 "Duplicate Character": "캐릭터 복제",
810826 "Create Character": "캐릭터 생성",
811827 "Delete Character": "캐릭터 삭제",
812828 "More...": "추가 설정들...",
813829 "Link to World Info": "월드 정보에인포에 연결",
814830 "Import Card Lore": "카드 로어로어북 가져오기",
815831 "Scenario Override": "시나리오 재정의",
816832 "Convert to Persona": "페르소나로 변환",
817833 "Rename": "이름 변경",
@@ -820,22 +836,22 @@
820836 "Import Tags": "태그 가져오기",
821837 "Search / Create Tags": "검색 / 태그 생성",
822838 "View all tags": "모든 태그 보기",
823839 "Creator's Notes": "제작자의 노트메모",
824840 "Show / Hide Description and First Message": "설명 및 첫 번째 메시지 표시/숨기기",
825841 "Character Description": "캐릭터 설명",
826842 "Click to allow/forbid the use of external media for this character.": "이 캐릭터에 대한 외부 미디어 사용을 허용/금지하려면 클릭하세요.",
827843 "Ext. Media": "내선외부 미디어",
828844 "Describe your character's physical and mental traits here.": "여기에 캐릭터의 신체적, 정신적 특성을 설명하세요.",
829845 "First message": "첫 번째 메시지",
830846 "Click to set additional greeting messages": "추가 인사말번째 메시지를 추가로 설정하려면 클릭하세요.",
831847 "Alt. Greetings": "대체. 인사말첫 메시지",
832848 "This will be the first message from the character that starts every chat.": "이것은 모든 채팅을 시작하는시작할 캐릭터의 첫 번째 메시지가 됩니다.",
833849 "Group Controls": "그룹 제어",
834850 "Chat Name (Optional)": "채팅 이름 (선택 사항)",
835851 "Click to select a new avatar for this group": "이 그룹의 새 아바타를 선택하려면 클릭하세요",
836852 "Group reply strategy": "그룹 응답 전략",
837853 "Natural order": "자연자연스러운 순서",
838854 "List order": "목록목록에 배정된 순서",
839855 "Group generation handling mode": "그룹 생성 처리 모드",
840856 "Swap character cards": "캐릭터 카드 바꾸기",
841857 "Join character cards (exclude muted)": "캐릭터 카드 가입 (뮤트 제외)",
@@ -861,8 +877,8 @@
861877 "Characters sorting order": "캐릭터 정렬 순서",
862878 "A-Z": "A-Z",
863879 "Z-A": "Z-A",
864880 "Newest": "최신최신순",
865881 "Oldest": "가장 오래된",
866882 "Favorites": "즐겨찾기",
867883 "Recent": "최근",
868884 "Most chats": "대화가 가장 많은",
@@ -874,19 +890,19 @@
874890 "Bulk_edit_characters": "대량 캐릭터 편집",
875891 "Bulk select all characters": "모든 문자 일괄 선택",
876892 "Bulk delete characters": "대량 캐릭터 삭제",
877893 "popup-button-save": "구하다저장하기",
878894 "popup-button-yes": "",
879895 "popup-button-no": "아니요",
880896 "popup-button-cancel": "취소",
881897 "popup-button-import": "수입불러오기",
882898 "Advanced Defininitions": "고급 정의",
883899 "Prompt Overrides": "프롬프트 무시",
884900 "(For Chat Completion and Instruct Mode)": "(채팅 완료 및 지시 모드의 경우)",
885901 "Insert {{original}} into either box to include the respective default prompt from system settings.": "{{original}}를 해당 상자에 넣어 시스템 설정의 기본 프롬프트를 포함합니다.",
886902 "Main Prompt": "주요 프롬프트",
887903 "Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "여기에 있는 모든 내용은 이 캐릭터에 사용된 기본 메인 프롬프트를 대체합니다. (v2 사양: system_prompt)",
888904 "Any contents here will replace the default Jailbreak Prompt used for this character. (v2 spec: post_history_instructions)": "여기에 있는 모든 내용은 이 캐릭터에 사용된 기본 탈옥 프롬프트를 대체합니다. (v2 사양: post_history_instructions)",
889905 "Creator's Metadata (Not sent with the AI prompt)": "만든이제작자의 메타데이터 (AI 프롬프트와 함께 전송되지 않음)",
890906 "Creator's Metadata": "제작자의 메타데이터",
891907 "(Not sent with the AI Prompt)": "(AI 프롬프트와 함께 전송되지 않음)",
892908 "Everything here is optional": "여기 있는 모든 것은 선택 사항입니다",
@@ -904,11 +920,11 @@
904920 "@ Depth": "@ 깊이",
905921 "Role": "역할",
906922 "Talkativeness": "수다스러움",
907923 "How often the character speaks in group chats!": "캐릭터가 그룹 채팅에서 얼마나 자주 말하는지말할지 설정해보세요!",
908924 "How often the character speaks in": "캐릭터가 말하는 빈도",
909925 "group chats!": "그룹 채팅!",
910926 "Shy": "수줍음",
911927 "Normal": "보통평범함",
912928 "Chatty": "수다쟁이",
913929 "Examples of dialogue": "대화 예시",
914930 "Important to set the character's writing style.": "캐릭터의 글쓰기 스타일을 설정하는 것이 중요합니다.",
@@ -918,16 +934,16 @@
918934 "Import Chat": "채팅 가져오기",
919935 "Copy to system backgrounds": "시스템 배경에 복사",
920936 "Rename background": "배경 이름 바꾸기",
921937 "Lock": "잠그다잠금",
922938 "Unlock": "터놓다잠금 해제",
923939 "Delete background": "배경 삭제",
924940 "Chat Scenario Override": "채팅 시나리오 재정의",
925941 "Remove": "제거",
926942 "Type here...": "여기에 입력하세요...",
927943 "Chat Lorebook": "채팅 설화집로어북",
928944 "Chat Lorebook for": "채팅 설화집로어북",
929945 "chat_world_template_txt": "선택한 세계월드 정보가인포가 이 채팅에 연결됩니다. AI 답글을응답을 생성할 때,\n 글로벌 및 캐릭터 지식북의로어북의 항목과 결합됩니다.",
930946 "Select a World Info file for": "다음을 위해 세계월드 정보인포 파일 선택:",
931947 "Primary Lorebook": "기본 로어북",
932948 "A selected World Info will be bound to this character as its own Lorebook.": "선택한 월드 정보가 이 캐릭터에게 자체 로어북으로 바인딩됩니다.",
933949 "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "AI 응답을 생성할 때 전역 월드 정보 선택기의 항목과 결합됩니다.",
@@ -942,34 +958,34 @@
942958 "Use tag as folder": "폴더로 태그 지정",
943959 "Delete tag": "태그 삭제",
944960 "Entry Title/Memo": "항목 제목/메모",
945961 "WI Entry Status:🔵 Constant🟢 Normal🔗 Vectorized❌ Disabled": "WI 입국 상태:\r🔵 상수상시\r🟢 보통조건 만족시\r🔗 벡터화됨\r❌ 장애인비활성화",
946962 "WI_Entry_Status_Constant": "끊임없는상시 활성화",
947963 "WI_Entry_Status_Normal": "정상",
948964 "WI_Entry_Status_Vectorized": "벡터화됨",
949965 "WI_Entry_Status_Disabled": "장애가 있는비활성화됨",
950966 "T_Position": "↑Char: 캐릭터 정의 전\n↓Char: 캐릭터 정의 후\n↑AN: 저자작가 주석노트 전\n↓AN: 저자 주석작가노트 후\n@D: 깊이에깊이",
951967 "Before Char Defs": "캐릭터 정의 전",
952968 "After Char Defs": "캐릭터 정의 후",
953969 "Before EM": "↑EM",
954970 "After EM": "↓EM",
955971 "Before AN": "저자작가 주석노트 전",
956972 "After AN": "저자작가 주석노트 후",
957973 "at Depth System": "@D ⚙️",
958974 "at Depth User": "@D 👤",
959975 "at Depth AI": "@D 🤖",
960976 "Depth": "깊이",
961977 "Order:": "주문순서:",
962978 "Order": "주문순서:",
963979 "Trigger %:": "방아쇠발동 확률 %:",
964980 "Probability": "개연성",
965981 "Duplicate world info entry": "중복된 세계월드 정보인포 항목",
966982 "Delete world info entry": "세계월드 정보인포 항목 삭제",
967983 "Comma separated (required)": "쉼표로 구분 (필수)",
968984 "Primary Keywords": "기본 키워드",
969985 "Keywords or Regexes": "키워드 또는 정규식",
970986 "Comma separated list": "쉼표로 구분된 목록",
971987 "Switch to plaintext mode": "일반 텍스트 모드로 전환",
972988 "Logic": "로직논리 구조",
973989 "AND ANY": "AND ANY",
974990 "AND ALL": "AND ALL",
975991 "NOT ALL": "NOT ALL",
@@ -982,6 +998,7 @@
982998 "Case-Sensitive": "대소문자 구분",
983999 "Yes": "예",
9841000 "No": "아니오",
1001+ "Quick Reply": "빠른 답장",
9851002 "Can be used to automatically activate Quick Replies": "빠른 답장을 자동으로 활성화하는 데 사용할 수 있습니다.",
9861003 "Automation ID": "자동화 ID",
9871004 "( None )": "( 없음 )",
@@ -994,7 +1011,7 @@
9941011 "Character Exclusion": "캐릭터 제외",
9951012 "-- Characters not found --": "-- 캐릭터를 찾을 수 없음 --",
9961013 "Inclusion Group": "포함 그룹",
9971014 "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문서: 세계월드 정보인포 - 포함 그룹",
9981015 "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여러 항목의 우선순위가 높은 경우 '순서'가 가장 높은 항목이 선택됩니다.",
9991016 "Only one entry with the same label will be activated": "동일한 라벨을 가진 항목은 하나만 활성화됩니다",
10001017 "A relative likelihood of entry activation within the group": "그룹 내 항목 활성화의 상대적 가능성",
@@ -1004,27 +1021,28 @@
10041021 "Add Memo": "메모 추가",
10051022 "Text or token ids": "텍스트 또는 [토큰 ID]",
10061023 "close": "닫다",
10071024 "prompt_manager_edit": "편집하다프롬프트 편집",
10081025 "prompt_manager_name": "이름",
10091026 "A name for this prompt.": "이 프롬프트의 이름입니다.",
10101027 "To whom this message will be attributed.": "해당 메시지는프롬프트에 누구에게부여할 귀속됩니까역할은 무엇인가요?",
10111028 "AI Assistant": "AI 어시스턴트",
10121029 "prompt_manager_position": "위치",
10131030 "Injection position. Next to other prompts (relative) or in-chat (absolute).": "주입 위치. 다른 프롬프트 옆(상대적) 또는 채팅 내(절대적).",
10141031 "prompt_manager_relative": "상대적인",
1032+ "prompt_manager_in_chat": "깊이에 따라",
10151033 "prompt_manager_depth": "깊이",
10161034 "Injection depth. 0 = after the last message, 1 = before the last message, etc.": "주입 깊이. 0 = 마지막 메시지 뒤, 1 = 마지막 메시지 앞 등",
10171035 "Prompt": "프롬프트",
10181036 "The prompt to be sent.": "보낼보내질 프롬프트입니다프롬프트 내용을 작성하는 부분입니다.",
10191037 "This prompt cannot be overridden by character cards, even if overrides are preferred.": "이 프롬프트는 고급 정의에서 재정의가 선호되는 경우에도 캐릭터 카드로 재정의될 수 없습니다.",
10201038 "prompt_manager_forbid_overrides": "재정의 금지",
10211039 "reset": "초기화",
10221040 "save": "구하다저장",
10231041 "This message is invisible for the AI": "이 메시지는 AI에게 보이지 않습니다",
10241042 "Message Actions": "메시지 작업",
10251043 "Translate message": "메시지 번역",
10261044 "Generate Image": "이미지 생성",
10271045 "Narrate": "이야기하기나레이션 하기",
10281046 "Exclude message from prompts": "프롬프트에서 메시지 제외",
10291047 "Include message in prompts": "프롬프트에 메시지 포함",
10301048 "Embed file or image": "파일 또는 이미지 삽입",
@@ -1040,26 +1058,26 @@
10401058 "Move message down": "메시지를 아래로 이동",
10411059 "Enlarge": "확대",
10421060 "Welcome to SillyTavern!": "SillyTavern에 오신 것을 환영합니다!",
10431061 "welcome_message_part_1": "자세한 설명 읽기:",
10441062 "welcome_message_part_2": "공식 문서",
10451063 "welcome_message_part_3": null,
10461064 "welcome_message_part_4": "유형",
10471065 "welcome_message_part_5": "명령과 매크로에 대한 채팅.",
10481066 "welcome_message_part_6": "참여하세요공식",
10491067 "Discord server": "디스코드 서버",
10501068 "welcome_message_part_7": "에서 정보 및 공지사항을 확인하세요.",
10511069 "SillyTavern is aimed at advanced users.": "SillyTavern은 고급 사용자를 대상으로 합니다.",
10521070 "If you're new to this, enable the simplified UI mode below.": "처음 사용하는 경우 아래의 단순화된 UI 모드를 활성화하세요.",
10531071 "Change it later in the 'User Settings' panel.": "나중에 '사용자 설정' 패널에서 변경하세요.",
10541072 "Enable simple UI mode": "단순 UI 모드 활성화",
10551073 "Looking for AI characters?": "AI 캐릭터를 찾고 계십니까?",
10561074 "onboarding_import": "수입가져오기",
10571075 "from supported sources or view": "지원되는 소스 또는 보기에서",
10581076 "Sample characters": "샘플 캐릭터",
10591077 "Your Persona": "당신의 페르소나",
10601078 "Before you get started, you must select a persona name.": "시작하기 전에 페르소나 이름을 선택해야 합니다.",
10611079 "welcome_message_part_8": "이는 언제든지 다음을 통해 변경될 수 있습니다. 변경을 원한다면",
10621080 "welcome_message_part_9": "아이콘을 누르세요.",
10631081 "Persona Name:": "페르소나 이름:",
10641082 "Temporarily disable automatic replies from this character": "이 캐릭터의 자동 응답 일시적으로 비활성화",
10651083 "Enable automatic replies from this character": "이 캐릭터의 자동 응답 활성화",
@@ -1081,7 +1099,7 @@
10811099 "Remove the file": "파일을 제거하세요",
10821100 "Unique to this chat": "이 채팅에만 고유함",
10831101 "Checkpoints inherit the Note from their parent, and can be changed individually after that.": "체크포인트는 상위 항목으로부터 메모를 상속받으며 이후 개별적으로 변경될 수 있습니다.",
10841102 "Include in World Info Scanning": "세계월드인포를 정보스캔 스캔에대상에 포함",
10851103 "Before Main Prompt / Story String": "메인 프롬프트 전/스토리 문자열",
10861104 "After Main Prompt / Story String": "메인 프롬프트 이후 / 스토리 문자열",
10871105 "as": "~처럼",
@@ -1090,11 +1108,11 @@
10901108 "User inputs until next insertion:": "다음 삽입까지 사용자 입력:",
10911109 "Character Author's Note (Private)": "캐릭터 작가의 메모 (비공개)",
10921110 "Won't be shared with the character card on export.": "내보내기 시 캐릭터 카드와 공유되지 않습니다.",
10931111 "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.": "해당 캐릭터에 대한 작가의작가 메모로노트로 자동 추가됩니다. 그룹으로 사용되지만\n 그룹 채팅이 열려 있으면 수정할 수 없습니다.",
10941112 "Use character author's note": "캐릭터 작성자의작가 메모노트 사용",
10951113 "Replace Author's Note": "작성자의작가 메모노트 바꾸기자리를 대체하기",
10961114 "Default Author's Note": "기본 작성자의작가 메모노트",
10971115 "Will be automatically added as the Author's Note for all new chats.": "모든 새 채팅에 대한 작성자작가 메모로노트로 자동으로 추가됩니다.",
10981116 "Chat CFG": "채팅CFG",
10991117 "1 = disabled": "1 = 비활성화됨",
11001118 "write short replies, write replies using past tense": "짧은 답장 쓰기, 과거 시제를 사용하여 답장 쓰기",
@@ -1104,7 +1122,7 @@
11041122 "Will be automatically added as the CFG for this character.": "해당 캐릭터의 CFG로 자동 추가됩니다.",
11051123 "Global CFG": "글로벌 CFG",
11061124 "Will be used as the default CFG options for every chat unless overridden.": "재정의되지 않는 한 모든 채팅에 대해 기본 CFG 옵션으로 사용됩니다.",
11071125 "CFG Prompt Cascading": "CFG 프롬프트 카스케이딩세분화",
11081126 "Combine positive/negative prompts from other boxes.": "다른 상자의 긍정적/부정적 프롬프트를 결합합니다.",
11091127 "For example, ticking the chat, global, and character boxes combine all negative prompts into a comma-separated string.": "예를 들어, 채팅, 글로벌, 문자 상자를 체크하면 모든 부정 프롬프트가 쉼표로 구분된 문자열로 결합됩니다.",
11101128 "Always Include": "항상 포함",
@@ -1127,14 +1145,14 @@
11271145 "Toggle Panels": "토글 패널",
11281146 "Back to parent chat": "부모 채팅으로 돌아가기",
11291147 "Save checkpoint": "체크포인트 저장",
11301148 "Convert to group": "그룹으로그룹 채팅으로 변환",
11311149 "Start new chat": "새로운 채팅 시작",
11321150 "Manage chat files": "채팅 파일 관리",
11331151 "Delete messages": "메시지 삭제",
11341152 "Regenerate": "재생성",
11351153 "Ask AI to write your message for you": "AI에게 메시지를 대신 작성하도록 요청",
11361154 "Impersonate": "대신 말하기사칭",
11371155 "Continue": "계속 생성하기",
11381156 "Bind user name to that avatar": "그 아바타에 사용자 이름 바인딩",
11391157 "Change persona image": "페르소나 이미지 변경",
11401158 "Select this as default persona for the new chats.": "새 채팅의 기본 페르소나로 선택합니다.",
@@ -1142,8 +1160,8 @@
11421160 "These characters are the winners of character design contests and have outstandable quality.": "캐릭터 디자인 공모전에서 당선된 캐릭터로, 뛰어난 퀄리티를 자랑하는 캐릭터입니다.",
11431161 "Contest Winners": "콘테스트 우승자",
11441162 "These characters are the finalists of character design contests and have remarkable quality.": "이 캐릭터들은 캐릭터 디자인 공모전의 최종 후보로, 뛰어난 퀄리티를 자랑합니다.",
11451163 "Featured Characters": "주요독립된 캐릭터",
11461164 "Attach a File": "파일을파일 첨부첨부하기",
11471165 "Open Data Bank": "오픈데이터뱅크",
11481166 "Enter a URL or the ID of a Fandom wiki page to scrape:": "스크랩할 Fandom 위키 페이지의 URL이나 ID를 입력하세요:",
11491167 "Examples:": "예:",
@@ -1176,16 +1194,14 @@
11761194 "Don't include the page name!": "페이지 이름을 포함하지 마세요!",
11771195 "Enter web URLs to scrape (one per line):": "스크랩할 웹 URL을 입력하세요(한 줄에 하나씩):",
11781196 "Enter a video URL to download its transcript.": "스크립트를 다운로드하려면 동영상 URL 또는 ID를 입력하세요.",
11791197 "Expression API": "현지의표현\n엑스트라\n법학대학원nAPI",
1180- "ext_sum_with": "요약:",
1181- "ext_sum_main_api": "메인 API",
11821198 "ext_sum_current_summary": "현재 요약:",
11831199 "ext_sum_restore_previous": "이전 복원",
11841200 "ext_sum_memory_placeholder": "여기에 요약이 생성됩니다...",
11851201 "Trigger a summary update right now.": "지금 요약하세요",
11861202 "ext_sum_force_text": "지금 요약하세요",
11871203 "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에서만 사용 가능)을 눌러 강제로 업데이트할 수 있습니다.",
11881204 "ext_sum_pause": "정지시키다요약 정지시키기",
11891205 "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.": "요약할 텍스트에서 World Info 및 Author's Note를 생략합니다. Main API를 사용할 때만 효과가 있습니다. Extras API는 항상 WI/AN을 생략합니다.",
11901206 "ext_sum_no_wi_an": "WI/AN 없음",
11911207 "ext_sum_settings_tip": "요약 프롬프트, 삽입 위치 등을 편집합니다.",
@@ -1193,7 +1209,7 @@
11931209 "ext_sum_prompt_builder": "프롬프트 빌더",
11941210 "ext_sum_prompt_builder_1_desc": "확장 프로그램은 아직 요약되지 않은 메시지를 사용하여 자체 프롬프트를 작성합니다. 요약이 생성될 때까지 채팅을 차단합니다.",
11951211 "ext_sum_prompt_builder_1": "원시, 차단",
11961212 "ext_sum_prompt_builder_2_desc": "확장 프로그램은 아직 요약되지 않은 메시지를 사용하여 자체 프롬프트를 작성합니다. 요약이 생성되는 동안 채팅을 차단하지 않습니다. 하지만 모든 백엔드가 이 모드를 지원하는 것은 아닙니다.",
11971213 "ext_sum_prompt_builder_2": "원시, 비차단",
11981214 "ext_sum_prompt_builder_3_desc": "확장은 일반 기본 프롬프트 빌더를 사용하고 요약 요청을 마지막 시스템 메시지로 추가합니다.",
11991215 "ext_sum_prompt_builder_3": "클래식, 차단",
@@ -1224,13 +1240,13 @@
12241240 "ext_regex_title": "정규식",
12251241 "ext_regex_new_global_script": "+ 글로벌",
12261242 "ext_regex_new_scoped_script": "+ 범위 지정",
12271243 "ext_regex_import_script": "수입불러오기",
12281244 "ext_regex_global_scripts": "글로벌 스크립트",
12291245 "ext_regex_global_scripts_desc": "모든 캐릭터에 사용 가능합니다. 로컬 설정에 저장되었습니다.",
12301246 "ext_regex_scoped_scripts": "범위가 지정된 스크립트",
12311247 "ext_regex_scoped_scripts_desc": "해당 캐릭터에만 사용 가능합니다. 카드 데이터에 저장됩니다.",
12321248 "Regex Editor": "정규식 편집기",
12331249 "Test Mode": "시험테스트 모드",
12341250 "ext_regex_desc": "Regex는 정규식을 사용하여 문자열을 찾거나 바꾸는 도구입니다. 자세한 내용을 보려면 ?를 클릭하세요. 제목 옆에.",
12351251 "Input": "입력",
12361252 "ext_regex_test_input_placeholder": "여기에 입력하세요...",
@@ -1277,20 +1293,21 @@
12771293 "sd_refine_mode": "프롬프트를 생성 API로 보내기 전에 수동으로 편집할 수 있도록 허용",
12781294 "sd_refine_mode_txt": "생성 전에 프롬프트 편집",
12791295 "sd_interactive_mode": "'고양이 사진 보내주세요'와 같은 메시지를 보낼 때 자동으로 이미지를 생성합니다.",
12801296 "sd_interactive_mode_txt": "대화형대화에 따른 자동 이미지 생성 모드",
12811297 "sd_multimodal_captioning": "다중 모달 캡션을 사용하여 아바타를 기반으로 사용자 및 캐릭터 초상화에 대한 프롬프트를 생성합니다.",
12821298 "sd_multimodal_captioning_txt": "인물 사진에 다중 모드 캡션 사용",
12831299 "sd_expand": "텍스트 생성 모델을 사용하여 프롬프트 자동 확장",
12841300 "sd_expand_txt": "자동 강화 프롬프트",
12851301 "sd_snap": "강제 종횡비(인물 사진, 배경)를 사용하여 가장 가까운 알려진 해상도로 스냅 생성을 요청하는 동시에 절대 픽셀 수를 유지하려고 합니다(SDXL에 권장).",
12861302 "sd_snap_txt": "스냅 자동 조정 해상도",
12871303 "Source": "원천근원",
1304+ "Horde": "Horde",
12881305 "sd_auto_url": "예: {{auto_url}}",
12891306 "Authentication (optional)": "인증(선택사항)",
12901307 "Example: username:password": "예: 사용자 이름:비밀번호",
12911308 "Important:": "중요한:",
12921309 "sd_auto_auth_warning_1": "SD 웹 UI를 실행하세요",
12931310 "sd_auto_auth_warning_2": "깃발Flag! SillyTavern 호스트 시스템에서 서버에 액세스할 수 있어야 합니다.",
12941311 "sd_drawthings_url": "예: {{drawthings_url}}",
12951312 "sd_drawthings_auth_txt": "UI에서 HTTP API 스위치가 활성화된 상태에서 DrawThings 앱을 실행하세요! SillyTavern 호스트 시스템에서 서버에 액세스할 수 있어야 합니다.",
12961313 "sd_vlad_url": "예: {{vlad_url}}",
@@ -1308,26 +1325,28 @@
13081325 "Standard": "기준",
13091326 "HD": "HD(고화질)",
13101327 "sd_comfy_url": "예: {{comfy_url}}",
13111328 "Open workflow editor": "워크플로워크플로우로 편집기 열기",
13121329 "Create new workflow": "새 워크플로워크플로우 만들기",
13131330 "Delete workflow": "워크플로워크플로우 삭제",
13141331 "Enhance": "향상시키다",
13151332 "Refine": "구체화",
13161333 "Decrisper": "더 명확하게",
13171334 "Sampling steps": "샘플링 단계 ()",
13181335 "Width": "너비 ()",
13191336 "Height": "높이 ()",
13201337 "Resolution": "해결해상도",
13211338 "Model": "모델",
1339+ "Ask every time": "매번 물어보기",
13221340 "Sampling method": "샘플링 방법",
1341+ "Message Template": "메시지 템플릿",
13231342 "Karras (not all samplers supported)": "Karras(일부 샘플러는 지원되지 않음)",
13241343 "SMEA versions of samplers are modified to perform better at high resolution.": "샘플러의 SMEA 버전은 고해상도에서 더 나은 성능을 발휘하도록 수정되었습니다.",
13251344 "SMEA": "SMEA",
13261345 "DYN variants of SMEA samplers often lead to more varied output, but may fail at very high resolutions.": "SMEA 샘플러의 DYN 변형은 종종 더 다양한 출력으로 이어지지만 매우 높은 해상도에서는 실패할 수 있습니다.",
13271346 "DYN": "DYN",
13281347 "Scheduler": "스케줄러",
13291348 "Restore Faces": "얼굴 디테일 복원",
13301349 "Hires. Fix": "고용합니다.고해상도 고치다업스케일",
13311350 "Upscaler": "업스케일러",
13321351 "Upscale by": "고급화",
13331352 "Denoising strength": "노이즈 제거 강도",
@@ -1371,7 +1390,7 @@
13711390 "Import Characters": "캐릭터 가져오기",
13721391 "Enter the URL of the content to import": "가져올 콘텐츠의 URL을 입력하세요.",
13731392 "Supported sources:": "지원되는 소스:",
13741393 "char_import_1": "처브Chub 캐릭터 (다이렉트 링크 또는 ID)",
13751394 "char_import_example": "예:",
13761395 "char_import_2": "Chub Lorebook(직접 링크 또는 ID)",
13771396 "char_import_3": "JanitorAI 캐릭터(직접 링크 또는 UUID)",
@@ -1402,7 +1421,7 @@
14021421 "Make a Snapshot": "스냅샷 만들기",
14031422 "Restore this snapshot": "이 스냅샷 복원",
14041423 "Hi,": "안녕,",
14051424 "To enable multi-account features, restart the SillyTavern server with": "다중 계정 기능을 활성화하려면 SillyTavern 서버를 다시 시작하십시오시작하세요.",
14061425 "set to true in the config.yaml file.": "config.yaml 파일에서 true로 설정됩니다.",
14071426 "Account Info": "계정 정보",
14081427 "To change your user avatar, use the buttons below or select a default persona in the Persona Management menu.": "사용자 아바타를 변경하려면 아래 버튼을 사용하거나 페르소나 관리 메뉴에서 기본 페르소나를 선택하세요.",
@@ -1418,26 +1437,190 @@
14181437 "Download Backup": "백업 다운로드",
14191438 "Danger Zone": "위험지대",
14201439 "Reset your settings to factory defaults.": "설정을 공장 기본값으로 재설정하세요.",
14211440 "Reset Settings": "설정 재설정초기화",
14221441 "Wipe all user data and reset your account to factory settings.": "모든 사용자 데이터를 지우고 계정을 공장 설정으로 재설정하세요.",
14231442 "Reset Everything": "모든 것을 재설정",
14241443 "Reset Code:": "재설정 코드:",
14251444 "Want to update?": "업데이트 하시겠습니까?",
14261445 "How to start chatting?": "어떻게 채팅을 시작하는시작할 방법은수 있나요?",
14271446 "Click _space": "딸깍해당 하는아이콘을 소리클릭하세요.",
14281447 "and selectconnect ato an": "그리고 선택하십시오API를 해당 탭에서 연결하세요.",
1448+ "and select a": "그리고 선택하세요.",
14291449 "Chat API": "채팅 API",
14301450 "and pick a character.": "그리고 원하는 캐릭터를 선택하세요.",
14311451 "You can browse a list of bundled characters in the": "번들 캐릭터 목록을 검색할 수 있습니다.",
14321452 "Download Extensions & Assets": "확장 프로그램 및 자산에셋 다운로드",
1453+ "Character Expressions": "캐릭터 감정 표현들",
1454+ "ext_translate_title": "채팅 번역",
1455+ "ext_translate_auto_mode": "자동 번역 모드",
1456+ "ext_translate_mode_none": "없음",
1457+ "ext_translate_mode_responses": "응답 자동 번역",
1458+ "ext_translate_mode_inputs": "입력 자동 번역",
1459+ "ext_translate_mode_both": "응답과 입력 모두 번역",
1460+ "ext_translate_mode_provider": "번역 공급자",
1461+ "ext_translate_target_lang": "번역 도착 언어",
1462+ "ext_translate_clear": "번역 지우기",
1463+ "ext_sum_title": "채팅 요약",
1464+ "ext_sum_with": "요약에 사용될 API:",
1465+ "ext_sum_main_api": "메인 API",
1466+ "Vector Storage": "벡터 저장소",
14331467 "menu within": "내의 메뉴",
1468+ "Translate text to English before classification": "분류 전에 텍스트를 영어로 번역합니다.",
1469+ "Show default images (emojis) if sprite missing": "해당하는 스프라이트가 없으면 기본 이미지 (이모지들)을 표시합니다.",
1470+ "Image Type - talkinghead (extras)": "이미지 유형 - 토킹 헤드 (부가 사항)",
1471+ "Classifier API": "분류를 위한 API",
1472+ "Select the API for classifying expressions.": "감정 이미지들을 분류할 API를 선택하세요.",
1473+ "Local": "로컬",
1474+ "Extras": "외부",
1475+ "LLM": "대형 언어 모델(LLM)",
1476+ "LLM Prompt": "LLM 프롬프트",
1477+ "Will be used if the API doesn't support JSON schemas or function calling.": "API가 JSON 스키마나 함수 호출을 지원하지 않는 경우 사용됩니다.",
1478+ "Default / Fallback Expression": "기본 / 대체 감정들",
1479+ "Set the default and fallback expression being used when no matching expression is found.": "일치하는 표현이 없을 때 사용되는 기본 및 대체 표현을 설정합니다.",
1480+ "Custom Expressions": "커스텀 감정들",
1481+ "Can be set manually or with an _space": "수동으로 설정하거나 또는",
1482+ "space_ slash command.": "슬래시 명령어로 설정할 수 있습니다.",
1483+ "Open a chat to see the character expressions.": "캐릭터 감정을 보려면 채팅창을 열어주세요.",
1484+ "Sprite Folder Override": "스프라이트 폴더 덮어쓰기",
1485+ "Upload sprite pack (ZIP)": "스프라이트 압축팩 (ZIP) 업로드하기",
1486+ "Remove all image overrides": "모든 이미지 재정의 제거하기",
1487+ "Hint:": "힌트:",
1488+ "Create new folder in the _space": "사용자 데이터 경로에 있는",
1489+ "folder of your user data directory and name it as the name of the character.": "폴더에 새 폴더를 만들고 해당 폴더의 이름을 캐릭터의 이름으로 지정하세요.",
1490+ "Put images with expressions there. File names should follow the pattern:": "그리고 그곳에 표정이 담긴 이미지를 넣으세요. 파일 이름은 다음 패턴을 따라야 합니다:",
1491+ "Sprite set:": "스프라이트 세트:",
1492+ "sd_free_extend_txt": "무료 모드 프롬프트 확장",
14341493 "Confused or lost?": "혼란스러우시거나 길을 잃으셨나요?",
14351494 "click these icons!": "이 아이콘을 클릭하세요!",
14361495 "in the chat bar": "채팅 바에서",
14371496 "SillyTavern Documentation Site": "SillyTavern 공식 문서 사이트",
14381497 "Extras Installation Guide": "Extras 설치 안내서",
14391498 "Still have questions?": "아직 질문이 있으신가요?",
14401499 "Join the SillyTavern Discord": "SillyTavern Discord에디스코드에 참여하세요",
14411500 "Post a GitHub issue": "GitHub 이슈 게시",
14421501 "Contact the developers": "개발자에게 연락하기",
1502+ "enable_functions_desc_1": "다양한 확장 프로그램에서 추가 기능을 제공하기 위한",
1503+ "enable_functions_desc_2": "기능 도구",
1504+ "enable_functions_desc_3": "를 사용할 수 있게 합니다.",
1505+ "Injection position. Relative (to other prompts in prompt manager) or In-chat @ Depth.": "삽입 깊이. 상대적인 (프롬프트 관리 목록에 있는 다른 프롬프트들에 비해) 또는 @Depth 깊이에 따라.",
1506+ "Instruct Template": "지시 템플릿",
1507+ "System Message Sequences": "시스템 메시지 시퀀스",
1508+ "System Prompt Sequences": "시스템 프롬프트 시퀀스",
1509+ "First User Prefix": "첫 번째 유저 접두사",
1510+ "Last User Prefix": "마지막 유저 접두사",
1511+ "System Prefix": "시스템 메시지 접두사",
1512+ "System Suffix": "시스템 메시지 접미사",
1513+ "Assistant Message Sequences": "어시스턴트 메시지 시퀀스",
1514+ "Assistant Prefix": "어시스턴트 메시지 접두사",
1515+ "Assistant Suffix": "어시스턴트 메시지 접미사",
1516+ "User Message Sequences": "유저 메시지 시퀀스",
1517+ "User Prefix": "유저 메시지 접미사",
1518+ "User Suffix": "유저 메시지 접두사",
1519+ "Groups and Past Personas": "그룹과 과거 페르소나들",
1520+ "Never": "절대 추가하지 않음",
1521+ "Always": "항상 추가함",
1522+ "Separators as Stop Strings": "구분 기호를 정지 문자열로 사용하기",
1523+ "Names as Stop Strings": "캐릭터의 이름들을 정지 문자열로 사용하기",
1524+ "Allow Post-History Instructions": "Post-History 지침 허용",
1525+ "Image Captioning": "이미지 캡셔닝",
1526+ "Automatically caption images": "자동으로 이미지에 대한 설명 문장으로 나타내기",
1527+ "Edit captions before saving": "저장하기 전에 이미지에 대한 설명 문장 편집하기",
1528+ "Enable Quick Replies": "빠른 답장 활성화",
1529+ "Combine Quick Replies": "빠른 답장 결합하기",
1530+ "Show Popout Button": "팝아웃 버튼 표시 (데스크톱에서)",
1531+ "Global Quick Reply Sets": "글로벌 빠른 답장 세트들",
1532+ "Edit Quick Replies": "빠른 답변 편집하기",
1533+ "Disable send (insert into input field)": "보내기 비활성화 (입력 필드에 삽입)",
1534+ "Place quick reply before input": "인풋 전에 빠른 답변 위치하게 하기",
1535+ "Inject user input automatically": "사용자 인풋 자동으로 주입하기",
1536+ "(if disabled, use ": "비활성화된 경우,",
1537+ "macro for manual injection)": "매크로를 사용하여 수동으로 주입하세요.",
1538+ "Only apply color as accent": "색상은 오직 강조로써만 적용됩니다",
1539+ "qr--colorClear": "색상 지우기",
1540+ "Color": "색상",
1541+ "[title]world_button_title": "캐릭터 로어. 클릭하여 로드하세요. Shift를 클릭하면 '월드 인포 링크' 팝업이 열립니다.",
1542+ "Select TTS Provider": "TTS 공급자 선택",
1543+ "tts_enabled": "활성화",
1544+ "Narrate user messages": "사용자 메시지 나레이션",
1545+ "Auto Generation": "자동 생성",
1546+ "Requires auto generation to be enabled.": "자동 생성이 활성화 된 상태여야 합니다.",
1547+ "Narrate by paragraphs (when streaming)": "(스트리밍이 진행 중일 때) 단락 별로 설명하기",
1548+ "Only narrate quotes": "대사만 나레이션 하기",
1549+ "Ignore text, even quotes, inside asterisk": "대사나 별표에 관계없이 모든 텍스트를 무시하기",
1550+ "Narrate only the translated text": "오직 번역된 텍스트만 나레이션",
1551+ "Skip codeblocks": "코드 블럭 안의 내용 읽지 않기",
1552+ "Skip tagged blocks": "태그 안의 내용 읽지 않기",
1553+ "Pass Asterisks to TTS Engine": "TTS 엔진에 별표 전달하기",
1554+ "Audio Playback Speed": "음성 재생 속도",
1555+ "Vectorization Model": "벡터화 모델",
1556+ "Keep model in memory": "모델을 메모리에 유지하기",
1557+ "Hint: Set the URL in the API connection settings.": "힌트: API 연결 설정에서 URL을 설정하세요.",
1558+ "The server MUST be started with the --embedding flag to use this feature!": "이 기능을 사용하려면 서버를 --embedding 플래그와 함께 시작해야 합니다!",
1559+ "Click to set": "설정하려면 클릭하세요",
1560+ "Chunk boundary": "청크 바운더리",
1561+ "World Info settings": "월드인포 설정",
1562+ "Enable for World Info": "월드인포에 활성화",
1563+ "Vectorization Source": "벡터화 근원",
1564+ "File vectorization settings": "파일 벡터화 설정",
1565+ "Enable for files": "파일에 활성화",
1566+ "Chat vectorization settings": "채팅 벡터화 설정",
1567+ "Enabled for chat messages": "채팅 메시지에 활성화",
1568+ "Injection Position": "삽입 깊이",
1569+ "Chunk size (chars)": "청크 사이즈 (단위: 문자당)",
1570+ "Vector Summarization": "벡터 요약",
1571+ "Summarize chat messages for vector generation": "벡터 생성을 위한 채팅 메시지 요약하기",
1572+ "Warning: This will slow down vector generation drastically, as all messages have to be summarized first.": "경고: 모든 메시지를 먼저 요약해야 하므로 벡터 생성 속도가 크게 느려질 것입니다.",
1573+ "Summarize chat messages when sending": "채팅 메시지를 전송할 때 요약하기",
1574+ "Warning: This might cause your sent messages to take a bit to process and slow down response time.": "경고: 이로 인해 전송한 메시지가 처리되는 데 시간이 걸리고 응답 속도가 느려질 수 있습니다.",
1575+ "Summarize with:": "요약을 위해 사용:",
1576+ "Summary Prompt:": "요약 프롬프트",
1577+ "Only used when Main API or WebLLM Extension is selected.": "메인 API 또는 WebLLM 확장이 선택될 때만 사용됩니다.",
1578+ "Old messages are vectorized gradually as you chat. To process all previous messages, click the button below.": "이전 메시지는 채팅하는 동안 점진적으로 벡터화됩니다. 모든 이전 메시지를 처리하려면 아래 버튼을 클릭하세요.",
1579+ "Vectorize All": "전부 벡터화",
1580+ "Purge Vectors": "벡터 정리",
1581+ "View Stats": "상태 확인",
1582+ "Connection Profile": "연결 프로필",
1583+ "Prompt Content": "프롬프트 내용",
1584+ "Instruct Sequences": "지시 시퀀스",
1585+ "Prefer Character Card Instructions": "캐릭터 카드의 지시사항을 선호",
1586+ "[title]If checked and the character card contains a Post-History Instructions override, use that instead": "활성화 된 경우, 캐릭터 카드에 Post-History 지시 무시 항목이 포함되어 있으면, 카드 지시사항의 내용으로 대신 사용합니다.",
1587+ "Auto-select Input Text": "입력 텍스트 자동 선택",
1588+ "[title]Enable auto-select of input text in some text fields when clicking/selecting them. Applies to popup input textboxes, and possible other custom input fields.": "일부 텍스트 필드를 클릭하거나 선택할 때 자동으로 입력된 텍스트가 선택되도록 설정합니다. 팝업 입력창과 기타 커스텀 입력 필드에 적용됩니다.",
1589+ "Markdown Hotkeys": "마크다운 입력 단축키",
1590+ "[title]markdown_hotkeys_desc": "특정 텍스트 입력창에서 마크다운 형식 문자를 입력하기 위한 단축키를 활성화합니다. '/help hotkeys'를 참고하세요.",
1591+ "Show group chat queue": "그룹 채팅 대기열 표시",
1592+ "[title]In group chat, highlight the character(s) that are currently queued to generate responses and the order in which they will respond.": "그룹 채팅에서 응답을 생성하기 위해 현재 대기 중인 캐릭터와 응답할 순서를 강조 표시합니다.",
1593+ "Quick 'Impersonate' button": "빠른 '사칭' 버튼",
1594+ "[title]Show a button in the input area to ask the AI to impersonate your character for a single message": "입력 영역에 AI에게 한 메시지 동안 당신의 캐릭터 연기를 사칭하도록 요청하는 버튼을 표시합니다.",
1595+ "Injection Template": "삽입 템플릿",
1596+ "Query messages": "쿼리 메시지 수",
1597+ "Score threshold": "점수 임계값",
1598+ "ext_sum_include_wi_scan": "월드 인포를 요약 범위에 포함",
1599+ "(use _space": "이",
1600+ "macro)": "매크로를 사용하세요",
1601+ "Disable Send (Insert Into Input Field)": "전송 비활성화 (입력 필드에 삽입)",
1602+ "Place Quick Reply Before Input": "빠른 답변을 입력란 앞에 배치",
1603+ "Chat Message Visibility (by source)": "채팅 메시지 가시성 (근원별)",
1604+ "Uncheck to hide the extension's messages in chat prompts.": "체크를 해제하여 채팅 프롬프트에서 확장 프로그램의 메시지를 숨기세요.",
1605+ "Extensions Menu": "확장 메뉴",
1606+ "Slash Command": "슬래시 명령어",
1607+ "Interactive Mode": "인터랙티브 모드",
1608+ "Load a custom asset list or select": "커스텀 에셋 목록을 불러오거나",
1609+ "to install 3rd party extensions.": "를 선택하여 3rd 파티 확장 프로그램을 설치하세요.",
1610+ "Assets URL": "에셋 URL",
1611+ "Load an asset list": "에셋 목록을 불러옵니다.",
1612+ "ext_translate_btn_chat": "채팅 번역하기",
1613+ "ext_translate_btn_input": "입력 번역하기",
1614+ "Ask": "묻기",
1615+ "tag_import_none": "불러오지 않음",
1616+ "tag_import_all": "전부",
1617+ "Existing": "기존 태그 참조",
1618+ "You can add more": "원한다면",
1619+ "or_welcome": "또는",
1620+ "from other websites": "를 통해 다른 웹사이트들로부터 불러올 수 있습니다.",
1621+ "Go to the": "추가 기능 설치를 하려면",
1622+ "to install additional features.": "으로 가세요.",
1623+ "Master Import": "마스터 불러오기",
1624+ "Master Export": "마스터 내보내기",
1625+ "Chat Quick Reply Sets": "채팅 빠른 답장 세트들"
14431626}
14431626 \ No newline at end of file
public/script.js+33 -0
@@ -267,6 +267,7 @@ import { applyBrowserFixes } from './scripts/browser-fixes.js';
267267import { initServerHistory } from './scripts/server-history.js';
268268import { initSettingsSearch } from './scripts/setting-search.js';
269269import { initBulkEdit } from './scripts/bulk-edit.js';
270+import { deriveTemplatesFromChatTemplate } from './scripts/chat-templates.js';
270271
271272//exporting functions and vars for mods
272273export {
@@ -1235,6 +1236,38 @@ async function getStatusTextgen() {
12351236 const supportsTokenization = response.headers.get('x-supports-tokenization') === 'true';
12361237 supportsTokenization ? sessionStorage.setItem(TOKENIZER_SUPPORTED_KEY, 'true') : sessionStorage.removeItem(TOKENIZER_SUPPORTED_KEY);
12371238
1239+ const wantsInstructDerivation = (power_user.instruct.enabled && power_user.instruct.derived);
1240+ const wantsContextDerivation = power_user.context_derived;
1241+ const supportsChatTemplate = [textgen_types.KOBOLDCPP, textgen_types.LLAMACPP].includes(textgen_settings.type);
1242+ if (supportsChatTemplate && (wantsInstructDerivation || wantsContextDerivation)) {
1243+ const response = await fetch('/api/backends/text-completions/props', {
1244+ method: 'POST',
1245+ headers: getRequestHeaders(),
1246+ body: JSON.stringify({
1247+ api_server: endpoint,
1248+ api_type: textgen_settings.type,
1249+ }),
1250+ });
1251+
1252+ if (response.ok) {
1253+ const data = await response.json();
1254+ if (data) {
1255+ const { chat_template, chat_template_hash } = data;
1256+ console.log(`We have chat template ${chat_template.split('\n')[0]}...`);
1257+ const templates = await deriveTemplatesFromChatTemplate(chat_template, chat_template_hash);
1258+ if (templates) {
1259+ const { context, instruct } = templates;
1260+ if (wantsContextDerivation) {
1261+ selectContextPreset(context, { isAuto: true });
1262+ }
1263+ if (wantsInstructDerivation) {
1264+ selectInstructPreset(instruct, { isAuto: true });
1265+ }
1266+ }
1267+ }
1268+ }
1269+ }
1270+
12381271 // We didn't get a 200 status code, but the endpoint has an explanation. Which means it DID connect, but I digress.
12391272 if (online_status === 'no_connection' && data.response) {
12401273 toastr.error(data.response, t`API Error`, { timeOut: 5000, preventDuplicates: true });
public/scripts/authors-note.js+77 -18
@@ -37,12 +37,15 @@ const chara_note_position = {
3737};
3838
3939function setNoteTextCommand(_, text) {
40+ if (text) {
4041 $('#extension_floating_prompt').val(text).trigger('input');
4142 toastr.success(t`Author's Note text updated`);
42- return '';
43+ }
44+ return chat_metadata[metadata_keys.prompt];
4345}
4446
4547function setNoteDepthCommand(_, text) {
48+ if (text) {
4649 const value = Number(text);
4750
4851 if (Number.isNaN(value)) {
@@ -52,10 +55,12 @@ function setNoteDepthCommand(_, text) {
5255
5356 $('#extension_floating_depth').val(Math.abs(value)).trigger('input');
5457 toastr.success(t`Author's Note depth updated`);
55- return '';
58+ }
59+ return chat_metadata[metadata_keys.depth];
5660}
5761
5862function setNoteIntervalCommand(_, text) {
63+ if (text) {
5964 const value = Number(text);
6065
6166 if (Number.isNaN(value)) {
@@ -65,25 +70,52 @@ function setNoteIntervalCommand(_, text) {
6570
6671 $('#extension_floating_interval').val(Math.abs(value)).trigger('input');
6772 toastr.success(t`Author's Note frequency updated`);
68- return '';
73+ }
74+ return chat_metadata[metadata_keys.interval];
6975}
7076
7177function setNotePositionCommand(_, text) {
7278 const validPositions = {
79+ 'after': 0,
7380 'scenario': 0,
7481 'chat': 1,
82+ 'before_scenario': 2,
83+ 'before': 2,
7584 };
7685
77- const position = validPositions[text?.trim()];
86+ if (text) {
87+ const position = validPositions[text?.trim()?.toLowerCase()];
7888
79- if (Number.isNaN(position)) {
89+ if (typeof position === 'undefined') {
8090 toastr.error(t`Not a valid position`);
8191 return;
8292 }
8393
8494 $(`input[name="extension_floating_position"][value="${position}"]`).prop('checked', true).trigger('input');
8595 toastr.info(t`Author's Note position updated`);
86- return '';
96+ }
97+ return Object.keys(validPositions).find(key => validPositions[key] == chat_metadata[metadata_keys.position]);
98+}
99+
100+function setNoteRoleCommand(_, text) {
101+ const validRoles = {
102+ 'system': 0,
103+ 'user': 1,
104+ 'assistant': 2,
105+ };
106+
107+ if (text) {
108+ const role = validRoles[text?.trim()?.toLowerCase()];
109+
110+ if (typeof role === 'undefined') {
111+ toastr.error(t`Not a valid role`);
112+ return;
113+ }
114+
115+ $('#extension_floating_role').val(Math.abs(role)).trigger('input');
116+ toastr.info(t`Author's Note role updated`);
117+ }
118+ return Object.keys(validRoles).find(key => validRoles[key] == chat_metadata[metadata_keys.role]);
87119}
88120
89121function updateSettings() {
@@ -462,57 +494,84 @@ export function initAuthorsNote() {
462494 });
463495 $('#option_toggle_AN').on('click', onANMenuItemClick);
464496
465497 SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'note',
498+ name: 'note',
466499 callback: setNoteTextCommand,
500+ returns: 'current author\'s note',
467501 unnamedArgumentList: [
468502 new SlashCommandArgument(
469503 'text', [ARGUMENT_TYPE.STRING], truefalse,
470504 ),
471505 ],
472506 helpString: `
473507 <div>
474508 Sets an author's note for the currently selected chat if specified and returns the current note.
475509 </div>
476510 `,
477511 }));
478512 SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'depth',
513+ name: 'note-depth',
514+ aliases: ['depth'],
479515 callback: setNoteDepthCommand,
516+ returns: 'current author\'s note depth',
480517 unnamedArgumentList: [
481518 new SlashCommandArgument(
482519 'number', [ARGUMENT_TYPE.NUMBER], truefalse,
483520 ),
484521 ],
485522 helpString: `
486523 <div>
487524 Sets an author's note depth for in-chat positioning if specified and returns the current depth.
488525 </div>
489526 `,
490527 }));
491528 SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'freq',
529+ name: 'note-frequency',
530+ aliases: ['freq', 'note-freq'],
492531 callback: setNoteIntervalCommand,
532+ returns: 'current author\'s note insertion frequency',
493533 namedArgumentList: [],
494534 unnamedArgumentList: [
495535 new SlashCommandArgument(
496536 'number', [ARGUMENT_TYPE.NUMBER], truefalse,
497537 ),
498538 ],
499539 helpString: `
500540 <div>
501541 Sets an author's note insertion frequency if specified and returns the current frequency.
502542 </div>
503543 `,
504544 }));
505545 SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'pos',
546+ name: 'note-position',
506547 callback: setNotePositionCommand,
548+ aliases: ['pos', 'note-pos'],
549+ returns: 'current author\'s note insertion position',
550+ namedArgumentList: [],
551+ unnamedArgumentList: [
552+ new SlashCommandArgument(
553+ 'position', [ARGUMENT_TYPE.STRING], false, false, null, ['before', 'after', 'chat'],
554+ ),
555+ ],
556+ helpString: `
557+ <div>
558+ Sets an author's note position if specified and returns the current position.
559+ </div>
560+ `,
561+ }));
562+ SlashCommandParser.addCommandObject(SlashCommand.fromProps({
563+ name: 'note-role',
564+ callback: setNoteRoleCommand,
565+ returns: 'current author\'s note chat insertion role',
507566 namedArgumentList: [],
508567 unnamedArgumentList: [
509568 new SlashCommandArgument(
510569 'position', [ARGUMENT_TYPE.STRING], truefalse, false, null, ['chatsystem', 'scenariouser', 'assistant'],
511570 ),
512571 ],
513572 helpString: `
514573 <div>
515574 Sets an author's note positionchat insertion role if specified and returns the current role.
516575 </div>
517576 `,
518577 }));
public/scripts/char-data.js+1 -1
@@ -89,7 +89,7 @@
8989* @property {boolean} markdownOnly - Whether the script only applies to Markdown
9090* @property {boolean} promptOnly - Whether the script only applies to prompts
9191* @property {boolean} runOnEdit - Whether the script runs on edit
9292* @property {booleannumber} substituteRegex - Whether the regex should be substituted
9393* @property {number} minDepth - The minimum depth
9494* @property {number} maxDepth - The maximum depth
9595*/
public/scripts/chat-templates.js+81 -0
@@ -0,0 +1,81 @@
1+// the hash can be obtained from command line e.g. via: MODEL=path_to_model; python -c "import json, hashlib, sys; print(hashlib.sha256(json.load(open('"$MODEL"/tokenizer_config.json'))['chat_template'].encode()).hexdigest())"
2+// note that chat templates must be trimmed to match the llama.cpp metadata value
3+const hash_derivations = {
4+ // Meta
5+ 'e10ca381b1ccc5cf9db52e371f3b6651576caee0a630b452e2816b2d404d4b65':
6+ // Meta-Llama-3.1-8B-Instruct
7+ // Meta-Llama-3.1-70B-Instruct
8+ 'Llama 3 Instruct'
9+ ,
10+ '5816fce10444e03c2e9ee1ef8a4a1ea61ae7e69e438613f3b17b69d0426223a4':
11+ // Llama-3.2-1B-Instruct
12+ // Llama-3.2-3B-Instruct
13+ 'Llama 3 Instruct'
14+ ,
15+ '73e87b1667d87ab7d7b579107f01151b29ce7f3ccdd1018fdc397e78be76219d':
16+ // Nemotron 70B
17+ 'Llama 3 Instruct'
18+ ,
19+
20+ // Mistral
21+ // Mistral Reference: https://github.com/mistralai/mistral-common
22+ 'e16746b40344d6c5b5265988e0328a0bf7277be86f1c335156eae07e29c82826':
23+ // Mistral-Small-Instruct-2409
24+ // Mistral-Large-Instruct-2407
25+ 'Mistral V2 & V3'
26+ ,
27+ '3c4ad5fa60dd8c7ccdf82fa4225864c903e107728fcaf859fa6052cb80c92ee9':
28+ // Mistral-Large-Instruct-2411
29+ 'Mistral V7' // https://huggingface.co/mistralai/Mistral-Large-Instruct-2411
30+ ,
31+ 'e4676cb56dffea7782fd3e2b577cfaf1e123537e6ef49b3ec7caa6c095c62272':
32+ // Mistral-Nemo-Instruct-2407
33+ 'Mistral V3-Tekken'
34+ ,
35+ '26a59556925c987317ce5291811ba3b7f32ec4c647c400c6cc7e3a9993007ba7':
36+ // Mistral-7B-Instruct-v0.3
37+ 'Mistral V2 & V3'
38+ ,
39+
40+ // Gemma
41+ 'ecd6ae513fe103f0eb62e8ab5bfa8d0fe45c1074fa398b089c93a7e70c15cfd6':
42+ // gemma-2-9b-it
43+ // gemma-2-27b-it
44+ 'Gemma 2'
45+ ,
46+ '87fa45af6cdc3d6a9e4dd34a0a6848eceaa73a35dcfe976bd2946a5822a38bf3':
47+ // gemma-2-2b-it
48+ 'Gemma 2'
49+ ,
50+
51+ // Cohere
52+ '3b54f5c219ae1caa5c0bb2cdc7c001863ca6807cf888e4240e8739fa7eb9e02e':
53+ // command-r-08-2024
54+ 'Command R'
55+ ,
56+};
57+
58+const substr_derivations = {
59+ '<|im_start|>': 'ChatML', // qwen2.5, ...
60+};
61+
62+const parse_derivation = derivation => (typeof derivation === 'string') ? {
63+ 'context': derivation,
64+ 'instruct': derivation,
65+} : derivation;
66+
67+export async function deriveTemplatesFromChatTemplate(chat_template, hash) {
68+ if (hash in hash_derivations) {
69+ return parse_derivation(hash_derivations[hash]);
70+ }
71+
72+ // heuristics
73+ for (const [substr, derivation] of Object.entries(substr_derivations) ) {
74+ if (chat_template.includes(substr)) {
75+ return parse_derivation(derivation);
76+ }
77+ }
78+
79+ console.log(`Unknown chat template hash: ${hash} for [${chat_template}]`);
80+ return null;
81+}
public/scripts/extensions/caption/settings.html+1 -0
@@ -61,6 +61,7 @@
6161 <option data-type="google" value="gemini-1.5-flash-8b-exp-0827">gemini-1.5-flash-8b-exp-0827</option>
6262 <option data-type="google" value="gemini-1.5-flash-8b-exp-0924">gemini-1.5-flash-8b-exp-0924</option>
6363 <option data-type="google" value="gemini-exp-1114">gemini-exp-1114</option>
64+ <option data-type="google" value="gemini-exp-1121">gemini-exp-1121</option>
6465 <option data-type="google" value="gemini-1.5-pro">gemini-1.5-pro</option>
6566 <option data-type="google" value="gemini-1.5-pro-latest">gemini-1.5-pro-latest</option>
6667 <option data-type="google" value="gemini-1.5-pro-001">gemini-1.5-pro-001</option>
public/scripts/extensions/regex/editor.html+7 -3
@@ -121,12 +121,16 @@
121121 <input type="checkbox" name="run_on_edit" />
122122 <span data-i18n="Run On Edit">Run On Edit</span>
123123 </label>
124124 <label class="checkbox flex-container flexNoGap marginBot5" data-i18n="[title]ext_regex_substitute_regex_desc" title="Substitute &lcub;&lcub;macros&rcub;&rcub; in Find Regex before running it">
125- <input type="checkbox" name="substitute_regex" />
126125 <span>
127126 <spansmall data-i18n="SubstituteMacro in Find Regex">SubstituteMacros in Find Regex</spansmall>
128127 <span class="fa-solid fa-circle-question note-link-span"></span>
129128 </span>
129+ <select name="substitute_regex" class="text_pole textarea_compact margin0">
130+ <option value="0" data-i18n="Don't substitute">Don't substitute</option>
131+ <option value="1" data-i18n="Substitute (raw)">Substitute (raw)</option>
132+ <option value="2" data-i18n="Substitute (escaped)">Substitute (escaped)</option>
133+ </select>
130134 </label>
131135 <span>
132136 <small data-i18n="ext_regex_other_options" data-i18n="Ephemerality">Ephemerality</small>
public/scripts/extensions/regex/engine.js+20 -3
@@ -22,6 +22,12 @@ const regex_placement = {
2222 WORLD_INFO: 5,
2323};
2424
25+export const substitute_find_regex = {
26+ NONE: 0,
27+ RAW: 1,
28+ ESCAPED: 2,
29+};
30+
2531function sanitizeRegexMacro(x) {
2632 return (x && typeof x === 'string') ?
2733 x.replaceAll(/[\n\r\t\v\f\0.^$*+?{}[\]\\/|()]/gs, function (s) {
@@ -131,9 +137,20 @@ function runRegexScript(regexScript, rawString, { characterOverride } = {}) {
131137 return newString;
132138 }
133139
134140 const regexStringgetRegexString = regexScript.substituteRegex() => {
135- ? substituteParamsExtended(regexScript.findRegex, {}, sanitizeRegexMacro)
141+ switch(Number(regexScript.substituteRegex)) {
136- : regexScript.findRegex;
142+ case substitute_find_regex.NONE:
143+ return regexScript.findRegex;
144+ case substitute_find_regex.RAW:
145+ return substituteParamsExtended(regexScript.findRegex);
146+ case substitute_find_regex.ESCAPED:
147+ return substituteParamsExtended(regexScript.findRegex, {}, sanitizeRegexMacro);
148+ default:
149+ console.warn(`runRegexScript: Unknown substituteRegex value ${regexScript.substituteRegex}. Using raw regex.`);
150+ return regexScript.findRegex;
151+ }
152+ };
153+ const regexString = getRegexString();
137154 const findRegex = regexFromString(regexString);
138155
139156 // The user skill issued. Return with nothing.
public/scripts/extensions/regex/index.js+4 -4
@@ -8,7 +8,7 @@ import { enumIcons } from '../../slash-commands/SlashCommandCommonEnumsProvider.
88import { SlashCommandEnumValue, enumTypes } from '../../slash-commands/SlashCommandEnumValue.js';
99import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js';
1010import { download, getFileText, getSortableDelay, uuidv4 } from '../../utils.js';
1111import { regex_placement, runRegexScript, substitute_find_regex } from './engine.js';
1212import { t } from '../../i18n.js';
1313
1414/**
@@ -227,7 +227,7 @@ async function onRegexEditorOpenClick(existingId, isScoped) {
227227 editorHtml.find('input[name="only_format_display"]').prop('checked', existingScript.markdownOnly ?? false);
228228 editorHtml.find('input[name="only_format_prompt"]').prop('checked', existingScript.promptOnly ?? false);
229229 editorHtml.find('input[name="run_on_edit"]').prop('checked', existingScript.runOnEdit ?? false);
230230 editorHtml.find('inputselect[name="substitute_regex"]').propval('checked', existingScript.substituteRegex ?? falsesubstitute_find_regex.NONE);
231231 editorHtml.find('input[name="min_depth"]').val(existingScript.minDepth ?? '');
232232 editorHtml.find('input[name="max_depth"]').val(existingScript.maxDepth ?? '');
233233
@@ -267,7 +267,7 @@ async function onRegexEditorOpenClick(existingId, isScoped) {
267267 findRegex: editorHtml.find('.find_regex').val(),
268268 replaceString: editorHtml.find('.regex_replace_string').val(),
269269 trimStrings: String(editorHtml.find('.regex_trim_strings').val()).split('\n').filter((e) => e.length !== 0) || [],
270270 substituteRegex: Number(editorHtml.find('inputselect[name="substitute_regex"]').propval('checked')),
271271 };
272272 const rawTestString = String(editorHtml.find('#regex_test_input').val());
273273 const result = runRegexScript(testScript, rawTestString);
@@ -295,7 +295,7 @@ async function onRegexEditorOpenClick(existingId, isScoped) {
295295 markdownOnly: editorHtml.find('input[name="only_format_display"]').prop('checked'),
296296 promptOnly: editorHtml.find('input[name="only_format_prompt"]').prop('checked'),
297297 runOnEdit: editorHtml.find('input[name="run_on_edit"]').prop('checked'),
298298 substituteRegex: Number(editorHtml.find('inputselect[name="substitute_regex"]').propval('checked')),
299299 minDepth: parseInt(String(editorHtml.find('input[name="min_depth"]').val())),
300300 maxDepth: parseInt(String(editorHtml.find('input[name="max_depth"]').val())),
301301 };
public/scripts/extensions/stable-diffusion/index.js+79 -68
@@ -1,37 +1,62 @@
11import { Popper } from '../../../lib.js';
22import {
33 saveSettingsDebouncedanimation_duration,
44 systemUserNameappendMediaToMessage,
5- getRequestHeaders,
65 event_types,
76 eventSource,
7+ formatCharacterAvatar,
88 generateQuietPrompt,
99 this_chidgetCharacterAvatar,
1010 getCurrentChatId,
1111 animation_durationgetRequestHeaders,
12- appendMediaToMessage,
1312 getUserAvatar,
1413 user_avatarsaveSettingsDebounced,
15- getCharacterAvatar,
16- formatCharacterAvatar,
1714 substituteParams,
1815 substituteParamsExtended,
16+ systemUserName,
17+ this_chid,
18+ user_avatar,
1919} from '../../../script.js';
20-import { getApiUrl, getContext, extension_settings, doExtrasFetch, modules, renderExtensionTemplateAsync, writeExtensionField } from '../../extensions.js';
20+import {
21+ doExtrasFetch,
22+ extension_settings,
23+ getApiUrl,
24+ getContext,
25+ modules,
26+ renderExtensionTemplateAsync,
27+ writeExtensionField,
28+} from '../../extensions.js';
2129import { selected_group } from '../../group-chats.js';
22-import { stringFormat, initScrollHeight, resetScrollHeight, getCharaFilename, saveBase64AsFile, getBase64Async, delay, isTrueBoolean, debounce, isFalseBoolean, deepMerge } from '../../utils.js';
30+import {
31+ debounce,
32+ deepMerge,
33+ delay,
34+ getBase64Async,
35+ getCharaFilename,
36+ initScrollHeight,
37+ isFalseBoolean,
38+ isTrueBoolean,
39+ resetScrollHeight,
40+ saveBase64AsFile,
41+ stringFormat,
42+} from '../../utils.js';
2343import { getMessageTimeStamp, humanizedDateTime } from '../../RossAscends-mods.js';
2444import { SECRET_KEYS, secret_state, writeSecret } from '../../secrets.js';
2545import { getNovelUnlimitedImageGenerationgetNovelAnlas, getNovelAnlasgetNovelUnlimitedImageGeneration, loadNovelSubscriptionData } from '../../nai-settings.js';
2646import { getMultimodalCaption } from '../shared.js';
2747import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js';
2848import { SlashCommand } from '../../slash-commands/SlashCommand.js';
29-import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../slash-commands/SlashCommandArgument.js';
49+import {
50+ ARGUMENT_TYPE,
51+ SlashCommandArgument,
52+ SlashCommandNamedArgument,
53+} from '../../slash-commands/SlashCommandArgument.js';
3054import { debounce_timeout } from '../../constants.js';
3155import { SlashCommandEnumValue } from '../../slash-commands/SlashCommandEnumValue.js';
3256import { POPUP_RESULTcallGenericPopup, POPUP_TYPEPopup, PopupPOPUP_RESULT, callGenericPopupPOPUP_TYPE } from '../../popup.js';
3357import { commonEnumProviders } from '../../slash-commands/SlashCommandCommonEnumsProvider.js';
3458import { ToolManager } from '../../tool-calling.js';
59+
3560export { MODULE_NAME };
3661
3762const MODULE_NAME = 'sd';
@@ -118,13 +143,13 @@ const triggerWords = {
118143};
119144
120145const messageTrigger = {
121146 activationRegex: /\b(send|mail|imagine|generate|make|create|draw|paint|render|show)\b.{0,10}\b(pic|picture|image|drawing|painting|photo|photograph)\b(?:\s+of)?(?:\s+(?:a|an|the|this|that|those|your)?\s+)?(.+)/i,
122147 specialCases: {
123148 [generationMode.CHARACTER]: ['you', 'yourself'],
124149 [generationMode.USER]: ['me', 'myself'],
125150 [generationMode.SCENARIO]: ['story', 'scenario', 'whole story'],
126151 [generationMode.NOW]: ['last message'],
127152 [generationMode.FACE]: ['your face', 'your portrait', 'your selfie'],
128153 [generationMode.BACKGROUND]: ['background', 'scene background', 'scene', 'scenery', 'surroundings', 'environment'],
129154 },
130155};
@@ -343,7 +368,7 @@ function processTriggers(chat, _, abort) {
343368 return;
344369 }
345370
346371 console.log(`SD: Triggered by "${message}", detected subject: "${subject}"`);
347372
348373 outer: for (const [specialMode, triggers] of Object.entries(messageTrigger.specialCases)) {
349374 for (const trigger of triggers) {
@@ -359,7 +384,6 @@ function processTriggers(chat, _, abort) {
359384 setTimeout(() => generatePicture(initiators.interactive, {}, subject, message), 1);
360385 } catch {
361386 console.log('SD: Failed to process triggers.');
362- return;
363387 }
364388}
365389
@@ -685,7 +709,7 @@ async function refinePrompt(prompt, isNegative) {
685709 return prompt;
686710}
687711
688712async function onChatChanged() {
689713 if (this_chid === undefined || selected_group) {
690714 $('#sd_character_prompt_block').hide();
691715 return;
@@ -713,7 +737,7 @@ function onChatChanged() {
713737 $('#sd_character_prompt').val(characterPrompt);
714738 $('#sd_character_negative_prompt').val(negativePrompt);
715739 $('#sd_character_prompt_share').prop('checked', hasSharedData);
716740 await adjustElementScrollHeight();
717741}
718742
719743async function adjustElementScrollHeight() {
@@ -1285,8 +1309,7 @@ async function getAutoRemoteModel() {
12851309 throw new Error('SD WebUI returned an error.');
12861310 }
12871311
12881312 const data =return await result.text();
1289- return data;
12901313 } catch (error) {
12911314 console.error(error);
12921315 return null;
@@ -1305,9 +1328,7 @@ async function getDrawthingsRemoteModel() {
13051328 throw new Error('SD DrawThings API returned an error.');
13061329 }
13071330
13081331 const data =return await result.text();
1309-
1310- return data;
13111332 } catch (error) {
13121333 console.error(error);
13131334 return null;
@@ -1330,8 +1351,7 @@ async function getAutoRemoteUpscalers() {
13301351 throw new Error('SD WebUI returned an error.');
13311352 }
13321353
13331354 const data =return await result.json();
1334- return data;
13351355 } catch (error) {
13361356 console.error(error);
13371357 return [extension_settings.sd.hr_upscaler];
@@ -1350,8 +1370,7 @@ async function getAutoRemoteSchedulers() {
13501370 throw new Error('SD WebUI returned an error.');
13511371 }
13521372
13531373 const data =return await result.json();
1354- return data;
13551374 } catch (error) {
13561375 console.error(error);
13571376 return ['N/A'];
@@ -1370,8 +1389,7 @@ async function getVladRemoteUpscalers() {
13701389 throw new Error('SD.Next returned an error.');
13711390 }
13721391
13731392 const data =return await result.json();
1374- return data;
13751393 } catch (error) {
13761394 console.error(error);
13771395 return [extension_settings.sd.hr_upscaler];
@@ -1504,8 +1522,7 @@ async function loadHordeSamplers() {
15041522 });
15051523
15061524 if (result.ok) {
15071525 const data =return await result.json();
1508- return data;
15091526 }
15101527
15111528 return [];
@@ -1544,8 +1561,7 @@ async function loadAutoSamplers() {
15441561 throw new Error('SD WebUI returned an error.');
15451562 }
15461563
15471564 const data =return await result.json();
1548- return data;
15491565 } catch (error) {
15501566 return [];
15511567 }
@@ -1583,8 +1599,7 @@ async function loadVladSamplers() {
15831599 throw new Error('SD.Next returned an error.');
15841600 }
15851601
15861602 const data =return await result.json();
1587- return data;
15881603 } catch (error) {
15891604 return [];
15901605 }
@@ -1723,8 +1738,7 @@ async function loadPollinationsModels() {
17231738 });
17241739
17251740 if (result.ok) {
17261741 const data =return await result.json();
1727- return data;
17281742 }
17291743
17301744 return [];
@@ -1742,8 +1756,7 @@ async function loadTogetherAIModels() {
17421756 });
17431757
17441758 if (result.ok) {
17451759 const data =return await result.json();
1746- return data;
17471760 }
17481761
17491762 return [];
@@ -1781,8 +1794,7 @@ async function loadNanoGPTModels() {
17811794 });
17821795
17831796 if (result.ok) {
17841797 const data =return await result.json();
1785- return data;
17861798 }
17871799
17881800 return [];
@@ -1798,8 +1810,10 @@ async function loadHordeModels() {
17981810 if (result.ok) {
17991811 const data = await result.json();
18001812 data.sort((a, b) => b.count - a.count);
1801- const models = data.map(x => ({ value: x.name, text: `${x.name} (ETA: ${x.eta}s, Queue: ${x.queued}, Workers: ${x.count})` }));
1813+ return data.map(x => ({
1802- return models;
1814+ value: x.name,
1815+ text: `${x.name} (ETA: ${x.eta}s, Queue: ${x.queued}, Workers: ${x.count})`,
1816+ }));
18031817 }
18041818
18051819 return [];
@@ -1824,8 +1838,7 @@ async function loadExtrasModels() {
18241838
18251839 if (getModelsResult.ok) {
18261840 const data = await getModelsResult.json();
18271841 const view_models =return data.models.map(x => ({ value: x, text: x }));
1828- return view_models;
18291842 }
18301843
18311844 return [];
@@ -1867,8 +1880,7 @@ async function loadAutoModels() {
18671880 }
18681881 }
18691882
18701883 const data =return await result.json();
1871- return data;
18721884 } catch (error) {
18731885 return [];
18741886 }
@@ -1953,8 +1965,7 @@ async function loadVladModels() {
19531965 }
19541966 }
19551967
19561968 const data =return await result.json();
1957- return data;
19581969 } catch (error) {
19591970 return [];
19601971 }
@@ -2242,7 +2253,7 @@ async function loadComfyWorkflows() {
22422253 $('#sd_comfy_workflow').append(option);
22432254 }
22442255 } catch (error) {
2245- return;
2256+ console.error(`Could not load ComfyUI workflows: ${error.message}`);
22462257 }
22472258}
22482259
@@ -2361,7 +2372,7 @@ function ensureSelectionExists(setting, selector) {
23612372 * @param {string} trigger Subject trigger word
23622373 * @param {string} [message] Chat message
23632374 * @param {function} [callback] Callback function
23642375 * @returns {Promise<string|undefined>} Image path
23652376 * @throws {Error} If the prompt or image generation fails
23662377 */
23672378async function generatePicture(initiator, args, trigger, message, callback) {
@@ -2380,7 +2391,9 @@ async function generatePicture(initiator, args, trigger, message, callback) {
23802391
23812392 trigger = trigger.trim();
23822393 const generationType = getGenerationType(trigger);
2383- console.log('Image generation mode', generationType, 'triggered with', trigger);
2394+ const generationTypeKey = Object.keys(generationMode).find(key => generationMode[key] === generationType);
2395+ console.log(`Image generation mode ${generationTypeKey} triggered with "${trigger}"`);
2396+
23842397 const quietPrompt = getQuietPrompt(generationType, trigger);
23852398 const context = getContext();
23862399
@@ -2392,7 +2405,7 @@ async function generatePicture(initiator, args, trigger, message, callback) {
23922405 const callbackOriginal = callback;
23932406 callback = async function (prompt, imagePath, generationType, _negativePromptPrefix, _initiator, prefixedPrompt) {
23942407 const imgUrl = `url("${encodeURI(imagePath)}")`;
23952408 await eventSource.emit(event_types.FORCE_SET_BACKGROUND, { url: imgUrl, path: imagePath });
23962409
23972410 if (typeof callbackOriginal === 'function') {
23982411 await callbackOriginal(prompt, imagePath, generationType, negativePromptPrefix, initiator, prefixedPrompt);
@@ -2454,12 +2467,12 @@ function setTypeSpecificDimensions(generationType) {
24542467 const aspectRatio = extension_settings.sd.width / extension_settings.sd.height;
24552468
24562469 // Face images are always portrait (pun intended)
24572470 if ((generationType === generationMode.FACE || generationType === generationMode.FACE_MULTIMODAL) && aspectRatio >= 1) {
24582471 // Round to nearest multiple of 64
24592472 extension_settings.sd.height = Math.round(extension_settings.sd.width * 1.5 / 64) * 64;
24602473 }
24612474
24622475 if (generationType === generationMode.BACKGROUND) {
24632476 // Background images are always landscape
24642477 if (aspectRatio <= 1) {
24652478 // Round to nearest multiple of 64
@@ -2545,7 +2558,7 @@ async function getPrompt(generationType, message, trigger, quietPrompt, combineN
25452558 */
25462559function generateFreeModePrompt(trigger, combineNegatives) {
25472560 return trigger
25482561 .replace(/(?:^char(\s|,)|\{\{charPrefix\}\})/gi, (_, suffix) => {
25492562 const getLastCharacterKey = () => {
25502563 if (typeof this_chid !== 'undefined') {
25512564 return getCharaFilename(this_chid);
@@ -2553,9 +2566,7 @@ function generateFreeModePrompt(trigger, combineNegatives) {
25532566 const context = getContext();
25542567 for (let i = context.chat.length - 1; i >= 0; i--) {
25552568 const message = context.chat[i];
25562569 if (!message.is_user ||&& !message.is_system && typeof message.original_avatar === 'string') {
2557- continue;
2558- } else if (typeof message.original_avatar === 'string') {
25592570 return message.original_avatar.replace(/\.[^/.]+$/, '');
25602571 }
25612572 }
@@ -2578,11 +2589,11 @@ function generateFreeModePrompt(trigger, combineNegatives) {
25782589async function generateMultimodalPrompt(generationType, quietPrompt) {
25792590 let avatarUrl;
25802591
25812592 if (generationType === generationMode.USER_MULTIMODAL) {
25822593 avatarUrl = getUserAvatarUrl();
25832594 }
25842595
25852596 if (generationType === generationMode.CHARACTER_MULTIMODAL || generationType === generationMode.FACE_MULTIMODAL) {
25862597 avatarUrl = getCharacterAvatarUrl();
25872598 }
25882599
@@ -3190,8 +3201,8 @@ function getNovelParams() {
31903201 const ratio = Math.sqrt(MAX_PIXELS / (width * height));
31913202
31923203 // Calculate new width and height while maintaining aspect ratio.
31933204 varlet newWidth = Math.round(width * ratio);
31943205 varlet newHeight = Math.round(height * ratio);
31953206
31963207 // Ensure new dimensions are multiples of 64. If not, reduce accordingly.
31973208 if (newWidth % 64 !== 0) {
@@ -3487,9 +3498,9 @@ async function onComfyOpenWorkflowEditorClick() {
34873498 const popupResult = popup.show();
34883499 const checkPlaceholders = () => {
34893500 workflow = $('#sd_comfy_workflow_editor_workflow').val().toString();
34903501 $('.sd_comfy_workflow_editor_placeholder_list > li[data-placeholder]').each(function (idx) {
34913502 const key = this.getAttribute('data-placeholder');
34923503 const found = workflow.search(`"%${key}%"`) !== -1;
34933504 this.classList[found ? 'remove' : 'add']('sd_comfy_workflow_editor_not_found');
34943505 });
34953506 };
@@ -3849,7 +3860,7 @@ async function sdMessageButton(e) {
38493860 swipes.push(image);
38503861
38513862 // If already contains an image and it's not inline - leave it as is
38523863 message.extra.inline_image = !(message.extra.image && !message.extra.inline_image ? false : true);
38533864 message.extra.image = image;
38543865 message.extra.title = prompt;
38553866 message.extra.generationType = generationType;
public/scripts/extensions/tts/settings.html+13 -13
@@ -7,7 +7,7 @@
77 <div class="inline-drawer-content">
88 <div id="tts_status">
99 </div>
1010 <span data-i18n="Select TTS Provider">Select TTS Provider</span> </br>
1111 <div class="tts_block">
1212 <select id="tts_provider" class="flex1">
1313 </select>
@@ -16,49 +16,49 @@
1616 <div>
1717 <label class="checkbox_label" for="tts_enabled">
1818 <input type="checkbox" id="tts_enabled" name="tts_enabled">
1919 <small data-i18n="tts_enabled">Enabled</small>
2020 </label>
2121 <label class="checkbox_label" for="tts_narrate_user">
2222 <input type="checkbox" id="tts_narrate_user">
2323 <small data-i18n="Narrate user messages">Narrate user messages</small>
2424 </label>
2525 <label class="checkbox_label" for="tts_auto_generation">
2626 <input type="checkbox" id="tts_auto_generation">
2727 <small data-i18n="Auto Generation">Auto Generation</small>
2828 </label>
2929 <label class="checkbox_label" for="tts_periodic_auto_generation" data-i18n="[title]Requires auto generation to be enabled." title="Requires auto generation to be enabled.">
3030 <input type="checkbox" id="tts_periodic_auto_generation">
3131 <small data-i18n="Narrate by paragraphs (when streaming)">Narrate by paragraphs (when streaming)</small>
3232 </label>
3333 <label class="checkbox_label" for="tts_narrate_quoted">
3434 <input type="checkbox" id="tts_narrate_quoted">
3535 <small data-i18n="Only narrate quotes">Only narrate "quotes"</small>
3636 </label>
3737 <label class="checkbox_label" for="tts_narrate_dialogues">
3838 <input type="checkbox" id="tts_narrate_dialogues">
3939 <small data-i18n="Ignore text, even quotes, inside asterisk">Ignore *text, even "quotes", inside asterisks*</small>
4040 </label>
4141 <label class="checkbox_label" for="tts_narrate_translated_only">
4242 <input type="checkbox" id="tts_narrate_translated_only">
4343 <small data-i18n="Narrate only the translated text">Narrate only the translated text</small>
4444 </label>
4545 <label class="checkbox_label" for="tts_skip_codeblocks">
4646 <input type="checkbox" id="tts_skip_codeblocks">
4747 <small data-i18n="Skip codeblocks">Skip codeblocks</small>
4848 </label>
4949 <label class="checkbox_label" for="tts_skip_tags">
5050 <input type="checkbox" id="tts_skip_tags">
5151 <small data-i18n="Skip tagged blocks">Skip &lt;tagged&gt; blocks</small>
5252 </label>
5353 <label class="checkbox_label" for="tts_pass_asterisks">
5454 <input type="checkbox" id="tts_pass_asterisks">
5555 <small data-i18n="Pass Asterisks to TTS Engine">Pass Asterisks to TTS Engine</small>
5656 </label>
5757 </div>
5858 <div id="playback_rate_block" class="range-block">
5959 <hr>
6060 <div class="range-block-title justifyLeft" data-i18n="Audio Playback Speed">
6161 <small data-i18n="Audio Playback Speed">Audio Playback Speed</small>
6262 </div>
6363 <div class="range-block-range-and-counter">
6464 <div class="range-block-range">
public/scripts/instruct-mode.js+18 -0
@@ -39,6 +39,7 @@ const controls = [
3939 { id: 'instruct_first_input_sequence', property: 'first_input_sequence', isCheckbox: false },
4040 { id: 'instruct_last_input_sequence', property: 'last_input_sequence', isCheckbox: false },
4141 { id: 'instruct_activation_regex', property: 'activation_regex', isCheckbox: false },
42+ { id: 'instruct_derived', property: 'derived', isCheckbox: true },
4243 { id: 'instruct_bind_to_context', property: 'bind_to_context', isCheckbox: true },
4344 { id: 'instruct_skip_examples', property: 'skip_examples', isCheckbox: true },
4445 { id: 'instruct_names_behavior', property: 'names_behavior', isCheckbox: false },
@@ -100,6 +101,7 @@ export async function loadInstructMode(data) {
100101
101102 $('#instruct_enabled').parent().find('i').toggleClass('toggleEnabled', !!power_user.instruct.enabled);
102103 $('#instructSettingsBlock, #InstructSequencesColumn').toggleClass('disabled', !power_user.instruct.enabled);
104+ $('#instruct_derived').parent().find('i').toggleClass('toggleEnabled', !!power_user.instruct.derived);
103105 $('#instruct_bind_to_context').parent().find('i').toggleClass('toggleEnabled', !!power_user.instruct.bind_to_context);
104106
105107 controls.forEach(control => {
@@ -146,6 +148,12 @@ export async function loadInstructMode(data) {
146148 * @param {boolean} [options.isAuto=false] Is auto-select.
147149 */
148150export function selectContextPreset(preset, { quiet = false, isAuto = false } = {}) {
151+ const presetExists = context_presets.some(x => x.name === preset);
152+ if (!presetExists) {
153+ console.warn(`Context template "${preset}" not found`);
154+ return;
155+ }
156+
149157 // If context template is not already selected, select it
150158 if (preset !== power_user.context.preset) {
151159 $('#context_presets').val(preset).trigger('change');
@@ -163,6 +171,12 @@ export function selectContextPreset(preset, { quiet = false, isAuto = false } =
163171 * @param {boolean} [options.isAuto=false] Is auto-select.
164172 */
165173export function selectInstructPreset(preset, { quiet = false, isAuto = false } = {}) {
174+ const presetExists = instruct_presets.some(x => x.name === preset);
175+ if (!presetExists) {
176+ console.warn(`Instruct template "${preset}" not found`);
177+ return;
178+ }
179+
166180 // If instruct preset is not already selected, select it
167181 if (preset !== power_user.instruct.preset) {
168182 $('#instruct_presets').val(preset).trigger('change');
@@ -715,6 +729,10 @@ jQuery(() => {
715729 }
716730 });
717731
732+ $('#instruct_derived').on('change', function () {
733+ $('#instruct_derived').parent().find('i').toggleClass('toggleEnabled', !!power_user.instruct.derived);
734+ });
735+
718736 $('#instruct_bind_to_context').on('change', function () {
719737 $('#instruct_bind_to_context').parent().find('i').toggleClass('toggleEnabled', !!power_user.instruct.bind_to_context);
720738 });
public/scripts/logprobs.js+2 -2
@@ -519,14 +519,14 @@ function convertTokenIdLogprobsToText(input) {
519519
520520 const tokenizerId = getTokenizerBestMatch(api);
521521
522522 //** @type {any[]} Flatten unique token IDs across all logprobs */
523523 const tokenIds = Array.from(new Set(input.flatMap(logprobs =>
524524 logprobs.topLogprobs.map(([token]) => token).concat(logprobs.token),
525525 )));
526526
527527 // Submit token IDs to tokenizer to get token text, then build ID->text map
528528 // noinspection JSCheckFunctionSignatures - mutates input in-place
529529 const { chunks } = decodeTextTokens(tokenizerId, tokenIds.map(parseInt));
530530 const tokenIdText = new Map(tokenIds.map((id, i) => [id, chunks[i]]));
531531
532532 // Fixup logprobs data with token text
public/scripts/openai.js+6 -4
@@ -752,7 +752,8 @@ async function populateChatHistory(messages, prompts, chatCompletion, type = nul
752752 if (type === 'continue' && oai_settings.continue_prefill && chatPrompt === firstNonInjected) {
753753 // in case we are using continue_prefill and the latest message is an assistant message, we want to prepend the users assistant prefill on the message
754754 if (chatPrompt.role === 'assistant') {
755- const continueMessage = await Message.createAsync(chatMessage.role, substituteParams(oai_settings.assistant_prefill + '\n\n') + chatMessage.content, chatMessage.identifier);
755+ const messageContent = [substituteParams(oai_settings.assistant_prefill), chatMessage.content].filter(x => x).join('\n\n');
756+ const continueMessage = await Message.createAsync(chatMessage.role, messageContent, chatMessage.identifier);
756757 const collection = new MessageCollection('continuePrefill', continueMessage);
757758 chatCompletion.add(collection, -1);
758759 continue;
@@ -4083,7 +4084,7 @@ async function onModelChange() {
40834084 if (oai_settings.chat_completion_source == chat_completion_sources.MAKERSUITE) {
40844085 if (oai_settings.max_context_unlocked) {
40854086 $('#openai_max_context').attr('max', max_2mil);
40864087 } else if (value.includes('gemini-exp-1114') || value.includes('gemini-exp-1121')) {
40874088 $('#openai_max_context').attr('max', max_32k);
40884089 } else if (value.includes('gemini-1.5-pro')) {
40894090 $('#openai_max_context').attr('max', max_2mil);
@@ -4223,10 +4224,10 @@ async function onModelChange() {
42234224 else if (['command-light-nightly', 'command-nightly'].includes(oai_settings.cohere_model)) {
42244225 $('#openai_max_context').attr('max', max_8k);
42254226 }
42264227 else if (oai_settings.cohere_model.includes('command-r') || ['c4ai-aya-expanse-32b'].includes(oai_settings.cohere_model)) {
42274228 $('#openai_max_context').attr('max', max_128k);
42284229 }
42294230 else if (['c4ai-aya-23', 'c4ai-aya-expanse-8b'].includes(oai_settings.cohere_model)) {
42304231 $('#openai_max_context').attr('max', max_8k);
42314232 }
42324233 else {
@@ -4772,6 +4773,7 @@ export function isImageInliningSupported() {
47724773 'gemini-1.5-flash-8b-exp-0827',
47734774 'gemini-1.5-flash-8b-exp-0924',
47744775 'gemini-exp-1114',
4776+ 'gemini-exp-1121',
47754777 'gemini-1.0-pro-vision-latest',
47764778 'gemini-1.5-pro',
47774779 'gemini-1.5-pro-latest',
public/scripts/power-user.js+14 -0
@@ -226,6 +226,7 @@ let power_user = {
226226 macro: true,
227227 names_behavior: names_behavior_types.FORCE,
228228 activation_regex: '',
229+ derived: false,
229230 bind_to_context: false,
230231 user_alignment_message: '',
231232 system_same_as_user: false,
@@ -243,6 +244,8 @@ let power_user = {
243244 names_as_stop_strings: true,
244245 },
245246
247+ context_derived: false,
248+
246249 sysprompt: {
247250 enabled: true,
248251 name: 'Neutral - Chat',
@@ -1472,6 +1475,7 @@ async function loadPowerUserSettings(settings, data) {
14721475 $('#encode_tags').prop('checked', power_user.encode_tags);
14731476 $('#example_messages_behavior').val(getExampleMessagesBehavior());
14741477 $(`#example_messages_behavior option[value="${getExampleMessagesBehavior()}"]`).prop('selected', true);
1478+ $('#context_derived').parent().find('i').toggleClass('toggleEnabled', !!power_user.context_derived);
14751479
14761480 $('#console_log_prompts').prop('checked', power_user.console_log_prompts);
14771481 $('#request_token_probabilities').prop('checked', power_user.request_token_probabilities);
@@ -3057,6 +3061,16 @@ $(document).ready(() => {
30573061 saveSettingsDebounced();
30583062 });
30593063
3064+ $('#context_derived').on('input', function () {
3065+ const value = !!$(this).prop('checked');
3066+ power_user.context_derived = value;
3067+ saveSettingsDebounced();
3068+ });
3069+
3070+ $('#context_derived').on('change', function () {
3071+ $('#context_derived').parent().find('i').toggleClass('toggleEnabled', !!power_user.context_derived);
3072+ });
3073+
30603074 $('#always-force-name2-checkbox').change(function () {
30613075 power_user.always_force_name2 = !!$(this).prop('checked');
30623076 saveSettingsDebounced();
public/scripts/preset-manager.js+1 -0
@@ -584,6 +584,7 @@ class PresetManager {
584584 'openrouter_providers',
585585 'openrouter_allow_fallbacks',
586586 'tabby_model',
587+ 'derived',
587588 ];
588589 const settings = Object.assign({}, getSettingsByApiId(this.apiId));
589590
public/scripts/slash-commands.js+24 -0
@@ -1827,6 +1827,30 @@ export function initDefaultSlashCommands() {
18271827 </div>
18281828 `,
18291829 }));
1830+ SlashCommandParser.addCommandObject(SlashCommand.fromProps({
1831+ name: 'upper',
1832+ aliases: ['uppercase', 'to-upper'],
1833+ callback: (_, text) => typeof text === 'string' ? text.toUpperCase() : '',
1834+ returns: 'uppercase string',
1835+ unnamedArgumentList: [
1836+ new SlashCommandArgument(
1837+ 'string', [ARGUMENT_TYPE.STRING], true, false,
1838+ ),
1839+ ],
1840+ helpString: 'Converts the provided string to uppercase.',
1841+ }));
1842+ SlashCommandParser.addCommandObject(SlashCommand.fromProps({
1843+ name: 'lower',
1844+ aliases: ['lowercase', 'to-lower'],
1845+ callback: (_, text) => typeof text === 'string' ? text.toLowerCase() : '',
1846+ returns: 'lowercase string',
1847+ unnamedArgumentList: [
1848+ new SlashCommandArgument(
1849+ 'string', [ARGUMENT_TYPE.STRING], true, false,
1850+ ),
1851+ ],
1852+ helpString: 'Converts the provided string to lowercase.',
1853+ }));
18301854
18311855 registerVariableCommands();
18321856}
src/endpoints/backends/chat-completions.js+1 -1
@@ -280,7 +280,7 @@ async function sendMakerSuiteRequest(request, response) {
280280 delete generationConfig.stopSequences;
281281 }
282282
283283 const should_use_system_prompt = (model.includes('gemini-1.5-flash') || model.includes('gemini-1.5-pro') || model.includes('gemini-exp-1114') || model.includes('gemini-exp-1121')) && request.body.use_makersuite_sysprompt;
284284 const prompt = convertGooglePrompt(request.body.messages, model, should_use_system_prompt, request.body.char_name, request.body.user_name);
285285 let body = {
286286 contents: prompt.contents,
src/endpoints/backends/text-completions.js+35 -0
@@ -16,6 +16,7 @@ import {
1616} from '../../constants.js';
1717import { forwardFetchResponse, trimV1, getConfigValue } from '../../util.js';
1818import { setAdditionalHeaders } from '../../additional-headers.js';
19+import { createHash } from 'node:crypto';
1920
2021export const router = express.Router();
2122
@@ -227,6 +228,40 @@ router.post('/status', jsonParser, async function (request, response) {
227228 }
228229});
229230
231+router.post('/props', jsonParser, async function (request, response) {
232+ if (!request.body.api_server) return response.sendStatus(400);
233+
234+ try {
235+ const baseUrl = trimV1(request.body.api_server);
236+ const args = {
237+ headers: {},
238+ };
239+
240+ setAdditionalHeaders(request, args, baseUrl);
241+
242+ const apiType = request.body.api_type;
243+ const propsUrl = baseUrl + '/props';
244+ const propsReply = await fetch(propsUrl, args);
245+
246+ if (!propsReply.ok) {
247+ return response.status(400);
248+ }
249+
250+ /** @type {any} */
251+ const props = await propsReply.json();
252+ // TEMPORARY: llama.cpp's /props endpoint has a bug which replaces the last newline with a \0
253+ if (apiType === TEXTGEN_TYPES.LLAMACPP && props['chat_template'].endsWith('\u0000')) {
254+ props['chat_template'] = props['chat_template'].slice(0, -1) + '\n';
255+ }
256+ props['chat_template_hash'] = createHash('sha256').update(props['chat_template']).digest('hex');
257+ console.log(`Model properties: ${JSON.stringify(props)}`);
258+ return response.send(props);
259+ } catch (error) {
260+ console.error(error);
261+ return response.status(500);
262+ }
263+});
264+
230265router.post('/generate', jsonParser, async function (request, response) {
231266 if (!request.body) return response.sendStatus(400);
232267
src/prompt-converters.js+46 -0
@@ -347,6 +347,7 @@ export function convertGooglePrompt(messages, model, useSysPrompt = false, charN
347347 'gemini-1.5-flash-8b-exp-0827',
348348 'gemini-1.5-flash-8b-exp-0924',
349349 'gemini-exp-1114',
350+ 'gemini-exp-1121',
350351 'gemini-1.5-pro',
351352 'gemini-1.5-pro-latest',
352353 'gemini-1.5-pro-001',
@@ -628,11 +629,30 @@ export function convertMistralMessages(messages, charName = '', userName = '') {
628629export function mergeMessages(messages, charName, userName, strict) {
629630 let mergedMessages = [];
630631
632+ /** @type {Map<string,object>} */
633+ const contentTokens = new Map();
634+
631635 // Remove names from the messages
632636 messages.forEach((message) => {
633637 if (!message.content) {
634638 message.content = '';
635639 }
640+ // Flatten contents and replace image URLs with random tokens
641+ if (Array.isArray(message.content)) {
642+ const text = message.content.map((content) => {
643+ if (content.type === 'text') {
644+ return content.text;
645+ }
646+ // Could be extended with other non-text types
647+ if (content.type === 'image_url') {
648+ const token = crypto.randomBytes(32).toString('base64');
649+ contentTokens.set(token, content);
650+ return token;
651+ }
652+ return '';
653+ }).join('\n\n');
654+ message.content = text;
655+ }
636656 if (message.role === 'system' && message.name === 'example_assistant') {
637657 if (charName && !message.content.startsWith(`${charName}: `)) {
638658 message.content = `${charName}: ${message.content}`;
@@ -673,6 +693,32 @@ export function mergeMessages(messages, charName, userName, strict) {
673693 });
674694 }
675695
696+ // Check for content tokens and replace them with the actual content objects
697+ if (contentTokens.size > 0) {
698+ mergedMessages.forEach((message) => {
699+ const hasValidToken = Array.from(contentTokens.keys()).some(token => message.content.includes(token));
700+
701+ if (hasValidToken) {
702+ const splitContent = message.content.split('\n\n');
703+ const mergedContent = [];
704+
705+ splitContent.forEach((content) => {
706+ if (contentTokens.has(content)) {
707+ mergedContent.push(contentTokens.get(content));
708+ } else {
709+ if (mergedContent.length > 0 && mergedContent[mergedContent.length - 1].type === 'text') {
710+ mergedContent[mergedContent.length - 1].text += `\n\n${content}`;
711+ } else {
712+ mergedContent.push({ type: 'text', text: content });
713+ }
714+ }
715+ });
716+
717+ message.content = mergedContent;
718+ }
719+ });
720+ }
721+
676722 if (strict) {
677723 for (let i = 0; i < mergedMessages.length; i++) {
678724 // Force mid-prompt system messages to be user messages