From 34bca69950c88f06bae145f18bcb7dc4d1207e89 Mon Sep 17 00:00:00 2001 From: based Date: Thu, 11 Apr 2024 16:38:20 +1000 Subject: [PATCH 01/17] system prompt support for gemini 1.5 --- public/index.html | 11 +++++++++++ public/scripts/openai.js | 12 ++++++++++++ src/endpoints/backends/chat-completions.js | 16 ++++++++++++---- src/endpoints/tokenizers.js | 2 +- src/prompt-converters.js | 17 ++++++++++++++--- 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/public/index.html b/public/index.html index 46942e6d9..164b1cd0e 100644 --- a/public/index.html +++ b/public/index.html @@ -1761,6 +1761,17 @@
Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.
+ +
+ + Merges all system messages up until the first message with a non system role, and sends them through google's system_instruction field instead of with the rest of the prompt contents. + +
diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 98fa51b3d..8a71b89f0 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -260,6 +260,7 @@ const default_settings = { use_ai21_tokenizer: false, use_google_tokenizer: false, claude_use_sysprompt: false, + use_makersuite_sysprompt: true, use_alt_scale: false, squash_system_messages: false, image_inlining: false, @@ -330,6 +331,7 @@ const oai_settings = { use_ai21_tokenizer: false, use_google_tokenizer: false, claude_use_sysprompt: false, + use_makersuite_sysprompt: true, use_alt_scale: false, squash_system_messages: false, image_inlining: false, @@ -1733,6 +1735,7 @@ async function sendOpenAIRequest(type, messages, signal) { const stopStringsLimit = 3; // 5 - 2 (nameStopString and new_chat_prompt) generate_data['top_k'] = Number(oai_settings.top_k_openai); generate_data['stop'] = [nameStopString, substituteParams(oai_settings.new_chat_prompt), ...getCustomStoppingStrings(stopStringsLimit)]; + generate_data['use_makersuite_sysprompt'] = oai_settings.use_makersuite_sysprompt; } if (isAI21) { @@ -2668,6 +2671,7 @@ function loadOpenAISettings(data, settings) { if (settings.use_ai21_tokenizer !== undefined) { oai_settings.use_ai21_tokenizer = !!settings.use_ai21_tokenizer; oai_settings.use_ai21_tokenizer ? ai21_max = 8191 : ai21_max = 9200; } if (settings.use_google_tokenizer !== undefined) oai_settings.use_google_tokenizer = !!settings.use_google_tokenizer; if (settings.claude_use_sysprompt !== undefined) oai_settings.claude_use_sysprompt = !!settings.claude_use_sysprompt; + if (settings.use_makersuite_sysprompt !== undefined) oai_settings.use_makersuite_sysprompt = !!settings.use_makersuite_sysprompt; if (settings.use_alt_scale !== undefined) { oai_settings.use_alt_scale = !!settings.use_alt_scale; updateScaleForm(); } $('#stream_toggle').prop('checked', oai_settings.stream_openai); $('#api_url_scale').val(oai_settings.api_url_scale); @@ -2707,6 +2711,7 @@ function loadOpenAISettings(data, settings) { $('#use_ai21_tokenizer').prop('checked', oai_settings.use_ai21_tokenizer); $('#use_google_tokenizer').prop('checked', oai_settings.use_google_tokenizer); $('#claude_use_sysprompt').prop('checked', oai_settings.claude_use_sysprompt); + $('#use_makersuite_sysprompt').prop('checked', oai_settings.use_makersuite_sysprompt); $('#scale-alt').prop('checked', oai_settings.use_alt_scale); $('#openrouter_use_fallback').prop('checked', oai_settings.openrouter_use_fallback); $('#openrouter_force_instruct').prop('checked', oai_settings.openrouter_force_instruct); @@ -2976,6 +2981,7 @@ async function saveOpenAIPreset(name, settings, triggerUi = true) { use_ai21_tokenizer: settings.use_ai21_tokenizer, use_google_tokenizer: settings.use_google_tokenizer, claude_use_sysprompt: settings.claude_use_sysprompt, + use_makersuite_sysprompt: settings.use_makersuite_sysprompt, use_alt_scale: settings.use_alt_scale, squash_system_messages: settings.squash_system_messages, image_inlining: settings.image_inlining, @@ -3354,6 +3360,7 @@ function onSettingsPresetChange() { use_ai21_tokenizer: ['#use_ai21_tokenizer', 'use_ai21_tokenizer', true], use_google_tokenizer: ['#use_google_tokenizer', 'use_google_tokenizer', true], claude_use_sysprompt: ['#claude_use_sysprompt', 'claude_use_sysprompt', true], + use_makersuite_sysprompt: ['#use_makersuite_sysprompt', 'use_makersuite_sysprompt', true], use_alt_scale: ['#use_alt_scale', 'use_alt_scale', true], squash_system_messages: ['#squash_system_messages', 'squash_system_messages', true], image_inlining: ['#openai_image_inlining', 'image_inlining', true], @@ -4290,6 +4297,11 @@ $(document).ready(async function () { saveSettingsDebounced(); }); + $('#use_makersuite_sysprompt').on('change', function () { + oai_settings.use_makersuite_sysprompt = !!$('#use_makersuite_sysprompt').prop('checked'); + saveSettingsDebounced(); + }); + $('#send_if_empty_textarea').on('input', function () { oai_settings.send_if_empty = String($('#send_if_empty_textarea').val()); saveSettingsDebounced(); diff --git a/src/endpoints/backends/chat-completions.js b/src/endpoints/backends/chat-completions.js index b1613fbc2..3f1fcf610 100644 --- a/src/endpoints/backends/chat-completions.js +++ b/src/endpoints/backends/chat-completions.js @@ -252,17 +252,25 @@ async function sendMakerSuiteRequest(request, response) { }; function getGeminiBody() { - return { - contents: convertGooglePrompt(request.body.messages, model), + let should_use_system_prompt = model === 'gemini-1.5-pro-latest' && request.body.use_makersuite_sysprompt; + let prompt = convertGooglePrompt(request.body.messages, model, should_use_system_prompt); + let body = { + contents: prompt.contents, safetySettings: GEMINI_SAFETY, generationConfig: generationConfig, - }; + } + + if (should_use_system_prompt) { + body.system_instruction = prompt.system_instruction; + } + + return body; } function getBisonBody() { const prompt = isText ? ({ text: convertTextCompletionPrompt(request.body.messages) }) - : ({ messages: convertGooglePrompt(request.body.messages, model) }); + : ({ messages: convertGooglePrompt(request.body.messages, model).contents }); /** @type {any} Shut the lint up */ const bisonBody = { diff --git a/src/endpoints/tokenizers.js b/src/endpoints/tokenizers.js index e6fba800a..10cce1c2a 100644 --- a/src/endpoints/tokenizers.js +++ b/src/endpoints/tokenizers.js @@ -398,7 +398,7 @@ router.post('/google/count', jsonParser, async function (req, res) { accept: 'application/json', 'content-type': 'application/json', }, - body: JSON.stringify({ contents: convertGooglePrompt(req.body, String(req.query.model)) }), + body: JSON.stringify({ contents: convertGooglePrompt(req.body, String(req.query.model)).contents }), }; try { const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${req.query.model}:countTokens?key=${readSecret(SECRET_KEYS.MAKERSUITE)}`, options); diff --git a/src/prompt-converters.js b/src/prompt-converters.js index 72b75e223..517cb5e89 100644 --- a/src/prompt-converters.js +++ b/src/prompt-converters.js @@ -252,9 +252,10 @@ function convertCohereMessages(messages, charName = '', userName = '') { * Convert a prompt from the ChatML objects to the format used by Google MakerSuite models. * @param {object[]} messages Array of messages * @param {string} model Model name - * @returns {object[]} Prompt for Google MakerSuite models + * @param {boolean} useSysPrompt Use system prompt + * @returns {{contents: *[], system_instruction: {parts: {text: string}}}} Prompt for Google MakerSuite models */ -function convertGooglePrompt(messages, model) { +function convertGooglePrompt(messages, model, useSysPrompt = false) { // This is a 1x1 transparent PNG const PNG_PIXEL = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='; @@ -267,6 +268,16 @@ function convertGooglePrompt(messages, model) { const isMultimodal = visionSupportedModels.includes(model); let hasImage = false; + let sys_prompt = ''; + if (useSysPrompt) { + while (messages.length > 1 && messages[0].role === 'system') { + sys_prompt += `${messages[0].content}\n\n`; + messages.shift(); + } + } + + const system_instruction = { parts: { text: sys_prompt }}; + const contents = []; messages.forEach((message, index) => { // fix the roles @@ -327,7 +338,7 @@ function convertGooglePrompt(messages, model) { }); } - return contents; + return { contents: contents, system_instruction: system_instruction }; } /** From c4ec97aa5053dc64ced51fd3cda4336150e9445f Mon Sep 17 00:00:00 2001 From: based Date: Thu, 11 Apr 2024 16:51:05 +1000 Subject: [PATCH 02/17] cleanup --- src/endpoints/backends/chat-completions.js | 4 ++-- src/prompt-converters.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/endpoints/backends/chat-completions.js b/src/endpoints/backends/chat-completions.js index 3f1fcf610..c3e2b5ea7 100644 --- a/src/endpoints/backends/chat-completions.js +++ b/src/endpoints/backends/chat-completions.js @@ -252,8 +252,8 @@ async function sendMakerSuiteRequest(request, response) { }; function getGeminiBody() { - let should_use_system_prompt = model === 'gemini-1.5-pro-latest' && request.body.use_makersuite_sysprompt; - let prompt = convertGooglePrompt(request.body.messages, model, should_use_system_prompt); + const should_use_system_prompt = model === 'gemini-1.5-pro-latest' && request.body.use_makersuite_sysprompt; + const prompt = convertGooglePrompt(request.body.messages, model, should_use_system_prompt); let body = { contents: prompt.contents, safetySettings: GEMINI_SAFETY, diff --git a/src/prompt-converters.js b/src/prompt-converters.js index 517cb5e89..b2fb937cb 100644 --- a/src/prompt-converters.js +++ b/src/prompt-converters.js @@ -276,7 +276,7 @@ function convertGooglePrompt(messages, model, useSysPrompt = false) { } } - const system_instruction = { parts: { text: sys_prompt }}; + const system_instruction = { parts: { text: sys_prompt.trim() }}; const contents = []; messages.forEach((message, index) => { From 4ac6bbd515610dd87e005159c8435f734a044e49 Mon Sep 17 00:00:00 2001 From: based Date: Thu, 11 Apr 2024 17:01:19 +1000 Subject: [PATCH 03/17] thought it looked a little strange --- public/index.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/index.html b/public/index.html index 164b1cd0e..b7c03a37a 100644 --- a/public/index.html +++ b/public/index.html @@ -1761,6 +1761,8 @@
Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.
+
+
- +
-
+

@@ -5843,7 +5843,7 @@
- +
From 40cae057a53af93e6fbcd4aba9b4b81be47a3918 Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Thu, 11 Apr 2024 14:55:38 +0700 Subject: [PATCH 05/17] Bind string to locale --- public/scripts/personas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/personas.js b/public/scripts/personas.js index 6cfc71e2e..084276331 100644 --- a/public/scripts/personas.js +++ b/public/scripts/personas.js @@ -404,7 +404,7 @@ function onPersonaDescriptionInput() { } $(`.avatar-container[imgfile="${user_avatar}"] .ch_description`) - .text(power_user.persona_description || '[No description]') + .text(power_user.persona_description || $('#user_avatar_block').attr('no_desc_text')) .toggleClass('text_muted', !power_user.persona_description); saveSettingsDebounced(); } From 0486fe0126638aa7024ba9a05f12ab6565d9ab98 Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Thu, 11 Apr 2024 14:58:07 +0700 Subject: [PATCH 06/17] Bind strings to locale --- public/scripts/RossAscends-mods.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index 87cbbff2c..267711934 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -275,7 +275,9 @@ export async function favsToHotswap() { //helpful instruction message if no characters are favorited if (favs.length == 0) { - container.html(' Favorite characters to add them to HotSwaps'); + container.html(' ' + + container.attr('no_favs') + + ''); return; } @@ -285,7 +287,8 @@ export async function favsToHotswap() { //changes input bar and send button display depending on connection status function RA_checkOnlineStatus() { if (online_status == 'no_connection') { - $('#send_textarea').attr('placeholder', 'Not connected to API!'); //Input bar placeholder tells users they are not connected + var send_textarea = $('#send_textarea'); + send_textarea.attr('placeholder', send_textarea.attr('no_connection_text')); //Input bar placeholder tells users they are not connected $('#send_form').addClass('no-connection'); //entire input form area is red when not connected $('#send_but').addClass('displayNone'); //send button is hidden when not connected; $('#mes_continue').addClass('displayNone'); //continue button is hidden when not connected; @@ -294,7 +297,8 @@ function RA_checkOnlineStatus() { connection_made = false; } else { if (online_status !== undefined && online_status !== 'no_connection') { - $('#send_textarea').attr('placeholder', 'Type a message, or /? for help'); //on connect, placeholder tells user to type message + var send_textarea = $('#send_textarea'); + send_textarea.attr('placeholder', send_textarea.attr('connected_text')); //on connect, placeholder tells user to type message $('#send_form').removeClass('no-connection'); $('#API-status-top').removeClass('fa-plug-circle-exclamation redOverlayGlow'); $('#API-status-top').addClass('fa-plug'); From a5d3c98e01b781f5363f082aedc08857c2cb23ae Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:00:29 +0700 Subject: [PATCH 07/17] Bind strings to locale --- public/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/script.js b/public/script.js index 84a0e9d5d..e3d64f513 100644 --- a/public/script.js +++ b/public/script.js @@ -5982,7 +5982,7 @@ function getUserAvatarBlock(name) { const personaName = power_user.personas[name]; const personaDescription = power_user.persona_descriptions[name]?.description; template.find('.ch_name').text(personaName || '[Unnamed Persona]'); - template.find('.ch_description').text(personaDescription || '[No description]').toggleClass('text_muted', !personaDescription); + template.find('.ch_description').text(personaDescription || $('#user_avatar_block').attr('no_desc_text')).toggleClass('text_muted', !personaDescription); template.attr('imgfile', name); template.find('.avatar').attr('imgfile', name).attr('title', name); template.toggleClass('default_persona', name === power_user.default_persona); From c9509c5c54a8babc2eaa1307505b9a0f1dc06055 Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:02:23 +0700 Subject: [PATCH 08/17] Proofread, edit and update translation --- public/locales/ru-ru.json | 815 ++++++++++++++++++++------------------ 1 file changed, 440 insertions(+), 375 deletions(-) diff --git a/public/locales/ru-ru.json b/public/locales/ru-ru.json index d03ff14e7..5aeb74e02 100644 --- a/public/locales/ru-ru.json +++ b/public/locales/ru-ru.json @@ -1,31 +1,31 @@ { - "clickslidertips": "Щелкните на цифру ползунка, чтобы вписать вручную.", - "kobldpresets": "Предустановки Kobold", - "guikoboldaisettings": "Интерфейс KoboldAI", - "novelaipreserts": "Предустановки NovelAI", + "clickslidertips": "Кликайте по цифрам под ползунками, чтобы менять их вручную.", + "kobldpresets": "Пресеты для Kobold", + "guikoboldaisettings": "Настройки из интерфейса KoboldAI", + "novelaipreserts": "Пресеты для NovelAI", "default": "По умолчанию", - "openaipresets": "Предустановки OpenAI", - "text gen webio(ooba) presets": "Предустановки WebUI(ooba)", - "response legth(tokens)": "Длина ответа (в токенах)", + "openaipresets": "Пресеты для OpenAI", + "text gen webio(ooba) presets": "Пресеты для WebUI(ooba)", + "response legth(tokens)": "Ответ (в токенах)", "select": "Выбрать", - "context size(tokens)": "Размер контекста (в токенах)", + "context size(tokens)": "Контекст (в токенах)", "unlocked": "Неограниченный", "Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "Только отдельные модели поддерживают контекст, превышающий 4096 токенов. Используйте только если понимаете, что делаете.", - "rep.pen": "Штраф за повторение", - "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "Статус входа WI:\n 🔵 Константа\n 🟢 Cтандартный\n ❌ Отключен", - "rep.pen range": "Диапазон штрафов за повтор.", - "Temperature controls the randomness in token selection": "Temperature контролирует случайность выбора токенов:\n- низкая Temperature (<1.0) приводит к более предсказуемому тексту, отдавая предпочтение токенам с высокой вероятностью.\n- высокая Temperature (>1.0) повышает креативность и разнообразие вывода, давая токенам с низкой вероятностью больше шансов.\nУстановите значение 1.0 для исходных вероятностей.", - "temperature": "Temperature", - "Top K sets a maximum amount of top tokens that can be chosen from": "Top K задает максимальное количество токенов, которые могут быть выбраны.\nЕсли Top-K равен 20, это означает, что будут сохранены только 20 токенов с наивысшим рейтингом (независимо от того, что их вероятности разнообразны или ограничены)\nУстановите значение 0, чтобы отключить.", - "Top P (a.k.a. nucleus sampling)": "Top P (также известная как выборка ядра) складывает все верхние токены, необходимые для достижения целевого процента.\nТо есть, если 2 верхних токена составляют 25%, а Top-P равен 0.50, учитываются только эти 2 верхних токена.\nУстановите значение 1.0, чтобы отключить.", + "rep.pen": "Штраф за повтор", + "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "Статус записи:\n 🔵 Постоянная\n 🟢 Обычная\n ❌ Отключена", + "rep.pen range": "Окно для штрафов за повтор", + "Temperature controls the randomness in token selection": "Температура контролирует процесс выбора токена:\n- при низкой температуре (<1.0) предпочтение отдаётся наиболее вероятным токенам, текст получается предсказуемым.\n- при высокой температуре (>1.0) повышаются шансы у токенов с низкой вероятностью, текст получается более креативным.\nУстановите значение 1.0, чтобы вероятности не менялись.", + "temperature": "Температура", + "Top K sets a maximum amount of top tokens that can be chosen from": "Top K задает жёсткое ограничение на количество рассматриваемых токенов.\nЕсли Top-K равен 20, это означает, что будут сохранены только 20 наиболее вероятных токенов (распределение их вероятностей в расчёт не берётся)\nУстановите значение 0, чтобы отключить.", + "Top P (a.k.a. nucleus sampling)": "Top P (он же nucleus sampling) складывает все верхние токены, пока их суммарные вероятности не достигнут целевого процента.\nТо есть, если 2 верхних токена составляют 25%, а Top-P равен 0.50, учитываются только эти 2 верхних токена.\nУстановите значение 1.0, чтобы отключить.", "Typical P Sampling prioritizes tokens based on their deviation from the average entropy of the set": "Сэмплер Typical P определяет приоритет токенов на основе их отклонения от средней энтропии набора.\nОстаются токены, чья кумулятивная вероятность близка к заданному порогу (например, 0,5), выделяя те, которые имеют среднее информационное содержание.\nУстановите значение 1.0, чтобы отключить.", "Min P sets a base minimum probability": "Min P устанавливает базовую минимальную вероятность. Она масштабируется в зависимости от вероятности верхнего токена.\nЕсли вероятность верхнего токена составляет 80%, а Min P - 0.1, будут рассматриваться только токены с вероятностью выше 8%.\nУстановите значение 0, чтобы отключить.", "Top A sets a threshold for token selection based on the square of the highest token probability": "Top A устанавливает порог для отбора токенов на основе квадрата наибольшей вероятности токена.\nЕсли значение Top A равно 0.2, а вероятность верхнего токена равна 50%, то токены с вероятностью ниже 5% (0.2 * 0.5^2) будут исключены.\nУстановите значение 0, чтобы отключить.", "Tail-Free Sampling (TFS)": "Tail-Free Sampling (TFS) ищет хвост маловероятных токнов в распределении,\n анализируя скорость изменения вероятностей токенов с помощью производных. Он сохраняет токены до порога (например, 0.3), основанного на нормированной второй производной.\nЧем ближе к 0, тем больше отброшенных токенов. Установите значение 1.0, чтобы отключить.", "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "Epsilon cutoff устанавливает уровень вероятности, ниже которого токены исключаются из выборки.\nВ единицах 1e-4; разумное значение - 3.\nУстановите 0, чтобы отключить.", "Scale Temperature dynamically per token, based on the variation of probabilities": "Динамическое масштабирование Temperature для каждого токена, основанное на изменении вероятностей.", - "Minimum Temp": "Минимальная Temp", - "Maximum Temp": "Максимальная Temp", + "Minimum Temp": "Мин. температура", + "Maximum Temp": "Макс. температура", "Exponent": "Экспонента", "Mirostat Mode": "Режим", "Mirostat Tau": "Tau", @@ -35,35 +35,35 @@ "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "Сила условия регуляризации контрастивного поиска. Установите значение 0, чтобы отключить CS.", "Temperature Last": "Temperature Last", "Use the temperature sampler last": "Использовать Temperature сэмплер в последнюю очередь. Это почти всегда разумно.\nПри включении: сначала выборка набора правдоподобных токенов, затем применение Temperature для корректировки их относительных вероятностей (технически, логитов).\nПри отключении: сначала применение Temperature для корректировки относительных вероятностей ВСЕХ токенов, затем выборка правдоподобных токенов из этого.\nОтключение Temperature Last увеличивает вероятности в хвосте распределения, что увеличивает шансы получить несогласованный ответ.", - "LLaMA / Mistral / Yi models only": "Только для моделей LLaMA / Mistral / Yi. Убедитесь, что сначала выбрали подходящий токенизатор.\nПоследовательности, которые вы не хотите видеть в выходных данных.\nОдна на строку. Текст или [идентификаторы токенов].\nМногие токены имеют пробел впереди. Используйте счетчик токенов, если не уверены.", + "LLaMA / Mistral / Yi models only": "Только для моделей LLaMA / Mistral / Yi. Перед этим обязательно выберите подходящий токенизатор.\nПоследовательности, которых не должно быть на выходе.\nОдна на строку. Текст или [идентификаторы токенов].\nМногие токены имеют пробел впереди. Используйте счетчик токенов, если не уверены.", "Example: some text [42, 69, 1337]": "Пример:\nкакой-то текст\n[42, 69, 1337]", - "Classifier Free Guidance. More helpful tip coming soon": "Руководство без классификатора. Больше полезных советов в ближайшее время.", + "Classifier Free Guidance. More helpful tip coming soon": "Classifier Free Guidance. Чуть позже опишем более подробно", "Scale": "Масштаб", "GBNF Grammar": "Грамматика GBNF", "Usage Stats": "Статистика исп.", "Click for stats!": "Нажмите для получения статистики!", - "Backup": "Резер. копирование", - "Backup your personas to a file": "Резервное копирование персон в файл", + "Backup": "Бэкап", + "Backup your personas to a file": "Создать бэкап (резервную копию) персоны в виде файла", "Restore": "Восстановить", "Restore your personas from a file": "Восстановление персон из файла", "Type in the desired custom grammar": "Введите нужную пользовательскую грамматику", - "Encoder Rep. Pen.": "Штраф за кодирование", + "Encoder Rep. Pen.": "Штраф за повтор для кодировщика", "Smoothing Factor": "Коэффициент сглаживания", - "No Repeat Ngram Size": "Нет повторов размера Ngram", - "Min Length": "Минимальная длина", + "No Repeat Ngram Size": "Размер no_repeat_ngram", + "Min Length": "Мин. длина", "OpenAI Reverse Proxy": "Прокси с OpenAI", "Alternative server URL (leave empty to use the default value).": "Альтернативный URL сервера (оставьте пустым для стандартного значения)", - "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Удалите свой личный OAI API Key из панели API прежде, чем вносить сюда ЧТО УГОДНО", + "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "Удалите свой личный OAI API Key из панели API, и ТОЛЬКО ПОСЛЕ ЭТОГО вводите что-то сюда", "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "Мы не сможем предоставить помощь с проблемами, с которыми вы столкнетесь при использовании неофициальных прокси для OpenAI", - "Legacy Streaming Processing": "Старый способ потокового вывода текста", - "Enable this if the streaming doesn't work with your proxy": "Включите это, если потоковый вывод текста не работает с вашим прокси", + "Legacy Streaming Processing": "Старый способ стриминга", + "Enable this if the streaming doesn't work with your proxy": "Если на вашей прокси не работает стриминг, попробуйте включить эту опцию", "Context Size (tokens)": "Размер контекста (в токенах)", - "Max Response Length (tokens)": "Максимальная длина ответа (в токенах)", - "Temperature": "Temperature", + "Max Response Length (tokens)": "Макс. длина ответа (в токенах)", + "Temperature": "Температура", "Frequency Penalty": "Штраф за частоту", "Presence Penalty": "Штраф за присутствие", "Top-p": "Top P", - "Display bot response text chunks as they are generated": "Отображать ответ ИИ по мере генерации текста", + "Display bot response text chunks as they are generated": "Отображать ответ ИИ отрывками по мере генерации текста", "Top A": "Top А", "Typical Sampling": "Typical Sampling", "Tail Free Sampling": "Tail Free Sampling", @@ -72,10 +72,10 @@ "Top K": "Top K", "Top P": "Top P", "Do Sample": "Сделать образец", - "Add BOS Token": "Добавить BOS-токен", - "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "Добавлять BOS-токен в начале инструкции. Выключение этого может сделать ответы более креативными. ", - "Ban EOS Token": "Заблокировать EOS-токен", - "Ban the eos_token. This forces the model to never end the generation prematurely": "Блокировка EOS-токена вынудит модель никогда не завершать генерацию преждевременно", + "Add BOS Token": "Добавлять BOS-токен", + "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "Добавлять BOS-токен в начале промпта. Если выключить, ответы могут стать более креативными.", + "Ban EOS Token": "Запретить EOS-токен", + "Ban the eos_token. This forces the model to never end the generation prematurely": "Запрет EOS-токена не позволит модели завершить генерацию преждевременно", "Skip Special Tokens": "Пропускать специальные токены", "Beam search": "Поиск Beam", "Number of Beams": "Количество Beam", @@ -86,15 +86,15 @@ "Seed": "Зерно", "Epsilon Cutoff": "Epsilon Cutoff", "Eta Cutoff": "Eta Cutoff", - "Negative Prompt": "Отрицательная подсказка", - "Mirostat (mode=1 is only for llama.cpp)": "Mirostat", - "Mirostat is a thermostat for output perplexity": "Mirostat - это термостат для недоумения на выходе.\nMirostat подгоняет недоумение на выходе к недоумению на входе, что позволяет избежать ловушки повторения.\n(когда по мере того, как авторегрессионный вывод производит текст, недоумение на выходе стремится к нулю)\n и ловушки путаницы (когда недоумение расходится)\nДля подробностей смотрите статью Mirostat: A Neural Text Decoding Algorithm that Directly Controls Perplexity by Basu et al. (2020).\nРежим выбирает версию Mirostat. 0=отключить, 1=Mirostat 1.0 (только llama.cpp), 2=Mirostat 2.0.", - "Add text here that would make the AI generate things you don't want in your outputs.": "Добавьте сюда текст, который заставит ИИ генерировать то, что вы не хотите видеть в своих выводах", - "Phrase Repetition Penalty": "Штраф за повторение фразы", + "Negative Prompt": "Отрицательный промпт", + "Mirostat (mode=1 is only for llama.cpp)": "Mirostat (режим=1 предназначен только для llama.cpp)", + "Mirostat is a thermostat for output perplexity": "Mirostat - своего рода термометр, измеряющий перплексию для выводимого текста.\nMirostat подгоняет перплексию генерируемого текста к перплексии входного текста, что позволяет избежать повторов.\n(когда по мере генерации текста авторегрессионным инференсом, перплексия всё больше приближается к нулю)\n а также ловушки перплексии (когда перплексия начинает уходить в сторону)\nБолее подробное описание в статье Mirostat: A Neural Text Decoding Algorithm that Directly Controls Perplexity by Basu et al. (2020).\nРежим выбирает версию Mirostat. 0=отключить, 1=Mirostat 1.0 (только llama.cpp), 2=Mirostat 2.0.", + "Add text here that would make the AI generate things you don't want in your outputs.": "Добавьте сюда текст, который заставит ИИ генерировать то, что вы не хотите видеть в его текстах", + "Phrase Repetition Penalty": "Штраф за повтор фразы", "Preamble": "Преамбула", - "Use style tags to modify the writing style of the output.": "Используйте теги стиля, чтобы изменить стиль написания вывода.", + "Use style tags to modify the writing style of the output.": "Используйте теги стиля, чтобы изменить стиль написания выходного текста.", "Banned Tokens": "Запрещенные токены", - "Sequences you don't want to appear in the output. One per line.": "Последовательности, которые вы не хотите отображать в выводе. По одному на строку.", + "Sequences you don't want to appear in the output. One per line.": "Строки, которых не должно быть в выходном тексте. По одной на строчку.", "AI Module": "Модуль ИИ", "Changes the style of the generated text.": "Изменяет стиль создаваемого текста.", "Used if CFG Scale is unset globally, per chat or character": "Используется, если масштаб CFG не установлен глобально, для каждого чата или персонажа.", @@ -104,42 +104,42 @@ "Tell the AI that NSFW is allowed.": "Сообщает AI, что ему позволено генерировать NSFW.", "NSFW Prioritized": "Предпочитать NSFW", "NSFW prompt text goes first in the prompt to emphasize its effect.": "Отправлять NSFW-инструкцию в начале для усиления его эффекта", - "Streaming": "Потоковый вывод текста", - "Dynamic Temperature": "Динамическая Temperature", - "Restore current preset": "Восстановить текущую предустановку", + "Streaming": "Стриминг текста", + "Dynamic Temperature": "Динамическая температура", + "Restore current preset": "Восстановить текущий пресет", "Neutralize Samplers": "Нейтрализовать сэмплеры", - "Text Completion presets": "Предустановки Text Completion", + "Text Completion presets": "Пресеты для Text Completion", "Documentation on sampling parameters": "Документация по параметрам сэмплеров", "Set all samplers to their neutral/disabled state.": "Установить все сэмплеры в нейтральное/отключенное состояние.", - "Only enable this if your model supports context sizes greater than 4096 tokens": "Включите эту опцию, только если ваша модель поддерживает размер контекста более 4096 токенов.\nУвеличивайте только если вы знаете, что делаете.", - "Display the response bit by bit as it is generated": "Отображение ответа бит за битом по мере его генерации.\nКогда этот параметр выключен, ответы будут отображаться все сразу после их завершения.", - "Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Генерируйте только одну строку для каждого запроса (только KoboldAI, игнорируется KoboldCpp).", - "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Запретите токен конца последовательности (EOS) (с помощью KoboldCpp и, возможно, также других токенов с помощью KoboldAI).", - "Good for story writing, but should not be used for chat and instruct mode.": "Подходит для написания историй, но не должен использоваться в режиме чата и инструктирования.", - "Enhance Definitions": "Улучшенная узнаваемость", - "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Позволяет использовать базу знаний, улучшающую узнаваемость ИИ публичных лиц и вымышленных персонажей", + "Only enable this if your model supports context sizes greater than 4096 tokens": "Включайте эту опцию, только если ваша модель поддерживает размер контекста более 4096 токенов.\nУвеличивайте только если вы знаете, что делаете.", + "Display the response bit by bit as it is generated": "Выводить текст последовательно по мере его генерации.\nЕсли параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", + "Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "Генерировать только одну строку на каждый запрос (только для KoboldAI, игнорируется KoboldCpp).", + "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "Запретить токен конца последовательности (EOS) (актуально для KoboldCpp, но KoboldAI может запрещать ещё и другие токены).", + "Good for story writing, but should not be used for chat and instruct mode.": "Подходит для написания историй, но не должен использоваться в режиме Chat и Instruct.", + "Enhance Definitions": "Улучшить описания", + "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "Позволяет использовать базу знаний OAI, улучшающую описания для публичных лиц и известных вымышленных персонажей", "Wrap in Quotes": "Заключать в кавычки", - "Wrap entire user message in quotes before sending.": "Заключить всё сообщение пользователя в кавычки перед отправкой.", + "Wrap entire user message in quotes before sending.": "Перед отправкой заключать всё сообщение пользователя в кавычки.", "Leave off if you use quotes manually for speech.": "Оставьте выключенным, если вручную выставляете кавычки для прямой речи.", - "Main prompt": "Основная инструкция", - "The main prompt used to set the model behavior": "Основная инструкция, используемая для установки поведения модели", - "NSFW prompt": "NSFW-инструкция", - "Prompt that is used when the NSFW toggle is on": "Инструкция, отправляемая ИИ при включенном поощрении NSFW.", - "Jailbreak prompt": "Инструкция для JailBreak", - "Prompt that is used when the Jailbreak toggle is on": "Инструкция, отправляемая ИИ при включенном JailBreak.", - "Impersonation prompt": "Инструкция для перевоплощения", - "Prompt that is used for Impersonation function": "Инструкция, отправляемая ИИ для генерации действий за пользователя", - "Logit Bias": "Ошибка логита", - "Helps to ban or reenforce the usage of certain words": "Позволяет запретить или поощрять использование определенных слов", - "View / Edit bias preset": "Посмотреть/Настроить предустановку для bias", - "Add bias entry": "Добавить инструкцию в Bias", - "Jailbreak activation message": "Сообщение об активации JailBreak", - "Message to send when auto-jailbreak is on.": "Сообщение, отправляемое когда автоматический JailBreak включен.", + "Main prompt": "Основной промпт", + "The main prompt used to set the model behavior": "Основной промпт, задающий поведение модели", + "NSFW prompt": "NSFW-промпт", + "Prompt that is used when the NSFW toggle is on": "Промпт, применяемый при включенном поощрении NSFW.", + "Jailbreak prompt": "Джейлбрейк-промпт", + "Prompt that is used when the Jailbreak toggle is on": "Промпт, применяемый при включенном джейлбрейке.", + "Impersonation prompt": "Промпт для перевоплощения", + "Prompt that is used for Impersonation function": "Промпт, применяемый при генерации действий за пользователя", + "Logit Bias": "Смещение логитов", + "Helps to ban or reenforce the usage of certain words": "Запрещает или поощряет использование определенных слов", + "View / Edit bias preset": "Просмотр / Редактирование пресета смещения", + "Add bias entry": "Добавить правило смещения", + "Jailbreak activation message": "Сообщение об активации джейлбрейка", + "Message to send when auto-jailbreak is on.": "Сообщение, отправляемое когда автоматический джейлбрейк включен.", "Jailbreak confirmation reply": "Подтверждение JailBreak", "Bot must send this back to confirm jailbreak": "Это сообщение будет отправлено ИИ при успешном включении JailBreak.", "Character Note": "Заметки о персонаже", "Influences bot behavior in its responses": "Влияет на поведение ИИ и его ответы.", - "Connect": "Подключить", + "Connect": "Подключиться", "Test Message": "Тестовое сообщение", "API": "API", "KoboldAI": "KoboldAI", @@ -153,7 +153,7 @@ "API key": "API-ключ", "Tabby API key": "Tabby API-ключ", "Get it here:": "Получить здесь:", - "Register": "Регистрация", + "Register": "Зарегистрироваться", "TogetherAI Model": "Модель TogetherAI", "Example: 127.0.0.1:5001": "Пример: http://127.0.0.1:5001", "ggerganov/llama.cpp": "ggerganov/llama.cpp (сервер вывода)", @@ -164,18 +164,18 @@ "TogetherAI API Key": "TogetherAI API-ключ", "-- Connect to the API --": "-- Подключитесь к API --", "View my Kudos": "Посмотреть мой рейтинг(Kudos)", - "Enter": "Вставьте", + "Enter": "Введите", "to use anonymous mode.": "чтобы использовать анонимный режим.", "For privacy reasons": "В целях конфиденциальности API-ключ будет скрыт после перезагрузки страницы", "Models": "Модели", - "Hold Control / Command key to select multiple models.": "Удерживайте Control / Command для выбора нескольких моделей.", + "Hold Control / Command key to select multiple models.": "Удерживайте клавишу Control / Command для выбора нескольких моделей.", "Horde models not loaded": "Модели Horde не загружены", - "Not connected...": "Не подключено...", + "Not connected...": "Нет подключения...", "Novel API key": "API-ключ для NovelAI", "Follow": "Следуйте", "these directions": "данным инструкциям", "to get your NovelAI API key.": "чтобы получить свой API-ключ от NovelAI", - "Enter it in the box below": "Введите это в окошко ниже", + "Enter it in the box below": "Введите его в окошко ниже", "Novel AI Model": "Модель NovelAI", "If you are using:": "Если вы используете:", "oobabooga/text-generation-webui": "", @@ -189,34 +189,34 @@ "Use API key (Only required for Mancer)": "Нажмите на ячейку (и добавьте свой API ключ!):", "Blocking API url": "Блокирующий API url", "Example: 127.0.0.1:5000": "Пример: http://127.0.0.1:5000", - "Legacy API (pre-OAI, no streaming)": "Устаревший API (до OAI, без потоковой передачи)", + "Legacy API (pre-OAI, no streaming)": "Устаревший API (до OAI, без стриминга)", "Bypass status check": "Обход проверки статуса", "Streaming API url": "Потоковый API URL", "Example: ws://127.0.0.1:5005/api/v1/stream": "Пример: ws://127.0.0.1:5005/api/v1/stream", - "Mancer API key": "Mancer API ключ", + "Mancer API key": "Ключ от Mancer API", "Example: https://neuro.mancer.tech/webui/MODEL/api": "Пример: https://neuro.mancer.tech/webui/MODEL/api", - "to get your OpenAI API key.": "для получения API-ключа OpenAI", + "to get your OpenAI API key.": "для получения ключа от OpenAI API", "Window AI Model": "Модель Window AI", "OpenAI Model": "Модель OpenAI", - "Claude API Key": "Claude API ключ", - "Get your key from": "Получить ключ из", - "Anthropic's developer console": "Консоли разработчика Anthropic", - "Slack and Poe cookies will not work here, do not bother trying.": "Файлы cookie Slack и Poe здесь не подойдут, не пытайтесь.", + "Claude API Key": "Ключ от Claude API", + "Get your key from": "Получите ключ в", + "Anthropic's developer console": "консоли разработчика Anthropic", + "Slack and Poe cookies will not work here, do not bother trying.": "Файлы cookie Slack и Poe здесь не подойдут, можете их не пробовать.", "Claude Model": "Модель Claude", - "Scale API Key": "Scale API ключ", + "Scale API Key": "Ключ от Scale API", "Alt Method": "Альтернативный метод", - "AI21 API Key": "AI21 API ключ", + "AI21 API Key": "Ключ от API AI21", "AI21 Model": "Модель AI21", "View API Usage Metrics": "Посмотреть статистику использования API", "Show External models (provided by API)": "Показать \"сторонние\" модели (предоставленные API)", "Bot": "Бот:", "Allow fallback routes": "Разрешить резервные маршруты", "Allow fallback routes Description": "Автоматически выбирает альтернативную модель, если выбранная модель не может удовлетворить ваш запрос.", - "OpenRouter API Key": "OpenRouter API ключ", + "OpenRouter API Key": "Ключ от OpenRouter API", "Connect to the API": "Соединение с API", "OpenRouter Model": "Модель OpenRouter", "View Remaining Credits": "Посмотреть оставшиеся кредиты", - "Click Authorize below or get the key from": "Нажмите «Авторизовать» ниже или получите ключ от", + "Click Authorize below or get the key from": "Нажмите «Авторизоваться» ниже или получите ключ от", "Auto-connect to Last Server": "Автоматическое подключение к последнему серверу", "View hidden API keys": "Посмотреть скрытые API-ключи", "Advanced Formatting": "Расширенное форматирование", @@ -227,56 +227,56 @@ "Disable scenario formatting": "Отключить форматирование сценария", "Disable example chats formatting": "Отключить форматирование примеров чата", "Disable chat start formatting": "Отключить форматирование начала чата", - "Custom Chat Separator": "Пользовательское разделение чата", + "Custom Chat Separator": "Кастомный разделитель для чата", "Replace Macro in Custom Stopping Strings": "Заменить макрос в пользовательских стоп-строках", "Strip Example Messages from Prompt": "Удалить примеры сообщений из подсказки", "Story String": "Строка истории", "Example Separator": "Пример разделителя", "Chat Start": "Начало чата", - "Activation Regex": "Активация Regex", - "Instruct Mode": "Режим \"Инструктаж\"", - "Wrap Sequences with Newline": "Отделять последовательности красной строкой", - "Include Names": "Показывать имена", - "Force for Groups and Personas": "Усилия для Групп и Персон", - "System Prompt": "Системная инструкция", - "Instruct Mode Sequences": "Последовательности режима обучения", + "Activation Regex": "Regex для активации", + "Instruct Mode": "Режим Instruct", + "Wrap Sequences with Newline": "Отделять строки символом новой строки", + "Include Names": "Добавлять имена", + "Force for Groups and Personas": "Также для групп и персон", + "System Prompt": "Системный промпт", + "Instruct Mode Sequences": "Строки для Instruct-режима", "Input Sequence": "Входная последовательность", "Output Sequence": "Выходная последовательность", "First Output Sequence": "Первая выходная последовательность", "Last Output Sequence": "Последняя выходная последовательность", "System Sequence Prefix": "Префикс системной последовательности", "System Sequence Suffix": "Суффикс системной последовательности", - "Stop Sequence": "Последовательность остановки", + "Stop Sequence": "Стоп-строка", "Context Formatting": "Форматирование контекста", "(Saved to Context Template)": "(Сохраняется в шаблоне контекста)", "Tokenizer": "Токенайзер", - "None / Estimated": "Отсутствует/Приблизительно", + "None / Estimated": "Отсутствует / Приблизительно", "Sentencepiece (LLaMA)": "Sentencepiece (LLaMA)", - "Token Padding": "Заполнение токенов", - "Save preset as": "Сохранить предустановку как", - "Always add character's name to prompt": "Всегда добавлять имя персонажа в инструкции", - "Use as Stop Strings": "Использование в качестве стоп-строк", + "Token Padding": "Кол-во добавочных токенов", + "Save preset as": "Сохранить пресет как", + "Always add character's name to prompt": "Всегда добавлять имя персонажа в промпт", + "Use as Stop Strings": "Использовать в качестве стоп-строк", "Bind to Context": "Привязка к контексту", - "Generate only one line per request": "Генерировать только одну строку для каждого запроса", + "Generate only one line per request": "Генерировать одну строку на запрос", "Misc. Settings": "Доп. настройки", - "Auto-Continue": "Авто продолжение", - "Collapse Consecutive Newlines": "Свернуть последовательные новые строки", - "Allow for Chat Completion APIs": "Разрешить API завершения чата", + "Auto-Continue": "Авто-продолжение", + "Collapse Consecutive Newlines": "Сворачивать последовательные новые строки", + "Allow for Chat Completion APIs": "Разрешить для API Chat Completion", "Target length (tokens)": "Целевая длина (токены)", - "Keep Example Messages in Prompt": "Сохранять примеры сообщений в инструкции", + "Keep Example Messages in Prompt": "Сохранять примеры сообщений в промпте", "Remove Empty New Lines from Output": "Удалять пустые строчки из вывода", "Disabled for all models": "Выключено для всех моделей", "Automatic (based on model name)": "Автоматически (выбор по названию модели)", "Enabled for all models": "Включить для всех моделей", "Anchors Order": "Порядок Anchors", - "Character then Style": "Персонаж после Стиля", - "Style then Character": "Стиль после Персонажа", + "Character then Style": "Стиль после Персонажа", + "Style then Character": "Персонаж после Стиля", "Character Anchor": "Anchors Персонажа", "Style Anchor": "Стиль Anchors", "World Info": "Информация о мире", "Scan Depth": "Глубина сканирования", "Case-Sensitive": "С учетом регистра", - "Match Whole Words": "Сопоставить целые слова", + "Match Whole Words": "Только целые слова", "Use global setting": "Использовать глобальную настройку", "Yes": "Да", "No": "Нет", @@ -291,9 +291,9 @@ "User Settings": "Настройки пользователя", "UI Mode": "Режим интерфейса", "UI Language": "Язык интерфейса", - "MovingUI Preset": "Предустановка MovingUI", + "MovingUI Preset": "Пресет MovingUI", "UI Customization": "Настройки интерфейса", - "Avatar Style": "Стиль аватаров", + "Avatar Style": "Аватарки", "Circle": "Круглые", "Rectangle": "Прямоугольные", "Square": "Квадратные", @@ -306,28 +306,28 @@ "Message Timer": "Таймер сообщений", "Model Icon": "Показать значки модели", "# of messages (0 = disabled)": "# сообщений (0 = отключено)", - "Advanced Character Search": "Расширенный поиск персонажей", + "Advanced Character Search": "Расширенный поиск по персонажам", "Allow {{char}}: in bot messages": "Показывать {{char}}: в ответах", "Allow {{user}}: in bot messages": "Показать {{user}}: в ответах", "Show tags in responses": "Показывать <теги> в ответах", - "Aux List Field": "Вспомогательное поле списка", - "Lorebook Import Dialog": "Импрот Lorebook-ка", - "MUI Preset": "Предустановка MUI:", - "If set in the advanced character definitions, this field will be displayed in the characters list.": "Если это поле задано в расширенных параметрах персонажа, оно будет отображаться в списке персонажа.", + "Aux List Field": "Вспомогательное поле в списке", + "Lorebook Import Dialog": "Показывать окно импорта лорбука", + "MUI Preset": "Пресет MUI:", + "If set in the advanced character definitions, this field will be displayed in the characters list.": "Если это поле задано в расширенных параметрах персонажа, оно будет отображаться в списке персонажей.", "Relaxed API URLS": "Смягченные URL-адреса API", "Custom CSS": "Пользовательский CSS", "Default (oobabooga)": "По умолчанию (oobabooga)", "Mancer Model": "Модель Mancer", "API Type": "Тип API", - "Aphrodite API key": "API-ключ Aphrodite", - "Relax message trim in Groups": "Расслабленная отделка сообщений в Группах", - "Characters Hotswap": "Смена персонажей на лету", - "Request token probabilities": "Вероятность запроса токена", - "Movable UI Panels": "Перемещение панелей интерфейса", + "Aphrodite API key": "Ключ от API Aphrodite", + "Relax message trim in Groups": "Мягкая обрезка сообщений в группах", + "Characters Hotswap": "HotSwap (смена персонажей на лету)", + "Request token probabilities": "Запрашивать вероятность токена", + "Movable UI Panels": "Подвижные панели UI", "Reset Panels": "Сбросить MovingUI", - "UI Colors": "Цвета интерфейса", + "UI Colors": "Цвета UI", "Main Text": "Основной текст", - "Italics Text": "Курсивный текст", + "Italics Text": "Курсив", "Quote Text": "Текст в кавычках", "Shadow Color": "Цвет теней", "FastUI BG": "Фон FastUI", @@ -335,15 +335,15 @@ "Font Scale": "Размер текста", "Blur Strength": "Сила размытия", "Text Shadow Width": "Размер теней текста", - "UI Theme Preset": "Предустановки интерфейса", + "UI Theme Preset": "Пресет темы UI", "Power User Options": "Продвинутые параметры", - "Swipes": "Свайвы", + "Swipes": "Свайпы", "Miscellaneous": "Разное", - "Theme Toggles": "Переключатели темы", + "Theme Toggles": "Настройки темы", "Background Sound Only": "Только фоновый звук", - "Auto-load Last Chat": "Автоматически загружать последий чат", + "Auto-load Last Chat": "Автозагрузка последнего чата", "Auto-save Message Edits": "Автоматически сохранять отредактированные сообщения", - "Auto-fix Markdown": "Автоматическое исправление подчеркиваний", + "Auto-fix Markdown": "Автоисправление разметки", "Allow : in bot messages": "Разрешить : в сообщениях ИИ", "Auto-scroll Chat": "Автоматическая прокрутка чата", "Render Formulas": "Рендер формул", @@ -352,50 +352,50 @@ "Automatic (desktop)": "Автоматически (системные настройки)", "Always enabled": "Всегда включена", "Debug Menu": "Меню отладки", - "Restore User Input": "Восстановить запрос пользователя", + "Restore User Input": "Восстанавливать введённый текст", "Character Handling": "Обработка персонажа", - "Example Messages Behavior": "Пример поведения в сообщениях:", + "Example Messages Behavior": "Примеры сообщений:", "Gradual push-out": "Постепенное выталкивание", - "Chat/Message Handling": "Обработка чата/сообщения", - "Always include examples": "Всегда включать примеры", - "Never include examples": "Никогда не включать примеры", + "Chat/Message Handling": "Обработка чата и сообщений", + "Always include examples": "Всегда применять примеры", + "Never include examples": "Никогда не применять примеры", "Forbid External Media": "Запрет внешних медиа", "System Backgrounds": "Системные фоны", "Name": "Имя", - "Your Avatar": "Ваш Аватар", + "Your Avatar": "Ваш аватар", "Extensions API:": "API для расширений", "SillyTavern-extras": "SillyTavern-extras", - "Auto-connect": "Автоматическое соединение", + "Auto-connect": "Подключаться автоматически", "Active extensions": "Актививные расширения", "Extension settings": "Настройки расширений", "Description": "Описание", "First message": "Первое сообщение", - "Group Controls": "Контроль группы", - "Group reply strategy": "Сортировка ответов в группе", - "Natural order": "Обычный порядок", - "List order": "Порядок по листу", + "Group Controls": "Управление группой", + "Group reply strategy": "Персонажи отвечают...", + "Natural order": "По алфавиту", + "List order": "По списку", "Allow self responses": "Разрешить ответ себе", - "Auto Mode": "Автоматический режим", - "Add Members": "Добавить членов", - "Current Members": "Текущие члены", + "Auto Mode": "Авто-режим", + "Add Members": "Добавить участников", + "Current Members": "Текущие участники", "text": "текст", "Delete": "Удалить", "Cancel": "Отменить", - "Advanced Defininitions": "Улучшенная узнаваемость", - "Personality summary": "Личная сводка", + "Advanced Defininitions": "Продвинутое описание", + "Personality summary": "Сводка по личности", "A brief description of the personality": "Краткое описание личности", "Scenario": "Сценарий", "Circumstances and context of the dialogue": "Обстоятельства и контекст диалога", "Talkativeness": "Разговорчивость", "How often the chracter speaks in": "Как часто персонаж говорит", - "group chats!": "в груповых чатах", + "group chats!": "в групповых чатах!", "Shy": "Застенчивый", "Normal": "Обычный", "Chatty": "Разговорчивый", "Examples of dialogue": "Примеры диалога", - "Forms a personality more clearly": "Определите личность более точно", + "Forms a personality more clearly": "Определяет личность более точно", "Save": "Сохранить", - "World Info Editor": "Редактирование информации о мире", + "World Info Editor": "Редактировать информацию о мире", "New summary": "Новая переменная", "Export": "Экспорт", "Delete World": "Удалить мир", @@ -408,17 +408,17 @@ "Content": "Содержание", "What this keyword should mean to the AI": "Значение данного ключевого слова для ИИ", "Memo/Note": "Напоминание", - "Not sent to AI": "Не отправлять ИИ", + "Not sent to AI": "Не отправляется ИИ", "Constant": "Постоянно", "Selective": "Выборочно", "Before Char": "Перед Персонажем", "After Char": "После Персонажа", "Insertion Order": "Порядок внесения", - "Tokens:": "Токены", + "Tokens:": "Токены:", "Disable": "Отключено", - "${characterName}": "${имяПерсонажа}", + "${characterName}": "${characterName}", "CHAR": "ПЕРСОНАЖ", - "is typing": "Печатает...", + "is typing": "печатает...", "Back to parent chat": "Вернуться в основной чат", "Save bookmark": "Сохранить закладку", "Convert to group": "Превратить в группу", @@ -429,18 +429,18 @@ "Regenerate": "Повторная генерация", "PNG": "PNG", "JSON": "JSON", - "presets": "Предустановки", + "presets": "Пресеты", "Message Sound": "Звук сообщения", - "Author's Note": "Авторские заметки", - "Send Jailbreak": "Отправлять JailBreak", + "Author's Note": "Пометки автора", + "Send Jailbreak": "Отправлять джейлбрейк", "Replace empty message": "Заменять пустые сообщения", "Send this text instead of nothing when the text box is empty.": "Этот текст будет отправлен в случае отсутствия текста на отправку.", - "NSFW avoidance prompt": "Инструкции для избегания NSFW", - "Prompt that is used when the NSFW toggle is off": "Инструкции, используемые, когда поощрение NSFW отключено", + "NSFW avoidance prompt": "Анти-NSFW промпт", + "Prompt that is used when the NSFW toggle is off": "Промпт, применяемый, когда поощрение NSFW отключено", "Advanced prompt bits": "Дополнительные инструкции", - "World Info format": "Шаблон форматирования Информации о мире", + "World Info format": "Шаблон форматирования информации о мире", "Wraps activated World Info entries before inserting into the prompt. Use {0} to mark a place where the content is inserted.": "Выделяет активную Информацию о мире перед внесением в инструкции. Используйте {0} чтобы уточнить место с необходимой информацией.", - "Unrestricted maximum value for the context slider": "Неограниченное максимальное значение для ползунка с размером контекста", + "Unrestricted maximum value for the context slider": "Убрать потолок для ползунка контекста. Включайте только если точно знаете, что делаете", "Chat Completion Source": "Источник для Chat Completion", "Avoid sending sensitive information to the Horde.": "Избегайте отправки личной информации Horde", "Review the Privacy statement": "Ознакомиться с заявлением о конфиденциальности", @@ -454,25 +454,25 @@ "KoboldAI Horde": "KoboldAI Horde", "Text Gen WebUI (ooba)": "Text Gen WebUI (ooba)", "NovelAI": "NovelAI", - "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "Дополнение диалога (OpenAI, Claude, Window/OpenRouter, Scale)", - "OpenAI API key": "API-ключ для OpenAI", + "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "Char Completion (OpenAI, Claude, Window/OpenRouter, Scale)", + "OpenAI API key": "Ключ для API OpenAI", "Trim spaces": "Обрезать пробелы", - "Trim Incomplete Sentences": "Обрезать неоконченные предложения", - "Include Newline": "Использовать красную строку", + "Trim Incomplete Sentences": "Удалять неоконченные предложения", + "Include Newline": "Добавлять новую строку", "Non-markdown strings": "Строки без разметки", - "Replace Macro in Sequences": "Заменить макросы в последовательности", - "Presets": "Предустановки", + "Replace Macro in Sequences": "Заменить макросы в строках", + "Presets": "Пресеты", "Separator": "Разделитель", "Start Reply With": "Начинать ответ с", - "Show reply prefix in chat": "Показывать префиксы ответов в чате", - "Worlds/Lorebooks": "Миры/Lorebook-ки", + "Show reply prefix in chat": "Показывать префикс ответов в чате", + "Worlds/Lorebooks": "Миры и лорбуки", "Active World(s)": "Активные миры", "Activation Settings": "Настройки активации", - "Character Lore Insertion Strategy": "Порядок включения сведений", + "Character Lore Insertion Strategy": "Порядок включения лора персонажа", "Sorted Evenly": "Равномерная сортировка", "Active World(s) for all chats": "Активные миры для всех чатов", "-- World Info not found --": "-- Информация о мире не найдена --", - "--- Pick to Edit ---": "--- Редактировать ---", + "--- Pick to Edit ---": "--- Выберите для редактирования ---", "or": "или", "New": "Новый", "Priority": "Приритет", @@ -485,26 +485,26 @@ "Depth ↘": "Глубина ↘", "Order ↗": "Порядок ↗", "Order ↘": "Порядок ↘", - "UID ↗": "Уник. ID ↗", - "UID ↘": "Уник. ID ↘", + "UID ↗": "UID ↗", + "UID ↘": "UID ↘", "Trigger% ↗": "Триггер% ↗", "Trigger% ↘": "Триггер% ↘", "Order:": "Порядок:", "Depth:": "Глубина:", - "Character Lore First": "Сначала сведения о персонаже", - "Global Lore First": "Сначала общие сведения", + "Character Lore First": "Сначала лор персонажа", + "Global Lore First": "Сначала глобальный лор", "Recursive Scan": "Рекурсивное сканирование", "Case Sensitive": "Учитывать регистр", "Match whole words": "Только полное совпадение", "Alert On Overflow": "Оповещение о переполнении", - "World/Lore Editor": "Редактировать Мир/Сведения", - "--- None ---": "---Отсутствует---", - "Comma seperated (ignored if empty)": "Разделение запятыми (не используется, если оставлено пустым)", + "World/Lore Editor": "Редактировать мир или лор", + "--- None ---": "--- Отсутствует ---", + "Comma seperated (ignored if empty)": "Через запятую (не используется, если оставлено пустым)", "Use Probability": "Использовать вероятность", "Exclude from recursion": "Исключить из рекурсии", - "Entry Title/Memo": "Вставьте Название/Заметку", + "Entry Title/Memo": "Название или заметка о записи", "Position:": "Положение:", - "T_Position": "↑Char: Перед определениями Персонажа\n↓Char: После определений Персонажа\n↑AN: Перед Авторскими заметками\n↓AN: После Авторских заметок\n@D: На глубине", + "T_Position": "↑Char: Перед определениями Персонажа\n↓Char: После определений Персонажа\n↑AN: Перед Пометок автора\n↓AN: После Пометок автора\n@D: На глубине", "Before Char Defs": "↑Перс.", "After Char Defs": "↓Перс.", "Before AN": "↑АЗ", @@ -514,35 +514,35 @@ "Probability:": "Вероятность:", "Update a theme file": "Обновить файл темы", "Save as a new theme": "Сохранить как новую тему", - "Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных слов в черном списке для запуска авто-свайпа.", - "Delete Entry": "Удалить запись:", - "User Message Blur Tint": "Сообщение пользователя", - "AI Message Blur Tint": "Сообщение ИИ", + "Minimum number of blacklisted words detected to trigger an auto-swipe": "Минимальное количество обнаруженных запрещённых слов, при котором срабатывает авто-свайп.", + "Delete Entry": "Удалить запись", + "User Message Blur Tint": "Ваши сообщения", + "AI Message Blur Tint": "Сообщения ИИ", "Chat Backgrounds": "Фоны чата", "Chat Background": "Фон чата", - "UI Background": "Фон интерфейса", + "UI Background": "Фон UI", "Mad Lab Mode": "Режим безумца", "Show Message Token Count": "Счетчик токенов сообщения", "Compact Input Area (Mobile)": "Компактная зона ввода", "Zen Sliders": "Дзен слайдеры", - "UI Border": "Границы интерфейса", + "UI Border": "Границы UI", "Chat Style:": "Стиль чата", "Chat Width (PC)": "Ширина чата (для ПК)", "Chat Timestamps": "Временные метки в чате", "Tags as Folders": "Теги как папки", "Chat Truncation": "Усечение чата", "(0 = unlimited)": "(0 = неограниченное)", - "Streaming FPS": "Потоковый FPS", + "Streaming FPS": "FPS для стриминга", "Gestures": "Жесты", "Message IDs": "ID сообщений", - "Prefer Character Card Prompt": "Предпочитать инструкции из Карточки Персонажа", - "Prefer Character Card Jailbreak": "Предпочитать Джеилбреик из Карточки Персонажа", - "Press Send to continue": "Нажатие 'Отправить' для продолжения", - "Quick 'Continue' button": "Кнопка быстрого 'Продолжения'", - "Log prompts to console": "Выводы журнала в консоли", + "Prefer Character Card Prompt": "Предпочитать промпт из карточки персонажа", + "Prefer Character Card Jailbreak": "Предпочитать джейлбрейк из карточки керсонажа", + "Press Send to continue": "Кнопка отправки продолжает сообщение", + "Quick 'Continue' button": "Кнопка быстрого продолжения", + "Log prompts to console": "Выводить промпты в консоль", "Never resize avatars": "Никогда не менять размер аватаров", "Show avatar filenames": "Показывать названия файлов аватаров", - "Import Card Tags": "Импорт тегов Карточки", + "Import Card Tags": "Импорт тегов карточки", "Confirm message deletion": "Подтверждение удаления сообщений", "Spoiler Free Mode": "Режим без спойлеров", "Auto-swipe": "Автоматические свайпы", @@ -550,7 +550,7 @@ "Blacklisted words": "Запрещенные слова", "Blacklisted word count to swipe": "Количество запрещенных слов для свайпа", "Reload Chat": "Перезагрузить чат", - "Search Settings": "Поиск настроек", + "Search Settings": "Поиск по настройкам", "Disabled": "Отключено", "Automatic (PC)": "Автоматическое (ПК)", "Enabled": "Включено", @@ -569,54 +569,54 @@ "Show sequential message numbers in the chat log": "Показывать порядковые номера сообщений в журнале чата.", "Show the number of tokens in each message in the chat log": "Показать количество токенов в каждом сообщении в журнале чата.", "Single-row message input area. Mobile only, no effect on PC": "Однорядная область ввода сообщений. Только для мобильных устройств, на ПК не работает.", - "In the Character Management panel, show quick selection buttons for favorited characters": "На панели управления персонажами отображають кнопки быстрого выбора для избранных персонажей.", + "In the Character Management panel, show quick selection buttons for favorited characters": "На панели управления персонажами будут отображены кнопки быстрого выбора для избранных персонажей.", "Show tagged character folders in the character list": "Отобразить теговые папки с персонажами в списке персонажей.", "Play a sound when a message generation finishes": "Воспроизведение звука при завершении генерации сообщения.", "Only play a sound when ST's browser tab is unfocused": "Воспроизводить звук только тогда, когда вкладка браузера ST не выбрана.", "Reduce the formatting requirements on API URLs": "Снижение требований к форматированию URL-адресов API.", - "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "Запросить импорт информации о мире/Lorebook для каждого нового персонажа со встроенным Lorebook. Если флажок снят, вместо этого будет показано короткое сообщение.", + "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "Спрашивать разрешение на импорт лорбука для всех персонажей со встроенным лорбуком. При выключенной опции вместо этого будет показываться короткое сообщение", "Restore unsaved user input on page refresh": "Восстановление несохраненного пользовательского запроса при обновлении страницы.", - "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "Позволяет изменять положение некоторых элементов пользовательского интерфейса путем их перетаскивания. Только для ПК, на мобильных не работает.", - "MovingUI preset. Predefined/saved draggable positions": "Предварительная настройка MovingUI. Предопределенные/сохраненные позиции для перетаскивания.", - "Save movingUI changes to a new file": "Сохранение изменений перемещаемого пользовательского интерфейса в новый файл.", - "Apply a custom CSS style to all of the ST GUI": "Применить пользовательский стиль CSS ко всем элементам графического интерфейса ST.", - "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "Использовать нечеткое сопоставление и искать символы в списке по всем полям данных, а не только по подстроке имени.", - "If checked and the character card contains a prompt override (System Prompt), use that instead": "Если установлен флажок и карточка персонажа содержит переопределение подсказки (Системная подсказка), будет использована она вместо изначальной.", - "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "Если установлен флажок и карточка персонажа содержит переопределение джейлбрейка (инструкция Истории сообщений), будет использована он вместо изначального.", - "Avoid cropping and resizing imported character images. When off, crop/resize to 400x600": "Избегать обрезки и изменения размера импортированных изображений персонажей. Если выключено, обрезать/изменить размер до 400x600.", - "Show actual file names on the disk, in the characters list display only": "Отображение фактических имен файлов на диске, только в списке персонажей.", - "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "Запрос на импорт встроенных тегов карт при импорте персонажей. В противном случае встроенные теги игнорируются.", - "Hide character definitions from the editor panel behind a spoiler button": "Скрыть определения персонажей из панели редактора за кнопкой спойлера.", - "Show a button in the input area to ask the AI to continue (extend) its last message": "Показать кнопку в области ввода, чтобы попросить ИИ продолжить (продлить) его последнее сообщение.", + "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "Позволяет перемещать некоторые элементы интерфейса путем их перетаскивания. Только для ПК, на телефонах не работает.", + "MovingUI preset. Predefined/saved draggable positions": "Пресет для MovingUI. Предопределенные/сохраненные позиции для перетаскивания.", + "Save movingUI changes to a new file": "Сохранение изменений MovingUI в новый файл.", + "Apply a custom CSS style to all of the ST GUI": "Применять пользовательский CSS ко всему интерфейсу Таверны.", + "Use fuzzy matching, and search characters in the list by all data fields, not just by a name substring": "Искать персонажей по всем полям данных, а не только по имени.", + "If checked and the character card contains a prompt override (System Prompt), use that instead": "При включении этой опции, системный промпт будет заменяться кастомным промптом из карточки (при его наличии).", + "If checked and the character card contains a jailbreak override (Post History Instruction), use that instead": "При включении этой опции, пользовательский джейлбрейк будет заменяться кастомным джейлбрейком из карточки (при его наличии).", + "Avoid cropping and resizing imported character images. When off, crop/resize to 400x600": "Не растягивать и не обрезать изображения импортируемых персонажей. При выключении опции, изображения будут всегда приводиться к размеру 400x600.", + "Show actual file names on the disk, in the characters list display only": "Отображение названий файлов персонажей на диске, только в списке персонажей.", + "Prompt to import embedded card tags on character import. Otherwise embedded tags are ignored": "Запрашивать разрешения на импорт встроенных тегов карт при импорте персонажей. В противном случае встроенные теги игнорируются.", + "Hide character definitions from the editor panel behind a spoiler button": "Спрятать определения персонажей из панели редактора за кнопку спойлера.", + "Show a button in the input area to ask the AI to continue (extend) its last message": "Показывать на форме ответа кнопку, по нажатии на которую ИИ продолжит своё предыдущее сообщение.", "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "Показывать кнопки со стрелками на последнем сообщении в чате, чтобы генерировать альтернативные ответы ИИ. Как для ПК, так и для мобильных устройств.", "Allow using swiping gestures on the last in-chat message to trigger swipe generation. Mobile only, no effect on PC": "Позволяет использовать жесты смахивания на последнем сообщении в чате, чтобы вызвать альтернативную генерацию. Только для мобильных устройств, на ПК не работает.", - "Save edits to messages without confirmation as you type": "Сохранять правки в сообщениях без подтверждения при вводе текста.", + "Save edits to messages without confirmation as you type": "Сохранять правки в сообщениях без подтверждения по мере ввода текста.", "Render LaTeX and AsciiMath equation notation in chat messages. Powered by KaTeX": "Отображение нотации уравнений LaTeX и AsciiMath в сообщениях чата. При поддержке KaTeX.", - "Disalow embedded media from other domains in chat messages": "Запретить встроенные медиафайлы из других доменов в сообщениях чата.", + "Disalow embedded media from other domains in chat messages": "Запретить в сообщениях чата встроенные медиафайлы из других доменов.", "Skip encoding and characters in message text, allowing a subset of HTML markup as well as Markdown": "Не кодировать символы < и > в тексте сообщения, что позволяет использовать подмножество HTML-разметки, а также Markdown.", - "Allow AI messages in groups to contain lines spoken by other group members": "Разрешить в групповых сообщениях AI содержать реплики, произнесенные другими членами группы.", + "Allow AI messages in groups to contain lines spoken by other group members": "Разрешить ИИ в группах генерировать строчки за других участников группы в своих сообщениях.", "Requests logprobs from the API for the Token Probabilities feature": "Запросить логпробы из API для функции Token Probabilities.", "Automatically reject and re-generate AI message based on configurable criteria": "Автоматическое отклонение и повторная генерация сообщений AI на основе настраиваемых критериев.", - "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить функцию автоматического пролистывания. Настройки в этом разделе действуют только при включенном автопролистывании.", + "Enable the auto-swipe function. Settings in this section only have an effect when auto-swipe is enabled": "Включить авто-свайп. Настройки в этом разделе действуют только при включенном авто-свайпе.", "If the generated message is shorter than this, trigger an auto-swipe": "Если сгенерированное сообщение короче этого значения, срабатывает авто-свайп.", "Reload and redraw the currently open chat": "Перезагрузить и перерисовать открытый в данный момент чат.", "Auto-Expand Message Actions": "Развернуть контекстные элементы", "Not Connected": "Не подключено", - "Persona Management": "Управление Персоной", - "Persona Description": "Описание Персоны", - "Your Persona": "Ваша Персона", - "Show notifications on switching personas": "Показывать уведомления о смене персоны", + "Persona Management": "Управление персоной", + "Persona Description": "Описание персоны", + "Your Persona": "Ваша персона", + "Show notifications on switching personas": "Показывать уведомления при смене персоны", "Blank": "Пустой", - "In Story String / Chat Completion: Before Character Card": "В строке истории / Дополнение диалога: Перед Карточкой Персонажа", - "In Story String / Chat Completion: After Character Card": "В строке истории / Дополнение диалога: После Карточки Персонажа", - "In Story String / Prompt Manager": "В строке истории/Менеджер подсказок", - "Top of Author's Note": "Перед Авторскими Заметками", - "Bottom of Author's Note": "После Авторских Заметок", - "How do I use this?": "Как мне это использовать?", - "More...": "Узнать больше...", + "In Story String / Chat Completion: Before Character Card": "В строке истории / в Chat Completion: Перед карточкой персонажа", + "In Story String / Chat Completion: After Character Card": "В строке истории / в Chat Completion: После карточки персонажа", + "In Story String / Prompt Manager": "В строке истории / Менеджер промптов", + "Top of Author's Note": "Перед Заметками автора", + "Bottom of Author's Note": "После Заметок автора", + "How do I use this?": "Как пользоваться?", + "More...": "Ещё...", "Link to World Info": "Ссылка на информацию о мире", - "Import Card Lore": "Импортировать Карточку Сведений", - "Scenario Override": "Замещение сценария", + "Import Card Lore": "Импортировать лор карточки", + "Scenario Override": "Перезапись сценария", "Rename": "Переименовать", "Character Description": "Описание персонажа", "Creator's Notes": "Заметки создателя", @@ -624,114 +624,113 @@ "Z-A": "Z-A", "Newest": "Новейшие", "Oldest": "Старейшие", - "Favorites": "Любимые", + "Favorites": "Избранные", "Recent": "Последние", "Most chats": "Больше всего чатов", "Least chats": "Меньше всего чатов", "Back": "Назад", - "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "Замещение инструкций (Для OpenAI/Claude/Scale API, Window/OpenRouter, и Режима Instruct)", - "Insert {{original}} into either box to include the respective default prompt from system settings.": "Внесите {{original}} в любое поле для внесения стандартных инструкций из системных настроек", - "Main Prompt": "Главные инструкции", - "Jailbreak": "Jailbreak", - "Creator's Metadata (Not sent with the AI prompt)": "Сведения о создателе (не отправляются ИИ с инструкциями)", - "Everything here is optional": "Всё в данных полях опционально", - "Created by": "Создано", - "Character Version": "Версия Персонажа", - "Tags to Embed": "Теги для встраивания", + "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "Перезапись промпта (Для OpenAI/Claude/Scale API, Window/OpenRouter, и режима Instruct)", + "Insert {{original}} into either box to include the respective default prompt from system settings.": "Введите {{original}} в любое поле, чтобы использовать соответствующий промпт из системных настроек", + "Main Prompt": "Основной промпт", + "Jailbreak": "Джейлбрейк", + "Creator's Metadata (Not sent with the AI prompt)": "Метаданные (не отправляются ИИ)", + "Everything here is optional": "Все поля необязательные", + "Created by": "Автор", + "Character Version": "Версия персонажа", + "Tags to Embed": "Встраиваемые теги", "How often the character speaks in group chats!": "Как часто персонаж говорит в групповых чатах", - "Important to set the character's writing style.": "Важные замечания для стиля написания персонажа", + "Important to set the character's writing style.": "Серьёзно влияет на стиль письма персонажа.", "ATTENTION!": "ВНИМАНИЕ!", - "Samplers Order": "Порядок семплирования", - "Samplers will be applied in a top-down order. Use with caution.": "Семплирование будет применено в порядке сверху-вниз. Используйте с осторожностью.", - "Repetition Penalty": "Наказание за повторы", - "Rep. Pen. Range.": "Размер наказания за повторы", - "Rep. Pen. Freq.": "Частота наказания за повторы", - "Rep. Pen. Presence": "Наличие наказания за повторы", + "Samplers Order": "Порядок сэмплеров", + "Samplers will be applied in a top-down order. Use with caution.": "Сэмплеры будут применяться в порядке от верхнего к нижнему. Используйте с осторожностью.", + "Repetition Penalty": "Штраф за повторы", + "Rep. Pen. Range.": "Диапазон поиска повторов", + "Rep. Pen. Freq.": "Частота штрафа за повторы", + "Rep. Pen. Presence": "Наличие штрафа за повторы", "Enter it in the box below:": "Введите в поле ниже:", "separate with commas w/o space between": "разделять запятыми без пробела", "Document": "Документ", "Suggest replies": "Предлагать ответы", "Show suggested replies. Not all bots support this.": "Показывать предлагаемые ответы. Не все боты поддерживают это.", - "Use 'Unlocked Context' to enable chunked generation.": "Использовать 'Безлимитный контекст' для активации кусочной генерации", + "Use 'Unlocked Context' to enable chunked generation.": "Использовать 'Неограниченный контекст' для активации кусочной генерации", "It extends the context window in exchange for reply generation speed.": "Увеличивает размер контекста в обмен на скорость генерации.", "Continue": "Продолжить", "CFG Scale": "Масштаб CFG", "Editing:": "Изменения", - "AI reply prefix": "Префикс Ответ ИИ", - "Custom Stopping Strings": "Настройка ограничивающий нитей", - "JSON serialized array of strings": "JSON ориентированный набор нитей", - "words you dont want generated separated by comma ','": "Слова, которые вы не хотите генерировать, разделяются запятыми ','", - "Extensions URL": "URL расширений ", - "API Key": "Ключ API", + "AI reply prefix": "Префикс для ответа ИИ", + "Custom Stopping Strings": "Стоп-строки", + "JSON serialized array of strings": "Список строк в формате JSON", + "words you dont want generated separated by comma ','": "слова, которые вы не хотите генерировать, через запятую ','", + "Extensions URL": "URL расширений", + "API Key": "Ключ от API", "Enter your name": "Введите свое имя", "Name this character": "Назовите этого персонажа", "Search / Create Tags": "Искать / Создать тэги", - "Describe your character's physical and mental traits here.": "Опишите ментальные и физические черты персонажа здесь", - "This will be the first message from the character that starts every chat.": "Это булет первое сообщение от Персонажа при начале нового чата", - "Chat Name (Optional)": "Название Чата (Необязательно)", - "Filter...": "Отфильтровать...", + "Describe your character's physical and mental traits here.": "Опишите ментальные и физические черты персонажа", + "This will be the first message from the character that starts every chat.": "Это будет первое сообщение от персонажа при начале нового чата", + "Chat Name (Optional)": "Название чата (необязательно)", + "Filter...": "Фильтры...", "Search...": "Поиск...", "Any contents here will replace the default Main Prompt used for this character. (v2 spec: system_prompt)": "Все содержание этой ячейки будет заменять стандартный Промт", "Any contents here will replace the default Jailbreak Prompt used for this character. (v2 spec: post_history_instructions)": "Все содержание этой ячейки будет заменять стандартный Джейлбрейк", - "(Botmaker's name / Contact Info)": "Ваше имя / Контакты", - "(If you want to track character versions)": "Если вы хотите отслеживать модель персонажа", - "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "Опишите Персонажа, дайте советы, или упомяните на каких моделях он был протестирован", - "(Write a comma-separated list of tags)": "Запишите лист тэгов, разделяя запятой", - "(A brief description of the personality)": "Краткое описание личности)", - "(Circumstances and context of the interaction)": "(Обстоятельства и контекст этого взаимодействия)", + "(Botmaker's name / Contact Info)": "(Имя автора / Контакты)", + "(If you want to track character versions)": "Если вы хотите отслеживать версии персонажа", + "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(Описание персонажа, советы по использованию, список моделей, на которых он тестировался. Информация будет отображаться в списке персонажей)", + "(Write a comma-separated list of tags)": "(Список тегов через запятую)", + "(A brief description of the personality)": "(Краткое описание личности)", + "(Circumstances and context of the interaction)": "(Обстоятельства и контекст этого диалога)", "(Examples of chat dialog. Begin each example with START on a new line.)": "(Примеры диалога. Начинайте каждый пример с START или новой линией.)", - "Injection text (supports parameters)": "Текст включения (Поддерживает параметры)", - "Injection depth": "Глубина включения", + "Injection text (supports parameters)": "Текст для инжекта (поддерживает параметры)", + "Injection depth": "Глубина инжекта", "Type here...": "Пишите здесь...", - "Comma separated (required)": "Разделять через запятую (Обязательное)", - "Comma separated (ignored if empty)": "Разделять через запятую (Игнорируется если пусто)", + "Comma separated (required)": "Через запятую (обязательное поле)", + "Comma separated (ignored if empty)": "Через запятую (пустое поле игнорируется)", "What this keyword should mean to the AI, sent verbatim": "Что это ключевое слово должно означать для ИИ, отправляется дословно", - "Filter to Character(s)": "Фильтр к персонажу(ам)", - "Character Exclusion": "Исключение персонажей", - "Inclusion Group": "Инклюзивная группа", - "Only one entry with the same label will be activated": "Будет актив. только одна запись с одинаковой меткой", - "-- Characters not found --": "-- Персонаж не найден --", + "Filter to Character(s)": "Фильтр по персонажу(ам)", + "Character Exclusion": "Исключить персонажей", + "Inclusion Group": "Включить персонажей", + "Only one entry with the same label will be activated": "Будет активна только одна запись с одинаковой меткой", + "-- Characters not found --": "-- Персонажей не найдено --", "Not sent to the AI": "Не отправляется ИИ", "(This will be the first message from the character that starts every chat)": "(Это будет первое сообщение от персонажа, когда вы начинаете новый чат)", - "Not connected to API!": "Нет подключения к API", - "AI Response Configuration": "Еастройка Ответа ИИ", - "AI Configuration panel will stay open": "Панель Настройки ИИ останется открытой", - "Update current preset": "Обновить текущую настройку", - "Create new preset": "Создать новую настройку", - "Import preset": "Импорт предустановки", - "Export preset": "Экспорт предустановки", - "Delete the preset": "Удалить предустановку", - "Auto-select this preset for Instruct Mode": "Автоматический выбор этой предустановки для режима 'Инструктаж'.", - "Auto-select this preset on API connection": "Автоматический выбор этой предустановки при подключении к API.", - "NSFW block goes first in the resulting prompt": "НСФВ блокировка идет первой при отправки Промта", - "Enables OpenAI completion streaming": "Включить процесс генерации OpenAI", - "Wrap user messages in quotes before sending": "Заключить ответ Пользователя в кавычки", - "Restore default prompt": "Восстановить станндартный промт", - "New preset": "Новая настройка", - "Delete preset": "Удалить настройку", + "AI Response Configuration": "Настройка ответа ИИ", + "AI Configuration panel will stay open": "Панель настройки ИИ останется открытой", + "Update current preset": "Обновить текущий пресет", + "Create new preset": "Создать новый пресет", + "Import preset": "Импортировать пресет", + "Export preset": "Экспортировать пресет", + "Delete the preset": "Удалить пресет", + "Auto-select this preset for Instruct Mode": "Автоматический выбор этого пресета для режима Instruct.", + "Auto-select this preset on API connection": "Автоматический выбор этого пресета при подключении к API.", + "NSFW block goes first in the resulting prompt": "Блок NSFW идёт первым при отправке промпта", + "Enables OpenAI completion streaming": "Включить стриминг OpenAI", + "Wrap user messages in quotes before sending": "Перед отправкой заключать ответ пользователя в кавычки", + "Restore default prompt": "Восстановить станндартный промпт", + "New preset": "Новый пресет", + "Delete preset": "Удалить пресет", "Restore default jailbreak": "Восстановить стандартный джейлбрейк", "Restore default reply": "Восстановить стандартный ответ", "Restore defaul note": "Восстановить стандартную заметку", - "API Connections": "Соединения API", + "API Connections": "Соединения с API", "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "Может помочь с плохими ответами ставя в очередь только подтвержденных работников. Может замедлить время ответа.", - "Clear your API key": "Очистить свои ключи API", + "Clear your API key": "Очистите свой ключ от API", "Refresh models": "Обновить модели", "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "Получите свой OpenRouter API токен используя OAuth. У вас будет открыта вкладка openrouter.ai", - "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "Подверждает ваше соединение к API. Знайте, что за это снимут деньги с вашего счета.", + "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "Проверка работоспособности вашего соединения с API. Знайте, что оно будет отправлено от вашего лица.", "Create New": "Создать новое", "Edit": "Изменить", - "Locked = World Editor will stay open": "Закреплено = Редактирование Мира останется открытым", - "Entries can activate other entries by mentioning their keywords": "Записи могут активировать другие записи если в них содержаться ключевые слова", + "Locked = World Editor will stay open": "Закреплено = Редактор мира останется открытым", + "Entries can activate other entries by mentioning their keywords": "Записи могут активировать другие записи, если в них содержатся ключевые слова", "Lookup for the entry keys in the context will respect the case": "Большая буква имеет значение при активации ключевого слова", "If the entry key consists of only one word, it would not be matched as part of other words": "Если ключевое слово состоит только из одного слова, оно не будет активироваться как часть других слов", - "Open all Entries": "Открыть все Записи", - "Close all Entries": "Закрыть все Записи", + "Open all Entries": "Открыть все записи", + "Close all Entries": "Закрыть все записи", "Create": "Создать", - "Import World Info": "Импортировать Мир", - "Export World Info": "Экспортировать Мир", - "Delete World Info": "Удалить Мир", - "Duplicate World Info": "Дублировать Мир", - "Rename World Info": "Переименовать Мир", + "Import World Info": "Импортировать мир", + "Export World Info": "Экспортировать мир", + "Delete World Info": "Удалить мир", + "Duplicate World Info": "Дублировать мир", + "Rename World Info": "Переименовать мир", "Refresh": "Обновить", "Primary Keywords": "Основные ключевые слова", "Logic": "Логика", @@ -740,74 +739,74 @@ "NOT ALL": "НЕ ВСЕ", "NOT ANY": "НЕ ЛЮБОЙ", "Optional Filter": "Дополнительный фильтр", - "New Entry": "Новая Запись", + "New Entry": "Новая запись", "Fill empty Memo/Titles with Keywords": "Заполните пустые Заметки/Названия ключевыми словами", - "Save changes to a new theme file": "Сохранить изменения в новой теме", + "Save changes to a new theme file": "Сохранить изменения в файл новой темы", "removes blur and uses alternative background color for divs": "убирает размытие и использует альтернативный фон для разделов", "AI Response Formatting": "Формат ответа ИИ", "Change Background Image": "Изменить фон", "Extensions": "Расширения", "Click to set a new User Name": "Нажмите, чтобы задать новое имя пользователя.", - "Click to lock your selected persona to the current chat. Click again to remove the lock.": "Нажмите, чтобы закрепить выбранную персону за текущим чатом. Нажмите еще раз, чтобы снять блокировку.", + "Click to lock your selected persona to the current chat. Click again to remove the lock.": "Нажмите, чтобы закрепить выбранную персону для текущего чата. Нажмите еще раз, чтобы открепить.", "Click to set user name for all messages": "Нажмите, чтобы задать имя пользователя для всех сообщений.", - "Create a dummy persona": "Создать болванку", - "Character Management": "Управление Персонажами", - "Locked = Character Management panel will stay open": "Закреплено = Панель Управление Персонажами останется открытой ", + "Create a dummy persona": "Создать персону-болванку", + "Character Management": "Управление персонажами", + "Locked = Character Management panel will stay open": "Закреплено = Панель управление персонажами останется открытой", "Select/Create Characters": "Выбрать/Создать персонажа", - "Token counts may be inaccurate and provided just for reference.": "Счетчик токенов может быть неточным и используется только для примера", - "Click to select a new avatar for this character": "Нажмите что бы выбрать новый аватар для этого персонажа", + "Token counts may be inaccurate and provided just for reference.": "Счетчик токенов может быть неточным, используйте как ориентир", + "Click to select a new avatar for this character": "Нажмите чтобы выбрать новый аватар для этого персонажа", "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "Пример:\n [{{user}} is a 28-year-old Romanian cat girl.]", "Toggle grid view": "Переключить вид сетки", - "Add to Favorites": "Добавить в Любимые", - "Advanced Definition": "Расширенные Определения", - "Character Lore": "Сведения Персонажа", - "Export and Download": "Экспортировать и Скачать", + "Add to Favorites": "Добавить в Избранное", + "Advanced Definition": "Расширенное определение", + "Character Lore": "Лор персонажа", + "Export and Download": "Экспортировать и скачать", "Duplicate Character": "Дублировать персонажа", "Create Character": "Создать персонажа", "Delete Character": "Удалить персонажа", "View all tags": "Показать все тэги", - "Click to set additional greeting messages": "Нажмите что бы создать дополнительное вступительное сообщение", - "Show / Hide Description and First Message": "Показать/Убрать Описание и Первое сообщение", - "Click to select a new avatar for this group": "Нажмите что бы выбрать новый аватар для этого группового чата", - "Set a group chat scenario": "Создать сценарий для группового чата", - "Restore collage avatar": "Восстановить коллаж персонажа", + "Click to set additional greeting messages": "Нажмите чтобы создать дополнительное вступительное сообщение", + "Show / Hide Description and First Message": "Показать / убрать описание и первое сообщение", + "Click to select a new avatar for this group": "Нажмите чтобы выбрать новый аватар для этой группы", + "Set a group chat scenario": "Задать сценарий для группового чата", + "Restore collage avatar": "Восстановить аватар-коллаж", "Create New Character": "Создать нового персонажа", - "Import Character from File": "Внести персонажа из файла", - "Import content from external URL": "Вставить содержимое из внешнего URL", + "Import Character from File": "Импортировать персонажа из файла", + "Import content from external URL": "Импортировать содержимое из внешнего URL", "Create New Chat Group": "Создать новый групповой чат", - "Characters sorting order": "Упорядовачивание порядка персонажа", - "Add chat injection": "Добавить включение в чат", - "Remove injection": "Убрать включение", + "Characters sorting order": "Порядок сортировки персонажей", + "Add chat injection": "Добавить инжект в чат", + "Remove injection": "Убрать инжект", "Remove": "Убрать", - "Select a World Info file for": "Выбрать файл для Информации Мира", - "Primary Lorebook": "Основной Лорбук", - "A selected World Info will be bound to this character as its own Lorebook.": "Информация Мира будет закреплена на персонажем как собственный Лорбук", - "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "Когда ИИ генерирует ответ, в него будет включены заметки из Информации Мира", - "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "Скачивание этого персонажа так же будет включать в себя закрепленный за ним Сведения", - "Additional Lorebooks": "Вспомогательные Сведения", - "Associate one or more auxillary Lorebooks with this character.": "Закрепить этот или еще больше вспомогательных Сведений за этим персонажем", - "NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: Эти выборы необязательные и не будут сохранены при экспорте персонажа", + "Select a World Info file for": "Выбрать файл с миром для", + "Primary Lorebook": "Основного лорбука", + "A selected World Info will be bound to this character as its own Lorebook.": "Информация о мире будет привязана к персонажу как его собственный лорбук", + "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "Когда ИИ генерирует ответ, он будет совмещён с записями из глобально выбранного мира", + "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "При экспорте персонажа вместе с ним также выгрузится выбранный лорбук в виде JSON", + "Additional Lorebooks": "Вспомогательные лорбуки", + "Associate one or more auxillary Lorebooks with this character.": "Привязать к этому персонажу один или больше вспомогательных лорбуков", + "NOTE: These choices are optional and won't be preserved on character export!": "ВНИМАНИЕ: эти выборы необязательные и не будут сохранены при экспорте персонажа!", "Rename chat file": "Переименовать чат", - "Export JSONL chat file": "Создать чат в форме JSONL", - "Download chat as plain text document": "Скачать чат в формте .txt", + "Export JSONL chat file": "Экспортировать чат в формате JSONL", + "Download chat as plain text document": "Скачать чат в формате .txt", "Delete chat file": "Удалить файл этого чата", "Delete tag": "Удалить тэг", "Translate message": "Перевести сообщение", "Generate Image": "Создать изображение", "Narrate": "Повествовать", - "Prompt": "Промт", + "Prompt": "Промпт", "Create Bookmark": "Создать закладку", "Copy": "Скопировать", "Open bookmark chat": "Открыть чат из закладки", "Confirm": "Подтвердить", - "Copy this message": "Скопировать это сообщение", - "Delete this message": "Удалить это сообщение", + "Copy this message": "Скопировать сообщение", + "Delete this message": "Удалить сообщение", "Move message up": "Переместить сообщение вверх", "Move message down": "Переместить сообщение вниз", "Enlarge": "Увеличить", - "Temporarily disable automatic replies from this character": "Временно отключить сообщения от этого персонажа", + "Temporarily disable automatic replies from this character": "Временно отключить автоматические сообщения от этого персонажа", "Enable automatic replies from this character": "Включить автоматическую отправку сообщения этого персонажа", - "Trigger a message from this character": "Активировать сообщение этого персонажа", + "Trigger a message from this character": "Запросить сообщение от этого персонажа", "Move up": "Переместить вверх", "Move down": "Переместить вниз", "View character card": "Посмотреть карточку персонажа", @@ -816,95 +815,95 @@ "Add": "Добавить", "Abort request": "Прекратить генерацию", "Send a message": "Отправить сообщение", - "Ask AI to write your message for you": "Попросить ИИ написать для вас сообщение.", + "Ask AI to write your message for you": "Попросить ИИ написать сообщение за вас", "Continue the last message": "Продолжить текущее сообщение", - "Bind user name to that avatar": "Закрепить имя за этой Персоной", + "Bind user name to that avatar": "Закрепить имя за этим аватаром", "Select this as default persona for the new chats.": "Выберать эту Персону в качестве персоны по умолчанию для новых чатов.", - "Change persona image": "Сменить аватар Персоны.", - "Delete persona": "Удалить Персону.", + "Change persona image": "Сменить аватар персоны", + "Delete persona": "Удалить персону", "Reduced Motion": "Сокращение анимаций", - "Auto-select": "Авто выбор", + "Auto-select": "Авто-выбор", "Automatically select a background based on the chat context": "Автоматический выбор фона в зависимости от контекста чата", "Filter": "Фильтр", - "Exclude message from prompts": "Исключить сообщение из подсказок", + "Exclude message from prompts": "Исключить сообщение из промпта", "Include message in prompts": "Включить сообщение в подсказки", - "Create checkpoint": "Создание контрольной точки", - "Create Branch": "Создать Ветку", + "Create checkpoint": "Создать чекпоинт", + "Create Branch": "Создать ветку", "Embed file or image": "Вставить файл или изображение", - "UI Theme": "Тема пользовательского интерфейса", + "UI Theme": "Тема UI", "This message is invisible for the AI": "Это сообщение невидимо для ИИ", - "Sampler Priority": "Приоритет сэмплера", + "Sampler Priority": "Приоритет сэмплеров", "Ooba only. Determines the order of samplers.": "Только Ooba. Определяет порядок сэмплеров.", "Load default order": "Загрузить стандартный порядок", "Max Tokens Second": "Максимальное количество токенов в секунду", "CFG": "CFG", "No items": "Нет элементов", - "Extras API key (optional)": "Дополнительный ключ API (необязательно)", - "Notify on extension updates": "Уведомлять о обновлениях расширения", - "Toggle character grid view": "Переключить вид сетки персонажа", + "Extras API key (optional)": "Ключ от Extras API (необязательно)", + "Notify on extension updates": "Уведомлять об обновлениях расширений", + "Toggle character grid view": "Изменить вид грида персонажей", "Bulk edit characters": "Массовое редактирование персонажей", "Bulk delete characters": "Массовое удаление персонажей", - "Favorite characters to add them to HotSwaps": "Добавить избранных персонажей в HotSwaps", - "Underlined Text": "Подчеркнутый текст", + "Favorite characters to add them to HotSwaps": "Чтобы включить персонажа в HotSwaps, добавьте его в Избранное", + "Underlined Text": "Подчёркнутый", "Token Probabilities": "Вероятности токенов", "Close chat": "Закрыть чат", "Manage chat files": "Управление файлами чата", "Import Extension From Git Repo": "Импортировать расширение из Git Repository", "Install extension": "Установить расширение", "Manage extensions": "Управление расширениями", - "Tokens persona description": "Описание токенов", + "Tokens persona description": "Токенов", "Most tokens": "Больше всего токенов", "Least tokens": "Меньше всего токенов", "Random": "Случайно", "Skip Example Dialogues Formatting": "Пропустить форматирование примеров диалогов", "Import a theme file": "Импортировать файл темы", "Export a theme file": "Экспортировать файл темы", - "Unlocked Context Size": "Размер разблокированного контекста", - "Display the response bit by bit as it is generated.": "Показывать ответ по битам по мере его генерации.", - "When this is off, responses will be displayed all at once when they are complete.": "Когда это отключено, ответы будут отображаться сразу после завершения.", - "Quick Prompts Edit": "Быстрое редактирование подсказок", - "Enable OpenAI completion streaming": "Включить потоковое завершение OpenAI", + "Unlocked Context Size": "Неограниченный размер контекста", + "Display the response bit by bit as it is generated.": "Выводить текст последовательно по мере его генерации.", + "When this is off, responses will be displayed all at once when they are complete.": "Если параметр выключен, ответы будут отображаться сразу целиком, и только после полного завершения генерации.", + "Quick Prompts Edit": "Быстрое редактирование промптов", + "Enable OpenAI completion streaming": "Включить стриминг OpenAI", "Main": "Главное", - "Utility Prompts": "Подсказки утилиты", + "Utility Prompts": "Служебные промпты", "Add character names": "Добавить имена персонажей", "Send names in the message objects. Helps the model to associate messages with characters.": "Отправить имена в объектах сообщений. Помогает модели ассоциировать сообщения с персонажами.", - "Continue prefill": "Продолжить предварительное заполнение", + "Continue prefill": "Префилл для продолжения", "Continue sends the last message as assistant role instead of system message with instruction.": "Продолжение отправляет последнее сообщение в роли ассистента, а не системное сообщение с инструкцией.", - "Squash system messages": "Объединять системные сообщения", + "Squash system messages": "Склеивать сообщения системыы", "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "Объединяет последовательные системные сообщения в одно (за исключением примеров диалогов). Может улучшить согласованность для некоторых моделей.", "Send inline images": "Отправлять встроенные изображения", - "Assistant Prefill": "Предварительное заполнение ассистента", + "Assistant Prefill": "Префилл от ассистента", "Start Claude's answer with...": "Начать ответ Клода с...", - "Use system prompt (Claude 2.1+ only)": "Использовать системную подсказку (только Claude 2.1+)", - "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "Отправлять системную подсказку для поддерживаемых моделей. Если отключено, сообщение пользователя добавляется в начало подсказки.", - "Prompts": "Подсказки", + "Use system prompt (Claude 2.1+ only)": "Использовать системный промпт (только Claude 2.1+)", + "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "Отправлять системный промпт для поддерживаемых моделей. Если отключено, сообщение пользователя добавляется в начало промпта.", + "Prompts": "Промпты", "Total Tokens:": "Всего токенов:", - "Insert prompt": "Вставить подсказку", - "Delete prompt": "Удалить подсказку", - "Import a prompt list": "Импортировать список подсказок", - "Export this prompt list": "Экспортировать этот список подсказок", + "Insert prompt": "Вставить промпт", + "Delete prompt": "Удалить промпт", + "Import a prompt list": "Импортировать список промптов", + "Export this prompt list": "Экспортировать этот список промпт", "Reset current character": "Сбросить текущего персонажа", - "New prompt": "Новая подсказка", - "Tokens": "Токены", - "Want to update?": "Хотите обновить SillyTavern?", + "New prompt": "Новый промпт", + "Tokens": "токенов", + "Want to update?": "Хотите обновиться?", "How to start chatting?": "Как начать общение?", - "Click": "Нажмите ", + "Click": "Нажмите", "and select a": " и выберите", "Chat API": "API чата", - "and pick a character": " и выберите персонажа", + "and pick a character": "и выберите персонажа", "in the chat bar": " в поле чата", "Confused or lost?": "Запутались или потерялись?", "click these icons!": "нажмите на эти значки!", "SillyTavern Documentation Site": "Сайт документации SillyTavern", - "Extras Installation Guide": "Руководство по установке дополнительных возможностей", - "Still have questions?": "Есть еще вопросы?", - "Join the SillyTavern Discord": "Присоединяйтесь к SillyTavern Discord", - "Post a GitHub issue": "Опубликуйте проблему на GitHub", + "Extras Installation Guide": "Руководство по установке Extras", + "Still have questions?": "Остались вопросы?", + "Join the SillyTavern Discord": "Заходите на сервер SillyTavern в Discord", + "Post a GitHub issue": "Опубликуйте GitHub issue", "Contact the developers": "Свяжитесь с разработчиками", - "Nucleus Sampling": "Выборка ядра", - "Typical P": "Типичное P", - "Top K Sampling": "Выборка лучших K", - "Top A Sampling": "Выборка лучших A", + "Nucleus Sampling": "Nucleus Sampling", + "Typical P": "Typical P", + "Top K Sampling": "Top K", + "Top A Sampling": "Top A", "Off": "Выключено", "Very light": "Очень легкий", "Light": "Легкий", @@ -914,6 +913,72 @@ "Eta cutoff is the main parameter of the special Eta Sampling technique. In units of 1e-4; a reasonable value is 3. Set to 0 to disable. See the paper Truncation Sampling as Language Model Desmoothing by Hewitt et al. (2022) for details.": "Отсечение эпсилон - основной параметр специальной техники выборки эпсилон. В единицах 1e-4; разумное значение - 3. Установите в 0, чтобы отключить. См. статью Truncation Sampling as Language Model Desmoothing от Хьюитт и др. (2022) для получения подробной информации.", "Learn how to contribute your idle GPU cycles to the Horde": "Узнайте, как внести свой вклад в свои свободные GPU-циклы в орду", "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "Используйте соответствующий токенизатор для моделей Google через их API. Медленная обработка подсказок, но предлагает намного более точный подсчет токенов.", - "Load koboldcpp order": "Загрузить порядок koboldcpp", - "Use Google Tokenizer": "Использовать токенизатор Google" -} \ No newline at end of file + "Load koboldcpp order": "Загрузить порядок из koboldcpp", + "Use Google Tokenizer": "Использовать токенизатор Google", + "koboldcpp API key (optional)": "Ключ от API koboldcpp (необязательно)", + "Reverse Proxy": "Прокси", + "Use Proxy password field instead. This input will be ignored.": "Используйте поле \"Пароль от прокси\". Значение в этом окошке игнорируется", + "Proxy Password": "Пароль от прокси", + "Will be used as a password for the proxy instead of API key.": "Будет использован в качестве пароля от прокси вместо ключа от API", + "Proxy Presets": "Пресеты для прокси", + "Saved addresses and passwords.": "Сохранённые адреса и пароли.", + "Save Proxy": "Сохранить прокси", + "Delete Proxy": "Удалить прокси", + "Proxy Name": "Название прокси", + "This will show up as your saved preset.": "Будет отображено в вашем списке пресетов.", + "Proxy Server URL": "Адрес прокси-сервера", + "MistralAI Model": "Модель MistralAI", + "MistralAI API Key": "Ключ от API MistralAI", + "MakerSuite API Key": "Ключ от API MakerSuite", + "Google Model": "Модель Google", + "Cohere API Key": "Ключ от API Cohere", + "Cohere Model": "Модель Cohere", + "Model Order": "Сортировка моделей OpenRouter", + "Alphabetically": "По алфавиту", + "Price": "По цене (наиболее низкая)", + "Context Size": "По размеру контекста", + "Group by vendors": "Сгруппировать по владельцу", + "Group by vendors Description": "Модели от OpenAI попадут в одну группу, от Anthropic - в другую, и т.д. Можно комбинировать с сортировкой.", + "LEGACY": "УСТАР.", + "Force Instruct Mode formatting": "Включить форматирование для Instruct-режима", + "Force Instruct Mode formatting Description": "Если эта опция включена при активном режиме Instruct, то SillyTavern преобразует промпт в соответствие с настройками расширенного форматирования (кроме системного промпта для instruct). Если опция выключена, промпт форматируется самим OpenRouter.", + "Allow Jailbreak": "Разрешить джейлбрейк", + "System Prompt Wrapping": "Обрамление для системного промпта", + "System Prompt Prefix": "Префикс системного промпта", + "System Prompt Suffix": "Постфикс системного промпта", + "Chat Messages Wrapping": "Обрамление для сообщений в чате", + "User Message Prefix": "Префикс сообщения пользователя", + "User Message Suffix": "Постфикс сообщения пользователя", + "Assistant Message Prefix": "Префикс сообщения ассистента", + "Assistant Message Suffix": "Постфикс сообщения ассистента", + "System Message Prefix": "Префикс сообщения системы", + "System Message Suffix": "Постфикс сообщения системы", + "System same as User": "Для системы то же самое, что и для пользователя", + "Misc. Sequences": "Прочие строки", + "First Assistant Prefix": "Первый префикс ассистента", + "Last Assistant Prefix": "Последний префикс ассистента", + "System Instruction Prefix": "Префикс системной инструкции", + "User Filler Message": "Принудительное сообщение пользователя", + "Permanent": "перманентных", + "Alt. Greetings": "Др. варианты", + "Smooth Streaming": "Плавный стриминг", + "Save checkpoint": "Сохранить чекпоинт", + "Min Activations": "Мин. число активаций", + "Scan chronologically until reached min entries or token budget.": "Сканировать в хронологической последовательности, пока не будет достигнуто мин. число вхождений или не израсходуется бюджет токенов.", + "Max Depth": "Макс. глубина", + "(0 = unlimited, use budget)": "(0 = безграничная, использовать бюджет)", + "Ext. Media": "Внешн. медиа", + "Multiple swipes per generation": "Несколько свайпов на генерацию", + "Set to get deterministic results. Use -1 for random seed.": "Используется для получения предсказуемого результата. Введите -1 для случайного зерна", + "Most tokens have a leading space.": "У большинства токенов в начале пробел.", + "Prompts": "Промпты", + "Text or token ids": "Текст или [идентификаторы токенов]", + "World Info Format Template": "Шаблон форматирования информации о мире", + "Wraps activated World Info entries before inserting into the prompt.": "Дополняет информацию об активном на данный момент мире перед её отправкой в промпт.", + "Doesn't work? Try adding": "Не работает? Попробуйте добавить в конце", + "at the end!": "!", + "Authorize": "Авторизоваться", + "No persona description": "[Нет описания]", + "Not connected to API!": "Нет соединения с API!", + "Type a message, or /? for help": "Введите сообщение, или /? для получения справки по командам" +} From 0b0630344217554b84c4ae6f566b8fb533b78e7f Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:04:31 +0700 Subject: [PATCH 09/17] Small fix --- public/locales/ru-ru.json | 128 +++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/public/locales/ru-ru.json b/public/locales/ru-ru.json index 5aeb74e02..530108758 100644 --- a/public/locales/ru-ru.json +++ b/public/locales/ru-ru.json @@ -915,70 +915,70 @@ "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "Используйте соответствующий токенизатор для моделей Google через их API. Медленная обработка подсказок, но предлагает намного более точный подсчет токенов.", "Load koboldcpp order": "Загрузить порядок из koboldcpp", "Use Google Tokenizer": "Использовать токенизатор Google", - "koboldcpp API key (optional)": "Ключ от API koboldcpp (необязательно)", - "Reverse Proxy": "Прокси", - "Use Proxy password field instead. This input will be ignored.": "Используйте поле \"Пароль от прокси\". Значение в этом окошке игнорируется", - "Proxy Password": "Пароль от прокси", - "Will be used as a password for the proxy instead of API key.": "Будет использован в качестве пароля от прокси вместо ключа от API", - "Proxy Presets": "Пресеты для прокси", - "Saved addresses and passwords.": "Сохранённые адреса и пароли.", - "Save Proxy": "Сохранить прокси", - "Delete Proxy": "Удалить прокси", - "Proxy Name": "Название прокси", - "This will show up as your saved preset.": "Будет отображено в вашем списке пресетов.", - "Proxy Server URL": "Адрес прокси-сервера", - "MistralAI Model": "Модель MistralAI", - "MistralAI API Key": "Ключ от API MistralAI", - "MakerSuite API Key": "Ключ от API MakerSuite", - "Google Model": "Модель Google", - "Cohere API Key": "Ключ от API Cohere", - "Cohere Model": "Модель Cohere", - "Model Order": "Сортировка моделей OpenRouter", - "Alphabetically": "По алфавиту", - "Price": "По цене (наиболее низкая)", - "Context Size": "По размеру контекста", - "Group by vendors": "Сгруппировать по владельцу", - "Group by vendors Description": "Модели от OpenAI попадут в одну группу, от Anthropic - в другую, и т.д. Можно комбинировать с сортировкой.", - "LEGACY": "УСТАР.", - "Force Instruct Mode formatting": "Включить форматирование для Instruct-режима", - "Force Instruct Mode formatting Description": "Если эта опция включена при активном режиме Instruct, то SillyTavern преобразует промпт в соответствие с настройками расширенного форматирования (кроме системного промпта для instruct). Если опция выключена, промпт форматируется самим OpenRouter.", - "Allow Jailbreak": "Разрешить джейлбрейк", - "System Prompt Wrapping": "Обрамление для системного промпта", - "System Prompt Prefix": "Префикс системного промпта", - "System Prompt Suffix": "Постфикс системного промпта", - "Chat Messages Wrapping": "Обрамление для сообщений в чате", - "User Message Prefix": "Префикс сообщения пользователя", - "User Message Suffix": "Постфикс сообщения пользователя", - "Assistant Message Prefix": "Префикс сообщения ассистента", - "Assistant Message Suffix": "Постфикс сообщения ассистента", - "System Message Prefix": "Префикс сообщения системы", - "System Message Suffix": "Постфикс сообщения системы", - "System same as User": "Для системы то же самое, что и для пользователя", - "Misc. Sequences": "Прочие строки", - "First Assistant Prefix": "Первый префикс ассистента", - "Last Assistant Prefix": "Последний префикс ассистента", - "System Instruction Prefix": "Префикс системной инструкции", - "User Filler Message": "Принудительное сообщение пользователя", - "Permanent": "перманентных", - "Alt. Greetings": "Др. варианты", - "Smooth Streaming": "Плавный стриминг", - "Save checkpoint": "Сохранить чекпоинт", - "Min Activations": "Мин. число активаций", - "Scan chronologically until reached min entries or token budget.": "Сканировать в хронологической последовательности, пока не будет достигнуто мин. число вхождений или не израсходуется бюджет токенов.", - "Max Depth": "Макс. глубина", - "(0 = unlimited, use budget)": "(0 = безграничная, использовать бюджет)", - "Ext. Media": "Внешн. медиа", - "Multiple swipes per generation": "Несколько свайпов на генерацию", - "Set to get deterministic results. Use -1 for random seed.": "Используется для получения предсказуемого результата. Введите -1 для случайного зерна", - "Most tokens have a leading space.": "У большинства токенов в начале пробел.", - "Prompts": "Промпты", - "Text or token ids": "Текст или [идентификаторы токенов]", - "World Info Format Template": "Шаблон форматирования информации о мире", - "Wraps activated World Info entries before inserting into the prompt.": "Дополняет информацию об активном на данный момент мире перед её отправкой в промпт.", - "Doesn't work? Try adding": "Не работает? Попробуйте добавить в конце", - "at the end!": "!", - "Authorize": "Авторизоваться", - "No persona description": "[Нет описания]", + "koboldcpp API key (optional)": "Ключ от API koboldcpp (необязательно)", + "Reverse Proxy": "Прокси", + "Use Proxy password field instead. This input will be ignored.": "Используйте поле \"Пароль от прокси\". Значение в этом окошке игнорируется", + "Proxy Password": "Пароль от прокси", + "Will be used as a password for the proxy instead of API key.": "Будет использован в качестве пароля от прокси вместо ключа от API", + "Proxy Presets": "Пресеты для прокси", + "Saved addresses and passwords.": "Сохранённые адреса и пароли.", + "Save Proxy": "Сохранить прокси", + "Delete Proxy": "Удалить прокси", + "Proxy Name": "Название прокси", + "This will show up as your saved preset.": "Будет отображено в вашем списке пресетов.", + "Proxy Server URL": "Адрес прокси-сервера", + "MistralAI Model": "Модель MistralAI", + "MistralAI API Key": "Ключ от API MistralAI", + "MakerSuite API Key": "Ключ от API MakerSuite", + "Google Model": "Модель Google", + "Cohere API Key": "Ключ от API Cohere", + "Cohere Model": "Модель Cohere", + "Model Order": "Сортировка моделей OpenRouter", + "Alphabetically": "По алфавиту", + "Price": "По цене (наиболее низкая)", + "Context Size": "По размеру контекста", + "Group by vendors": "Сгруппировать по владельцу", + "Group by vendors Description": "Модели от OpenAI попадут в одну группу, от Anthropic - в другую, и т.д. Можно комбинировать с сортировкой.", + "LEGACY": "УСТАР.", + "Force Instruct Mode formatting": "Включить форматирование для Instruct-режима", + "Force Instruct Mode formatting Description": "Если эта опция включена при активном режиме Instruct, то SillyTavern преобразует промпт в соответствие с настройками расширенного форматирования (кроме системного промпта для instruct). Если опция выключена, промпт форматируется самим OpenRouter.", + "Allow Jailbreak": "Разрешить джейлбрейк", + "System Prompt Wrapping": "Обрамление для системного промпта", + "System Prompt Prefix": "Префикс системного промпта", + "System Prompt Suffix": "Постфикс системного промпта", + "Chat Messages Wrapping": "Обрамление для сообщений в чате", + "User Message Prefix": "Префикс сообщения пользователя", + "User Message Suffix": "Постфикс сообщения пользователя", + "Assistant Message Prefix": "Префикс сообщения ассистента", + "Assistant Message Suffix": "Постфикс сообщения ассистента", + "System Message Prefix": "Префикс сообщения системы", + "System Message Suffix": "Постфикс сообщения системы", + "System same as User": "Для системы то же самое, что и для пользователя", + "Misc. Sequences": "Прочие строки", + "First Assistant Prefix": "Первый префикс ассистента", + "Last Assistant Prefix": "Последний префикс ассистента", + "System Instruction Prefix": "Префикс системной инструкции", + "User Filler Message": "Принудительное сообщение пользователя", + "Permanent": "перманентных", + "Alt. Greetings": "Др. варианты", + "Smooth Streaming": "Плавный стриминг", + "Save checkpoint": "Сохранить чекпоинт", + "Min Activations": "Мин. число активаций", + "Scan chronologically until reached min entries or token budget.": "Сканировать в хронологической последовательности, пока не будет достигнуто мин. число вхождений или не израсходуется бюджет токенов.", + "Max Depth": "Макс. глубина", + "(0 = unlimited, use budget)": "(0 = безграничная, использовать бюджет)", + "Ext. Media": "Внешн. медиа", + "Multiple swipes per generation": "Несколько свайпов на генерацию", + "Set to get deterministic results. Use -1 for random seed.": "Используется для получения предсказуемого результата. Введите -1 для случайного зерна", + "Most tokens have a leading space.": "У большинства токенов в начале пробел.", + "Prompts": "Промпты", + "Text or token ids": "Текст или [идентификаторы токенов]", + "World Info Format Template": "Шаблон форматирования информации о мире", + "Wraps activated World Info entries before inserting into the prompt.": "Дополняет информацию об активном на данный момент мире перед её отправкой в промпт.", + "Doesn't work? Try adding": "Не работает? Попробуйте добавить в конце", + "at the end!": "!", + "Authorize": "Авторизоваться", + "No persona description": "[Нет описания]", "Not connected to API!": "Нет соединения с API!", "Type a message, or /? for help": "Введите сообщение, или /? для получения справки по командам" } From 83cc09458026baa231c7653cb14398c05e029398 Mon Sep 17 00:00:00 2001 From: sirius422 Date: Thu, 11 Apr 2024 19:51:12 +0800 Subject: [PATCH 10/17] Fix some errors in zh-cn.json and make the translations more concise --- public/locales/zh-cn.json | 451 +++++++++++++++++++------------------- 1 file changed, 226 insertions(+), 225 deletions(-) diff --git a/public/locales/zh-cn.json b/public/locales/zh-cn.json index ce1d8fa65..d48da734d 100644 --- a/public/locales/zh-cn.json +++ b/public/locales/zh-cn.json @@ -4,122 +4,123 @@ "guikoboldaisettings": "KoboldAI 用户界面设置", "novelaipreserts": "NovelAI 预设", "default": "默认", - "openaipresets": "OpenAI 预设", + "openaipresets": "对话补全预设", "text gen webio(ooba) presets": "WebUI(ooba) 预设", "response legth(tokens)": "响应长度(Token)", "select": "选择", "context size(tokens)": "上下文长度(Token)", "unlocked": "已解锁", - "Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "仅选择的模型支持大于 4096 个Token的上下文大小。只有在知道自己在做什么的情况下才增加。", + "Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "只有特定的模型支持超过4096 Tokens的上下文长度。仅在你清楚自己在做什么的情况下再增加这个值。", "rep.pen": "重复惩罚", - "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "WI 输入状态:\n🔵 恒定\n🟢 正常\n❌ 禁用", + "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "条目输入状态:\n🔵 常开\n🟢 触发\n❌ 禁用", "rep.pen range": "重复惩罚范围", "Temperature controls the randomness in token selection": "温度控制Token选择中的随机性:\n- 低温(<1.0)导致更可预测的文本,优先选择高概率的Token。\n- 高温(>1.0)鼓励创造性和输出的多样性,更多地选择低概率的Token。\n将值设置为 1.0 以使用原始概率。", "temperature": "温度", - "Top K sets a maximum amount of top tokens that can be chosen from": "Top K 设置可以从中选择的顶级Token的最大数量。", - "Top P (a.k.a. nucleus sampling)": "Top P(又称核心采样)将所有必需的顶级Token合并到一个特定百分比中。\n换句话说,如果前两个Token代表 25%,而 Top-P 为 0.50,则只考虑这两个Token。\n将值设置为 1.0 以禁用。", - "Typical P Sampling prioritizes tokens based on their deviation from the average entropy of the set": "典型的 P 采样根据它们与集合平均熵的偏差对Token进行优先排序。\n保留概率累积接近指定阈值(例如 0.5)的Token,区分包含平均信息的那些。\n将值设置为 1.0 以禁用。", - "Min P sets a base minimum probability": "Min P 设置基本最小概率。它根据顶级Token的概率进行优化。\n如果顶级Token的概率为 80%,而 Min P 为 0.1,则只考虑概率高于 8% 的Token。\n将值设置为 0 以禁用。", - "Top A sets a threshold for token selection based on the square of the highest token probability": "Top A 根据最高Token概率的平方设置Token选择的阈值。\n如果 Top A 为 0.2,最高Token概率为 50%,则排除概率低于 5% 的Token(0.2 * 0.5^2)。\n将值设置为 0 以禁用。", - "Tail-Free Sampling (TFS)": "无尾采样(TFS)查找分布中概率较低的尾部Token,\n 通过分析Token概率的变化率以及二阶导数。 Token保留到阈值(例如 0.3),取决于统一的二阶导数。\n值越接近 0,被拒绝的Token数量就越多。将值设置为 1.0 以禁用。", - "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "ε 截止设置了一个概率下限,低于该下限的Token将被排除在样本之外。\n以 1e-4 单位;合适的值为 3。将其设置为 0 以禁用。", - "Scale Temperature dynamically per token, based on the variation of probabilities": "根据概率的变化动态地按Token缩放温度。", + "Temperature": "温度", + "Top K sets a maximum amount of top tokens that can be chosen from": "Top K 限定了可供选择的最高概率 Token 的最大数目。", + "Top P (a.k.a. nucleus sampling)": "Top P(又称 nucleus sampling)累加所有需要达到目标百分比的最高概率 Token 。\n例如,如果前两个最高概率标记都是 25%,并且 Top P 设置为 0.50,那么只有这前两个 Token 会被考虑。\n如果将 Top P 设置为 1.0,则表示禁用该功能。", + "Typical P Sampling prioritizes tokens based on their deviation from the average entropy of the set": "典型的 P 采样根据令牌与集合平均熵的偏差来确定令牌的优先级。\n它保留累积概率接近预定义阈值(例如0.5)的令牌,强调那些具有平均信息内容的令牌。\n设置为1.0可禁用该功能。", + "Min P sets a base minimum probability": "最小概率(Min P)设置了一个基本的最小概率。这个概率会根据概率最高的令牌(top token)的概率进行缩放。\n例如,如果概率最高的令牌的概率为80%,且最小概率设置为0.1,则只有概率高于8%的令牌会被考虑。\n将最小概率设置为0可以禁用该功能。", + "Top A sets a threshold for token selection based on the square of the highest token probability": "Top A 根据最高令牌概率的平方设置令牌选择的阈值。\n例如,如果 Top-A 值为0.2,且概率最高的令牌的概率为50%,则概率低于5%(0.2 × 0.5^2)的令牌会被排除在外。\n将 Top A 设置为0可以禁用该功能。", + "Tail-Free Sampling (TFS)": "无尾采样(TFS)查找分布中概率较低的尾部Token,\n 通过分析Token概率的变化率以及二阶导数。Token保留到阈值(例如 0.3),取决于统一的二阶导数。\n值越接近 0,被拒绝的Token数量就越多。将值设置为 1.0 以禁用。", + "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "Epsilon 截止设置了一个概率下限,低于该下限的Token将被排除在样本之外。\n以 1e-4 单位;合适的值为 3。将其设置为 0 以禁用。", + "Scale Temperature dynamically per token, based on the variation of probabilities": "根据概率的变化,动态地调整每个令牌的温度(Temperature)", "Minimum Temp": "最小温度", "Maximum Temp": "最大温度", "Exponent": "指数", "Mirostat Mode": "Mirostat 模式", "Mirostat Tau": "Mirostat Tau", "Mirostat Eta": "Mirostat Eta", - "Variability parameter for Mirostat outputs": "Mirostat 输出的变异性参数。", - "Learning rate of Mirostat": "Mirostat 的学习率。", - "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "对比搜索正则化项的强度。 将值设置为 0 以禁用 CS。", - "Temperature Last": "最后温度", - "Use the temperature sampler last": "最后使用温度采样器。 通常是合理的。\n当启用时:首先进行潜在Token的选择,然后应用温度来修正它们的相对概率(技术上是对数似然)。\n当禁用时:首先应用温度来修正所有Token的相对概率,然后从中选择潜在Token。\n禁用最后的温度。", - "LLaMA / Mistral / Yi models only": "仅限 LLaMA / Mistral / Yi 模型。 确保首先选择适当的分析师。\n结果中不应出现串。\n每行一个串。 文本或 [Token标识符]。\n许多Token以空格开头。 如果不确定,请使用Token计数器。", + "Variability parameter for Mirostat outputs": "Mirostat 输出的可变性参数", + "Learning rate of Mirostat": "Mirostat 的学习率", + "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "对比搜索(Contrastive Search)正则化项的强度。设置为 0 可禁用对比搜索。", + "Temperature Last": "温度采样器后置", + "Use the temperature sampler last": "最后再使用温度采样器。这几乎总是明智的做法。\n当启用时:首先对一组合理的令牌进行采样,然后应用温度来调整它们的相对概率(技术上称为对数概率)。\n当禁用时:首先应用温度来调整所有令牌的相对概率,然后从中采样出合理的令牌。\n禁用会提高分布尾部的概率,这往往会增加得到不连贯响应的几率。", + "LLaMA / Mistral / Yi models only": "仅适用于 LLaMA / Mistral / Yi 模型。请确保首先选择适当的分词器。\n每行输入一个你不希望出现在输出中的序列,可以是文本或 [Token ID]。\n大多数Token前面都有一个空格。如果不确定,请使用Token计数器。", "Example: some text [42, 69, 1337]": "例如:\n一些文本\n[42, 69, 1337]", - "Classifier Free Guidance. More helpful tip coming soon": "免费的分类器指导。 更多有用的提示词即将推出。", + "Classifier Free Guidance. More helpful tip coming soon": "免费的分类器指导。更多有用的提示即将推出。", "Scale": "比例", "GBNF Grammar": "GBNF 语法", "Usage Stats": "使用统计", "Click for stats!": "点击查看统计!", "Backup": "备份", - "Backup your personas to a file": "将您的人设备份到文件中", + "Backup your personas to a file": "将我的角色备份到文件中", "Restore": "恢复", - "Restore your personas from a file": "从文件中恢复您的人设", + "Restore your personas from a file": "从文件中恢复我的角色", "Type in the desired custom grammar": "输入所需的自定义语法", "Encoder Rep. Pen.": "编码器重复惩罚", "Smoothing Factor": "平滑系数", - "No Repeat Ngram Size": "无重复 n-gram 大小", + "No Repeat Ngram Size": "无重复n-gram大小", "Min Length": "最小长度", "OpenAI Reverse Proxy": "OpenAI 反向代理", - "Alternative server URL (leave empty to use the default value).": "备用服务器 URL(留空以使用默认值)。", - "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "在键入任何内容之前,从 API 面板中删除您的真实 OAI API 密钥", - "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "我们无法为使用非官方 OpenAI 代理时遇到的问题提供支持", + "Alternative server URL (leave empty to use the default value).": "备用服务器URL(留空以使用默认值)。", + "Remove your real OAI API Key from the API panel BEFORE typing anything into this box": "在键入任何内容之前,从API面板中删除您的真实OpenAI API密钥", + "We cannot provide support for problems encountered while using an unofficial OpenAI proxy": "我们无法为使用非官方OpenAI代理时遇到的问题提供支持", "Legacy Streaming Processing": "传统流处理", - "Enable this if the streaming doesn't work with your proxy": "如果流媒体与您的代理不兼容,请启用此选项", + "Enable this if the streaming doesn't work with your proxy": "如果流式传输与您的代理不兼容,请启用此选项", "Context Size (tokens)": "上下文长度(Token)", "Max Response Length (tokens)": "最大回复长度(Token)", - "Frequency Penalty": "Frequency Penalty 频率惩罚", - "Presence Penalty": "Presence Penalty 存在惩罚", - "Top-p": "Top-p", + "Frequency Penalty": "频率惩罚", + "Presence Penalty": "存在惩罚", + "Top-p": "Top P", "Display bot response text chunks as they are generated": "生成时显示机器人响应文本片段", "Top A": "Top A", - "Typical Sampling": "Typical Sampling 典型采样", - "Tail Free Sampling": "Tail Free Sampling 无尾采样", - "Rep. Pen. Slope": "Rep. Pen. Slope 重复惩罚斜率", - "Single-line mode": "Single-line 单行模式", + "Typical Sampling": "典型采样", + "Tail Free Sampling": "无尾采样", + "Rep. Pen. Slope": "重复惩罚斜率", + "Single-line mode": "单行模式", "Top K": "Top K", "Top P": "Top P", "Do Sample": "进行采样", - "Add BOS Token": "添加 BOS Token", - "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "在提示词的开头添加 bos_token。 禁用此功能可以使回复更具创意", - "Ban EOS Token": "禁止 EOS Token", - "Ban the eos_token. This forces the model to never end the generation prematurely": "禁止 eos_token。 这将强制模型永远不会提前结束生成", + "Add BOS Token": "添加BOS Token", + "Add the bos_token to the beginning of prompts. Disabling this can make the replies more creative": "在提示词的开头添加BOS Token。禁用此功能可以使回复更具创意", + "Ban EOS Token": "禁止EOS Token", + "Ban the eos_token. This forces the model to never end the generation prematurely": "禁止EOS Token。这将强制模型永远不会提前结束生成", "Skip Special Tokens": "跳过特殊Token", "Beam search": "束搜索", "Number of Beams": "束数量", "Length Penalty": "长度惩罚", "Early Stopping": "提前停止", "Contrastive search": "对比搜索", - "Penalty Alpha": "惩罚 Alpha", + "Penalty Alpha": "惩罚Alpha", "Seed": "Seed 种子", - "Epsilon Cutoff": "Epsilon Cutoff", - "Eta Cutoff": "Eta Cutoff", + "Epsilon Cutoff": "Epsilon截断", + "Eta Cutoff": "Eta截断", "Negative Prompt": "负面提示词", "Mirostat (mode=1 is only for llama.cpp)": "Mirostat(mode=1 仅用于 llama.cpp)", - "Mirostat is a thermostat for output perplexity": "Mirostat 是输出困惑度的恒温器", - "Add text here that would make the AI generate things you don't want in your outputs.": "在这里添加文本,使 AI 生成您不希望在输出中出现的内容。", + "Mirostat is a thermostat for output perplexity": "Mirostat是控制输出困惑度的恒温器", + "Add text here that would make the AI generate things you don't want in your outputs.": "在此处添加可能导致AI生成你不想要的内容的文本。", "Phrase Repetition Penalty": "短语重复惩罚", "Preamble": "序文", "Use style tags to modify the writing style of the output.": "使用样式标签修改输出的写作风格。", "Banned Tokens": "禁用的Token", - "Sequences you don't want to appear in the output. One per line.": "您不希望出现在输出中的序列。 每行一个。", + "Sequences you don't want to appear in the output. One per line.": "您不希望出现在输出中的序列。每行一个。", "AI Module": "AI 模块", "Changes the style of the generated text.": "更改生成文本的样式。", - "Used if CFG Scale is unset globally, per chat or character": "如果 CFG Scal在全局未设置、它将作用于每个聊天或每个角色", - "Inserts jailbreak as a last system message.": "将 jailbreak 插入为最后一个系统消息。", - "This tells the AI to ignore its usual content restrictions.": "这告诉 AI 忽略其通常的内容限制。", - "NSFW Encouraged": "鼓励 NSFW", - "Tell the AI that NSFW is allowed.": "告诉 AI NSFW 是允许的。", - "NSFW Prioritized": "优先考虑 NSFW", - "NSFW prompt text goes first in the prompt to emphasize its effect.": "NSFW 提示词文本首先出现在提示词中以强调其效果。", - "Streaming": "Streaming 流式传输", - "Dynamic Temperature": "Dynamic Temperature 动态温度", + "Used if CFG Scale is unset globally, per chat or character": "如果CFG Scale未在全局设置,此项将作用于每个聊天或角色", + "Inserts jailbreak as a last system message.": "将jailbreak插入为最后一条系统消息。", + "This tells the AI to ignore its usual content restrictions.": "这告诉AI忽略其通常的内容限制。", + "NSFW Encouraged": "鼓励NSFW", + "Tell the AI that NSFW is allowed.": "告诉AI NSFW是允许的。", + "NSFW Prioritized": "优先NSFW", + "NSFW prompt text goes first in the prompt to emphasize its effect.": "NSFW提示词文本首先出现在提示词中以强调其效果。", + "Streaming": "流式传输", + "Dynamic Temperature": "动态温度", "Restore current preset": "恢复当前预设", - "Neutralize Samplers": "Neutralize Samplers 中和采样器", + "Neutralize Samplers": "中和采样器", "Text Completion presets": "文本补全预设", "Documentation on sampling parameters": "有关采样参数的文档", "Set all samplers to their neutral/disabled state.": "将所有采样器设置为中性/禁用状态。", - "Only enable this if your model supports context sizes greater than 4096 tokens": "仅在您的模型支持大于4096个标记的上下文大小时启用此选项", - "Display the response bit by bit as it is generated": "逐位显示生成的响应", + "Only enable this if your model supports context sizes greater than 4096 tokens": "仅在您的模型支持大于4096 Tokens的上下文长度时启用此选项", + "Display the response bit by bit as it is generated": "随着响应的生成,逐步显示结果", "Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "每个请求仅生成一行(仅限KoboldAI,KoboldCpp不支持)。", - "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "禁止序列末尾(EOS)标记(与KoboldCpp一起,可能还有其他与KoboldAI的标记)。", - "Good for story writing, but should not be used for chat and instruct mode.": "适用于写故事,但不应用于聊天和指导模式。", + "Ban the End-of-Sequence (EOS) token (with KoboldCpp, and possibly also other tokens with KoboldAI).": "禁用序列结束(EOS)Token(使用KoboldCpp,可能还包括KoboldAI中的其他Token。", + "Good for story writing, but should not be used for chat and instruct mode.": "适合用于故事写作,但不应用于聊天和指令模式。", "Enhance Definitions": "增强定义", - "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "使用OAI知识库来增强公众人物和已知虚构角色的定义", - "Wrap in Quotes": "用引号括起来", - "Wrap entire user message in quotes before sending.": "在发送之前用引号括起整个用户消息。", - "Leave off if you use quotes manually for speech.": "如果您手动使用引号进行讲话,请省略。", + "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "使用OpenAI知识库来增强对公众人物和已知虚构角色的定义", + "Wrap in Quotes": "用引号包裹", + "Wrap entire user message in quotes before sending.": "在发送之前用引号包裹整个用户消息。", + "Leave off if you use quotes manually for speech.": "如果您手动使用引号包裹对话,请忽略此项。", "Main prompt": "主提示词", "The main prompt used to set the model behavior": "用于设置模型行为的主提示词", "NSFW prompt": "NSFW提示词", @@ -128,26 +129,26 @@ "Prompt that is used when the Jailbreak toggle is on": "在越狱开关打开时使用的提示词", "Impersonation prompt": "冒名顶替提示词", "Prompt that is used for Impersonation function": "用于冒名顶替功能的提示词", - "Logit Bias": "对数偏差", + "Logit Bias": "对数偏置", "Helps to ban or reenforce the usage of certain words": "有助于禁止或加强某些单词的使用", "View / Edit bias preset": "查看/编辑偏置预设", "Add bias entry": "添加偏置条目", - "Jailbreak activation message": "越狱激活消息", + "Jailbreak activation message": "越狱启用消息", "Message to send when auto-jailbreak is on.": "自动越狱时发送的消息。", "Jailbreak confirmation reply": "越狱确认回复", "Bot must send this back to confirm jailbreak": "机器人必须发送此内容以确认越狱", - "Character Note": "角色注记", + "Character Note": "角色注释", "Influences bot behavior in its responses": "影响机器人在其响应中的行为", "Connect": "连接", "Test Message": "发送测试消息", "API": "API", "KoboldAI": "KoboldAI", - "Use Horde": "使用部落", - "API url": "API地址", - "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine(用于OpenAI API的包装器)", - "Register a Horde account for faster queue times": "注册Horde部落帐户以加快排队时间", - "Learn how to contribute your idle GPU cycles to the Hord": "了解如何将闲置的GPU周期贡献给部落", - "Adjust context size to worker capabilities": "根据工作人员的能力调整上下文大小", + "Use Horde": "使用 Horde", + "API url": "API URL", + "PygmalionAI/aphrodite-engine": "PygmalionAI/aphrodite-engine (OpenAI API wrapper 模式)", + "Register a Horde account for faster queue times": "注册Horde帐户以减少排队时间", + "Learn how to contribute your idle GPU cycles to the Hord": "了解如何将闲置的GPU算力贡献给Horde", + "Adjust context size to worker capabilities": "根据工作人员的能力调整上下文长度", "Adjust response length to worker capabilities": "根据工作人员的能力调整响应长度", "API key": "API密钥", "Tabby API key": "Tabby API密钥", @@ -168,7 +169,7 @@ "For privacy reasons": "出于隐私考虑", "Models": "模型", "Hold Control / Command key to select multiple models.": "按住Control / Command键选择多个模型。", - "Horde models not loaded": "部落模型未加载", + "Horde models not loaded": "Horde模型未加载", "Not connected...": "未连接...", "Novel API key": "Novel AI API密钥", "Follow": "跟随", @@ -181,16 +182,16 @@ "Make sure you run it with": "确保您用以下方式运行它", "flag": "标志", "API key (optional)": "API密钥(可选)", - "Server url": "服务器地址", + "Server url": "服务器URL", "Custom model (optional)": "自定义模型(可选)", "Bypass API status check": "绕过API状态检查", "Mancer AI": "Mancer AI", "Use API key (Only required for Mancer)": "使用API密钥(仅Mancer需要)", - "Blocking API url": "阻止API地址", + "Blocking API url": "阻止API URL", "Example: 127.0.0.1:5000": "示例:127.0.0.1:5000", "Legacy API (pre-OAI, no streaming)": "传统API(OAI之前,无流式传输)", "Bypass status check": "绕过状态检查", - "Streaming API url": "流式API地址", + "Streaming API url": "流式传输API地址", "Example: ws://127.0.0.1:5005/api/v1/stream": "示例:ws://127.0.0.1:5005/api/v1/stream", "Mancer API key": "Mancer API密钥", "Example: https://neuro.mancer.tech/webui/MODEL/api": "示例:https://neuro.mancer.tech/webui/MODEL/api", @@ -209,36 +210,36 @@ "View API Usage Metrics": "查看API使用指标", "Show External models (provided by API)": "显示外部模型(由API提供)", "Bot": "机器人", - "Allow fallback routes": "允许后备路由", + "Allow fallback routes": "允许路由回退", "Allow fallback routes Description": "如果所选模型无法响应您的请求,则自动选择备用模型。", "OpenRouter API Key": "OpenRouter API密钥", "Connect to the API": "连接到API", "OpenRouter Model": "OpenRouter模型", - "View Remaining Credits": "查看剩余信用额", + "View Remaining Credits": "查看剩余额度", "Click Authorize below or get the key from": "点击下方授权或从以下位置获取密钥", "Auto-connect to Last Server": "自动连接到上次的服务器", "View hidden API keys": "查看隐藏的API密钥", - "Advanced Formatting": "高级格式设置", + "Advanced Formatting": "高级格式化设置", "Context Template": "上下文模板", "AutoFormat Overrides": "自动格式覆盖", - "Disable description formatting": "禁用描述格式", - "Disable personality formatting": "禁用人格格式", - "Disable scenario formatting": "禁用情景格式", - "Disable example chats formatting": "禁用示例聊天格式", - "Disable chat start formatting": "禁用聊天开始格式", + "Disable description formatting": "禁用描述格式化", + "Disable personality formatting": "禁用人格格式化", + "Disable scenario formatting": "禁用情景格式化", + "Disable example chats formatting": "禁用示例聊天格式化", + "Disable chat start formatting": "禁用聊天开始格式化", "Custom Chat Separator": "自定义聊天分隔符", - "Replace Macro in Custom Stopping Strings": "自定义停止字符串替换宏", + "Replace Macro in Custom Stopping Strings": "在自定义停止字符串中替换宏", "Strip Example Messages from Prompt": "从提示词中删除示例消息", - "Story String": "Story String 故事字符串", + "Story String": "故事字符串", "Example Separator": "示例分隔符", "Chat Start": "聊天开始", - "Activation Regex": "激活正则表达式", - "Instruct Mode": "指导模式", - "Wrap Sequences with Newline": "用换行符包装序列", + "Activation Regex": "启用正则表达式", + "Instruct Mode": "指令模式", + "Wrap Sequences with Newline": "用换行符包裹序列", "Include Names": "包括名称", - "Force for Groups and Personas": "强制适配群组和人物", + "Force for Groups and Personas": "强制适用于群聊和我的角色", "System Prompt": "系统提示词", - "Instruct Mode Sequences": "Instruct Mode Sequences 指导模式序列", + "Instruct Mode Sequences": "指令模式序列", "Input Sequence": "输入序列", "Output Sequence": "输出序列", "First Output Sequence": "第一个输出序列", @@ -246,7 +247,7 @@ "System Sequence Prefix": "系统序列前缀", "System Sequence Suffix": "系统序列后缀", "Stop Sequence": "停止序列", - "Context Formatting": "上下文格式", + "Context Formatting": "上下文格式化", "(Saved to Context Template)": "(保存到上下文模板)", "Tokenizer": "分词器", "None / Estimated": "无 / 估计", @@ -256,11 +257,11 @@ "Always add character's name to prompt": "始终将角色名称添加到提示词", "Use as Stop Strings": "用作停止字符串", "Bind to Context": "绑定到上下文", - "Generate only one line per request": "每个请求只生成一行", + "Generate only one line per request": "每次请求只生成一行", "Misc. Settings": "其他设置", "Auto-Continue": "自动继续", "Collapse Consecutive Newlines": "折叠连续的换行符", - "Allow for Chat Completion APIs": "允许聊天完成API", + "Allow for Chat Completion APIs": "允许对话补全API", "Target length (tokens)": "目标长度(Token)", "Keep Example Messages in Prompt": "在提示词中保留示例消息", "Remove Empty New Lines from Output": "从输出中删除空行", @@ -272,7 +273,7 @@ "Style then Character": "样式然后角色", "Character Anchor": "角色锚点", "Style Anchor": "样式锚点", - "World Info": "世界信息", + "World Info": "世界书", "Scan Depth": "扫描深度", "Case-Sensitive": "区分大小写", "Match Whole Words": "匹配整个单词", @@ -280,7 +281,7 @@ "Yes": "是", "No": "否", "Context %": "上下文百分比", - "Budget Cap": "预算上限", + "Budget Cap": "Token预算上限", "(0 = disabled)": "(0 = 禁用)", "depth": "深度", "Token Budget": "Token预算", @@ -289,7 +290,7 @@ "None": "无", "User Settings": "用户设置", "UI Mode": "UI 模式", - "UI Language": "语言", + "UI Language": "UI 语言", "MovingUI Preset": "MovingUI 预设", "UI Customization": "UI 自定义", "Avatar Style": "头像样式", @@ -301,8 +302,8 @@ "Bubbles": "气泡", "No Blur Effect": "禁用模糊效果", "No Text Shadows": "禁用文本阴影", - "Waifu Mode": "AI老婆模式", - "Message Timer": "AI回复消息计时器", + "Waifu Mode": "视觉小说模式", + "Message Timer": "AI回复计时器", "Model Icon": "模型图标", "# of messages (0 = disabled)": "消息数量(0 = 禁用)", "Advanced Character Search": "高级角色搜索", @@ -310,7 +311,7 @@ "Allow {{user}}: in bot messages": "在机器人消息中允许 {{user}}:", "Show tags in responses": "在响应中显示标签", "Aux List Field": "辅助列表字段", - "Lorebook Import Dialog": "Lorebook 导入对话框", + "Lorebook Import Dialog": "世界书导入对话框", "MUI Preset": "可移动UI 预设", "If set in the advanced character definitions, this field will be displayed in the characters list.": "如果在高级角色定义中设置,此字段将显示在角色列表中。", "Relaxed API URLS": "宽松的API URL", @@ -319,10 +320,10 @@ "Mancer Model": "Mancer 模型", "API Type": "API 类型", "Aphrodite API key": "Aphrodite API 密钥", - "Relax message trim in Groups": "放松群组中的消息修剪", + "Relax message trim in Groups": "宽松的群聊消息修剪", "Characters Hotswap": "收藏角色卡置顶显示", "Request token probabilities": "请求Token概率", - "Movable UI Panels": "可移动的 UI 面板", + "Movable UI Panels": "可移动UI 面板", "Reset Panels": "重置面板", "UI Colors": "UI 颜色", "Main Text": "主要文本", @@ -362,15 +363,15 @@ "System Backgrounds": "系统背景", "Name": "名称", "Your Avatar": "您的头像", - "Extensions API:": "扩展 API地址:", - "SillyTavern-extras": "SillyTavern-额外功能", + "Extensions API:": "扩展API地址:", + "SillyTavern-extras": "SillyTavern扩展", "Auto-connect": "自动连接", - "Active extensions": "激活扩展", + "Active extensions": "启用扩展", "Extension settings": "扩展设置", "Description": "描述", "First message": "第一条消息", - "Group Controls": "群组控制", - "Group reply strategy": "群组回复策略", + "Group Controls": "群聊控制", + "Group reply strategy": "群聊回复策略", "Natural order": "自然顺序", "List order": "列表顺序", "Allow self responses": "允许自我回复", @@ -385,42 +386,42 @@ "A brief description of the personality": "个性的简要描述", "Scenario": "情景", "Circumstances and context of the dialogue": "对话的情况和背景", - "Talkativeness": "健谈", + "Talkativeness": "健谈度", "How often the chracter speaks in": "角色在其中讲话的频率", "group chats!": "群聊中!", "Shy": "害羞", - "Normal": "正常", + "Normal": "普通", "Chatty": "话多", "Examples of dialogue": "对话示例", "Forms a personality more clearly": "更清晰地形成个性", "Save": "保存", - "World Info Editor": "世界信息编辑器", + "World Info Editor": "世界书编辑器", "New summary": "新摘要", "Export": "导出", "Delete World": "删除世界", "Chat History": "聊天记录", - "Group Chat Scenario Override": "群组聊天情景替代", - "All group members will use the following scenario text instead of what is specified in their character cards.": "所有群组成员将使用以下情景文本,而不是在其角色卡中指定的内容。", + "Group Chat Scenario Override": "群聊情景覆盖", + "All group members will use the following scenario text instead of what is specified in their character cards.": "所有群聊成员将使用以下情景文本,而不是在其角色卡中指定的内容。", "Keywords": "关键词", "Separate with commas": "用逗号分隔", - "Secondary Required Keywords": "次要必需关键词", + "Secondary Required Keywords": "第二个必需关键词", "Content": "内容", "What this keyword should mean to the AI": "这个关键词对 AI 的含义", "Memo/Note": "备忘录/注释", "Not sent to AI": "不发送给 AI", "Constant": "常量", "Selective": "选择性", - "Before Char": "角色之前", - "After Char": "角色之后", + "Before Char": "角色定义之前", + "After Char": "角色定义之后", "Insertion Order": "插入顺序", - "Tokens:": "Token:", + "Tokens:": "Tokens:", "Disable": "禁用", "${characterName}": "${角色名称}", "CHAR": "角色", "is typing": "正在输入...", "Back to parent chat": "返回到父级聊天", "Save bookmark": "保存书签", - "Convert to group": "转换为群组", + "Convert to group": "转换为群聊", "Start new chat": "开始新聊天", "View past chats": "查看过去的聊天记录", "Delete messages": "删除消息", @@ -437,13 +438,13 @@ "NSFW avoidance prompt": "禁止 NSFW 提示词", "Prompt that is used when the NSFW toggle is off": "NSFW 开关关闭时使用的提示词", "Advanced prompt bits": "高级提示词位", - "World Info format": "世界信息格式", - "Wraps activated World Info entries before inserting into the prompt. Use {0} to mark a place where the content is inserted.": "在插入到提示词中之前包装激活的世界信息条目。使用 {0} 标记内容插入的位置。", - "Unrestricted maximum value for the context slider": "AI可见的最大上下文长度", - "Chat Completion Source": "聊天补全来源", + "World Info format": "世界书格式", + "Wraps activated World Info entries before inserting into the prompt. Use {0} to mark a place where the content is inserted.": "在插入到提示词中之前包裹启用的世界书条目。使用 {0} 标记内容插入的位置。", + "Unrestricted maximum value for the context slider": "上下文长度滑块的最大值无限制,仅在你知道自己在做什么的情况下才启用。", + "Chat Completion Source": "对话补全来源", "Avoid sending sensitive information to the Horde.": "避免向 Horde 发送敏感信息。", "Review the Privacy statement": "查看隐私声明", - "Learn how to contribute your idel GPU cycles to the Horde": "了解如何将您的空闲 GPU 周期贡献给 Horde", + "Learn how to contribute your idel GPU cycles to the Horde": "了解如何将您的空闲 GPU 算力贡献给 Horde", "Trusted workers only": "仅信任的工作人员", "For privacy reasons, your API key will be hidden after you reload the page.": "出于隐私原因,重新加载页面后您的 API 密钥将被隐藏。", "-- Horde models not loaded --": "-- Horde 模型未加载 --", @@ -451,9 +452,9 @@ "No connection...": "没有连接...", "Get your NovelAI API Key": "获取您的 NovelAI API 密钥", "KoboldAI Horde": "KoboldAI Horde", - "Text Gen WebUI (ooba)": "文本生成 WebUI(ooba)", + "Text Gen WebUI (ooba)": "Text Gen WebUI(ooba)", "NovelAI": "NovelAI", - "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "聊天补全(OpenAI、Claude、Window/OpenRouter、Scale)", + "Chat Completion (OpenAI, Claude, Window/OpenRouter, Scale)": "对话补全(OpenAI、Claude、Window/OpenRouter、Scale)", "OpenAI API key": "OpenAI API 密钥", "Trim spaces": "修剪空格", "Trim Incomplete Sentences": "修剪不完整的句子", @@ -464,16 +465,16 @@ "Separator": "分隔符", "Start Reply With": "以...开始回复", "Show reply prefix in chat": "在聊天中显示回复前缀", - "Worlds/Lorebooks": "世界/传说书", - "Active World(s)": "活动世界", - "Activation Settings": "激活配置", - "Character Lore Insertion Strategy": "角色传说插入策略", + "Worlds/Lorebooks": "世界书/传说书", + "Active World(s)": "当前启用的世界书", + "Activation Settings": "启用配置", + "Character Lore Insertion Strategy": "角色世界书条目插入策略", "Sorted Evenly": "均匀排序", "Active World(s) for all chats": "已启用的世界书(全局有效)", - "-- World Info not found --": "-- 未找到世界信息 --", + "-- World Info not found --": "-- 未找到世界书 --", "--- Pick to Edit ---": "--- 选择以编辑 ---", "or": "或", - "New": "新", + "New": "新建", "Priority": "优先级", "Custom": "自定义", "Title A-Z": "标题 A-Z", @@ -486,23 +487,23 @@ "Order ↘": "顺序 ↘", "UID ↗": "UID ↗", "UID ↘": "UID ↘", - "Trigger% ↗": "触发器% ↗", - "Trigger% ↘": "触发器% ↘", + "Trigger% ↗": "触发频率% ↗", + "Trigger% ↘": "触发频率% ↘", "Order:": "顺序:", "Depth:": "深度:", - "Character Lore First": "角色传说优先", - "Global Lore First": "全局传说优先", + "Character Lore First": "角色世界书优先", + "Global Lore First": "全局世界书优先", "Recursive Scan": "递归扫描", "Case Sensitive": "区分大小写", "Match whole words": "完整匹配单词", "Alert On Overflow": "溢出警报", - "World/Lore Editor": "世界/传说编辑器", + "World/Lore Editor": "世界书编辑器", "--- None ---": "--- 无 ---", "Use Probability": "使用概率", - "Exclude from recursion": "排除递归", + "Exclude from recursion": "从递归中排除", "Entry Title/Memo": "条目标题/备忘录", "Position:": "位置:", - "T_Position": "↑Char:在角色定义之前\n↓Char:在角色定义之后\n↑AN:在作者注释之前\n↓AN:在作者注释之后\n@D:在深度处", + "T_Position": "↑Char:在角色定义之前\n↓Char:在角色定义之后\n↑AN:在作者注释之前\n↓AN:在作者注释之后\n@D:在深度D处", "Before Char Defs": "角色定义之前", "After Char Defs": "角色定义之后", "Before AN": "作者注释之前", @@ -512,7 +513,7 @@ "Probability:": "概率:", "Update a theme file": "更新主题文件", "Save as a new theme": "另存为新主题", - "Minimum number of blacklisted words detected to trigger an auto-swipe": "检测到触发自动滑动的黑名单词语的最小数量", + "Minimum number of blacklisted words detected to trigger an auto-swipe": "触发自动滑动的检测到的黑名单词汇的最小数量", "Delete Entry": "删除条目", "User Message Blur Tint": "用户消息模糊色调", "AI Message Blur Tint": "AI 消息模糊色调", @@ -522,7 +523,7 @@ "Mad Lab Mode": "疯狂实验室模式", "Show Message Token Count": "显示消息Token计数", "Compact Input Area (Mobile)": "紧凑输入区域(移动端)", - "Zen Sliders": "禅滑块", + "Zen Sliders": "禅意滑块", "UI Border": "UI 边框", "Chat Style:": "聊天风格:", "Chat Width (PC)": "聊天宽度(PC)", @@ -535,18 +536,18 @@ "Message IDs": "显示消息编号", "Prefer Character Card Prompt": "角色卡提示词优先", "Prefer Character Card Jailbreak": "角色卡越狱优先", - "Press Send to continue": "按发送键继续", + "Press Send to continue": "按发送键以继续", "Quick 'Continue' button": "快速“继续”按钮", "Log prompts to console": "将提示词记录到控制台", "Never resize avatars": "不调整头像大小", "Show avatar filenames": "显示头像文件名", "Import Card Tags": "导入卡片标签", - "Confirm message deletion": "确认删除消息", + "Confirm message deletion": "删除消息前确认", "Spoiler Free Mode": "隐藏角色卡信息", "Auto-swipe": "自动滑动", "Minimum generated message length": "生成的消息的最小长度", - "Blacklisted words": "黑名单词语", - "Blacklisted word count to swipe": "滑动的黑名单词语数量", + "Blacklisted words": "黑名单词汇", + "Blacklisted word count to swipe": "滑动的黑名单词汇数量", "Reload Chat": "重新加载聊天", "Search Settings": "搜索设置", "Disabled": "已禁用", @@ -571,8 +572,8 @@ "Show tagged character folders in the character list": "在角色列表中显示已标记的角色文件夹", "Play a sound when a message generation finishes": "当消息生成完成时播放声音", "Only play a sound when ST's browser tab is unfocused": "仅在ST的浏览器选项卡未聚焦时播放声音", - "Reduce the formatting requirements on API URLs": "减少API URL的格式要求", - "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "询问是否为每个具有嵌入式传说书的新角色导入世界信息/传说书。如果未选中,则会显示简短的消息", + "Reduce the formatting requirements on API URLs": "减少API URL的格式化要求", + "Ask to import the World Info/Lorebook for every new character with embedded lorebook. If unchecked, a brief message will be shown instead": "询问是否为每个具有嵌入的世界书的新角色导入世界书。如果未选中,则会显示简短的消息", "Restore unsaved user input on page refresh": "在页面刷新时恢复未保存的用户输入", "Allow repositioning certain UI elements by dragging them. PC only, no effect on mobile": "允许通过拖动重新定位某些UI元素。仅适用于PC,对移动设备无影响", "MovingUI preset. Predefined/saved draggable positions": "MovingUI预设。预定义/保存的可拖动位置", @@ -600,20 +601,20 @@ "Reload and redraw the currently open chat": "重新加载和重绘当前打开的聊天", "Auto-Expand Message Actions": "自动展开消息操作菜单", "Not Connected": "未连接", - "Persona Management": "角色管理", - "Persona Description": "角色描述", - "Your Persona": "您的角色", - "Show notifications on switching personas": "切换角色时显示通知", + "Persona Management": "我的角色管理", + "Persona Description": "我的角色描述", + "Your Persona": "我的角色", + "Show notifications on switching personas": "切换我的角色时显示通知", "Blank": "空白", - "In Story String / Chat Completion: Before Character Card": "故事模式/聊天补全模式:在角色卡之前", - "In Story String / Chat Completion: After Character Card": "故事模式/聊天补全模式:在角色卡之后", + "In Story String / Chat Completion: Before Character Card": "故事模式/对话补全模式:在角色卡之前", + "In Story String / Chat Completion: After Character Card": "故事模式/对话补全模式:在角色卡之后", "In Story String / Prompt Manager": "在故事字符串/提示词管理器", - "Top of Author's Note": "作者注的顶部", - "Bottom of Author's Note": "作者注的底部", + "Top of Author's Note": "作者注释的顶部", + "Bottom of Author's Note": "作者注释的底部", "How do I use this?": "怎样使用?", "More...": "更多...", - "Link to World Info": "链接到世界信息", - "Import Card Lore": "导入卡片知识", + "Link to World Info": "链接到世界书", + "Import Card Lore": "导入人物卡的世界书", "Scenario Override": "场景覆盖", "Rename": "重命名", "Character Description": "角色描述", @@ -627,13 +628,13 @@ "Most chats": "最多聊天", "Least chats": "最少聊天", "Back": "返回", - "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "提示词覆盖(适用于OpenAI/Claude/Scale API、Window/OpenRouter和Instruct模式)", + "Prompt Overrides (For OpenAI/Claude/Scale APIs, Window/OpenRouter, and Instruct mode)": "提示词覆盖(适用于OpenAI/Claude/Scale API、Window/OpenRouter和指令模式)", "Insert {{original}} into either box to include the respective default prompt from system settings.": "将{{original}}插入到任一框中,以包含系统设置中的相应默认提示词。", "Main Prompt": "主要提示词", "Jailbreak": "越狱", "Creator's Metadata (Not sent with the AI prompt)": "创作者的元数据(不与AI提示词一起发送)", "Everything here is optional": "这里的一切都是可选的", - "Created by": "作者", + "Created by": "创作者", "Character Version": "角色版本", "Tags to Embed": "嵌入的标签", "How often the character speaks in group chats!": "角色在群聊中说话的频率!", @@ -642,7 +643,7 @@ "Samplers Order": "采样器顺序", "Samplers will be applied in a top-down order. Use with caution.": "采样器将按自上而下的顺序应用。请谨慎使用。", "Repetition Penalty": "重复惩罚", - "Rep. Pen. Range.": "重复惩罚范围。", + "Rep. Pen. Range.": "重复惩罚范围", "Rep. Pen. Freq.": "重复惩罚频率", "Rep. Pen. Presence": "重复惩罚存在", "Enter it in the box below:": "在下面的框中输入它:", @@ -651,9 +652,9 @@ "Suggest replies": "建议回复", "Show suggested replies. Not all bots support this.": "显示建议的回复。并非所有机器人都支持此功能。", "Use 'Unlocked Context' to enable chunked generation.": "使用'Unlocked Context'启用分块生成。", - "It extends the context window in exchange for reply generation speed.": "它扩展了上下文窗口,以换取回复生成速度。", + "It extends the context window in exchange for reply generation speed.": "它以回复生成速度为代价,扩展了上下文窗口", "Continue": "继续", - "CFG Scale": "CFG规模", + "CFG Scale": "CFG Scale", "Editing:": "编辑:", "AI reply prefix": "AI回复前缀", "Custom Stopping Strings": "自定义停止字符串", @@ -664,8 +665,8 @@ "Enter your name": "输入您的名字", "Name this character": "为这个角色命名", "Search / Create Tags": "搜索/创建标签", - "Describe your character's physical and mental traits here.": "在这里描述您角色的身体和精神特征。", - "This will be the first message from the character that starts every chat.": "这将是每次开始的角色的第一条消息。", + "Describe your character's physical and mental traits here.": "在这里描述您角色的身体和心理特征。", + "This will be the first message from the character that starts every chat.": "这将是每次开始对话时角色的第一条消息。", "Chat Name (Optional)": "聊天名称(可选)", "Filter...": "过滤...", "Search...": "搜索...", @@ -674,10 +675,10 @@ "(Botmaker's name / Contact Info)": "(机器人制作者的姓名/联系信息)", "(If you want to track character versions)": "(如果您想跟踪角色版本)", "(Describe the bot, give use tips, or list the chat models it has been tested on. This will be displayed in the character list.)": "(描述机器人,提供使用技巧,或列出已经测试过的聊天模型。这将显示在角色列表中。)", - "(Write a comma-separated list of tags)": "(编写逗号分隔的标签列表)", + "(Write a comma-separated list of tags)": "(编写一个以逗号分隔的标签列表。)", "(A brief description of the personality)": "(性格的简要描述)", "(Circumstances and context of the interaction)": "(交互的情况和背景)", - "(Examples of chat dialog. Begin each example with START on a new line.)": "(聊天对话的示例。每个示例都以新行上的START开头。)", + "(Examples of chat dialog. Begin each example with START on a new line.)": "(聊天对话的示例,每个示例都另起一行以开头。)", "Injection text (supports parameters)": "注入文本(支持参数)", "Injection depth": "注入深度", "Type here...": "在此处输入...", @@ -687,23 +688,23 @@ "Filter to Character(s)": "过滤到角色", "Character Exclusion": "角色排除", "Inclusion Group": "包含组", - "Only one entry with the same label will be activated": "只有一个带有相同标签的条目将被激活", + "Only one entry with the same label will be activated": "只有一个带有相同标签的条目将被启用", "-- Characters not found --": "-- 未找到角色 --", "Not sent to the AI": "不发送到AI", - "(This will be the first message from the character that starts every chat)": "(这将是每次开始的角色的第一条消息)", + "(This will be the first message from the character that starts every chat)": "(这将是每次开始对话时角色的第一条消息。)", "Not connected to API!": "未连接到API!", "AI Response Configuration": "AI响应配置", - "AI Configuration panel will stay open": "AI配置面板将保持打开状态", + "AI Configuration panel will stay open": "AI配置面板将保持打开", "Update current preset": "更新当前预设", "Create new preset": "创建新预设", "Import preset": "导入预设", "Export preset": "导出预设", "Delete the preset": "删除预设", - "Auto-select this preset for Instruct Mode": "自动选择此预设以进行指示模式", + "Auto-select this preset for Instruct Mode": "为指令模式自动选择此预设", "Auto-select this preset on API connection": "在API连接时自动选择此预设", "NSFW block goes first in the resulting prompt": "结果提示词中首先是NSFW块", - "Enables OpenAI completion streaming": "启用OpenAI完成流", - "Wrap user messages in quotes before sending": "在发送之前将用户消息用引号括起来", + "Enables OpenAI completion streaming": "启用OpenAI补全流式传输", + "Wrap user messages in quotes before sending": "在发送之前将用户消息用引号包裹起来", "Restore default prompt": "恢复默认提示词", "New preset": "新预设", "Delete preset": "删除预设", @@ -711,56 +712,56 @@ "Restore default reply": "恢复默认回复", "Restore defaul note": "恢复默认备注", "API Connections": "API连接", - "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "可以通过仅排队批准的工作人员来帮助处理不良响应。可能会减慢响应时间。", + "Can help with bad responses by queueing only the approved workers. May slowdown the response time.": "可以通过仅将批准的工作人员加入排队来帮助处理不良响应。可能会延长响应时间。", "Clear your API key": "清除您的API密钥", "Refresh models": "刷新模型", - "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "使用OAuth流程获取您的OpenRouter APIToken。您将被重定向到openrouter.ai", - "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "通过发送简短的测试消息验证您的API连接。请注意,您将因此而获得信用!", - "Create New": "创建新", + "Get your OpenRouter API token using OAuth flow. You will be redirected to openrouter.ai": "使用OAuth流程获取您的OpenRouter API Token。您将被重定向到openrouter.ai", + "Verifies your API connection by sending a short test message. Be aware that you'll be credited for it!": "通过发送简短的测试消息验证您的API连接。请注意,这也将被纳入计费!", + "Create New": "新建", "Edit": "编辑", - "Locked = World Editor will stay open": "锁定=世界编辑器将保持打开状态", - "Entries can activate other entries by mentioning their keywords": "条目可以通过提及它们的关键字来激活其他条目", + "Locked = World Editor will stay open": "锁定 = 世界书编辑器将保持打开状态", + "Entries can activate other entries by mentioning their keywords": "条目可以通过提及对应的关键字来启用其他条目", "Lookup for the entry keys in the context will respect the case": "在上下文中查找条目键将保持大小写敏感", "If the entry key consists of only one word, it would not be matched as part of other words": "如果条目键只由一个单词组成,则不会作为其他单词的一部分匹配", "Open all Entries": "打开所有条目", "Close all Entries": "关闭所有条目", "Create": "创建", - "Import World Info": "导入世界信息", - "Export World Info": "导出世界信息", - "Delete World Info": "删除世界信息", - "Duplicate World Info": "复制世界信息", - "Rename World Info": "重命名世界信息", + "Import World Info": "导入世界书", + "Export World Info": "导出世界书", + "Delete World Info": "删除世界书", + "Duplicate World Info": "复制世界书", + "Rename World Info": "重命名世界书", "Refresh": "刷新", "Primary Keywords": "主要关键字", "Logic": "逻辑", - "AND ANY": "和任意", - "AND ALL": "和所有", - "NOT ALL": "不是所有", - "NOT ANY": "没有任何", + "AND ANY": "与任意", + "AND ALL": "与所有", + "NOT ALL": "非所有", + "NOT ANY": "非任何", "Optional Filter": "可选过滤器", "New Entry": "新条目", "Fill empty Memo/Titles with Keywords": "使用关键字填充空的备忘录/标题", "Save changes to a new theme file": "将更改保存到新的主题文件", "removes blur and uses alternative background color for divs": "消除模糊并为div使用替代背景颜色", - "AI Response Formatting": "AI响应格式", + "AI Response Formatting": "AI响应格式化", "Change Background Image": "更改背景图片", - "Extensions": "扩展管理", + "Extensions": "扩展", "Click to set a new User Name": "点击设置新的用户名", - "Click to lock your selected persona to the current chat. Click again to remove the lock.": "单击以将您选择的角色锁定到当前聊天。再次单击以移除锁定。", + "Click to lock your selected persona to the current chat. Click again to remove the lock.": "单击以将您选择的我的角色锁定到当前聊天。再次单击以移除锁定。", "Click to set user name for all messages": "点击为所有消息设置用户名", - "Create a dummy persona": "创建虚拟角色", + "Create a dummy persona": "创建虚拟我的角色", "Character Management": "角色管理", - "Locked = Character Management panel will stay open": "已锁定=角色管理面板将保持打开状态", + "Locked = Character Management panel will stay open": "已锁定 = 角色管理面板将保持打开状态", "Select/Create Characters": "选择/创建角色", "Token counts may be inaccurate and provided just for reference.": "Token计数可能不准确,仅供参考。", "Click to select a new avatar for this character": "单击以为此角色选择新的头像", - "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "示例:[{{user}}是一个28岁的罗马尼亚猫女孩。]", + "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "示例:[{{user}}是一个28岁的罗马尼亚猫娘。]", "Toggle grid view": "切换网格视图", "Add to Favorites": "添加到收藏夹", "Advanced Definition": "高级定义", - "Character Lore": "角色传说", + "Character Lore": "角色世界书", "Export and Download": "导出并下载", - "Duplicate Character": "复制角色", + "Duplicate Character": "创建角色副本", "Create Character": "创建角色", "Delete Character": "删除角色", "View all tags": "查看所有标签", @@ -769,22 +770,22 @@ "Click to select a new avatar for this group": "单击以为该组选择新的头像", "Set a group chat scenario": "设置群组聊天场景", "Restore collage avatar": "恢复拼贴头像", - "Create New Character": "创建新角色", + "Create New Character": "新建角色", "Import Character from File": "从文件导入角色", "Import content from external URL": "从外部URL导入内容", - "Create New Chat Group": "创建新的聊天组", + "Create New Chat Group": "创建新的群聊", "Characters sorting order": "角色排序顺序", "Add chat injection": "添加聊天注入", "Remove injection": "移除注入", "Remove": "移除", - "Select a World Info file for": "为...选择一个世界信息文件", - "Primary Lorebook": "主要传说书", - "A selected World Info will be bound to this character as its own Lorebook.": "所选的世界信息将作为该角色自己的传说书绑定到此角色。", - "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "在生成AI回复时,它将与全局世界信息选择器中的条目结合。", - "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "导出角色还将导出嵌入在JSON数据中的所选传说书文件。", - "Additional Lorebooks": "附加传说书", - "Associate one or more auxillary Lorebooks with this character.": "将一个或多个辅助传说书与此角色关联。", - "NOTE: These choices are optional and won't be preserved on character export!": "注意:这些选择是可选的,并且不会在角色导出时保留!", + "Select a World Info file for": "为...选择一个世界书文件", + "Primary Lorebook": "主要世界书", + "A selected World Info will be bound to this character as its own Lorebook.": "所选的世界书将会于该角色绑定,作为该角色自己的世界书", + "When generating an AI reply, it will be combined with the entries from a global World Info selector.": "在生成AI回复时,它将与全局世界书选择器中的条目相结合。", + "Exporting a character would also export the selected Lorebook file embedded in the JSON data.": "导出角色还将导出嵌入在JSON数据中的所选世界书文件。", + "Additional Lorebooks": "附加世界书", + "Associate one or more auxillary Lorebooks with this character.": "将一个或多个辅助世界书与此角色关联。", + "NOTE: These choices are optional and won't be preserved on character export!": "注意:这些选项是可选的,并且不会在角色导出时被一并导出!", "Rename chat file": "重命名聊天文件", "Export JSONL chat file": "导出JSONL聊天文件", "Download chat as plain text document": "将聊天下载为纯文本文档", @@ -817,9 +818,9 @@ "Ask AI to write your message for you": "请求AI为您撰写消息", "Continue the last message": "继续上一条消息", "Bind user name to that avatar": "将用户名称绑定到该头像", - "Select this as default persona for the new chats.": "选择此项作为新聊天的默认人物。", - "Change persona image": "更改人物形象", - "Delete persona": "删除人物", + "Select this as default persona for the new chats.": "将这个设置为新聊天的默认我的角色。", + "Change persona image": "更改我的角色头像", + "Delete persona": "删除我的角色", "Reduced Motion": "减少动态效果", "Auto-select": "自动选择", "Automatically select a background based on the chat context": "根据聊天上下文自动选择背景", @@ -832,7 +833,7 @@ "UI Theme": "UI主题", "This message is invisible for the AI": "此消息对AI不可见", "Sampler Priority": "采样器优先级", - "Ooba only. Determines the order of samplers.": "仅适用于Ooba。确定采样器的顺序。", + "Ooba only. Determines the order of samplers.": "确定采样器的顺序(仅适用于Ooba)", "Load default order": "加载默认顺序", "Max Tokens Second": "每秒最大Token数", "CFG": "CFG", @@ -850,30 +851,30 @@ "Import Extension From Git Repo": "从Git存储库导入扩展", "Install extension": "安装扩展", "Manage extensions": "管理扩展", - "Tokens persona description": "Token人物描述", - "Most tokens": "大多数Token", - "Least tokens": "最少Token", + "Tokens persona description": "我的角色描述 Tokens", + "Most tokens": "最多Tokens", + "Least tokens": "最少Tokens", "Random": "随机", - "Skip Example Dialogues Formatting": "跳过示例对话格式", + "Skip Example Dialogues Formatting": "跳过示例对话格式化", "Import a theme file": "导入主题文件", "Export a theme file": "导出主题文件", "Unlocked Context Size": "解锁上下文长度", - "Display the response bit by bit as it is generated.": "逐位显示生成的响应。", - "When this is off, responses will be displayed all at once when they are complete.": "当此选项关闭时,响应将在完成时一次性显示。", + "Display the response bit by bit as it is generated.": "随着响应的生成,逐步显示结果。", + "When this is off, responses will be displayed all at once when they are complete.": "当此选项关闭时,响应将在完成后一次性显示。", "Quick Prompts Edit": "快速提示词编辑", - "Enable OpenAI completion streaming": "启用OpenAI完成流", + "Enable OpenAI completion streaming": "启用OpenAI流式传输补全", "Main": "主要", - "Utility Prompts": "Utility Prompts 实用提示词", + "Utility Prompts": "实用提示词", "Add character names": "添加角色名称", - "Send names in the message objects. Helps the model to associate messages with characters.": "在消息对象中发送名称。有助于模型将消息与角色关联起来。", - "Continue prefill": "继续预填充", - "Continue sends the last message as assistant role instead of system message with instruction.": "继续将上一条消息发送为助手角色,而不是带有说明的系统消息。", + "Send names in the message objects. Helps the model to associate messages with characters.": "在消息对象中发送名称,有助于模型将消息与角色关联起来。", + "Continue prefill": "“继续”预填充", + "Continue sends the last message as assistant role instead of system message with instruction.": "继续以AI助手的角色发送最后一条消息,而不是带有指令的系统消息。", "Squash system messages": "压缩系统消息", - "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "将连续的系统消息合并为一条(不包括示例对话)。可能会提高一些模型的连贯性。", + "Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models.": "将连续的系统消息合并为一条(不包括示例对话),可能会提高一些模型的连贯性。", "Send inline images": "发送内联图像", "Assistant Prefill": "助手预填充", - "Start Claude's answer with...": "以以下内容开始Claude克劳德的回答...", - "Use system prompt (Claude 2.1+ only)": "仅使用系统提示词(仅适用于Claude 2.1+)", + "Start Claude's answer with...": "以如下内容开始Claude的回答...", + "Use system prompt (Claude 2.1+ only)": "使用系统提示词(仅适用于Claude 2.1+)", "Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt.": "为支持的模型发送系统提示词。如果禁用,则用户消息将添加到提示词的开头。", "Prompts": "提示词", "Total Tokens:": "总Token数:", @@ -883,7 +884,7 @@ "Export this prompt list": "导出此提示词列表", "Reset current character": "重置当前角色", "New prompt": "新提示词", - "Tokens": "Tokens Token", + "Tokens": "Tokens", "Want to update?": "获取最新版本", "How to start chatting?": "如何快速开始聊天?", "Click": "点击", @@ -899,8 +900,8 @@ "Join the SillyTavern Discord": "加入SillyTavern Discord", "Post a GitHub issue": "发布GitHub问题", "Contact the developers": "联系开发人员", - "Nucleus Sampling": "核心采样", - "Typical P": "Typical P 典型P", + "Nucleus Sampling": "核采样", + "Typical P": "典型P", "Top K Sampling": "Top K 采样", "Top A Sampling": "Top A 采样", "Off": "关闭", @@ -909,9 +910,9 @@ "Medium": "中", "Aggressive": "激进", "Very aggressive": "非常激进", - "Eta cutoff is the main parameter of the special Eta Sampling technique. In units of 1e-4; a reasonable value is 3. Set to 0 to disable. See the paper Truncation Sampling as Language Model Desmoothing by Hewitt et al. (2022) for details.": "Eta截止是特殊Eta采样技术的主要参数。 以1e-4为单位;合理的值为3。 设置为0以禁用。 有关详细信息,请参阅Hewitt等人的论文《Truncation Sampling as Language Model Desmoothing》(2022年)。", - "Learn how to contribute your idle GPU cycles to the Horde": "了解如何将您的空闲GPU时间分享给Horde", - "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "通过其API为Google模型使用适当的标记器。处理速度较慢,但提供更准确的Token计数。", + "Eta cutoff is the main parameter of the special Eta Sampling technique.\nIn units of 1e-4; a reasonable value is 3.\nSet to 0 to disable.\nSee the paper Truncation Sampling as Language Model Desmoothing by Hewitt et al. (2022) for details.": "Eta截止是特殊Eta采样技术的主要参数。\n以1e-4为单位;合理的值为3。\n设置为0以禁用。\n有关详细信息,请参阅Hewitt等人的论文 Truncation Sampling as Language Model Desmoothing (2022)", + "Learn how to contribute your idle GPU cycles to the Horde": "了解如何将您的空闲GPU算力分享给Horde", + "Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting.": "通过其API为Google模型使用适当的分词器。处理速度较慢,但提供更准确的Token计数。", "Load koboldcpp order": "加载koboldcpp顺序", - "Use Google Tokenizer": "使用Google标记器" + "Use Google Tokenizer": "使用Google分词器" } From 008527de4bb8f1e93c7f9d46ebbcf1062bc65acd Mon Sep 17 00:00:00 2001 From: deffcolony <61471128+deffcolony@users.noreply.github.com> Date: Thu, 11 Apr 2024 17:12:40 +0200 Subject: [PATCH 11/17] Update st-launcher.ico remaster for the ST-launcher icon by casual_autopsy --- public/st-launcher.ico | Bin 125279 -> 121733 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/st-launcher.ico b/public/st-launcher.ico index b6a5c9931da3311a76c4ddc7884dacbcc821beb0..ca6f5681c713621e9f339d0c37d62ee809dc1477 100644 GIT binary patch literal 121733 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 Date: Thu, 11 Apr 2024 19:21:59 +0300 Subject: [PATCH 12/17] Fix broken HTML and code style --- public/index.html | 2 +- public/scripts/RossAscends-mods.js | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/public/index.html b/public/index.html index 277750528..e2e5357cc 100644 --- a/public/index.html +++ b/public/index.html @@ -4092,7 +4092,7 @@

-
+
diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index 267711934..c2782a281 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -275,9 +275,7 @@ export async function favsToHotswap() { //helpful instruction message if no characters are favorited if (favs.length == 0) { - container.html(' ' - + container.attr('no_favs') - + ''); + container.html(`${DOMPurify.sanitize(container.attr('no_favs'))}`); return; } @@ -287,7 +285,7 @@ export async function favsToHotswap() { //changes input bar and send button display depending on connection status function RA_checkOnlineStatus() { if (online_status == 'no_connection') { - var send_textarea = $('#send_textarea'); + const send_textarea = $('#send_textarea'); send_textarea.attr('placeholder', send_textarea.attr('no_connection_text')); //Input bar placeholder tells users they are not connected $('#send_form').addClass('no-connection'); //entire input form area is red when not connected $('#send_but').addClass('displayNone'); //send button is hidden when not connected; @@ -297,7 +295,7 @@ function RA_checkOnlineStatus() { connection_made = false; } else { if (online_status !== undefined && online_status !== 'no_connection') { - var send_textarea = $('#send_textarea'); + const send_textarea = $('#send_textarea'); send_textarea.attr('placeholder', send_textarea.attr('connected_text')); //on connect, placeholder tells user to type message $('#send_form').removeClass('no-connection'); $('#API-status-top').removeClass('fa-plug-circle-exclamation redOverlayGlow'); From 58152a60c61f9423073b83432aac4b73dfcd389a Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 11 Apr 2024 19:45:50 +0300 Subject: [PATCH 13/17] Append example names to converted Google sysprompt --- src/endpoints/backends/chat-completions.js | 4 ++-- src/prompt-converters.js | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/endpoints/backends/chat-completions.js b/src/endpoints/backends/chat-completions.js index c3e2b5ea7..057d2527c 100644 --- a/src/endpoints/backends/chat-completions.js +++ b/src/endpoints/backends/chat-completions.js @@ -253,12 +253,12 @@ async function sendMakerSuiteRequest(request, response) { function getGeminiBody() { const should_use_system_prompt = model === 'gemini-1.5-pro-latest' && request.body.use_makersuite_sysprompt; - const prompt = convertGooglePrompt(request.body.messages, model, should_use_system_prompt); + const prompt = convertGooglePrompt(request.body.messages, model, should_use_system_prompt, request.body.char_name, request.body.user_name); let body = { contents: prompt.contents, safetySettings: GEMINI_SAFETY, generationConfig: generationConfig, - } + }; if (should_use_system_prompt) { body.system_instruction = prompt.system_instruction; diff --git a/src/prompt-converters.js b/src/prompt-converters.js index b2fb937cb..3d2191d84 100644 --- a/src/prompt-converters.js +++ b/src/prompt-converters.js @@ -253,9 +253,11 @@ function convertCohereMessages(messages, charName = '', userName = '') { * @param {object[]} messages Array of messages * @param {string} model Model name * @param {boolean} useSysPrompt Use system prompt + * @param {string} charName Character name + * @param {string} userName User name * @returns {{contents: *[], system_instruction: {parts: {text: string}}}} Prompt for Google MakerSuite models */ -function convertGooglePrompt(messages, model, useSysPrompt = false) { +function convertGooglePrompt(messages, model, useSysPrompt = false, charName = '', userName = '') { // This is a 1x1 transparent PNG const PNG_PIXEL = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='; @@ -271,12 +273,23 @@ function convertGooglePrompt(messages, model, useSysPrompt = false) { let sys_prompt = ''; if (useSysPrompt) { while (messages.length > 1 && messages[0].role === 'system') { + // Append example names if not already done by the frontend (e.g. for group chats). + if (userName && messages[0].name === 'example_user') { + if (!messages[0].content.startsWith(`${userName}: `)) { + messages[0].content = `${userName}: ${messages[0].content}`; + } + } + if (charName && messages[0].name === 'example_assistant') { + if (!messages[0].content.startsWith(`${charName}: `)) { + messages[0].content = `${charName}: ${messages[0].content}`; + } + } sys_prompt += `${messages[0].content}\n\n`; messages.shift(); } } - const system_instruction = { parts: { text: sys_prompt.trim() }}; + const system_instruction = { parts: { text: sys_prompt.trim() } }; const contents = []; messages.forEach((message, index) => { From 05ae571971102c22054b3e31ca8087837a9ce429 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 11 Apr 2024 19:53:45 +0300 Subject: [PATCH 14/17] Pass names to Cohere prompt converter --- src/endpoints/backends/chat-completions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/endpoints/backends/chat-completions.js b/src/endpoints/backends/chat-completions.js index 057d2527c..876352b06 100644 --- a/src/endpoints/backends/chat-completions.js +++ b/src/endpoints/backends/chat-completions.js @@ -566,7 +566,7 @@ async function sendCohereRequest(request, response) { } try { - const convertedHistory = convertCohereMessages(request.body.messages); + const convertedHistory = convertCohereMessages(request.body.messages, request.body.char_name, request.body.user_name); // https://docs.cohere.com/reference/chat const requestBody = { From 334178f6f922e96203c8c77f5dbc5d7ad7892fa6 Mon Sep 17 00:00:00 2001 From: CasualAutopsy <107777585+CasualAutopsy@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:52:57 -0400 Subject: [PATCH 15/17] Add New Icon (#2068) * Revert Change * Add files via upload --- public/st.ico | Bin 0 -> 125279 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/st.ico diff --git a/public/st.ico b/public/st.ico new file mode 100644 index 0000000000000000000000000000000000000000..b6a5c9931da3311a76c4ddc7884dacbcc821beb0 GIT binary patch literal 125279 zcmXVX1yCE`*Y*O%p#<0B1p>vLqG_=pg#g706n8C7k>U<5!JQHuio5-Q;!@n9Kyi16 zFaLSJ%w&?AOm=hco;~N0a{&MazySXDKmq81Q&Rx2K)w$M_`fk577Czk1_091|9=bt z0Dn6afQRS*#zn6Ips)h@OZxvm1_8i_DHH&NeEr|?tX=@X^*+RBoKl@d!}TyGA24!OGQ9_dDL=QT4HqbgvG_p79a#10?lO4K0v1ozzI+R z`6y;&M!G=jOpt03m@t4Q;99tt7cdEoqNV^mFFzA?k^s8ks6x+djw9h~z%4x7a zXMior#gw-i_Ah8CARabHFaF{$CE!<%Sx4y}h(aH(eI5iHp`1tpz5o?Ur5*tn14@8& z>pKeI#I2|IFJ6EsP%;ywALT6syy#>Aj!~S11JXg%fx*GvmM=Sr0Y8kt>EUrWZq`_P z<3LKd_T8$S`0b_GD@#b1HyeNw;0WBv0|aO%HWEdMsi7Xm@K@dqC^yUjvnW;-mpMd4 zgZ+2`m?&S#I)4I@MUw_Hb>k=x7y)!l^-1hruYV2QkOH2cPg7@yc>LYp&~zFDMyNbd z3;w(V99~-If-N@(bP)V^({*Qg`oI%brxD}JZQZ(N6l`q4E>tJd0AU6pEN;e8(Z;eW zpcTFI7Z6<3MyhH!P)cjKww~dMYr^U|U9|O*9{ukJln2UndxG*UOcjM9Q?_-pdLP2E zfkHy+kVp+qG$*{yXWYNng#Vj%aAH28eCJCvPfF)y8QJ1m6ds`URp%<>%hPG4IbMd` zEYUzuVII7{;_J%Yk!p&_%W$I&Jn;t@D6sfLy5txDJ(N~T=kMbQMe&41a1^T-C*;5r z#c4eY1B3B-N;vLHGm3a14hfZ37f_3GLjd@Z|2lgg797miNvPdwLHHIkYO~d|316BZ zU<~C3M8xe6fi&fWN3B&rK7EMio(&nY24YcfH~`1@e7D3zgZLc)+x5qhj#FzBPhK3n*|ynYzim? z&lsIj^8cIa9)4hBv<^coo?Snih0a_s!vtZBRJuF>?hlCjAYA?xMdpzbNw&> zvIDE{GLAb8rW{nLTPFoJ1=ErSU}=I_UYi)hN}}8Bq)+|MEQWa91(Xc#T7S2gnKg-~ z2X6bR-;{c0Rx}7|H0S*nQwmQ=sJ;n4Cinl_9Li*_jo#}_TSYaSCjadcF97{-6tL2^ zJf6>%>2JyIcEr`)*hO!)JngF-UKJ)W=KsfS5rQCk^DK4Id&mCQFzw@SQ$4mKS?q)l~P7X5obJ*&Csg^F0DGx|HJ&r5pSKz^ zN9W{SCtP;f#|J!d_h`xMv&il)`Dhg9&Zce2B*d%eipXKT?ex-PGP^LN5GrPVNKp#| zb+#>6kG3z?6Xb(O?5?g=Akn627Fon5?t0-a7PD#LrEVP&jj!i%W{8eFIRoC-pU+Y< zJRKH@-cfanSP_~yZcdf`?>7AJjq-K?w}7aFyvT+K8z)k3j9%qPUh-Sfm}SdZQrM%eJW!^}f{56cPE zd0&4|o({g$qg?!MgbIKHXl82LKUnaoCrvcz#jzUO!{Dl|Qi+2`juc_;d;c(j1W;)h zukO|m5pXQ~hTR*xw&&STYOwOLUk&O8aepY8@ADd3wDXx`&M)&mz~1a;X1;#X9Bi8B zc{wp8{k=JL0!kyw*@Juk`r7h##0KTW8*bd9#FfBVBOC6PZhX)-BJhDSg0Sc<8@;3O zNbW3!941G%=mTFU;7PnL`h+ut-$@!y4YH#)0)sV0GgIrBRIIm_>wQn^lBUOqnAC)w zAP@U0=Lli_kN0x?$L^>bFpR|xsGGxNT!KoofIjEK15&92DqsB+e3&k^;(ujeVp#rFowJ z?XM$t!qQXRVgBFu>f2j-ii7I1UYAc}+JpOXd8zY*%QS#AhiP6qZ_T#}(v4AA+M}76 zisa9!eq5Q#h94UWI>c2`=U=iF3KzvFY`HHnw87h96+TxG3L#AwdNRaH7_4{{4`Hsm z?*bz`hiIP7d$R^eb(?5>M_~LF0y51X-t`U{7cJYS8H=`7Ye0s5bJad?sB4ak13{qM zHCOKkp~>M&qSI#qM5+&`t@y90lUtsH|IF9-=M-J}lkS(53vx{p6IV3`@2mE+o+9>- zz|eWkfhr!zL#eCpjzzbE<1ET9o7O|swil_ShzH{g&JE$oK4u1E1(i42;EnW{Qn4_f zdwueG(&0+RJ&omwCxtur-is4x8>94o9OK0AIZg8I7)0*`#9Byccc+OB=M{o0Sz|Od zC$%cXW8rE}t9d1iXso0Ves2fLXdiRFW0$x^kw&qDg@^d2B{{NJ*)HL+b~_z}RV>o5 z)gfwc@$;BI68OCcXtn|-!b_iCCZ2O+OQ-*U8Cp^du6!o_9AW!@3|;2AA@X;95j25Q zZBT?TR8@GJ_%K>9elwRCqQkmfUOb28nFS+VwqWVefseNFCyMz;8Pn+4Yl~9I@*A;{ zq-~e-+>$eRfvK4pYP7A=MzH5=rKC~Mlqs_At2g?=49)8E2Crq76n7SZz$lCy^r{u3 zriNK&ZgZQDgSqe0dPh{KP|%AuWSow&BV~nH%>^44d$idFSvC*2de26p1-S@pi2_`C zXHs%q*MIX&Z3-zB5YNalnXRb~QGKm3e`ScMf3JeYdpZBLornEBYe_nRv|Pv^5}taa z$q6{9d7P&ab?P$-{_=72cq;u|X$k+4KtKnkTB8-bISatBSRgUa#;JDt@A8qH<}cBjJrQH z!L7)of6`*_^K27h{u2`I->#M-Mjnc(9<+duO;OnWhlbE3Cw1a0t||4xw^oW5mL0G+ za;!mr)e>2xK-?EnfYZ}@%$;wKTn?;K6wE({DI*E6*g?KVfr2;}xfG?np-rZcVgFS( z`3{XY?wk2`viPs;MZwhD`JWnBc%Tl)SkhFK2^BEYcbnv{p3~icm+~z4gS*(WZF%)s z94@b4_Qo(RLEyXUdO4kRP~Pc#3Nk>s0E~zR{l;D+CnrE>(*}Ed3hyE?@Ys>;+s%ly zRVm5*PXy~PL!jsW9hzOoo#Q(Y{oeZ5>SW$$Xt!Dmg((d^E&Z6B`c2^R`5Id_8LMBL znR|$1{oyx{`KyZQk2!=4avg?mRHcsZ`^-#U4E9Q@yuJTV6G}T#i-xG5Mg<`QNA+Ri z{3RxIdh+EPD`UHY%!!lmiW-bwh&J?y?e_;PI|71PNr5tANF ze`C@XfC^W`;mf*kBiEb68d$d14LYtnL_bvUOS?XR%nD=H}7H)Tf5txjc zY<)+qYbzI^ZEQp?xeSb!zL{7ExZU#ifwy-|1HV#dt2g=)EH@&R+oSM3GtISqPU?A@voR zNlx6C@0<+i<%D^cE?F@FU$%etL+_}{@L%_|tniE?YvY1eN%~9RA7c2~AeZM30y=

b;cgA)ZCCC)M1}eFwhF!h_;Aie@(C-6IRok5Mh_jipU#~7e9_qR(^6ZB?QQUiy3d`x33c7 z=U1VHmdG0JTMCyfB@g<0G5acvAau?9$5cUZw zRtjA2n07DvW19Wm8%@0S1{ZcY{d05?mEeKMrHEaX=OpW_&;*iYuTTS8;M%7 zz!u^Hquc53mIrSv)OfKK-fP0T=|b_soDjA%T^lh=h2c%X@BU?F6l={6?Pa5Mai<2m z2x+J(YnNIZ=!FVD#BAE6JwkT(0*Q|fMv~lW;rU6Zn*J0oeJj+$d-IA26!S}nhCw~$ zK?$|feB<4>x7P^Rkz2E$Y;m@dwD{q@<+G3E>N}9tlPNTs+M7Bt!xiGm6-+!gJZE zQh!V|$<1C@uoQ?gZC*%`;Y^O*KGln9u$Fx=0oVbQshCjSyTx7CZW|RQCVH2AS64_a zjYj%%gI@&E3oh1BD;P3zmja<36M-o#WsAYh0;i%u^n4cOr%6{#& z4-sMfU7hg;B{P_5Vwrv{&gBponZnksdQ}JrV)3$1^+pQ77MzqPsi-NbX^0s0O1ZwF zj!%a=uQyEY7D$e^*iP$lXtI0upQ|owzj2RZb}nIOej9+(g$-UYPJ2YAW#3(*`M^>_ zl<$RbZB3{*>`V>3k*9~p#4Lb)3JV4$fb1pwzX5qhw@*B+PkO>@7~NL9AIXCDy+K8r-k`LBCTez@@~ z|R_pOL`?+>&Xk)Ps7iXyPS49xZVh$D^`EdQv3>#_U60pwH0et#GO~b zOp0n?qkgOBq3uYNfiJ7RyaWl)}zU4iX{B}2+ioX6t*V8%Gp?f z%4mq&ICH-Ixbq*@f7@Xz8Zu5>*);NP6ff=r%U{zF=4#pqM5d|Aj(16pKH?!>%NkRI z1z8ap6tQ`soDZ47oYe{V0q-r*I$bNxweHF{j_8z>x_M$er z)NY}?gM&u;x}DmCsvxYU9GY2VTG5AK@cl2o=%#%)-{g;7GP~@X;yYff#~frnEWtbT z4m5@+Wo+i>H8S)P2-Pc>EJNC7%it3{1a4thrB2z05IR{Po0v}t8ypz_xk~C^tg6}q zuRM?$Z;}MtPB9)n%!PB>V6$V#qcHSfuR0pWPh6~5u)7(PT-oY97xJa{CJ~W3BtV8A z-{n@Gz(5yyt%!2=ce}%MW;H8>D*J|6Nv%cDedmD0NYxvtmz3)=v6S2LimdTW^^ZJ( zXR*lx{}y{X{io~K^!{sJmd{+-t46XB2ZG1ukrQ7Dwrhm6NB96rm&0h^5zj~$e)GyqJyfbu6l`gP6s%yIkaam7=)& zfC(!epH1D0jPA^UpFg*$QTVJ}6Xfvm&6K28RUwJ%dQpLW$>_#=imPWWuGx%)YA^nd z21-6S*MqarKFy!nicKkGblw|nZ{y+$e!S0>uKh5Hv62p*_Yrl}H3t!3h zG8{PGMp8jx-YrdUJVZ`_rw6;>6LnIZt)TM{7)5Z3_TJrp|5FQCO>yfe?#ZMaA7y}N z?{1Mt+QpT{R=KY}g0SHHRqMqt2i_5sp5Llkue;}V{8Vg>Xz#D!E_7F|JVuC#k0>W$ z65RX@?;YB%W8aVOjQL72!Ak}!6xk5ZOXsk2*eLh2E*ipJczaU6@t{6O+Ns={wnKfE zx*G1F$leiE73xs{>t;cGnWlXvllt-=i}Kr+hoFH&_-k3+QapnGuYs$<_A!vnyP(;I~;=fv1}gb~1)5&Sq70 z^Jh(5Q{3a)vZN%HvWFpF>?)-E)BS7w(yRGfrgnL;5}H$-`G}B4^P!qr671e#$VHSv z>z)zoFYQzjjX-fZOR`Q5a(;gSS8oTGxxmn%EXN2iJVt+vvj639C z8Fp>~RnTgfXh_}C#57$L`h&r+MQy(b)zB;3x@mwcQvwMSYa9aQb(-NeH9P@E<<^{F zh(&`>d5nqL-r?5QkVyp;5jxqll5baCW$<1&+@vo19{OE|!6pxzmjj`$Y4aPpI;_KP zAgkz>FcE1lXHoW#FoCIasj+1LN7Veu1$ zz_$6tsenl*R^T+UIprY2+;axBYH}R%S7uvUy3C+A+R%Y?hoOGYw|JOmY zV^Ow`R;)SeSUCAkBI5%Q{hN)=fqamv=2oT}5;EqFqI>MyV@g}h=oHrvzEAz72uzRO z-YnYtTv-@M6(xG@->|=PnBuby-f5uf&3()m^PhKC&AfPI+FamO?SO0Zz59@u!*7G|`ViUOskVaMbn`dEX=EmQqN~5|Ul}h`1}GHI zum*jGIkbh$;H+3L-utm83<&ZIRmRMG`W!6MkYe#HKe0O_k#Rk)veaSGt4Af8U2^fb zXl=&EX;IG;k2C4U^iGLLx)6rMYdMr57h7h2xcU6~`+`Hevg$aE; zTS*LR<_CcOI2u+TF+9vcH<|SKDYxeK?QF#4le&Qv=I2R*3^|2UIb@d7FP_RO;QSXs z3}A{Tv;8z~p|N7_se=ZqyhHT7YnSq5i0swAUl!_JFmlv2@JQXl4vPQG@1G1j8LCj< zkk6Mj4hal-N2e2-T&a)QVy$zjxTzQ&>j9c;awHe|MByOvyv)ozJ9^tcQXndWJwS>O=$WY> z+iTms=#f#`*QLGl<-)>{OdqO~diBEYW3k4)$cJQ{N!{Q%iRda+CqK>bvgqtx!Hy3> zplzWcvBz=ElAj6Zu`nWYeRHIXz)c=SY}tJR?0xyx7VP~66%`pIIJHhxM=E z9Fj^XX^cI7QRc6ZcU_wz!<5{6E>1{~->4GQ2Uj`+r@Lm=gT{*yj{plXY~;1FOYP<> zD`ZM;+8R=|`<-o}_GFVw-fjjqdoZCbew%twQ-@0 za|(UEJY<|Qpp-iFMhVNNp!SlpUgEy#Ydf28m4sRFKdB_>X;9i#WX*wF!TbbW=wqDs z$~UM#xssZ1^ho>f>X-AubHE=3>kUl%`@fzfF`4+?zSM0X)*k<#=IDs%Jvc}suK9=~ zRD~_kug5LU5UYEwVgBlLA8(`o%+r?%5fgJ4IvXKaqvDHrU|=BILeyS4(+d8YXntVK zf*m=LjQHj13?u1xqD`2xUrsE3C*#E?{oLC(J^!dV_b=+2S5_d!2;wtn{pWm53Y0u4 zJo&h=-1ElcV;J=NTh9IAwt^-p{m_yw*n4OQf#*spCQYHK7iBqz`F)hJ=M!1C0=EZ= zA;LOSd-v`Dx82cE)1)Q&yqI=WduLNvg9_BCC0+MJrH5AKXK(c@-K2?7BmrNyqk!5u zEw*qZ@o}eSToxUF7*%SryzMXw&&#@}VPy`!Fe==~6kc#O`>7xu3PoT2l93xG{%c$V zy1({yt1gtcE&a>SxbrJSlp0Xw5g2z_jblIEn(GmuOxyCr#0% z&0d-8HGFNYmqyG-4X&%;&iy`d+n|?ZWojpjGLZqV`EcLkG03gbc7}cuj-fm6Dp25d~Oj`dXX(4?Pp4_Oa_)e#JzWLu?6|#UGzEOP)DGx{yZ~q@#@iA(MZllElt-uv$@c z(T+_#7?68L_G3p z>9`p!OmJktLG9Ry(*?#Qess?y<-R;z3krjRiF{!0mqSC`0UFnagIb?){*c@5YYUp- zd^T0D-B${MT*-{Rm163t-#FQTC_hg*>qVZrJ8Cf^_~N_`Co|w2MDY}zhClc3SF)j- z_)ylF=2#W1W(xgN%I*9NN}TRq=*mCX8--K}@=y**V%A^*I9re*G;QLxh12%0TY*XK0-i>TKE>%jT^JNC2glQs^ri1IvGGgpWHQ(Zu@ zOKpW47_pOx83{y_uUamS(~dT1CQ*Y){n~VfRj{0`n2zaU^R~vwaQdXaLnAg(6EZ-D zFDJ$AVBQaYeb^XXmH9-DkrO;EJ5Kt88SoJ4VtmU#iMYj@?$E)3&F4{+73JOE;$cd7 zD6g4!KHJ?e?Yh=xpZ`R>7p6f(N?nQzk;?iAi;z5S((m}T*xwgx+3>i)M#F6XT@&E& zo}%?BUWcub+F;t;B?oDTpy&j*{=1iF&9g%KGr7|%aFeo|2+h5dv+$r7|039^s7M&2 z@GFRL{*1o(Z;jl|cZaJtP04=a*JSNG-&Ezb^w=+VxAZ&Ch}xtIhzgu+5?+zALkyFH zO&3Hv<^?y$tA?)>TK`jAO(t*nLxRN#wR9AUPJOGwzu4zBP~KJwzvt`|y@!G9L?QtI z9nl|@C48s4IGR+l?jwZ7(y=X4dNc(=xFhwd8MVKv8`EY$4qy)pk5#N{mh1LY+2_7I z=7$XXmFq;41sC(9A{dt%vAU}B6jW_9d9pU<*20+excwRoY`8=hK}0hjdBP66jX5^NO0ox~&S zr<%pM&HKoseoM3FKeHRG>f7+;V+|mk(<#Z(Zfh`Zkh<$yAP5;DN~#&Z1t!xd0AYu( zRe_Sd2S{xp$Ty>*o_D7ATkK|xdeS<0bLF_1)&Hp3=N*EofsYL3BwH+296lm8Q~h&7 z-Qc*NM<^kRI+Gbr&kHF1!8)xFiqp3?nQrW{F7gi(I^q^c3By7`$rtHblh?j5%$TWqoys7QtUP275nRQ z^Y0NP40>-7%&dEQiKPY17@x5zp^BJ@*V%uG)$@(hi5*xXUw&mtPDk3a*}gUAm-Y7V z{QU|Ufm0Ju#_hNLvq>4J-zIM_?0H|m@PO-mKa~x5Uu67>2(9u32AduuToCEDsfJgx zk+whurPjS>qT$<;DbR8E-fBDC)gW5iE#W+jmVk1&CN6y%p~=%ceTpAalAjm(_c5so z7eVz7@p0*0Ca5j_ydb%|vSP7+_D2u!Cigq6C3S-II-ef#v%dY&==1~~s*6PQq?X-I zXD=rYIz|Mj-FfSa|K!VBe*^IAu+UtcjvTfgHz3gx#4i%!d<-|7NDev2<@Ax=6FZ-k zxfF^mf_MI7i4H<-d~@oDqxJ=#?mYylPog5bl6ozEO|cq|-?i&Vnx@5AFO#UfDH_$i@b zaaIe%EwJJ%cj&cku+=x1AAu=r$0xRvrRv@sRGzJnox6yAcgl9DWvI0=`SzFDz2+Gx zxDJcg<9GE|@*h)4OF0{ealAkN*k`NWT-m7Mtz~{=5C7j)U~rJF zOEYyCfeNQjq|Q?HKG>>E&W+q^DJA&1LZZ|0H%bUc#~#^|f5LeOMUz8~r6;*Yykh`K zpw&T^oy^&e2XG?8!4_jiG=f0tMFzs8Q_4*W4ehDoK8O4Im~P>D7HR6E0^K; z^A%*(95nIG5;tV>!v|G&<$o^YH#eSSL$DA^23$QF)K69Vje3)jQaL2(;L-)STcNbt z=F7569H#t}F}~DOk5UNju$-(8(F)sfc{M zOrDD{7S_kv6?f`9bNgW`3hG7J{*Em665v|-LIOMbuZp3@+c6tOz@tUG3?);S6 zwau(6TqS(D@AgjwePa)x6a24&Kl%x2F!+wZ+kZs#+EceVdK15V*mBIf&+xgB4#Fb^2PPfY4x?lK0tw*u zULJSu%!fna)#$g+TaK0Y<&G*W{^s=H-h~lsj zshb(fRHFf1`mSv$jAkmvv2Pf9k^CW#H!$e=nO5HrbN;Q^tw+w#zI6{@8qM^4mZGz@{Zf`+cTCclh$eTa zaQ>e~W$XHcs+rB{udf=GLsx`5nr7%;8{=b1AJvs@P30w-L553LfF)~P8Ji%C91_h* zr@ujT!Sflxsrx7)(*$=a@I75Tu*;visM0`r^sLRajVK z0k(Hd3b;*c{h>CTE`e#i18h2-$*8_5gVhspk?0r!k-39f|FX8xV*sH7zR}}1uuT4%?rHC-bgo4`-**xC zWBmk=F7A$P_WC(LJ#@+aN*uA6cYK_2bo21=aNOGw;N?|+=pt|D5tEYYKv1z1>f{@V z_@??<1%0sOo9xkT;WCcg7hk_cYGu{ zDsUlT^+<#Hva5joted9oOR^#6^&-L_9lr&X4EN1I!J^_^?crKP3%W(k}1$3c>tKXq9OXd{vv-><{#3smQn$s%R<_!!3seALj zRHXNb4_4NWEV%%Ltk(x5$qpo6Yh+Z21r)_`9^W6{r-b!cxez|912VQxBwGVU_ z*aSsDYyqu1_o1azkz&{w@p90iv!!(S=#s6jsRvc>_mO&Xsgix)j!fvOTrY-t_X|V` zC4gGAkF)~YlBRz!GPfE29NU}=&Ucu&%$iNvLT?{1JVE@yR=;D<_J5D{?KcGc^L=a+ zvhp-;@9InZU_<=V?zo#K1DgxB+oZ_putv`Uq8Qn-+L5)PAzb zXnh4pPAXBVsvQYr@s}Gmv$`a2z@OL#sC}3GB@(= z#Ut^|+}btaH%gM5UX$No_KR&R7R8Y$R%XLKHRkq;8XY7aXBU|uMq{< zZV~yx@Y?6K^>G;LrwS7wjZJ0M%&wF@9hFW0pdkk4(@~(3fmQEYy*zZN=@l$g*h$H#H6TtvjZ;R(G>S)$OwH)FV`&Dg6^2na!mgz#fhy06(Ayn%a zjGwToc1=kbf}aMm9~8e;R7bup!*xzPo964AZ-wKkV{fiy0<7<+8JVo)b^2{4Ms@Cg z^pd-NEGDJ&4pJ8o)n~-3qm+DDBe0ab8;^VGxJ~uzVmbL|BQhS3AwS@^Y8?U62NyPdL@Gmm0Mb?3?GqcxsWZJ0INPtsQC)^cS-C=@uJ2@G*IfLvW-OI(Y|u9L{lNCt}10yugc6>0{d! z!XuM-@!WTQ-g1N5E@($B$L+gPkCRf%Kjc$D5QoOK&?9Px#$1{PSulc!pZ_O50YSp~ z_E<~y(?wxlw&!|8EV3`l{hhS!r^ljzsW=*WpW*XQa#&}uBZ8z0`bsdq((9dID7w^T z>-nRxRWaw*S|OP9xc1PFA7NgM5(mc_3(18E^2}-R0+XgMq@srPC zo#*1>iiOnezk~$;D@*_0Z2z0JYV-8@w9r_)`mN1!qCeZ(idZ%*!8)&_;lMwQc1NVB zkdz){6)e)0LC~=xK&?m_J5CH4CXgdU?zaglSw~}orruWVZ+%77m-iB}lZtQOkCuV- z*}Izh6(}sW5g8npH9}Bqp%nJL=8DtOK03Nz{V|IyX$7Z?4lU*PrACi7lOF9?bw77k zIHk^$Kig8-PhVDZ)4l+aA#gdPIS(cUwo@uT98U`T3aJVaK!`&7CmT2L_Th(txnS|&OKFsY0eY);?eMC0qStBZ#?ZlC zqdPx~mh!A6k@PXgH>Wi}n;nou2=_b8mR45)!txTpEu{5{Uiv!3X|CkTF1+ii*YYIn z_ikSqaneus#L!yomJXChpbGtovibso;LPsb?bsJYNFtjnz;yx;Jtjn#DEKiCc2-QE zLLJR`Xh)$J3zsN0h(g_~D*z7@!Pb}{!{i}zM>CljxZR_Dfq$nCL!BGpN1bwBym%j; zhtH{Or<==cHapwlG1(j>1(K<%ahERbi1K@+-<{1(;!*=CD@ARg6-8M2Q#2dcZTdwoWfdXxPG zX0+UA4QxFgBJ9Ji&zx<;VrBM}XLoxVDe%%U`l!{1J&w%Fj%Y|n@+Cdl69wV=#bc~# z4DNV+>o+zex~qr&UX>;xC8@MG(4kA{=t6C*n0C<;dhx)aZv-0$SvvKHTAc^@@l+6yn&mJhvv#C!FD7b6o9 zt_Lgzj^nf7;@4FtRP)`pM~iqHf3gJx%#h}}iW%E0h7P~1DH#>&V-vgI%wvj8C&9#ZU;WFSBi3R%YEVh-&8agv%0;Q@D+uj!rMm{7Ytkz@2$I$ z7~#H3*`oc!Bo`2l2RUmrAfD?5+BEN{fZeqZ_-e;iEh z^L@V1#zEi5UX==<^5Cp!W{gL@3E^3Ke*WjuM2&BHqh~Pt(rLv8lxIYu6&}#9JxCpy zcUu^ggWO;uycImBe>62J%HSS{#jC@va$8w(jkG&Y|6_xBq-^!v!-@@UW11cPjZr>4 zI6hN*vWHxyJD`@TRZX}vz)e=~SK~JPFSVUmS?c}&TS%KX|b_OE^KhWGP0bKLgH*EE0R~LCUK+`#;0nBo-B|ZLASRrSPvv zjRJ{1#YtcIu2h>Ul@}$lv2iHOUsUc3NgUm4WWveBM70m26;X@O!2=;YX2dWXSult7 z>)YET;pF?5?#qf10I=u{=m= zIezicQ8Oe#k^LY?QrBw}l{)ys9 zj4m{Ht+@vIKgfx{!=qz@Gl)%u_uk`OFbW>y{ZpJ5qJNE%XI0EBB9my6hormhAlWaN zf`>n*!%#0O3(Dt}Co~4L2^l@a@uJ3V+xZJgI7Ww47CP>IM>&NY#N7Qia6>H?YA$GIje;)d6F&!f~C*%4=Cm=imLRcmXI=zO@bd7*@R7Z z`dD)>SRUkX5}pgV3E|0ST|9=ce(f-pDJDajrP{s6_bHULu}^7GreR;Fcr zyuB+e$Fjb(xF7zQw@a$8tE;-Yy85B|YbA-SB?TG!6*xH_vIQRe69HDoPy z*gHI2o|>;eJy{!RZCh996d`_rIr`@QTDmwZ5Ke*9y`#7~MmJTPie%;&>MHvaLXGlO)675-x_F(S<%!uZiusH-CK!B8M4#9aM@Xak zFRy=gbkONA4z-ba=+E@@DY=qAsaB=j7i@gWTNx6KYrpx;{nBm**hw9>STQ7Uk{>MC z_U+j91U1ULJ>K+9?5@mcc?-SSWX%$G62ogq^ml3cp^1iil4$eLzR$?LnPy;0l4FP$ z_v7R#_joGKb}G*gvTI9;%DHIU~o&aW;^qM#YsRdjC06 zCMM6CrQsy=c>M{A6i3(s+CeWy#xVZd(K~)i9BP_9usvM{Hz@jiQ{YT$9R8IOF_=;@ zYoBkzq#!Lt`{KSs?M>{6qNx6!L_6%i>sNiLq|B-SBuhp_Kpj51f|7g>If3uNs zF-@YMVe5Mc*;Y}(I<=KI;_Pk6UlL@HWBX0#L?gky8M$N;1bVdT4rf!_2B+0AA?0ag z`+k8wr9Q)mI8)DqX}crKc7Jnl^!xFOY_FBb4Qlkcy0n7bVCF&T(s+shSu7CEzgDw? z)p@qG<|057|6>$AKLjdcWFrnz()pNAnL$4I^{KqnK&ZwKQ=zKwwjJNWiwYLJuh<*2=n}!nlBm# z-YC+F*stBwbk6rYq2s&^&^xDQ3Z>U!1ajhz zA8odNM~!_!L^sMuga!lvYg)~tN)ZZo(A0K#DHYJo(_bj{xH}UX8cMn+1B0fHZJz^Q zf&T6DwW%q1^3Y~pYHF&Lg$0XYVi$-rO)k!Y&&L%i=+E_$ojB_{(kVv~aTKc}?m8)Asr4QJ+YDAY01l@_q@aRrU%zHXRz3kk|=Cq87u=f&C5 zZNd#vD-@^}nY@5b0gQkk!sp6wZ14=P(j$kCu#lTAI^Wta?wiW0UId@RKdWP^YOw&=Ni-~6#cQ~5@KY_XD(vR)?WaU*s3O#r^W z#0T(gq6sfDZ3eCLWw4Sr*-28c_B25zS&%B=4vxy(PHf~y`c2`V$XTE7{pFoqU594> zU=4IMRq@Uadl`xL!daNVlo}tT|EPX8o|Pa0*X?G6Mx~Ux&Iw{y2`$D!Q1&)hojL zum1qAQe(Vj<1`8V@gw~hxlAR(b|*Mkn7X&AVa`1P+fGr@%y96p9Vi$d zTHfEJppkYf%}$ChJAP6N(%-Els^eqX=qvbY6}*G&`uQ#g9h2N?9vw2CtNWw_2P#yG z9l388(GmIF2=Ko03s=!gGr){s8_h?Q;Ha{!R}Mm9lyN{yf7i|9y>uP+Al()Q z`}cWxyFPcH@qWKv@AqrJUhmseN4;Hi)FFOCkas|P^OrNu#wNCkNS<=WYe_rgL@Ec4 zt)f1~jukK(lGu00IF~zL*GGUMS?aA~O?UO%^l@Kw&aM+9-#1q1GsnEw(~P{Z_qq-2 zSB@RnZff85J-SwBy}$YHRV{}lIY==cckcKEwec4N4ez`+sJ*bIe9rVIxvSvSZ2QLQ z!Oh9ehYWS@y?luCmiGZyzo{-ec4p9-E0_1!w;8*JeeJNq zkEmwe%00gJ*65%dh<_2D&4W%Ka0q@j&&$tRZ({KIiNWpVSQuBc?ada=_^0~aJ6*dw z4U&?&*{@Z=vFo|9GoF545VF+5N_!s1L@wmR&`&qsy$f#9JbiIc=f$lDcb;9_GdsLP z>+GbUnT9Po)b2I+{=C>ehud{^S+#1F+2?tWXLKI0Lu+;tVgjBGJFOM!Jn8M!5zzxX z*4wplpM}@^LCziPob4ZbaOmFkFZ^8ntj~rRm~EEp9=)6$*}-z$A!_`SYo^EL8mdnI5Q?C-{!PdCeq%J$+NsW~v$=8|_WaY3t)W|G zy^6P<0!w9V(DsQho!>1OF(l)hY4<~$LRyW}(v)d+EzH%sFxel-Al7>>L#`KU%KOMjl0v7e0Nq?kvU{? zxc&#{F)KJdT^9H>4v5zGRe2k|I573HD$AkPrSR96uP)kMX7;u-FLoQv;WM; zS1(xiKY5PHuxTIss?X%%Pv0t9Lf&zYztR%nqdlH9lMT&1Uk82~)lsuo$$!Dq?z!sL z*}Zf2e)~c5dcMrDuCsQ{>RnK}F1Om?qU(E6{g$R_edQhHN~X$2(qM z@Mx4a+Bd;0sOHs>S)1)@4frhO(LO8Nz5n<%F9s`Z@>W~<WnWHPdN=*raGm!5uxeJ{ed&&YbLa5~Lxir-|7an~N7S3~&D+N$Fe&RFzt`nqY2#spml z-PAd~4}Wzx@XWUDHsibRv`;aqD=x0Mn^^xxr+U3sE$I~Sk7re##nmDL&zKrcAA9V% z%9_^K*Cto#WtD8bxYZiFpsVV;J2%N2wAY}6`kHES{`wBBBCd4!&}v-QX{OdleL1mJ zw`Pp1t5iGJTd$|Fpb_@3Hh$ChtKo=g8q=)mz4!&5*EYM=*-JdttG<>t0dNp^q*=fT=X54BYcjcf>@PaxAb9e%ddMziHU_IjUY$0{{$ z)aT?^3)0TFM0@83J9gW>^R!Cvum=r%J(hpTmKk%nU)2B3xV8UyAiCCUkJy)IAEdua z`~3Z}iIR2rvY16Zl10TuaeW2@3oxywDa?jgI`Dn{j@_Nw@StZ=>o(Cz)1L%) zn-m;5+G5Fi&eUa#koz{hng8PJwWYt@YJcVvtG?xtFT3x2U2(FSOI!O}GiPQ#b(On$ zX}#{0k5Q?stu3C)ux))?c5;2xw-fiyxWtba>O@#}e;705WPsbY?$5%Tox3$G)nLay z=SRmpV3wG20PWEE4J|eILUp{=;sq5DIfJd95o1X@a zGaeFbH_CYE=4gkVBdW75xwL*h$Sgh=5t7EUK0Qg){c!H_)7uC#jzd7%kcaZMpQnD} zHrN)q?D*u-q0W!?o}JUTUCX1r zUY9A?)m6saVe$8o58HNsmiKtvtRFVjRXdx@49r}{jY!JO*>-(-Bi-?<9#7Vb^t5%~ z`7v-&bTbuH4Cs@HLJZl{gVRnvKf5X@#Gq!c{UNhHovQzRetbKeBOCYXvtj$QpkT$l*6vTkleLg3FQ+zT zM92#tE2pz<-{gFm+j*Yv3D;#u5q@R-OE^v%$dwZdbd_ zKHJu>>W=$6BAp+l&FaRj8r(##(~N?JD$=V5b+u&EYZj+oBnug^-SC^PcA1n0KKHXVm5a zk)~~ZM-H8>x1z6n8|OW5P9J+6!e%uZw8GR&);uW9)7;58B0GDo>41ROr_C03YE>gI z$Z`rqv?Xx{78}i;+l)TEa=$h*!(UZ(m-qDu%DvRV{M4EgcE{a^OzCx8rlIq-4%^M8 zJ9BN9f!)HhmrRhEKU_wyoo+8nGYbv&p*^Z8vPa^imD%kYPZ-{#zLNEmr}9?w zrygM?dB(@*j`RQF6`n`^~wSM6?eX_g~f)T%E+heYW&UzYs^mdq>lZoDv z{_9Q;k*eyp!Mw)xDT7k$m>h7++Z7@6cFKr7J0EBavwS#eW8a;1*a<5-);3(Q%C7cu zmkIOET7I~Uj0jFgMcsZG)6NWYKIT#F+34}@4y0M^sQOgCb=UoF+~ea~cdWB!RPb~4 zck-r(H&52fzF@uYVoiuwHdYU>n{Qsy@Kpn?Ef$J)oy;@88?ZFh0}`%AejT@ZtndAP z?^D)AyuY_w_Ha046U;J#cHHV-Rji2 zuUdOT4ciZaoy*KS!KXvZXVA;@>>f>9mR z*;|})rSADJ=~S=FDSb7^w$A3O2WBms-e^PG(9DLXJk{%T(t(Z3EnR~%;6BpA?RVGE z>M&`DUwZ@Z5^oO7xE zq!Ic7Co;pvIM-GS++6Qs+~k3WTdaulV&_i@g2?V+!|vOK>1<6=F%`S)|0p7Mcr_v&6gl@qdC-d`;`tIxT6b2iy+{6}xp zyx03!*G9Y?@uB)r%eN<97`ACYd)tWx`U?(us|K#VG`Qx0H<~cX%WXarfzkGtgzdfzmcsmd4>pK>7wS0(pH;MF^4(BbFbQ;svZ@N0- zev|&G?$KtzyJNbZ>gg?CdR}~B(6SSULcZsEzTc`FWm;$11&%?ho?E->eLv7E(s76N zoEAE}`y8HWvu^dtsxIFKX61Dcc#_n5%5;|Yjj9KxEqjr^U&-{5mFdI-){C~Of7{o3 z*Us6~J8o#Q?8oJAAqz%jcM6GD7~g%<+>nt9*OZ)cWv=A$Qw{bsAGUIAe^y{#dhh18nZfA2KuVy{y&l zD!mPlFF0)1tk3X_qmIjdAlu>avyhfX((0b-4_556nEd&`tMmhgiq;dQw`iLC*UUQf z#y8x^X@a_p0sDuy_4}1>7Mra%t+3Xs;d*ZRjIh~_#!BDFX+5fGziW4;>(?-Ud8MQ4 zfZoq@#*H?)RBt{!E~}AQziE``$%L)SJ)egq8q}WR_i9+PCFeSx@84nkrJaH5*R2=3 z-}AF}d*ax|EA8Z~)X%=XhA3JN%+3qz;r+I8luh>qRSroHliqd0T4j;m?oqxqrN_4H zc4nT#{iw$*+aZtoxlf-s?YwL9qomF&Cz`(;8ofBdwEBRK)_#_LUM!iM(H7C%dZ*uq z$7ya`ZoBSqz>|no2bTsoob0BUBiLgAp(?Wp&C;edxJ^RvE1I%`ii+?betz`Em+=xaf_8Zvrbt*W?u?xUSL z{abR=X)A8CY^o1E9OI@w=boX(d$$wvTth35PB%I^d~=*;`p~nX?|O^QF7lx_=UHq;0TBW+hyXM}XwK(wIO|uB!Y3_rjTy^pPI{T&)XUoL9r+XV(oHJ;T zx-|ZK-1fF_-Ci+ciJ?PS>W+4K-ZoPfG#&2{)HGnfO`^|+JBcV8V}HiS$S(WUZmopV z&YUkT{1)XcXzM=swUbQ!st5G1SC<}-!1OTZANQO0s@5)SXFWCPrU$m@^h}vNBCqqP zbj0ArDf_l>G0Sb8(~r#h9l7qdCmy&Cn*88@{tsZF3GJY-1W&_BH%{Ewce4?*8~z@3 z6=b{b-ml%f*`4jyew^y;E*$x7FLZmX>+BbuJT$7ak>BJ|p6U;WyzlO*9C(HvfaPM2hb_!xNE*T(sX0Ra&pMXC-3PW_L@e8=SVdQ~bUOakf`#qWHx{w=>96@UMq3hvoiC z&lfK=pD}XbKuzryB5n&3bcAPzrlumE8XTyHdpGb6Kp*zZF`ce zbM*;M`h)xSX1%yIY?Z3AmurKmt-1C0DmLovL`3{+kHa>3RbPG_X>QPy_1qn{p!>=D z>fTKWwm5UAf%C}5ogbg*eaOb3@%LLVuNx;Tg>0>kkUB81p)$-&WzE2X5@eWMB_AKu`Bl%uXM9>e z_Ol5ITGXNGZME&Ug1Q@c3^i9(Tya%BR&kPvgT}gQTU8pjj&yde*Z1H()KT$%Jzt}j zuOe9D8RL1L``-t>uiPCdrD?>~F2A6c??YqsyB ztHQq3<8odSa;V3jdl293d(NwQ1C4(y>bm>gXHAyPo#uAKN4mV;u+r@@;t>*T)l*KU zdF%VStNFcj4Dj1DBm9HH?pt=Oyc$lI2fco8w=UPCea8C!ewW|@w^r$i1O%UpaglPi z3tWfV$$ay2I%zY}WSwKHh_)6-oofwp^E>Ufd5rqLVOvhKcdkf0+E!N2GCA!ZBX8Ba z;oWu&u)ka*df4$L&oXsuE_yaE{kv~}>(Ltay$AGs{yDz$W_V+zd_M=W=AZM6U2?&p zn!foqFOy6?OP12Px_1WnZS}vD?q}W5Yvb{#jYhTBd;>}jMof97wa2?tU1_=a1*06= zZR$E;-TZBKwuyUfj*K1Dc~o@b=!qSbZ;WKy4v*d%)3c4+lk3mVubtj*W1y@~^9Fh@ zibh&oOI>~Cd%h=(%$^4 zss2Y=zU{@ndq};r(;O5w(BEz{VbGKXb6Q5Y)vW8X&#aNzSR;9sk3DO#dMzi1gPV8M zQq-U1-2eSXi^CWFoAj=;&g`R|N5lAm2bTH!T>pxjdN7`Hu(IK~LlQvx+ z9kteH?W)h3FLkkAyZO>>Oi+F$@4~PlQBHpCPPV`4ba7IcuYo6b&9_7Dx>3jf7jydK zaTIDY_YJeN2p(y^s5d9c3MqBxOm(&$-S&Bgk+%Qt%u*)1Fv+fR>OSg+3(@blSXZ9*Yn0DCDZCwt2eS5-VO*p zJ>c5o)AKtZYv<10`nS6roBR(Xx%CSVTDN+7w*xyT;cNRh(g}M3BDfY zKVF`clbNJ7e$ytm0p9Bx+&gZv;drlg*}?9QKF(Y7{KAMY=G`CWK_l*KX`@bII3Ql|gTm3yl79d;z9j}t1=j5Hdrb*0l&OVc4A z$8S=P-Qzc*j_=)8J+01r8r?KAw_j$w?Mt1b>vm1kUZviUvnD(6S=DpKijO!MA?&c0 zpZjw{>)O0k+jGJY;oQUCcpo2-=c4X(KzDGim0PQ3+s8Q{ioI@VdTX~ua@cPDsY72j z`&wm@-kgxxpOT?1jov<~nT@i{mNQn`?W{XLzjEwbQZGZ(g-X7ev-IX9Tl)niDjS%- zvheFP`>5SqhoLVvu@1Ofr}kIZb~)#&oTGWen3K?I*&&Y881}_lgFoDw;;fB$-qVLQ z+70@Uuzv1h?He;Moj_K{=QR^l+P1Xb(uUjOUgYvu$*K=}Uh?~@?K_QY?q9uzvnS#O zRFgH0u8n@O#MskZ#idO*DOnwrql>aT^lLue0SwJOUfbpM)pD|p zwGVBmI&z2gymNlrTR865*oV3oPt#7G?S?$({U8xmPmMe$y&dd|VA}Lf0}g1+PD6&? zn1}KyGp`?g^Ucqhr=5hIUpcIm}>+MvDk&W`8mvJD0ww=yt!Q76iv*2aDB>veq6 zvV(ih>opsDJ&%hw8ZgCtU7g`IP^8Vv@X4*CRobpwkj-k@j`fXoeduv3!$BS&jto6F z1QkS-16Kq*j(BZr{dP>-tiV&zE~{7i>})e8+J9PAMP2hgmVr8sYKgW19liTyv_H~F zV~EYe=H|m+20oi;=~Q#WzOB$?<2I^$z1w?bXAoQF6sAh_?#*p2-`Sa&aE`3mzEQQH z{;3kn`_SD!w!Ush-G=V31KpL#^$Cei)};T{>otXWm!UHXM{) z=&3vSs8{?+R+oU3dOM8oqYAR@%xcZ9-uiyv_91nvTFqTs+c-7r6Pd|cVLhQ$|#B1k1+oLQN;fO?IA{Htm;OtX-`+#D}-G(?h3KAN?ZlvTe^|lFak88g(Z~WooF*R6YRL9-@QoPtLoM*rzGc=ew2nAS$C!T~heBytE!MPNYWdPS zxbLt*PK)2A_ddA#(4CgnI^HiMc5t0eB!#yc`+mq?&4uRYjDK97-LCunO>LTfk9peV zB#5TM_a;pzM6ut_3mf;*@o0bf)|qbc_JJRqHy>o@NSU8y+dA|!;)K?;>E3XxjeLuf zHmKvHH2tOh@lJXX-3ICQS6yTGKNlZMg?ES4TQt#$K(U20n&;%BXX$KMb3LqM+lcWF z_eUhOU~$#VtNXw1*57$p>#$Xa5)N29b!*~Vg%goJ+xz+3=bVKToXmT*Ma`(kv&=}A zJ)+w9v1ZF!eU@umDfBlq2=~*om=V@-4+|*~<3nb8eq2AS*6FHBHmuO)(lf8WQhQtT znY2?aR_$Xc@~f@GFB$Y7sMI?6);rTd$COS*siU)@t-rBplZHMts2T*dnOse$K?Rc9wmyq)KC=8zJ>u+V$_#=g@L#rvTY!0iSDi z@OZa{ouK=_x+@hFj8;UbU&tQW!D#k=yY;Lajhs5{Nz%K8r;J3^d!KQ`pFf>4tx3yH ztUVg-{--vuPoH<{K4y;pxVBFUe_Y*3{>Ha;bEMLA4zC^9=TK8^CplJ*M*F>y{_h_h zP@m=htd@GbtR@PXuVS+T0y08W&TM~m+wOM6#ttmqeqM7;O>dpoZO|>9JM&Dy#n&Ih zmfeoJ*zU)@e~*^u!^W$X9UuQUIj#O)bUnwm#kO>HC7o3hR~ zayjo6)u^7oL21(KWuDi;5uw}hWfaMTVkY9vENlX zVLXe=sdYa&ME<*tuDfi4y3=@+l5fpXQ1~9U?^t^L9_Nb@L-a26w5sdB`n0;eauc0f z&d#w7)emOm^_!ObD8SQvl3Nvxp{nN_d{${RYObc{`OR{n@vNMww-pvn@U?ERy4zPT z6Q_kux9DaxYBbGz5sO>*MnI3%i{}rq_O+?6s?p7L*tn}z){m*LW7n_`t5w66F`1fQ zWzIFQ8R0jK)p66iPVW>#Hz;ziIXeffzy<``PGk1nGPiyGLeEEbrtvuLjn=I79y3gD zncrpS)MMq@v&O&9SoM0E%}oDgp^I)W=8WpIPg+6Y#>sQ-^BR9`5im5GJ-DXStTurP zw-XPVfE$gE~=zi8`*J1OI)xGDw(y@6tKpY?GKt4Q@|} zo5QNAZvUgJOla%dM;+O-)l%=BL9u*U#aXp@`80HzK{`HWl)VNh!hdVZw zZJ=YSKXvCA$13UrQ)=9{n3<)Key8@xoOtah$B_Xw@|ORjsMM+EId(r5j=sGH^gLlY zcBL-BlcUWbn2cXamt4(e|S~Knp>OLCZwr{y%R71A+y?gkVE3 zB3KPTBiIoP|4j#NDTDe_EElv_XxV80-*H^t@e}L_h8xicrUctR_0U4cW~048%Rwve znE&1<8g>Lzf-S+AVEv~Y)R(1bVQ7DG_iJE4uqK#mqW!LegBOoP`-1it@4p8I1be~( z;o?^w4e+w7XnAOVasPW^KsX>=5KeyfLG#QSEfVc7-v2BZ5Kac6{VZA_jb}Tf{gvnc zEW8V@L&D7}G{RM79&&itF0{Y&{?EldGY<$yJJASdm2t@9A&1cZ;{MOaz2F=moDuFS za*(~j2aS2|-_L&+EC_eywHZm_UTie`7x({i7!VE#mt{Rhynp}vCmh)Oxba5NI-<-7h+Rvr4}#ZA@HZ!0LBT9STYFb}l`4CuCBf~ zip`eI_&WzAo1+|#aPhrMQpWu6`lCNWSF7#a?`A0)zc|4n~lwQ96m3>ZE^gSGo zT9T&bhJ->GctZy0^8?S7NN1CkZ4revkX?9xaoVY>Iw=}DV43-Kk+D&%2;ttQ$oFNU z15#3281LFdQT-*{7w9SyjXl2~Qdz31lfwj`hw*-6v!(xd9g@vffZo33M`7Q+bCs2C z5TnT{L(CLA7jkuIl`5j=fV#S4EbKtgr7C4^Q@q%Uiav|YR!o7-?}wI_E9QZB9(2MC zHMLpM($e+H#lNB3q^YUR7MKG*dCJPR&5Wf`aVYuVWtFZdFtBDyIL zN1&rA&~pXos1M}n?q4ft`}#@vm&#UF9{NR4cLVNzU>+xnhZlqIl0VsOPI5j>S+FCN zd|f$z^TmBZ<-GSN!Lo3Ska40lHC^JFHKncX0o#`$*#^qMPYR#+bH>SreXAeYK>2z* z=50L50YB$`l{y~EH~gdXH)LdVAP?>2>rvn>nKCks%f(lI20kz!g>X-DzqE8M_`WI? zPd{s|g`%H-dYnfdU>pXWCzGKApb2qA8-6#8!K0zC?nq_&1wAjF^#0%7uQI%!*3lm? zSEG;M{XM{63w0sr90~9(3dq6i4Co@UGBVB5;UmM})k*fM3>qww?_!N7X=%AZHe>qa zl>_;NaQ_GKrc!CpzXA6Jw2uuPU{pB#NqG#+VSD%?BU3+GMP*Ecmey7QSur0cv>r7y z9HZssjUwQKltd;)9D`~i?6%R+K}q(A!TN?jZVT)(jul=?B?( z6&3r3{>l0Y=H<`gA;0XoSkD=%suRBn&VfQ4FzZnCC-kQn#86;;azw6YlGl`#N5W=X zNY6z-+dEfV+l_DAqia-DCcwTURZ)A)FN5R1c`m@lf;GKT#9H5-1^YuP>D+2+Gtg$o zV%>r_7s};iSA!h^@d(m__QX6{S$)utEkZtb(lxZSHm7Q6tj@*U${b^8z#| zQbOAD7r&K2gMfeF#F=kzBwM(u>eL_7(sh9c8Nw^WfAi=ZK8k2Hwds*`T|VA?^1v^! zUh`wqn!tRm=pCsnhboe|9=ajPY5R&yp(v*Mm zI{P#G&dya)83&(gz6?M(m6K~tcEM8M&&dVt|5`W)JhKsF5Ki%Rh4CxiIr;HwrN!8> zbL8XHE}HgU2!97XtQQ_|8pSjYKxanR>XqT6M8 zCVUa!m^nap1kn5>hL!{OF<9>s+iKC5=zQDk9xnJ!N+rZ*mVg6xF6@Z(eArc`$WO=6 zw-T=ZwQ?TCAt@;hib2d8>~tg>d1h;9tbo6_BhlD$`V~cvArCyA?{9{`f!2K)VL|j` zjEK0(P08iKpMpX+zK;Shkl4p3*_>tPz!w+^e-da^zU>3^EFL-#^beH^+m$8jgGfB^ z=N)))GVI*N;91CLM3YpEs69I z#y$<)B$3~$JbfyD4?9OmX~0*kCy}v3kbk0S9L4VwkFQF;9{h45^l{Pp7BdHs6Hq1^ zEzn2k;wp)-{lzFN4~~MI&G)UTVPo>rd45T-VCSf-&*MLfe3gi~E!SM4zGB@MJj*8! zajxO83qfv_6R=B_)Q^(Chnxu?a-obV3dW>&RMy%OfH{9{m-ZdzAAFOHOkMIEKnxGr z;mX7Z=-DbN|NNjBFhA6RmM>se;Ljx$72AUK$j*k3IvTVE`bs{G zG&R?N4=R)j2k1=DOSkg%Ql_7xKIP>*@yApa+*QW4u&rf)ck;(Bs(<<4dFPUS4s)Qy zcy*EwG&G#}aURg~;I9#mok5Hla0$cn)GH3T=AGe-wga!FDpL*==&q1mW8%b#2~kl|N$EIpad0beBD3gG`;eDmcO8INZ2X@Z6k+6Lb z9CBe#h(QivEOM<-1E4K@T$0ET<;SHsJeTh`st?eE{3Rm&r^0k&4_8K}sSy5`ELoB+ z5(yRf^3$h8u7SZ(UabNV_{Z8{=V@tKg@=SB=81YuTwDgXNt1&GwGO;6zMfQ9p~N)> z{SPv|7e79<=$M&vl2w$HEFt?ym&kL(z2{H<4g4)uUcL)*z=}3w$o+-!6!7B;@wK0U zf5NG+?+0$xs(ZMi@z3H)OUtDN2Ztt$$G;ck3@gg-5F7gee3I>TL&eBB=Qej%MkaQzei&cKnHnws|g`}YLkC+69+ z=P@r{d`*4!EQb5wK_oXYFoJva>W2(3FR!?J_wL2yQ>tqZ5(OuSYtH zL~9kioKOEz!zCTMvjld4el=R&6shgT=>V_OO}_H zm)Hg=E2|6rh;IiXA7QC97a#q$*J1AJzD-Cb4HfgkH@Yik=@ z68;x0dhko|ucTzb_mLy6SZIEWgUkPy-=w6fz~_HNa3VVdLqni* z^69drrDb$U_+P#}=%?eKbYtX$7uZ3_Zq@!T{)^~Jq#H2!Cmd3o59BJr7~K+eD`t%# zRz?8-4t)M94*yG+KK#k}r`*8auqQEg0`i4cDbY^AjOG8=CnpO&KE4l4U=1TqTSiD0 z6bBdBocK0KJdeM|#Npq;;r36&KRXw8I{30Z`1MR^Z15MLcH5t0yAub~GWF=gpfR=jZ2_aOcjQ=(lg*#s>!nCr}Fw z{hAaTo57_P9v+|Z^5v`8moHz&e*5+hn=M zb`Wf(g}!rIGj;0h=X!g;MUa{Y2W#w|4Ha%Ej{DVe;zpv%%FAV)E{PaQX zhSjKL;LOi2QB|ElG(eQEKqQ~T{7QpwF%rHB)PfxiJ6cz)hu`Y^qj-A6Y81EWk_{96 zqZ*~9jt@11fqTZ+Nj2@7@^otQ2f`*q>nE4=xm~+ni^XMmemr~ji&*=gIQx&F{s*5Q zWET&9ZgL^sNuTx1hVO@JcBEm=gU;p0^ihr(;*BNYZB*wk4)P=4KE^yBxk>TJeJIga z_A}`O@Ps&g_Y%fTeoo4XXjN+5C*r61G8_2{Nmge1O)!&}Zy(XI?E(jJSHi9OI&~V8lzBfR>2XiGI%aQbMsB%zP~RNp;L9Mnqg65XZxZ zhnkuL+5L<0jRgx9q?L%sGX6mJ!@$76q#ix~$G10@WdE0uQONrA>3fQ(R|w;u2Yc9| z%{M)`W`>T{7l(t+|RxaZED6S)Q%ynOofDLx<| zAnw|=Yw@Dm)vH$%{r&y35gU+TWMq^Kn;>#PN{|1Ol>Uo@7x-H;^1@>QGoDWizHR<| z2fawaoKGmZ&E&^B64=b}Z6%2gZk*Wh0Yc~HxEumV2-{yC`YW+J2uRu&wwR)l<};^t&Ue}iof z_>nB;t1RP#o`*TiPJ>LzivEmZ>WQW9EkC#qcN_;mY<)WPa_aJ z1X+Qd0=)BLA0hW-q4pW+_F2UiKE4PG3rm!hmHlJ!57=V;uj1#GOG&9m!|%_RJ1FLj zY6~ES7Bo*(TTOKoON|4?HJRnfT`UjonR}?Fr+68_2QgG##Ky$Xv!KuN^%~@5()!QR z)ZECctx+(pg!k{?i}c@SXJ;e-Otn-Ulj*bI=dW1*l=})DmR~0XI6`i~5P`U}Ma1uD z{xY_+VxNfb2Asv`fg%1xY)rA>xGV2((s|5LE5)N&o(gooEY$FYPEvZ!Q}BEN+s{I> z8zDDuKL0!95J$Xv^{Pap&)m6l%SHEo1^%gi1m-Yr{gZA8e?}H+lkn*#`XGVK#sQC` zx{^L3W5*CzA69xCeC5f0MduG<9)BS2H463#*eKS=QO+A|1F*eImX}Sw5XMFdx{o^1 zHBdu#Bj1jXSc#0INAF~aqW|2u-X;i)%n+=wYlYtts*ZuRhCB=_aZ@XXt{Z$}qx z6g!fcnJH5CpzrB-=#tT*+O=!fqpMb($_>$;owqeWgqXigi{iYJ&k_5zfv- zjsrh7f{`T&K8#JZQ6oRddLqp*;!q&=x8H$(W^D8c9T&WgSIgsfthqnxozN%26NUXf z;CT_qorZtGjYltSZLe`tQnJP3v@AdV8vOeq?_*RLC|-uu|d z@h!}eBN!Fb&!ybW80b(u{?NDYIqu!NC5G~q1^wKgkN<4=vj;*3mdcQpt}QgbsXnl% zJh49yFO^H@#f=ZSvV6H1_Ma5kv-y4l_<>Mg$O^PzS9&$GMXyA4{1y(LQ#@ zj2Y4J55yF-=!FXxMY*_~O548u6_?t!ZC6qdKODPw@nWIYxbZ5U-nn`6b6j&XdEvr^ zF-6;!Effe-_NIx~RxH zF_Pe)YF04(TJV$PQpE70&QA@RH$0mS>fR-a(Zi`8OacBW#-UNEIpr0F=fCZK*!fXw zbt_*tM*SbL@)2N-Jl$c)?H6Bv2r(BT?SqowpX@h+crW@l@hRGmr8GMi?EcBf4d=y5 zkY2;#Xo{SZ|2CXea(|KYI-S4X5HriC??vB3vH|eNuNOdgfv+H$_$qXUXw>QE+gK4B zArjV-;lB#sHcd7u*dk*Pw*?!F;6B&h*sshoglsfL`^lW658yTVHr)Ie7b$*>3v!A73^mrwP#3Q-t`hSGwMBS)t?*<9*j4%K7JgAt z&)`aef6B#V);#jD$yURo^;DY-?-a1hd&93wbfCDrOmTaHxsBuxge;2~$NZ+C&>MRM zDg0OG1Hp^&Z!k6o@IRd&z%_quF)%LriM58fIgXI51YHWb!i?{k>Nt;vk4g9%$Y6ZD zp`N=)*-jGtQ%y*wPk2rdek7F*9ELFK8oU6u>sm#wVQ~=$Nq#c1K3~M|U{8VC66X?% znrDB~cO?IURz@NRD+%>XsQv@$?zf^C$aJh-)ZZ1X?^S5$Wnf+SNqfEx{wfel1s+jo zQ>VSrM9A7)_!NNue3&B-fbd_;M=SyU^Wa@wX%f#{NM{TP67Wu!NUdd zFARNS=7~4#WAjiCM76~FS%qUS&Vzo{Zxk1zrZ!KY&JEN5;-BQ}1J4Y{+Ggrm^LQ)z zicdE7(dh}FXW?AIoQOvqExvvL{}<_qCCXf|yFt#TJ!1>?bU`>sf`8IM;iEyVWkr52 zncy>+zY(L!x9>s*rM+lyUf6eb1YYd$f*J`hiyV&sA%pR@<6G4wmpyaGNWk#e1+Fp&)ZlC351G`_r9blmXs zkiAIkx<%|}B=iD)oJi4U2%bZp5GiL$I_{r&9r!(8e-rF;(Z8{dMbczZeS@73vSRVv z8sybctVoeLBl&q{;vY5!zPwpDRv*X@6H(_)QKbG^wC_|mvhd#GYoGZIbgx45zUX@^ z@f=J15f{XdgBOHV(Z8W*z@C-wR}j^g-}xQJAQ0PF@*IYYP_8+Q zm@>XRj(nSntbeK_$*0+*p95|p?SzuRQ&!f1|18Alki5XJJt4{cbPaNXh2~IEyff#} z6^WNfymlmge`Q>UcqZsVqT|$<{*&ECUcOtIYdcW?@O=K7g>J^!-pjmh$)5;aM8MXx zI|n!u%cI4?2l=W3^Rj=r<~HT=F}8$4SQTGGWHS@jm*4pt?A+LwZ8;wnqQ(K*51qYy zdt^`zc}6!PdkfWSF3)(8Q;2y~Xg{QW!cSN(pDfv@3gZ>Mk&D-$T=<7vpF#4yD3~$d zAyyuBb2Z8}=JLR)Jolh~*cWq!2>pK#m+D``r&59W%jVU^WZ(f^OQIZO!Es>jrNUpx zr`OE0@^k3qCCSGXqBoF3`1T+05#+DR2-zzI-(A|@upOY@tFuVhQ5+QPKo#M6Lj5kS zFBSQna(F@G$xk1P*qu1~M13dPBeBAEZqf$|eSTip!>tqfi6rEQQslQ4piiWu7xF96 z)^7#&2#H_?e8Co7n7>GN=Ze6M?uDI+VqLKB>^k@icOW))Q!4BUQCK(s3fzkrzl69E zmWM?=rvN9k2k;1zGYb6aRD0DJG4SH+w3Gc1_E`b?N_+M6`vIK8kI3*@?_4|^_GbA~ z!aX~HuG@txNcEGcA2KWK&)x!Iik&Hrh2e1~2*9zzb9N6Y- zqW;EE*rkN`rzzO?TOzvgD`E9tdl%Wj!M{t;m3$~)4sj%|@HK3vm@CxiEE*re+xr!` zm*vN3!LNWl>=yC)IJ2fH*8=h^^0Q~h;P+VaPc!l-a}D!}_hEmRY89sc|22G7=6FDt zNk$gJJ?--h+bN$8Gx!koNxnGL-lM#Nr5Zi3W1+Uq4w3uL5j~-r7Vz&;?iFgaTMO+)58F0;TBW|H zQeaX^I3hY&t{lordcOp);6UaZM)a8<`5z3)poz*aO54@kq?P+ymdTJz@n)uL=I^;3rnL zB6|gDn2Wte0v!FU`+0sqs-ejDEs*{Wo?Y5n{$+j6=SzkAi4fgE%@@G5Fc##`g)a~H zL4RofXpbl4m>1R=gB%}6@jZW9e~Dhe?j>YfD6gIS7mtl_@Ar$}Dbd=5o(FzjSYME6 z0Qt)Q#J*CW5dW7bSgVct{_AVAm6;9`?w6MzrW9WzMYak7J-N(%C^jD`{y$&7&gZLy zd+_5@>xq9v51{e!`~4i)*S3+Zy5CrmX!Te+AjT z;YS6YwkD8mUrA{QVqG-L?MGw!z-BAKM!&A0ZW6DSWESN6ulT((##?NzG4HLcPvj(_ z-gluMN%o}5h}{FsVOQ@8{bV|PEKUiks?$*a(-6E+yzR4;aarN_>Sz-CEl9^LskSls zRb^$HlsiU={4>z$dHe6>%hVJDJPf`$(Q$mGjP0l6x`g+mHcmh2g@tnfIw)fI1`mX9R-+t#P$|^P zod6p>V^bkp-8lGUise%l=~LyAN`D$Qi&KDAWrvHp&MV&>bav7U{WI??QGj z!RON76z^OX-&Mg_AK{a5Pse(+QsIhxe9S=xKZRo}+8>%Du*XA(mb}3i1Nph|+2AdR zyOw;99ZCBCE3bha2=$)k3g`rsD`x!#cH)GxH0-A-Wcw%z>-=-?9NPb;jN@C2>zShs z{wS6wf$xOo1bmbH7#z|4D0xnl<$CD&h@&cbzv!a<`cuy-{u6Xt$nTiX7l=1V+6vc% zI2eN7l$bLq0zQOm!Z~xu;*U~!0BX-mWNR1K&(eO&*YP#W!9RrOD#jx;cYoJ8a$>L# z@@9$RyGw(OxZmNYDvKSLa7{QDJZ9oVEX-gJ{i*Ap{Hn;i{LkQ?fhTg6BFO(F4u2K> zjrKHW-Y3E53|v$6(8d>#QA(Zz$cI4!0=; z#qdZ=*H0*G1J6YcX=yyb2m7$Ml+-Rt`WfL`)UgU*ilG5)$S{N8?*fm3NOg`#j4Jcpc#x-$~jlOr6LbdW7TtQ-M51azCh@WmFN1F&_( z!#@9Sja3sf?|<+7Lk=0@&DM&X1MquCmqAu0+*U0K`32vP$7iXwHp;)HJuI+SLo8~* z!YAI2m%ogA|5!NwoBIZRGK1o1p--UJ?wUBnDIl)F2)W_H^$*01k#K5tt3ZNTvQf$^6y;vv*!xovWX;!7r15+{{G`*!_ddSb5A@B2#18rvK}1V zK(b<~vH-66i-SKC2826jG{R+h4)PDUqy5G2zYhk4`(0>^j|YF2>yXD?htU4gfq%~& zAYA#O$)Q!oLC>MN^mh*Y`E!6-_mzcvX8sTzAzo5uA2#m!%Rhb%3QV?V)gLw-CrF4UKmhpEa9fSvL0@g_-KqP1JM5RgWrpDT62Vh>u3$pe&s>)Y&2RJ z+TXSRdtgAYw?+FEYaXu=c~rr-E78cW_;()s8W<3)3FZX*Kjk2w@+>rpEBq@XR{lI7 zmYQ0l|)7NU$WB5^VoX2k9Z?Z?-^lMB9({ z04)TK;#DNhJHWO7)j32kAXpGg2sQ*Gf)&AxVE40hIXoIbs8Olnf>}rXPya&TF9iNV z;4cIUAmAhniDLA$=nLv03%;KMoV# z|K&tcnbPLzX|e2 z;*}zBC52ke>rgYWF#j2~gi#BH_Ub6wO3$+v{SHy@755$0A1nH9b|&f&2<0K7b}?`z zwtkO0`a_2rn#g*3*wdQ7=XN0ss2=O?+@cLRLaA)FqBxj~fUmf57XJKR^KQccVbuE61 zj|BB1P@{4=-s7E%y;e|9MYs>BrzWuH9KpaR4>?<<;bR!aUc%hx!36a<9r!hS@NVpF z))Di+7`&*S3$GS4<{{u(*>zp0KFM_S!zWKkX&@;+#qfo_$ubS~^-@Y%`^-4+qfb%g>sRqUg9c|IZ;dxcvG;~Zno`zxVNW28oz~U@;yt7# zGkvd&PZ~RDdF4Hm_zq|k_Iuo&joKYF2T}iDCKI(mvayE6(W7GHLGB%BI_)31HVw43 zQu|pj=AZFQ?A2N=9W~N2P%{mCN6yB4VD`TB&LtX#y_JOKhLltd@a%CZsHXth?g98Y zV;}h8*ek&!i}u(={jmz~F;ST~mgHI3XPC#22@crfDg`yF)3BFB8ut9;tq;&kqLZ|5 zQUdCa=b$zU(HPo46M48J(ok=SR~uDMuB|9~TWqdK(x>uYLpjLe_T>~_Kgeyy{yAGv zXMJTF)epAqW(y+wT;?Ws0;3h8cEARbIY>sIXPv>nJxv6oE-Em ziPkb|P-iMC4j|dDMEc9X7r5u)80!FZSQs|UId}zcegN-)kLdA1-r>;^?1#dmBh0-e zd;+e$6REyE)w2ix!@e~YlSMEN0p6c4S7Ggn>5)&;i)Xtz?y}+fi74>gHd;r$A3jWlX#yX|0j7(QE{LUohbosCC&l7TS)e&XQG}} zvHqeCAm;ii-uqE67HfBFHfrgKt(_?=tIyjT5V$S&Ji&fq-+RmfchW-uFK@^gQ)oXT ztViK_g&I`FWL4DFuMph?-QvwrM)svo)F;H87SsXR;LQtDAQxvA@H@yWqtZ1sHv<2{ zav=8hg4{d<_4*CL16uL=OXHW8)=7h$37xGtoyW6NAy*TOus@3~c*1tn<{npsCUSB} z-V^L+KCXza2*ar?=is@R$4-2>V!tMyJ_H>Ta@HWw>p`g)EAPG7=bJy*6ck#e>FXcn zwrF9Vtgo-1-nnz<^nU#;vc`@*o-uOdRc@n3y-`n5aQt<^FSlms=pko*Ghiqe_ zX$|%#qy6c4^YO%q6RFJjuU!i(ar{Y1NvMlmoPR@(WgdsK1m3 zS`8W`Bhsz|8I|OnZ0uKqeTm#*8=9ChckbG>`}gmsM?^%V#l^*?Cnu-nq@-l#Mny%X zWn^UVX`{FI+fv7mx@n{f!M-<^Cs*Me*#E>m2YZr`Y$-w(;?RC4kd+z(7oz1#N#KE6 zPnr2LO}^ZR+9as|swBiuQ2UC9d(glXvi(7CNm{h%Miw)_#eHUH=W_e>IVUv!Y13x# z*FQ7=$&NtsEXm)fiHrR|s;7}YMLdw~fr4WpJ^`5rzvcHCvKacMAk=5U>&5+z`kZ{e z&pc06by70%E2hCN!+RIz2i3O&d{i=nf*uKtA9El*BqW62f`fyzPMtcH(W{pOZyhuI zkNV=^FtgbB>3fU|wgYMCHPSgm>t$v2cr-U(uWXkAI{~l3?#&-N(`U$qCF&sJ#!vH& zc}8iUp#8kL3H>!WCMG72!Ml%-Pl>R{y5c=waQuSwpTWOi9~BgOK+bf}#D1*U4=5kU zrF}xrDi@tZ|A3!Ddm_CD`+v~>F{w<0EX2bh_VC2`-60!UrpCs`<}%}Vbadp)ErR2q zzsos((7rvmw*{|WC-zRtf@}!AFTbHyJMVWvn4q?Jx$uuZ!Zu-yec3ibpVAGz+1VwJ8Z|1F8r`q1J`?!giF!%-wiVF0qPT@z&=>X;H=gYYHTFnf z7psRA#Y-8_^B|vM&H3=`?If4^_`GA#FZOfKo|oKJs~(HJM)1d+oIGxwI{Wb+s+~_f zU>EI?Rnq(-S>vb4zk)C#{hj&*y$&|64v9^g?8&-$GhDFiBL6P?_;axr+hFY5H zpzoD;Ui0O6!Eu!LZ^$G(T7-GWn~St2)YPUXwP>+Cv2EM7sa?C8#rEj2AllmcRJOIX zXS$J*Q5v=8&4=RmV_Y+{DM`=|Q>j^5xu;oMAIs?8eL{?pkx3$bXKlSB*~Z2vy+;oV z9>0eVmiIo;Tp`|9-u_qgKFCFwi@QPltc$EgHtOZ~1@HFY`=wy-8de#!P&xQ0Q4F@B#s@LK+}DmsSp-OoX7?$+?Nw1e*M3Y+yhjK9z>0^SVU zCfQ3Ipr_SK!SCtN1Nb_NsPU7n2X<4)5=~ODo_PK)$RPrC7dg54^5)JA*g{fB=8(|O zQ{g#}c}{zS;JuBK$sP|mi^uyIe9>dAx7NYSa4yV~$@W1p3Q|%v$)*CEhp>!VKHLiHaj;K; zzwa!NIq3c5&+vk6*cN;-pZ7u*#C)bPPfUc}FrBU^J2>-x>@iF8xnOK8uBh?D7mx_} z^647MedGs#%`Fx49`nHqa{ugZ+4lk{h1yhT4j>v{Aawp{+2D0&Ui67r>j zhL(5@*@G}%{yu`#N7B=ZKT8;{W%-@PLAotyGyG92pj$T;JHMcR^K=KS*&=r8{63H^ zHGiFu-NYjsI<3g(f!^}wHvIV|j-SSX{(!cw1svRI9~Z=+D3%EKvW&YT*Fsn4`R$dJ zha{5S2G7dH+Qoif?UPY69sa?s>Cl_v2zTJ0_`4P8NxqK}e)3H6J&{~N@D}9%V)}%& zA-IQU`SC609TM?TvcCYY@Lg}Gy{f@0h(_F0?v6jrMW_Dg}%o+&jjr# zm>YCXen(H*14QKfsAxY6?&tHU%6J~pKj0U0k?esrVG~g&eGPsRTkNYl7`6+2j78Ws zPka)7Z^%3|Ay+t(?-IPcIphp&q9a8A$hKG_y{SOIY3!9&4>dpbV-0Z6i~Xn+oaN6Y zclbeED#@QCv@R(ArIh%m(*4~8f6z$S-WCzv%LUyMN%zW&CngRCemBsz5_R69YqJ=y z6!Cr`+h~)SA_fqWFWFD=Cyk3d1Uxm1Wyv2)e1APZ< zh1ZW@|4BZg*b*(Rjp@J#`KiS5j$OESh~WM7cYgfFwjw;$0qe0k&Vs(gqL4QHt z3U#%j&#l-w=>wy9FovBAa-b6Ai{g#BhWbMdw1}=NiN?{`DOX5HmIb{nChs!OE9nz5 zKb}#j|5a?Pg?JZ!4hQo8%mR6rf!SlPBdN_#Uz`6VGDqr%&+c zOvJ(f2cp_=*rydrvPBhLmlZlE*?{cskQ)(~Uc5n8FD4H|9}+cw8Z&b=#UDa*1h!qC z{!U{j+b-$bxTZpV{}uN`7Nod2zRd-CH?7H{w2;PHG!LX${sU+S>>GyQ;i_V2-=7B) zvIme}1wRS!E|MP6Sc@Kt_~HrLACKb-_L0V@fF|mo9I^jm?iYho8e3_3a4r6$Frcy1 z*d#d!M*pR?Kw~Kl??vH4Yh*3jzl!#uzsy{xPwG33p``VWpGrN5PY|!HRGA*n6YOVY z|4n_RJ{RS2_^RB8GVUCNwgc@RS|pl~%z*RC9)~2)qdrhys87^4>Lc}4qJw*bE<-_q z{HvKV1Wf&%dIePm)I#%rXX@ri-N-+ea?1Z?GoSgVfB*kk5MbcUeBQ`^5g#9+`R8&B z-iQF;s7KCV9L5Zu8N5@S2m`dSX#6@6f|-%{UV?*alrBKKg!T=M=A4w65G=nUc);aBwH+gaet z#&ZTxo>4*T2iui=CHZpLlt+LZe&*Q&;8(Wi`&P-$0h_xh8$0!x`o0iN2==fA3fTx@ ztA`DEX(rR?9QG>c;9~R8g`QdT9R=se`?ZEGb{Fz$3ZD;~xX}AycNT)Lz_W-yToyQI z-U)yGc=#c`;p6>Z78AqHTnAqU`Ke%U8bx-5qBa!f8Kr*07J2GOhY8+W_%|D|FdB$85PdKF2k@Wl%0?b-x$IYnHKZIght3V^XvCdVC&3W>>!9JafafqVbT!IbacfeQr zg1!jz5;}*UmLJvuq5+VKpA1=QSL>Iu%C{7Hq=^e?Z4LYGJ07o|Vwr)mw6Qo3{b{RNuUP2 zcjC_+#J=Re6Z47kcK|c(9Lf=*zCL~&E!cm4eq4tR9eDGGc^70%#Ffnv`i}XnvOkHg zVr?Pkp&xQ+q!Hh%oZX~JlMDlcwi$i;oX9pX=$88E|Jpkn*ea_tj#COEFl-lvf@P+g z5k~mj0!Rm1EYtyhA%RT_j4u=Ua9cX$D}r>{6v7-jsT6BL1QQZW2GoUROJKkfi3wRk zM#Kn-%}^Xcsf^h6zW285_doAF=f3Z~x0l-%*p}=~PTzaq`<`>2^PJ~-&hvFnPo6aJ zfAGP@wD6A|JJyUJ9FPgNY3{!Sc4{Ot!`rt3hU0& z{b{i4G?3rqrx|fkYLANEZv9Pcfn8vY2_3_Hf%iSKX($Z4%OwW7wE`e6pGKSThW$>d2bD(XIbNrm11o9WbJU&0SLOyuJ9CBJ>a)q;XooBQ=!&zV5E z?5)3z&o$_I!_l2{$?urn)W3ffcJ3n1NGSaJjyp=o{VrmC&rv=-XQs?=%SOB*dcNjO z@=bcX_?SJOX09cNM4#+S;H;hnlDmfH#4qA|_{Zoj$jWV;2{AOTbLX`3 z9N9BhX9>_|c5*TsI+7lTo*W^+UVCNPd!XDEUp`0&m8~c~?$c+XU}@F(&;yK|ONJl# z*kAgD84Ef!`qb}4*X*-Q zutrK2$(BGq5|68fHi9kd1rm?*iBt* zk5IqRT~fc9<%`8Xu`kY~s*KxV(s!oD=`~Sb@&X;e1Ai%NBhR!BUc*0?qPtTsrgf0~ zqm;3+rv>@u=L5&_9~xf*z62a?JyX87^i3a!>G`T>&neK+CS;D!&uU9NE&7P>DUz%W zj6E0oVgA?b$pQBCZIUC2T{(^QGOQ1^1!rfTYp=7fUsU5`Tw@B~S&J7+KSh2%PTtd- z$j!CV5g3fM=Yu1KZO-K2+9?*U*1{tom8$#%bCY z?0*VA*PN20r@bNUN%MVZ!Qb^6xeSk0V;9RepLv{_erHb>YuOu|Z z#>#N`1sRvZ?<;{l6u)49hpVHy_>u4nY*oIkE9~8(t&X2T5yY21Bb(u)ZN|0>-u-pi zw*kPV&Pi~#AoVmKHiopD1Ha6v9{cc3`zJnc=3kAoK2goXYiq53GsMx{7&O|ijtxS@a#VVcZPli zqhL*URq*h?c?^P0FlM@D^W*<&{(v1<5g!y2PA7A3H9ZLi!BRwN?xP)TY{Q>r&2XHRWddTGY1sxSbNb zl*@mF(%G?QTVH(zb8O$Zg?(EX)u*melsL|FIKTZF#UY3{6i7aaoK!lZhpSCfA6;H{ zqwHF>Y5Ujjme$NO^b@xa1wRV0?~OXoQ88_3C`HG#?WEkXOVNe5us2rqH)8k84sTc3UZ?2Gsx?sR<-18-)(7dRc@p2h2{ zZ}CUU7{bpqFVCXyPZS=|2h-`To~+m-t}oi^Uge_ z^pC#}o9^*+_z&S7+tvAqpw&1IbII8%7yW9Fkm%XffiCf7gmEqZ2m3#XO&7X305_&x z;_~iUupRpu+QC-YE?=b1y2j=jf;~4+wmT=O+4+zX883G43sV@8z94 zcP{0e(pO$Ni9dRvH-7x1CI+*4^ZWQLzH8(L;dRvQ({3n*P2*LHMqFf(J?+@ z;W0!%;l8^dpXM7ISu$ATV*Yh52y*kj##5)xn|LI#F=CSq(evle$CfNPC_k(>X3YI& z{OTV+5WeS0#*Z%g1b4tONbu+kFk=7x+QbR8WBkha!lJ6HzQMoog*P@fww^d~A_Twa zFNlBjuQB20quyfqambUYAg5#%H0|5l-MbHIlLzo$fx9xD6=M3q*UNbxF9Q4P-Y1_l zv~tE!81+>n9V zJFU11@up$KW_rhEL04ii!$hM|=1F){T*2YwI%8AcAK7>C%aZ?B!hDAOQ^YYBnS3<+ zUZ%UR1O3v-&)|ESSNyTS9nziD_v?BOUW4v-7(G#PPr9OtbV2S}>3+69t>en&Atp^u ziC>fx68F~yaihMaf454%BGwG8?&N&VGH^VS921oh%w5+^^OrPNKJ5|br;SmrKrcqN zyyvp7*3YD;a}`R1d4eZ~JYJBm_WiNI9xpWeK`wx6T)slMf> z$fp!hoS&i_U(#QC{UGHk<$8G0I|nGLqiYDIBmPU(QQd>kF!Ax<5IcMXonS&*K0!_! z{zcv+JC@mZ1c!+!!PCgiT=dL-oO?47UJUYfF8dayv+i^!UZ1aX5sj^5>vC6&%IRR} zdC1H0$hC*D5hhW7C>z`KDOlk*Ti@Ucy-K!)ayJz}VlA0LT)%+4+b59U!?6{5a$d(% z$nO!Xp^vf-ZgzdCZx!(|IzINn!_lg$s#tApUF`Jff41Ip&j|1M@l)8Qy)*``%kvn>M$4)MsBA}@I?vA>z*DCLu@{Ukbbch?5` z0Cv$r{eLyBf055VyV%PA2xyr)wIa5B`3mp!>C-J`Wph}AS1Q+B|BFsKx2tc*ApA4F zNOAFeZ_b<@kx7%Djm@07oLsEx=7|$$F!slSaw$07Y)}q(b>zGgK^}=j52kw+jMq!aQ<{=x}gh= zLvsra8a!z{ Date: Thu, 11 Apr 2024 18:29:19 +0000 Subject: [PATCH 16/17] IVC + support new settings and turbo model (#2067) --- public/scripts/extensions/tts/elevenlabs.js | 173 +++++++++++++++++--- 1 file changed, 150 insertions(+), 23 deletions(-) diff --git a/public/scripts/extensions/tts/elevenlabs.js b/public/scripts/extensions/tts/elevenlabs.js index ec0ad602d..d0adafb00 100644 --- a/public/scripts/extensions/tts/elevenlabs.js +++ b/public/scripts/extensions/tts/elevenlabs.js @@ -14,6 +14,8 @@ class ElevenLabsTtsProvider { defaultSettings = { stability: 0.75, similarity_boost: 0.75, + style_exaggeration: 0.00, + speaker_boost: true, apiKey: '', model: 'eleven_monolingual_v1', voiceMap: {}, @@ -26,27 +28,57 @@ class ElevenLabsTtsProvider { - + - + +

+
+
+ Instant Voice Cloning
+ + + + + +
+ +
+
`; return html; } + shouldInvolveExtendedSettings() { + return this.settings.model === 'eleven_multilingual_v2'; + } + onSettingsChange() { // Update dynamically this.settings.stability = $('#elevenlabs_tts_stability').val(); this.settings.similarity_boost = $('#elevenlabs_tts_similarity_boost').val(); + this.settings.style_exaggeration = $('#elevenlabs_tts_style_exaggeration').val(); + this.settings.speaker_boost = $('#elevenlabs_tts_speaker_boost').is(':checked'); this.settings.model = $('#elevenlabs_tts_model').find(':selected').val(); - $('#elevenlabs_tts_stability_output').text(this.settings.stability); - $('#elevenlabs_tts_similarity_boost_output').text(this.settings.similarity_boost); + $('#elevenlabs_tts_stability_output').text(this.settings.stability * 100 + '%'); + $('#elevenlabs_tts_similarity_boost_output').text(this.settings.similarity_boost * 100 + '%'); + $('#elevenlabs_tts_style_exaggeration_output').text(this.settings.style_exaggeration * 100 + '%'); + $('#elevenlabs_tts_v2_options').toggle(this.shouldInvolveExtendedSettings()); saveTtsProviderSettings(); } @@ -75,21 +107,28 @@ class ElevenLabsTtsProvider { $('#elevenlabs_tts_stability').val(this.settings.stability); $('#elevenlabs_tts_similarity_boost').val(this.settings.similarity_boost); + $('#elevenlabs_tts_style_exaggeration').val(this.settings.style_exaggeration); + $('#elevenlabs_tts_speaker_boost').prop('checked', this.settings.speaker_boost); $('#elevenlabs_tts_api_key').val(this.settings.apiKey); $('#elevenlabs_tts_model').val(this.settings.model); $('#eleven_labs_connect').on('click', () => { this.onConnectClick(); }); $('#elevenlabs_tts_similarity_boost').on('input', this.onSettingsChange.bind(this)); $('#elevenlabs_tts_stability').on('input', this.onSettingsChange.bind(this)); + $('#elevenlabs_tts_style_exaggeration').on('input', this.onSettingsChange.bind(this)); + $('#elevenlabs_tts_speaker_boost').on('change', this.onSettingsChange.bind(this)); $('#elevenlabs_tts_model').on('change', this.onSettingsChange.bind(this)); $('#elevenlabs_tts_stability_output').text(this.settings.stability); $('#elevenlabs_tts_similarity_boost_output').text(this.settings.similarity_boost); - + $('#elevenlabs_tts_style_exaggeration_output').text(this.settings.style_exaggeration); + $('#elevenlabs_tts_v2_options').toggle(this.shouldInvolveExtendedSettings()); try { await this.checkReady(); console.debug('ElevenLabs: Settings loaded'); } catch { console.debug('ElevenLabs: Settings loaded, but not ready'); } + + this.setupVoiceCloningMenu(); } // Perform a simple readiness check by trying to fetch voiceIds @@ -107,6 +146,63 @@ class ElevenLabsTtsProvider { }); } + setupVoiceCloningMenu() { + const audioFilesInput = document.getElementById('elevenlabs_tts_audio_files'); + const selectedFilesListElement = document.getElementById('elevenlabs_tts_selected_files_list'); + const cloneVoiceButton = document.getElementById('elevenlabs_tts_clone_voice_button'); + const uploadAudioFileButton = document.getElementById('upload_audio_file'); + const voiceCloningNameInput = document.getElementById('elevenlabs_tts_voice_cloning_name'); + const voiceCloningDescriptionInput = document.getElementById('elevenlabs_tts_voice_cloning_description'); + const voiceCloningLabelsInput = document.getElementById('elevenlabs_tts_voice_cloning_labels'); + + const updateCloneVoiceButtonVisibility = () => { + cloneVoiceButton.style.display = audioFilesInput.files.length > 0 ? 'inline-block' : 'none'; + }; + + const clearSelectedFiles = () => { + audioFilesInput.value = ''; + selectedFilesListElement.innerHTML = ''; + updateCloneVoiceButtonVisibility(); + }; + + uploadAudioFileButton.addEventListener('click', () => { + audioFilesInput.click(); + }); + + audioFilesInput.addEventListener('change', () => { + selectedFilesListElement.innerHTML = ''; + for (const file of audioFilesInput.files) { + const listItem = document.createElement('div'); + listItem.textContent = file.name; + selectedFilesListElement.appendChild(listItem); + } + updateCloneVoiceButtonVisibility(); + }); + + cloneVoiceButton.addEventListener('click', async () => { + const voiceName = voiceCloningNameInput.value.trim(); + const voiceDescription = voiceCloningDescriptionInput.value.trim(); + const voiceLabels = voiceCloningLabelsInput.value.trim(); + + if (!voiceName) { + toastr.error('Please provide a name for the cloned voice.'); + return; + } + + try { + await this.addVoice(voiceName, voiceDescription, voiceLabels); + toastr.success('Voice cloned successfully. Hit reload to see the new voice in the voice listing.'); + clearSelectedFiles(); + voiceCloningNameInput.value = ''; + voiceCloningDescriptionInput.value = ''; + voiceCloningLabelsInput.value = ''; + } catch (error) { + toastr.error(`Failed to clone voice: ${error.message}`); + } + }); + + updateCloneVoiceButtonVisibility(); + } async updateApiKey() { // Using this call to validate API key @@ -206,24 +302,26 @@ class ElevenLabsTtsProvider { async fetchTtsGeneration(text, voiceId) { let model = this.settings.model ?? 'eleven_monolingual_v1'; console.info(`Generating new TTS for voice_id ${voiceId}, model ${model}`); - const response = await fetch( - `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`, - { - method: 'POST', - headers: { - 'xi-api-key': this.settings.apiKey, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model_id: model, - text: text, - voice_settings: { - stability: Number(this.settings.stability), - similarity_boost: Number(this.settings.similarity_boost), - }, - }), + const request = { + model_id: model, + text: text, + voice_settings: { + stability: Number(this.settings.stability), + similarity_boost: Number(this.settings.similarity_boost), }, - ); + }; + if (this.shouldInvolveExtendedSettings()) { + request.voice_settings.style_exaggeration = Number(this.settings.style_exaggeration); + request.voice_settings.speaker_boost = Boolean(this.settings.speaker_boost); + } + const response = await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`, { + method: 'POST', + headers: { + 'xi-api-key': this.settings.apiKey, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(request), + }); if (!response.ok) { toastr.error(response.statusText, 'TTS Generation Failed'); throw new Error(`HTTP ${response.status}: ${await response.text()}`); @@ -260,4 +358,33 @@ class ElevenLabsTtsProvider { const responseJson = await response.json(); return responseJson.history; } + + async addVoice(name, description, labels) { + const selected_files = document.querySelectorAll('input[type="file"][name="audio_files"]'); + const formData = new FormData(); + + formData.append('name', name); + formData.append('description', description); + formData.append('labels', labels); + + for (const file of selected_files) { + if (file.files.length > 0) { + formData.append('files', file.files[0]); + } + } + + const response = await fetch('https://api.elevenlabs.io/v1/voices/add', { + method: 'POST', + headers: { + 'xi-api-key': this.settings.apiKey, + }, + body: formData, + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${await response.text()}`); + } + + return await response.json(); + } } From 210f388d7af2d16e7e24b0878d31ea7611a31d92 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Thu, 11 Apr 2024 21:33:15 +0300 Subject: [PATCH 17/17] Switch button style to use class --- public/scripts/extensions/tts/elevenlabs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/scripts/extensions/tts/elevenlabs.js b/public/scripts/extensions/tts/elevenlabs.js index d0adafb00..3504c813d 100644 --- a/public/scripts/extensions/tts/elevenlabs.js +++ b/public/scripts/extensions/tts/elevenlabs.js @@ -50,13 +50,13 @@ class ElevenLabsTtsProvider { -