From 6b656bf3806e0b15820b7b7f2949e0660cc488a7 Mon Sep 17 00:00:00 2001 From: kingbri Date: Fri, 12 Apr 2024 01:49:09 -0400 Subject: [PATCH 01/81] Expressions: Classify using LLM Rather than using a separate BERT model to classify the last message, use the LLM itself to get the classified expression label as a JSON and set that as the current sprite. Doing this should take more information into consideration and cut down on extra processing. This is made possible by the use of constrained generation with JSON schemas. Only available to TabbyAPI since it's the only backend that supports the use of JSON schemas, but there can hopefully be a way to use this with other backends as well. Intercepts the generation and sets top_k = 1 (for greedy sampling) and the json_schema to an emotion enum. Doing this also prevents reingestion of the entire context every time a message is sent and then asked to be classified, which doesn't compromise the chat experience. Signed-off-by: kingbri --- .../scripts/extensions/expressions/index.js | 166 ++++++++++++------ .../extensions/expressions/settings.html | 14 +- 2 files changed, 122 insertions(+), 58 deletions(-) diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index 15ad253be..fcd85f5c9 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -1,4 +1,4 @@ -import { callPopup, eventSource, event_types, getRequestHeaders, saveSettingsDebounced } from '../../../script.js'; +import { callPopup, eventSource, event_types, generateQuietPrompt, getRequestHeaders, saveSettingsDebounced } from '../../../script.js'; import { dragElement, isMobile } from '../../RossAscends-mods.js'; import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch, renderExtensionTemplateAsync } from '../../extensions.js'; import { loadMovingUIState, power_user } from '../../power-user.js'; @@ -43,6 +43,11 @@ const DEFAULT_EXPRESSIONS = [ 'surprise', 'neutral', ]; +const EXPRESSION_API = { + local: 0, + extras: 1, + llm: 2, +} let expressionsList = null; let lastCharacter = undefined; @@ -55,7 +60,7 @@ let lastServerResponseTime = 0; export let lastExpression = {}; function isTalkingHeadEnabled() { - return extension_settings.expressions.talkinghead && !extension_settings.expressions.local; + return extension_settings.expressions.talkinghead && extension_settings.expressions.api == EXPRESSION_API.extras; } /** @@ -585,10 +590,10 @@ function handleImageChange() { async function moduleWorker() { const context = getContext(); - // Hide and disable Talkinghead while in local mode - $('#image_type_block').toggle(!extension_settings.expressions.local); + // Hide and disable Talkinghead while not in extras + $('#image_type_block').toggle(extension_settings.expressions.api == EXPRESSION_API.extras); - if (extension_settings.expressions.local && extension_settings.expressions.talkinghead) { + if (extension_settings.expressions.api != EXPRESSION_API.extras && extension_settings.expressions.talkinghead) { $('#image_type_toggle').prop('checked', false); setTalkingHeadState(false); } @@ -628,7 +633,7 @@ async function moduleWorker() { } const offlineMode = $('.expression_settings .offline_mode'); - if (!modules.includes('classify') && !extension_settings.expressions.local) { + if (!modules.includes('classify') && extension_settings.expressions.api == EXPRESSION_API.extras) { $('#open_chat_expressions').show(); $('#no_chat_expressions').hide(); offlineMode.css('display', 'block'); @@ -821,7 +826,7 @@ function setTalkingHeadState(newState) { extension_settings.expressions.talkinghead = newState; // Store setting saveSettingsDebounced(); - if (extension_settings.expressions.local) { + if (extension_settings.expressions.api == EXPRESSION_API.local) { return; } @@ -900,7 +905,7 @@ async function classifyCommand(_, text) { return ''; } - if (!modules.includes('classify') && !extension_settings.expressions.local) { + if (!modules.includes('classify') && extension_settings.expressions.api == EXPRESSION_API.extras) { toastr.warning('Text classification is disabled or not available'); return ''; } @@ -971,9 +976,32 @@ function sampleClassifyText(text) { return result.trim(); } +function onTextGenSettingsReady(args) { + // Only call if inside an API call + if (inApiCall) { + const emotions = DEFAULT_EXPRESSIONS.filter((e) => e != 'talkinghead') + Object.assign(args, { + top_k: 1, + json_schema: { + $schema: "http://json-schema.org/draft-04/schema#", + type: "object", + properties: { + emotion: { + type: "string", + enum: emotions + } + }, + required: [ + "emotion" + ] + } + }); + } +} + async function getExpressionLabel(text) { // Return if text is undefined, saving a costly fetch request - if ((!modules.includes('classify') && !extension_settings.expressions.local) || !text) { + if ((!modules.includes('classify') && extension_settings.expressions.api == EXPRESSION_API.extras) || !text) { return getFallbackExpression(); } @@ -984,36 +1012,44 @@ async function getExpressionLabel(text) { text = sampleClassifyText(text); try { - if (extension_settings.expressions.local) { - // Local transformers pipeline - const apiResult = await fetch('/api/extra/classify', { - method: 'POST', - headers: getRequestHeaders(), - body: JSON.stringify({ text: text }), - }); + switch (extension_settings.expressions.api) { + case EXPRESSION_API.local: + // Local BERT pipeline + const localResult = await fetch('/api/extra/classify', { + method: 'POST', + headers: getRequestHeaders(), + body: JSON.stringify({ text: text }), + }); - if (apiResult.ok) { - const data = await apiResult.json(); - return data.classification[0].label; - } - } else { - // Extras - const url = new URL(getApiUrl()); - url.pathname = '/api/classify'; + if (localResult.ok) { + const data = await localResult.json(); + return data.classification[0].label; + } - const apiResult = await doExtrasFetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Bypass-Tunnel-Reminder': 'bypass', - }, - body: JSON.stringify({ text: text }), - }); + break; + case EXPRESSION_API.llm: + // Using LLM + const emotionResponse = await generateQuietPrompt('', false); + const parsedEmotion = JSON.parse(emotionResponse); + return parsedEmotion.emotion; + default: + // Extras + const url = new URL(getApiUrl()); + url.pathname = '/api/classify'; - if (apiResult.ok) { - const data = await apiResult.json(); - return data.classification[0].label; - } + const extrasResult = await doExtrasFetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Bypass-Tunnel-Reminder': 'bypass', + }, + body: JSON.stringify({ text: text }), + }); + + if (extrasResult.ok) { + const data = await extrasResult.json(); + return data.classification[0].label; + } } } catch (error) { console.log(error); @@ -1177,23 +1213,12 @@ async function getExpressionsList() { */ async function resolveExpressionsList() { // get something for offline mode (default images) - if (!modules.includes('classify') && !extension_settings.expressions.local) { + if (!modules.includes('classify') && extension_settings.expressions.api == EXPRESSION_API.extras) { return DEFAULT_EXPRESSIONS; } try { - if (extension_settings.expressions.local) { - const apiResult = await fetch('/api/extra/classify/labels', { - method: 'POST', - headers: getRequestHeaders(), - }); - - if (apiResult.ok) { - const data = await apiResult.json(); - expressionsList = data.labels; - return expressionsList; - } - } else { + if (extension_settings.expressions.api == EXPRESSION_API.extras) { const url = new URL(getApiUrl()); url.pathname = '/api/classify/labels'; @@ -1204,6 +1229,17 @@ async function getExpressionsList() { if (apiResult.ok) { + const data = await apiResult.json(); + expressionsList = data.labels; + return expressionsList; + } + } else { + const apiResult = await fetch('/api/extra/classify/labels', { + method: 'POST', + headers: getRequestHeaders(), + }); + + if (apiResult.ok) { const data = await apiResult.json(); expressionsList = data.labels; return expressionsList; @@ -1444,6 +1480,15 @@ async function onClickExpressionRemoveCustom() { moduleWorker(); } +function onExperesionApiChanged() { + const tempApi = this.value; + if (tempApi) { + extension_settings.expressions.api = Number(tempApi); + moduleWorker(); + saveSettingsDebounced(); + } +} + function onExpressionFallbackChanged() { const expression = this.value; if (expression) { @@ -1556,6 +1601,7 @@ async function onClickExpressionOverrideButton() { // Refresh sprites list. Assume the override path has been properly handled. try { + inApiCall = true; $('#visual-novel-wrapper').empty(); await validateImages(overridePath.length === 0 ? currentLastMessage.name : overridePath, true); const expression = await getExpressionLabel(currentLastMessage.mes); @@ -1563,6 +1609,8 @@ async function onClickExpressionOverrideButton() { forceUpdateVisualNovelMode(); } catch (error) { console.debug(`Setting expression override for ${avatarFileName} failed with error: ${error}`); + } finally { + inApiCall = false; } } @@ -1699,6 +1747,17 @@ async function fetchImagesNoCache() { return await Promise.allSettled(promises); } +function migrateSettings() { + if (Object.keys(extension_settings.expressions).includes('local')) { + if (extension_settings.expressions.local) { + extension_settings.expressions.api == EXPRESSION_API.local; + } + + delete extension_settings.expressions.local; + saveSettingsDebounced(); + } +} + (async function () { function addExpressionImage() { const html = ` @@ -1730,11 +1789,6 @@ async function fetchImagesNoCache() { extension_settings.expressions.translate = !!$(this).prop('checked'); saveSettingsDebounced(); }); - $('#expression_local').prop('checked', extension_settings.expressions.local).on('input', function () { - extension_settings.expressions.local = !!$(this).prop('checked'); - moduleWorker(); - saveSettingsDebounced(); - }); $('#expression_override_cleanup_button').on('click', onClickExpressionOverrideRemoveAllButton); $(document).on('dragstart', '.expression', (e) => { e.preventDefault(); @@ -1753,10 +1807,12 @@ async function fetchImagesNoCache() { }); await renderAdditionalExpressionSettings(); + $('#expression_api').val(extension_settings.expressions.api || 0); $('#expression_custom_add').on('click', onClickExpressionAddCustom); $('#expression_custom_remove').on('click', onClickExpressionRemoveCustom); $('#expression_fallback').on('change', onExpressionFallbackChanged); + $('#expression_api').on('change', onExperesionApiChanged); } // Pause Talkinghead to save resources when the ST tab is not visible or the window is minimized. @@ -1789,6 +1845,7 @@ async function fetchImagesNoCache() { addExpressionImage(); addVisualNovelMode(); + migrateSettings(); await addSettings(); const wrapper = new ModuleWorkerWrapper(moduleWorker); const updateFunction = wrapper.update.bind(wrapper); @@ -1828,6 +1885,7 @@ async function fetchImagesNoCache() { }); eventSource.on(event_types.MOVABLE_PANELS_RESET, updateVisualNovelModeDebounced); eventSource.on(event_types.GROUP_UPDATED, updateVisualNovelModeDebounced); + eventSource.on(event_types.TEXT_COMPLETION_SETTINGS_READY, onTextGenSettingsReady); registerSlashCommand('sprite', setSpriteSlashCommand, ['emote'], '(spriteId) – force sets the sprite for the current character', true, true); registerSlashCommand('spriteoverride', setSpriteSetCommand, ['costume'], '(optional folder) – sets an override sprite folder for the current character. If the name starts with a slash or a backslash, selects a sub-folder in the character-named folder. Empty value to reset to default.', true, true); registerSlashCommand('lastsprite', (_, value) => lastExpression[value.trim()] ?? '', [], '(charName) – Returns the last set sprite / expression for the named character.', true, true); diff --git a/public/scripts/extensions/expressions/settings.html b/public/scripts/extensions/expressions/settings.html index b0b3b0bd3..0746d0327 100644 --- a/public/scripts/extensions/expressions/settings.html +++ b/public/scripts/extensions/expressions/settings.html @@ -6,10 +6,6 @@
- +
+ + Select the API for classifying expressions. + +
Set the default and fallback expression being used when no matching expression is found. From bea63a2efe363a3542fa9b99d920f4f3a157ebe1 Mon Sep 17 00:00:00 2001 From: kingbri Date: Fri, 12 Apr 2024 01:59:44 -0400 Subject: [PATCH 02/81] Expressions: Remove TalkingHead from choices This is a sub-choice under extras. Signed-off-by: kingbri --- public/scripts/extensions/expressions/settings.html | 1 - 1 file changed, 1 deletion(-) diff --git a/public/scripts/extensions/expressions/settings.html b/public/scripts/extensions/expressions/settings.html index 0746d0327..0831a34d3 100644 --- a/public/scripts/extensions/expressions/settings.html +++ b/public/scripts/extensions/expressions/settings.html @@ -25,7 +25,6 @@ -
From 8c4dd6ce1ea40c627b9f25915d935577e84486aa Mon Sep 17 00:00:00 2001 From: kingbri Date: Fri, 12 Apr 2024 09:57:09 -0400 Subject: [PATCH 03/81] Expressions: Ignore stopping strings Don't use stopping strings when triggering a classify generation. Signed-off-by: kingbri --- public/scripts/extensions/expressions/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index fcd85f5c9..1bf07179c 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -982,6 +982,9 @@ function onTextGenSettingsReady(args) { const emotions = DEFAULT_EXPRESSIONS.filter((e) => e != 'talkinghead') Object.assign(args, { top_k: 1, + stop: [], + stopping_strings: [], + custom_token_bans: [], json_schema: { $schema: "http://json-schema.org/draft-04/schema#", type: "object", From 913085ba749b73aee1acc297860166f653a378d0 Mon Sep 17 00:00:00 2001 From: kingbri Date: Sat, 13 Apr 2024 01:29:54 -0400 Subject: [PATCH 04/81] Expressions: Let the user know if classification failed Send a message if the classifer fails and fallback to the default expression. Signed-off-by: kingbri --- public/scripts/extensions/expressions/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index 1bf07179c..629ff44d0 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -1055,7 +1055,8 @@ async function getExpressionLabel(text) { } } } catch (error) { - console.log(error); + toastr.info("Could not classify expression. Check the console or your backend for more information.") + console.error(error); return getFallbackExpression(); } } From 333df466806101ff8daf48002f77f57150486f8d Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Sat, 13 Apr 2024 18:50:15 +0700 Subject: [PATCH 05/81] Add readme-ru_ru --- .github/readme-ru_ru.md | 357 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 .github/readme-ru_ru.md diff --git a/.github/readme-ru_ru.md b/.github/readme-ru_ru.md new file mode 100644 index 000000000..c3a926f1a --- /dev/null +++ b/.github/readme-ru_ru.md @@ -0,0 +1,357 @@ + + +[English](readme.md) | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | Русский + +![][cover] + +Мобайл-френдли интерфейс, поддержка множества API (KoboldAI/CPP, Horde, NovelAI, Ooba, OpenAI, OpenRouter, Claude, Scale), ВН-образный режим Вайфу, Stable Diffusion, TTS, поддержка миров (лорбуков), кастомизируемый интерфейс, автоперевод, тончайшая настройка промптов + возможность устанавливать расширения. + +Основано на форке [TavernAI](https://github.com/TavernAI/TavernAI) версии 1.2.8 + +## Важные новости! + +1. Чтобы помочь вам быстрее разобраться в Таверне, мы создали [сайт с документацией](https://docs.sillytavern.app/). Ответы на большинство вопросов можно найти там. + +2. Почему пропали расширения после апдейта? Начиная с версии 1.10.6, большинство встроенных расширений были конвертированы в формат загружаемых аддонов. Их можно установить обратно через меню "Download Extensions and Assets" на панели расширений (значок с тремя кубиками сверху). + +3. Не поддерживается следующая платформа: android arm LEtime-web. 32-битный Android требует внешнюю зависимость, которую нельзя установить посредством npm. Для её установки потребуется следующая команда: `pkg install esbuild`. После этого продолжайте установку по общей инструкции. + +### Таверну делают для вас Cohee, RossAscends, а также всё сообщество SillyTavern + +### Что такое SillyTavern и TavernAI? + +SillyTavern — это интерфейс, который устанавливается на ПК (и на Android), который даёт возможность общаться с генеративным ИИ и чатиться/ролеплеить с вашими собственными персонажами или персонажами других пользователей. + +SillyTavern — это форк версии TavernAI 1.2.8, который разрабатывается более активно и имеет множество новых функций. Сейчас уже можно сказать, что это две отдельные и абсолютно самостоятельные программы. + +## Скриншоты + +image +image + +### Ветки + +SillyTavern разрабатывается в двух ветках, чтобы всем категориям пользователей было удобно. + +* release -🌟 **Рекомендовано для большинства пользователей.** Самая стабильная ветка, рекомендуем именно её. Обновляется только в момент крупных релизов. Подходит для большей части пользователей. +* staging - ⚠️ **Не рекомендуется для повседневного использования.** В этой ветке весь самый свежий и новый функционал, но будьте аккуратны, поскольку сломаться может в любом месте и в любое время. Только для продвинутых пользователей и энтузиастов. + +Если вы не знакомы с системой CLI в git, или не знаете, что такое ветка, то не переживайте! Наилучшим вариантом всегда остаётся ветка release. + +### Что ещё нужно, кроме SillyTavern? + +Сама по себе SillyTavern бесполезна, ведь это просто интерфейс. Вам потребуется доступ к бэкенду с ИИ, который и будет отыгрывать выбранного вами персонажа. Поддерживаются разные виды бэкендов: OpenAPI API (GPT), KoboldAI (локально или на Google Colab), и многое другое. Больше информации в [FAQ](https://docs.sillytavern.app/usage/faq/). + +### Требуется ли для SillyTavern мощный ПК? + +SillyTavern — это просто интерфейс, поэтому запустить его можно на любой картошке. Мощным должен быть бэкенд с ИИ. + +## Есть вопросы или предложения? + +### У нас появился сервер в Discord + +| [![][discord-shield-badge]][discord-link] | [Вступайте в наше Discord-сообщество!](https://discord.gg/sillytavern) Задавайте вопросы, делитесь любимыми персонажами и промптами. | +| :---------------------------------------- | :----------------------------------------------------------------------------------------------------------------- | + +Также можно написать разработчикам напрямую: + +* Discord: cohee или rossascends +* Reddit: [/u/RossAscends](https://www.reddit.com/user/RossAscends/) или [/u/sillylossy](https://www.reddit.com/user/sillylossy/) +* [Запостить issue на GitHub](https://github.com/SillyTavern/SillyTavern/issues) + +## Эта версия включает + +* Глубоко переработанную TavernAI 1.2.8 (переписано и оптимизировано более 50% кода) +* Свайпы +* Групповые чаты: комнаты для нескольких ботов, где персонажи могут говорить друг с другом и с вами +* Чекпоинты и ветки для чатов +* Продвинутые настройки для KoboldAI / TextGen со множеством созданных сообществом пресетов +* Поддержка миров (функция "Информация о мире" / WorldInfo): создавайте свой богатый лор, или экономьте токены для карточек персонажей +* Соединение через [OpenRouter](https://openrouter.ai) для разных API (Claude, GPT-4/3.5 и других) +* Соединение с API [Oobabooga's TextGen WebUI](https://github.com/oobabooga/text-generation-webui) +* Соединение с [AI Horde](https://horde.koboldai.net/) +* Настройку форматирования промптов + +## Расширения + +SillyTavern поддерживает расширения, при этом некоторые из ИИ-модулей работают через [SillyTavern Extras API](https://github.com/SillyTavern/SillyTavern-extras) + +* Заметки автора / Смещение характера +* Эмоции для персонажей (спрайты) +* Автоматический саммарайз (краткий пересказ) истории чата +* Возможность отправить в чат картинку, которую ИИ сможет рассмотреть и понять +* Генерация картинок в Stable Diffusion (5 пресетов для чата, плюс свободный режим) +* Text-to-speech для сообщений ИИ (с помощью ElevenLabs, Silero, или родной TTS вашей ОС) + +Полный список расширений и инструкций к ним можно найти в [документации](https://docs.sillytavern.app/). + +## Улучшения от RossAscends для UI/CSS/общего удобства + +* Мобильный интерфейс адаптирован для iOS, добавлена возможность сохранить ярлык на главный экран и открыть приложение в полноэкранном режиме. +* Горячие клавиши + * Up = Редактировать последнее сообщение в чате + * Ctrl+Up = Редактировать ВАШЕ последнее сообщение в чате + * Left = свайп влево + * Right = свайп вправо (ОБРАТИТЕ ВНИМАНИЕ: когда в окне ввода что-то напечатано, клавиши для свайпа не работают) + * Ctrl+Left = посмотреть локальные переменные (в консоли браузера) + * Enter (при нахождении внутри окна ввода) = отправить ваше сообщение ИИ + * Ctrl+Enter = Повторная генерация последнего ответа ИИ + +* Страница больше не перезагружается при смене имени пользователя или удалении персонажа + +* Отключаемая возможность автоматически соединяться с API при загрузке страницы. +* Отключаемая возможность автоматически загружать последнего открытого персонажа при загрузке страницы. +* Улучшенный счётчик токенов - работает с несохранёнными персонажами, отображает и перманентные, и временные токены + +* Улучшенный менеджер чатов + * Файлы с новыми чатами получают читабельные названия вида "(персонаж) - (когда создано)" + * Увеличен размер превью чата с 40 символов до 300. + * Несколько вариантов сортировки списка персонажей (по имени, дате создания, размеру чата). + +* Панели настроек слева и справа автоматически скрываются, если щёлкнуть за их пределы. +* При нажатии на значок замка навигационная панель будет закреплена на экране, и эта настройка сохранится между сессиями +* Сам статус панели (открыта или закрыта) также сохраняется между сессиями + +* Кастомизируемый интерфейс чата: + * Настройте звук при получении нового ответа + * Переключайтесь между круглыми и прямоугольными аватарками + * Увеличенное вширь окно чата для стационарных ПК + * Возможность включать полупрозрачные панели, стилизованные под стекло + * Настраиваемые цвета для обычного текста, курсива, цитат + * Настраиваемый цвет фона и интенсивность размытия + +# ⌛ Установка + +> \[!ВНИМАНИЕ] +> * НЕ УСТАНАВЛИВАЙТЕ В ПАПКИ, КОТОРЫЕ КОНТРОЛИРУЕТ WINDOWS (Program Files, System32 и т.п.). +> * НЕ ЗАПУСКАЙТЕ START.BAT С ПРАВАМИ АДМИНИСТРАТОРА +> * УСТАНОВКА НА WINDOWS 7 НЕВОЗМОЖНА ИЗ-ЗА ОТСУТСТВИЯ NODEJS 18.16 + +## 🪟 Windows + +## Установка через Git + 1. Установите [NodeJS](https://nodejs.org/en) (рекомендуется последняя LTS-версия) + 2. Установите [Git for Windows](https://gitforwindows.org/) + 3. Откройте Проводник (`Win+E`) + 4. Перейдите в папку, которую не контролирует Windows, или создайте её. (пример: C:\MySpecialFolder\) + 5. Откройте командную строку. Для этого нажмите на адресную строку (сверху), введите `cmd` и нажмите Enter. + 6. Когда появится чёрное окошко (командная строка), введите ОДНУ из перечисленных ниже команд: + +- для ветки release: `git clone https://github.com/SillyTavern/SillyTavern -b release` +- для ветки staging: `git clone https://github.com/SillyTavern/SillyTavern -b staging` + + 7. Когда клонирование закончится, дважды щёлкните по `Start.bat`, чтобы установить зависимости для NodeJS. + 8. После этого сервер запустится, и SillyTavern откроется в вашем браузере. + +## Установка при помощи SillyTavern Launcher + 1. Установите [Git for Windows](https://gitforwindows.org/) + 2. Откройте Проводник (`Win+E`) и создайте или выберите папку, в которую будет установлен лаунчер + 3. Откройте командную строку. Для этого нажмите на адресную строку (сверху), введите `cmd` и нажмите Enter. + 4. Когда появится чёрное окошко, введите следующую команду: `git clone https://github.com/SillyTavern/SillyTavern-Launcher.git` + 5. Дважды щёлкните по `installer.bat` и выберите, что именно хотите установить + 6. После завершения установки дважды щёлкните по `launcher.bat` + +## Установка с помощью GitHub Desktop +(Тут речь про git **только** в рамках GitHub Desktop, если хотите использовать `git` в командной строке, вам также понадобится [Git for Windows](https://gitforwindows.org/)) + 1. Установите [NodeJS](https://nodejs.org/en) (latest LTS version is recommended) + 2. Установите [GitHub Desktop](https://central.github.com/deployments/desktop/desktop/latest/win32) + 3. После завершения установки GitHub Desktop, нажмите `Clone a repository from the internet....` (обратите внимание: для этого шага **НЕ требуется** аккаунт на GitHub) + 4. В меню перейдите на вкладку URL, введите адрес `https://github.com/SillyTavern/SillyTavern`, и нажмите Clone. В поле Local path можно изменить директорию, в которую будет загружена SillyTavern. + 6. Чтобы запустить SillyTavern, откройте Проводник и перейдите в выбранную на предыдущем шаге папку. По умолчанию репозиторий будет склонирован сюда: `C:\Users\[Имя пользователя]\Documents\GitHub\SillyTavern` + 7. Дважды щёлкните по файлу `start.bat`. (обратите внимание: окончание `.bat` может быть скрыто настройками вашей ОС. Таким образом, имя файла будет выглядеть как "`Start`". Дважды щёлкните по нему, чтобы запустить SillyTavern) + 8. После того, как вы дважды щёлкнули по файлу, должно открыться чёрное окошко, и SillyTavern начнёт устанавливать свои зависимости. + 9. Если установка прошла успешно, то в командной строке будет вот такое, а в браузере откроется вкладка с SillyTavern: + 10. Подключайтесь к любому из [поддерживаемых API](https://docs.sillytavern.app/usage/api-connections/) и начинайте переписку! + +## 🐧 Linux и 🍎 MacOS + +В MacOS и Linux всё это делается через Терминал. + +1. Установите git и nodeJS (как именно - зависит от вашей ОС) +2. Клонируйте репозиторий + +- для ветки release: `git clone https://github.com/SillyTavern/SillyTavern -b release` +- для ветки staging: `git clone https://github.com/SillyTavern/SillyTavern -b staging` + +3. Перейдите в папку установки с помощью `cd SillyTavern`. +4. Запустите скрипт `start.sh` с помощью одной из команд: + +- `./start.sh` +- `bash start.sh` + +## Установка при помощи SillyTavern Launcher + +### Для пользователей Linux +1. Откройте любимый терминал и установите git +2. Загрузите Sillytavern Launcher с помощью команды: `git clone https://github.com/SillyTavern/SillyTavern-Launcher.git` +3. Перейдите в SillyTavern-Launcher: `cd SillyTavern-Launcher` +4. Запустите лаунчер установки: `chmod +x install.sh && ./install.sh`, затем выберите, что конкретно хотите установить +5. После завершения установки, запустите лаунчер следующей командой: `chmod +x launcher.sh && ./launcher.sh` + +### Для пользователей Mac +1. Откройте терминал и установите brew: `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` +2. Затем установите git: `brew install git` +3. Загрузите Sillytavern Launcher: `git clone https://github.com/SillyTavern/SillyTavern-Launcher.git` +4. Перейдите в SillyTavern-Launcher: `cd SillyTavern-Launcher` +5. Запустите лаунчер установки: `chmod +x install.sh && ./install.sh` and choose what you wanna install +6. После завершения установки, запустите лаунчер следующей командой: `chmod +x launcher.sh && ./launcher.sh` + +## 📱 Мобильные устройства - Установка при помощи termux + +> \[!ОБРАТИТЕ ВНИМАНИЕ] +> **На Android-телефонах SillyTavern можно запускать нативно посредством Termux. Обратитесь к гайду, написанному ArroganceComplex#2659:** +> * + + +## Управление ключами от API + +SillyTavern сохраняет ключи от ваших API в файле `secrets.json` в папке на сервере. + +По умолчанию, ключи не будут отображаться на фронте после их ввода и перезагрузки страницы. + +Чтобы включить возможность отображения ключей путём нажатия кнопки в блоке API: + +1. Зайдите в файл `config.yaml` и установите `allowKeysExposure` в положение `true`. +2. Перезапустите сервер SillyTavern. + +## Удалённое подключение + +В основном этим пользуются тогда, когда хотят использовать SillyTavern с телефона, запустив сервер SillyTavern на стационарном ПК в той же Wi-Fi-сети. + +Однако это позволит подключаться откуда угодно, а не только вам. + +**ВАЖНО: в SillyTavern не предусмотрена возможность использования программы несколькими людьми. Поэтому любой, кто подключится к вашему серверу, получит доступ ко всем вашим персонажам и чатам, а также сможет менять настройки через UI.** + +### 1. Заведение "белого списка" IP-адресов + +* Создайте в корневой папке SillyTavern файл с названием `whitelist.txt`. +* Откройте файл в текстовом редакторе и внесите список IP-адресов, с которых хотите разрешить подключение. + +*Принимаются как обычные IP-адреса, так и целые диапазоны, размеченные с помощью астериска. Примеры:* + +```txt +192.168.0.1 +192.168.0.20 +``` + +или + +```txt +192.168.0.* +``` + +(диапазон из примера сверху позволит подключаться всем устройствам в локальной сети) + +Также принимаются маски CIDR (вида 10.0.0.0/24). + +* Сохраните файл `whitelist.txt`. +* Перезапустите сервер Таверны. + +После этого устройства из белого списка смогут подключаться к вашему серверу. + +*Обратите внимание: в файле `config.yaml` также имеется массив `whitelist`, который работает по тому же принципу. Однако если существует файл `whitelist.txt`, то этот массив игнорируется.* + +### 2. Получение IP хост-машины с Таверной + +После настройки белого списка адресов, следующим шагом будет получение IP-адреса хост-машины, на которой запущена Таверна. + +Если хост-машина находится в той же Wi-Fi-сети, то можно воспользоваться её внутренним Wi-Fi-IP-адресом: + +* На Windows: нажмите Пуск > введите `cmd.exe` в поиске > в консоли введите команду `ipconfig` и нажмите Enter > найдите пункт `IPv4-адрес`. + +Если вы (или кто-то другой) хотите подключаться к хост-машине из другой сети, то вам понадобится ваш публичный IP-адрес. + +* Откройте [эту страницу](https://whatismyipaddress.com/) с вашей хост-машины и найдите пункт `IPv4`. На этот адрес и будет подключаться удалённое устройство. + +### 3. Соединить удалённое устройство с хост-машиной Таверны + +Какой бы IP-адрес вы ни выбрали, вам нужно будет вводить его в адресной строке браузера вашего удалённого устройства. + +Обычный адрес хост-машины, находящейся в той же Wi-Fi-сети, выглядит примерно так: + +`http://192.168.0.5:8000` + +НЕ используйте https:// +Только http:// + +### Открытие доступа до Таверны для всех IP-адресов + +Мы не рекомендуем так делать, но вы можете открыть файл `config.yaml` и изменить `whitelistMode` на `false`. + +Обязательно нужно удалить (или переименовать) файл `whitelist.txt`, если такой файл есть в корневой директории SillyTavern. + +Эта практика считается небезопасной, поэтому, если вы решите так сделать, мы попросим вас установить логин и пароль. + +Оба этих параметра настраиваются в `config.yaml` (username и password). + +Останется только перезапустить сервер Таверны, и после этого к вам сможет подключиться любой пользователь вне зависимости от IP-адреса его устройства. Главное, чтобы он знал логин и пароль. + +### Не получается соединиться? + +* Создайте входящее/исходящее правило в вашем фаерволле для порта, указанного в `config.yaml`. НЕ ПУТАЙТЕ этот процесс с пробросом портов на роутере. Если по ошибке перепутаете, то на ваш сервер сможет забраться посторонний человек и украсть ваши логи, этого следует избегать. +* Переключите Сетевой профиль на значение "Частные". Для этого зайдите в Параметры > Сеть и Интернет > Ethernet. КРАЙНЕ важно для Windows 11, без этого не получится подключиться даже с правилом фаервола. + +## Проблемы с производительностью? + +Попробуйте включить опцию "Отключить эффект размытия" в меню "Пользовательские настройки". + +## Нравится ваш проект! Как помочь? + +### ЧТО ДЕЛАТЬ + +1. Присылайте пулл реквесты +2. Присылайте идеи и баг-репорты, оформленные по установленным шаблонам +3. Прежде чем задавать вопросы, прочтите readme и документацию + +### ЧЕГО НЕ ДЕЛАТЬ + +1. Предлагать донаты +2. Присылать баг-репорты безо всякого контекста +3. Задавать вопросы, на которые уже отвечали + +## Где найти старые фоны? + +Мы двигаемся в сторону 100% уникальности всего используемого контента, поэтому старые фоны были убраны из репозитория. + +Они отправлены в архив, скачать их можно здесь: + + + + + + +## Авторы и лицензии + +**Мы надеемся, что эта программа принесёт людям пользу, +но мы не даём НИКАКИХ ГАРАНТИЙ; мы ни в коем случае не гарантируем того, +что программа СООТВЕТСТВУЕТ КАКИМ-ЛИБО КРИТЕРИЯМ или ПРИГОДНА ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ. +Подробнее можно узнать в GNU Affero General Public License.** + +* Базовая TAI от Humi: Лицензия неизвестна +* Модификации от Cohee и производная кодовая база: AGPL v3 +* Дополнения RossAscends: AGPL v3 +* Кусочки TavernAITurbo мода от CncAnon: Лицензия неизвестна +* Различные коммиты и предложения от kingbri () +* Расширения и внедрение разного рода удобств - city_unit () +* Различные коммиты и баг-репорты от StefanDanielSchwarz () +* Режим Вайфу вдохновлён работой PepperTaco () +* Благодарность Pygmalion University за прекрасную работу по тестированию и за все предлагаемые крутые фичи! +* Благодарность oobabooga за компиляцию пресетов для TextGen +* Пресеты для KoboldAI из KAI Lite: +* Шрифт Noto Sans от Google (OFL license) +* Тема Font Awesome (Иконки: CC BY 4.0, Шрифты: SIL OFL 1.1, Код: MIT License) +* Клиентская библиотека для AI Horde от ZeldaFan0225: +* Пусковой скрипт для Linux от AlpinDale +* Благодарность paniphons за оформление документа с FAQ +* Фон в честь 10 тысяч пользователей в Discord от @kallmeflocc +* Стандартный контент (персонажи и лорбуки) предоставлен пользователями @OtisAlejandro, @RossAscends и @kallmeflocc +* Корейский перевод от @doloroushyeonse +* Поддержка k_euler_a для Horde от +* Китайский перевод от [@XXpE3](https://github.com/XXpE3), 中文 ISSUES 可以联系 @XXpE3 + + +[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square +[cover]: https://github.com/SillyTavern/SillyTavern/assets/18619528/c2be4c3f-aada-4f64-87a3-ae35a68b61a4 +[discord-link]: https://discord.gg/sillytavern +[discord-shield]: https://img.shields.io/discord/1100685673633153084?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=flat-square +[discord-shield-badge]: https://img.shields.io/discord/1100685673633153084?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=for-the-badge From cb472fc91253d52a71269f76a76ab1ab399000ad Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Sat, 13 Apr 2024 18:51:03 +0700 Subject: [PATCH 06/81] Add link to readme-ru_ru --- .github/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/readme.md b/.github/readme.md index 2504eec35..992ef1365 100644 --- a/.github/readme.md +++ b/.github/readme.md @@ -1,6 +1,6 @@ -English | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) +English | [中文](readme-zh_cn.md) | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) ![][cover] From 1c515c3a5ed3e652015ee9df028b8248b9c63abd Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:02:28 +0700 Subject: [PATCH 07/81] Fix markup --- .github/readme-ru_ru.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/readme-ru_ru.md b/.github/readme-ru_ru.md index c3a926f1a..96368f576 100644 --- a/.github/readme-ru_ru.md +++ b/.github/readme-ru_ru.md @@ -122,7 +122,7 @@ SillyTavern поддерживает расширения, при этом не # ⌛ Установка -> \[!ВНИМАНИЕ] +> ** ВНИМАНИЕ! ** > * НЕ УСТАНАВЛИВАЙТЕ В ПАПКИ, КОТОРЫЕ КОНТРОЛИРУЕТ WINDOWS (Program Files, System32 и т.п.). > * НЕ ЗАПУСКАЙТЕ START.BAT С ПРАВАМИ АДМИНИСТРАТОРА > * УСТАНОВКА НА WINDOWS 7 НЕВОЗМОЖНА ИЗ-ЗА ОТСУТСТВИЯ NODEJS 18.16 @@ -198,7 +198,7 @@ SillyTavern поддерживает расширения, при этом не ## 📱 Мобильные устройства - Установка при помощи termux -> \[!ОБРАТИТЕ ВНИМАНИЕ] +> **ОБРАТИТЕ ВНИМАНИЕ!** > **На Android-телефонах SillyTavern можно запускать нативно посредством Termux. Обратитесь к гайду, написанному ArroganceComplex#2659:** > * From 4ba3f5b3514409ccc1914d3aaf76174080f02a12 Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:18:34 +0700 Subject: [PATCH 08/81] Markup --- .github/readme-ru_ru.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/readme-ru_ru.md b/.github/readme-ru_ru.md index 96368f576..db4fe6d5d 100644 --- a/.github/readme-ru_ru.md +++ b/.github/readme-ru_ru.md @@ -122,7 +122,7 @@ SillyTavern поддерживает расширения, при этом не # ⌛ Установка -> ** ВНИМАНИЕ! ** +> **Внимание!** > * НЕ УСТАНАВЛИВАЙТЕ В ПАПКИ, КОТОРЫЕ КОНТРОЛИРУЕТ WINDOWS (Program Files, System32 и т.п.). > * НЕ ЗАПУСКАЙТЕ START.BAT С ПРАВАМИ АДМИНИСТРАТОРА > * УСТАНОВКА НА WINDOWS 7 НЕВОЗМОЖНА ИЗ-ЗА ОТСУТСТВИЯ NODEJS 18.16 @@ -199,7 +199,9 @@ SillyTavern поддерживает расширения, при этом не ## 📱 Мобильные устройства - Установка при помощи termux > **ОБРАТИТЕ ВНИМАНИЕ!** +> > **На Android-телефонах SillyTavern можно запускать нативно посредством Termux. Обратитесь к гайду, написанному ArroganceComplex#2659:** +> > * From e62bdab2c60d76997395c8f2a7762788cd1f6902 Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:23:10 +0700 Subject: [PATCH 09/81] Add link to readme-ru_ru --- .github/readme-zh_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/readme-zh_cn.md b/.github/readme-zh_cn.md index 575072404..0d910978b 100644 --- a/.github/readme-zh_cn.md +++ b/.github/readme-zh_cn.md @@ -1,4 +1,4 @@ -[English](readme.md) | 中文 | [日本語](readme-ja_jp.md) +[English](readme.md) | 中文 | [日本語](readme-ja_jp.md) | [Русский](readme-ru_ru.md) ![image](https://github.com/SillyTavern/SillyTavern/assets/18619528/c2be4c3f-aada-4f64-87a3-ae35a68b61a4) From ae781123110cab2d1cf1d271e021246170f5a605 Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:23:51 +0700 Subject: [PATCH 10/81] Add link to readme-ru_ru --- .github/readme-ja_jp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/readme-ja_jp.md b/.github/readme-ja_jp.md index 6f77d76b5..5aade3e84 100644 --- a/.github/readme-ja_jp.md +++ b/.github/readme-ja_jp.md @@ -1,4 +1,4 @@ -[English](readme.md) | [中文](readme-zh_cn.md) | 日本語 +[English](readme.md) | [中文](readme-zh_cn.md) | 日本語 | [Русский](readme-ru_ru.md) ![SillyTavern-Banner](https://github.com/SillyTavern/SillyTavern/assets/18619528/c2be4c3f-aada-4f64-87a3-ae35a68b61a4) From 4fb6cbc3fbcf0da28845a5be4d2c7d147eb42b08 Mon Sep 17 00:00:00 2001 From: Yokayo <52032299+Yokayo@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:31:07 +0700 Subject: [PATCH 11/81] Update readme-ru_ru.md --- .github/readme-ru_ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/readme-ru_ru.md b/.github/readme-ru_ru.md index db4fe6d5d..b42fcc428 100644 --- a/.github/readme-ru_ru.md +++ b/.github/readme-ru_ru.md @@ -36,7 +36,7 @@ SillyTavern разрабатывается в двух ветках, чтобы * release -🌟 **Рекомендовано для большинства пользователей.** Самая стабильная ветка, рекомендуем именно её. Обновляется только в момент крупных релизов. Подходит для большей части пользователей. * staging - ⚠️ **Не рекомендуется для повседневного использования.** В этой ветке весь самый свежий и новый функционал, но будьте аккуратны, поскольку сломаться может в любом месте и в любое время. Только для продвинутых пользователей и энтузиастов. -Если вы не знакомы с системой CLI в git, или не знаете, что такое ветка, то не переживайте! Наилучшим вариантом всегда остаётся ветка release. +Если вы не умеете обращаться с git через командную строку, или не знаете, что такое ветка, то не переживайте! Наилучшим вариантом всегда остаётся ветка release. ### Что ещё нужно, кроме SillyTavern? From 985b77d40718d43a0892b3da35aadc89acb43334 Mon Sep 17 00:00:00 2001 From: Touch-Night <1762918301@qq.com> Date: Sat, 13 Apr 2024 20:40:02 +0800 Subject: [PATCH 12/81] Improve Chinese translation --- public/locales/zh-cn.json | 348 +++++++++++++++++++------------------- 1 file changed, 175 insertions(+), 173 deletions(-) diff --git a/public/locales/zh-cn.json b/public/locales/zh-cn.json index ce1d8fa65..8743c9d9b 100644 --- a/public/locales/zh-cn.json +++ b/public/locales/zh-cn.json @@ -6,39 +6,39 @@ "default": "默认", "openaipresets": "OpenAI 预设", "text gen webio(ooba) presets": "WebUI(ooba) 预设", - "response legth(tokens)": "响应长度(Token)", + "response legth(tokens)": "响应长度(以词符数计)", "select": "选择", - "context size(tokens)": "上下文长度(Token)", + "context size(tokens)": "上下文长度(以词符数计)", "unlocked": "已解锁", - "Only select models support context sizes greater than 4096 tokens. Increase only if you know what you're doing.": "仅选择的模型支持大于 4096 个Token的上下文大小。只有在知道自己在做什么的情况下才增加。", - "rep.pen": "重复惩罚", - "WI Entry Status:🔵 Constant🟢 Normal❌ Disabled": "WI 输入状态:\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 以使用原始概率。", + "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": "世界书条目状态:\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 设置可以从中选择的顶级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缩放温度。", + "Top K sets a maximum amount of top tokens that can be chosen from": "Top K 设定了可以选择的最高概率词符的最大数量。", + "Top P (a.k.a. nucleus sampling)": "Top P(又称核采样)将所有高概率词符聚集在一起,直到达到特定的百分比。\n换句话说,如果前两个词符分别都有 25% 的概率,而 Top-P 为 0.50,那么只有这两个词符会被考虑。\n将这个值设置为 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 设定了一个基础的最小概率,它会根据最高词符概率来进行优化。\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)": "无尾采样(TFS)通过分析词符概率变化率以及二阶导数来搜索分布中概率较低的尾部词符,\n词符会被保留到某个阈值(例如 0.3),这取决于统一的二阶导数。\n这个值越接近 0,被拒绝的词符数量就越多。将这个值设置为 1.0 就相当于关闭了这个功能。", + "Epsilon cutoff sets a probability floor below which tokens are excluded from being sampled": "ε 截止设置了一个概率下限,低于该下限的词符将被排除在采样之外。\n以 1e-4 单位;合适的值为 3。将其设置为 0 以禁用。", + "Scale Temperature dynamically per token, based on the variation of probabilities": "根据概率的变化动态地缩放每个词符的温度。", "Minimum Temp": "最小温度", "Maximum Temp": "最大温度", "Exponent": "指数", "Mirostat Mode": "Mirostat 模式", - "Mirostat Tau": "Mirostat Tau", - "Mirostat Eta": "Mirostat Eta", + "Mirostat Tau": "Mirostat τ", + "Mirostat Eta": "Mirostat η", "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计数器。", + "Strength of the Contrastive Search regularization term. Set to 0 to disable CS": "对比搜索正则化项的强度。 将值设置为 0 以禁用对比搜索。", + "Temperature Last": "温度放最后", + "Use the temperature sampler last": "温度采样器放到最后使用。 这通常是合理的。\n当启用时:首先进行潜在词符的选择,然后应用温度来修正它们的相对概率(技术上是对数似然)。\n当禁用时:首先应用温度来修正所有词符的相对概率,然后从中选择潜在词符。\n禁用此项可以增大分布在尾部的词符概率,这可能加大得到不相关回复的几率。", + "LLaMA / Mistral / Yi models only": "LLaMA / Mistral / Yi模型专用。首先确保您选择了适当的词符化器。\n这项设置决定了你不想在结果中看到的字符串。\n每行一个字符串。可以是文本或者[词符id]。\n许多词符以空格开头。如果不确定,请使用词符计数器。", "Example: some text [42, 69, 1337]": "例如:\n一些文本\n[42, 69, 1337]", - "Classifier Free Guidance. More helpful tip coming soon": "免费的分类器指导。 更多有用的提示词即将推出。", - "Scale": "比例", + "Classifier Free Guidance. More helpful tip coming soon": "无分类器指导(CFG)。更多有用的提示敬请期待。", + "Scale": "缩放比例", "GBNF Grammar": "GBNF 语法", "Usage Stats": "使用统计", "Click for stats!": "点击查看统计!", @@ -55,66 +55,67 @@ "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 代理时遇到的问题提供支持", - "Legacy Streaming Processing": "传统流处理", - "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 存在惩罚", + "Legacy Streaming Processing": "旧版流式处理", + "Enable this if the streaming doesn't work with your proxy": "如果流式传输与您的代理不兼容,请启用此选项", + "Context Size (tokens)": "上下文长度(以词符数计)", + "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 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 BOS Token": "添加 BOS 词符", "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 EOS Token": "禁止 EOS 词符", "Ban the eos_token. This forces the model to never end the generation prematurely": "禁止 eos_token。 这将强制模型永远不会提前结束生成", - "Skip Special Tokens": "跳过特殊Token", + "Skip Special Tokens": "跳过特殊词符", "Beam search": "束搜索", "Number of Beams": "束数量", "Length Penalty": "长度惩罚", "Early Stopping": "提前停止", "Contrastive search": "对比搜索", - "Penalty Alpha": "惩罚 Alpha", - "Seed": "Seed 种子", - "Epsilon Cutoff": "Epsilon Cutoff", - "Eta Cutoff": "Eta Cutoff", + "Penalty Alpha": "惩罚系数 α", + "Seed": "种子", + "Epsilon Cutoff": "ε 截断", + "Eta Cutoff": "η 截断", "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 生成您不希望在输出中出现的内容。", - "Phrase Repetition Penalty": "短语重复惩罚", + "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.": "使用样式标签修改输出的写作风格。", - "Banned Tokens": "禁用的Token", - "Sequences you don't want to appear in the output. One per line.": "您不希望出现在输出中的序列。 每行一个。", + "Banned Tokens": "禁用的词符", + "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 插入为最后一个系统消息。", + "Used if CFG Scale is unset globally, per chat or character": "如果无分类器指导(CFG)缩放比例未在全局设置,它将作用于每个聊天或每个角色", + "Inserts jailbreak as a last system message.": "将越狱提示词插入为最后一个系统消息。", "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 动态温度", + "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个标记的上下文大小时启用此选项", + "Only enable this if your model supports context sizes greater than 4096 tokens": "仅在您的模型支持大于4096个词符的上下文大小时启用此选项", "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 词符(用KoboldCpp会出现的词符,可能还有其他用KoboldAI会出现的词符)。", + "Good for story writing, but should not be used for chat and instruct mode.": "适用于写故事,但不应该用于聊天和指导模式。", "Enhance Definitions": "增强定义", "Use OAI knowledge base to enhance definitions for public figures and known fictional characters": "使用OAI知识库来增强公众人物和已知虚构角色的定义", "Wrap in Quotes": "用引号括起来", @@ -122,13 +123,13 @@ "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开关打开时使用的提示词", + "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": "对数偏差", + "Impersonation prompt": "AI帮答提示词", + "Prompt that is used for Impersonation function": "用于AI帮答功能的提示词", + "Logit Bias": "Logit 偏置", "Helps to ban or reenforce the usage of certain words": "有助于禁止或加强某些单词的使用", "View / Edit bias preset": "查看/编辑偏置预设", "Add bias entry": "添加偏置条目", @@ -142,13 +143,13 @@ "Test Message": "发送测试消息", "API": "API", "KoboldAI": "KoboldAI", - "Use Horde": "使用部落", + "Use Horde": "使用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": "根据工作人员的能力调整上下文大小", - "Adjust response length to worker capabilities": "根据工作人员的能力调整响应长度", + "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密钥", "Get it here:": "在此获取:", @@ -162,23 +163,23 @@ "Download": "下载", "TogetherAI API Key": "TogetherAI API密钥", "-- Connect to the API --": "-- 连接到API --", - "View my Kudos": "查看我的赞誉", + "View my Kudos": "查看我的荣誉", "Enter": "输入", - "to use anonymous mode.": "使用匿名模式。", + "to use anonymous mode.": "以使用匿名模式。", "For privacy reasons": "出于隐私考虑", "Models": "模型", - "Hold Control / Command key to select multiple models.": "按住Control / Command键选择多个模型。", - "Horde models not loaded": "部落模型未加载", + "Hold Control / Command key to select multiple models.": "按住 Control / Command 键选择多个模型。", + "Horde models not loaded": "Horde模型未加载", "Not connected...": "未连接...", "Novel API key": "Novel AI API密钥", "Follow": "跟随", "these directions": "这些说明", - "to get your NovelAI API key.": "获取您的NovelAI API密钥。", + "to get your NovelAI API key.": "以获取您的NovelAI API密钥。", "Enter it in the box below": "在下面的框中输入", "Novel AI Model": "Novel AI模型", "If you are using:": "如果您正在使用:", "oobabooga/text-generation-webui": "oobabooga/text-generation-webui", - "Make sure you run it with": "确保您用以下方式运行它", + "Make sure you run it with": "确保您在运行时加上", "flag": "标志", "API key (optional)": "API密钥(可选)", "Server url": "服务器地址", @@ -190,7 +191,7 @@ "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,12 +210,12 @@ "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密钥", @@ -227,18 +228,18 @@ "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": "用换行符包装序列", + "Instruct Mode": "指示模式", + "Wrap Sequences with Newline": "用换行符包裹序列", "Include Names": "包括名称", "Force for Groups and Personas": "强制适配群组和人物", "System Prompt": "系统提示词", - "Instruct Mode Sequences": "Instruct Mode Sequences 指导模式序列", + "Instruct Mode Sequences": "指示模式序列", "Input Sequence": "输入序列", "Output Sequence": "输出序列", "First Output Sequence": "第一个输出序列", @@ -247,11 +248,11 @@ "System Sequence Suffix": "系统序列后缀", "Stop Sequence": "停止序列", "Context Formatting": "上下文格式", - "(Saved to Context Template)": "(保存到上下文模板)", - "Tokenizer": "分词器", + "(Saved to Context Template)": "(已保存到上下文模板)", + "Tokenizer": "词符化器", "None / Estimated": "无 / 估计", "Sentencepiece (LLaMA)": "Sentencepiece (LLaMA)", - "Token Padding": "Token填充", + "Token Padding": "词符填充", "Save preset as": "另存预设为", "Always add character's name to prompt": "始终将角色名称添加到提示词", "Use as Stop Strings": "用作停止字符串", @@ -260,12 +261,12 @@ "Misc. Settings": "其他设置", "Auto-Continue": "自动继续", "Collapse Consecutive Newlines": "折叠连续的换行符", - "Allow for Chat Completion APIs": "允许聊天完成API", - "Target length (tokens)": "目标长度(Token)", + "Allow for Chat Completion APIs": "允许使用聊天补全API", + "Target length (tokens)": "目标长度(以词符数计)", "Keep Example Messages in Prompt": "在提示词中保留示例消息", "Remove Empty New Lines from Output": "从输出中删除空行", "Disabled for all models": "对所有模型禁用", - "Automatic (based on model name)": "自动(根据模型名称)", + "Automatic (based on model name)": "自动(基于模型名称)", "Enabled for all models": "对所有模型启用", "Anchors Order": "锚定顺序", "Character then Style": "角色然后样式", @@ -283,14 +284,14 @@ "Budget Cap": "预算上限", "(0 = disabled)": "(0 = 禁用)", "depth": "深度", - "Token Budget": "Token预算", + "Token Budget": "词符预算", "budget": "预算", "Recursive scanning": "递归扫描", "None": "无", "User Settings": "用户设置", "UI Mode": "UI 模式", "UI Language": "语言", - "MovingUI Preset": "MovingUI 预设", + "MovingUI Preset": "可移动UI 预设", "UI Customization": "UI 自定义", "Avatar Style": "头像样式", "Circle": "圆形", @@ -304,14 +305,14 @@ "Waifu Mode": "AI老婆模式", "Message Timer": "AI回复消息计时器", "Model Icon": "模型图标", - "# of messages (0 = disabled)": "消息数量(0 = 禁用)", + "# of messages (0 = disabled)": "消息数量(0 = 禁用)", "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": "可移动UI 预设", + "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", "Custom CSS": "自定义 CSS", @@ -320,9 +321,9 @@ "API Type": "API 类型", "Aphrodite API key": "Aphrodite API 密钥", "Relax message trim in Groups": "放松群组中的消息修剪", - "Characters Hotswap": "收藏角色卡置顶显示", - "Request token probabilities": "请求Token概率", - "Movable UI Panels": "可移动的 UI 面板", + "Characters Hotswap": "角色卡快速热切换", + "Request token probabilities": "请求词符概率", + "Movable UI Panels": "可移动 UI 面板", "Reset Panels": "重置面板", "UI Colors": "UI 颜色", "Main Text": "主要文本", @@ -408,12 +409,12 @@ "What this keyword should mean to the AI": "这个关键词对 AI 的含义", "Memo/Note": "备忘录/注释", "Not sent to AI": "不发送给 AI", - "Constant": "常量", + "Constant": "不变", "Selective": "选择性", "Before Char": "角色之前", "After Char": "角色之后", "Insertion Order": "插入顺序", - "Tokens:": "Token:", + "Tokens:": "词符:", "Disable": "禁用", "${characterName}": "${角色名称}", "CHAR": "角色", @@ -424,7 +425,7 @@ "Start new chat": "开始新聊天", "View past chats": "查看过去的聊天记录", "Delete messages": "删除消息", - "Impersonate": "冒充", + "Impersonate": "AI 帮答", "Regenerate": "重新生成", "PNG": "PNG", "JSON": "JSON", @@ -436,15 +437,15 @@ "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 开关关闭时使用的提示词", - "Advanced prompt bits": "高级提示词位", + "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} 标记内容插入的位置。", + "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": "聊天补全来源", "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", - "Trusted workers only": "仅信任的工作人员", + "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 模型未加载 --", "Example: http://127.0.0.1:5000/api ": "示例:http://127.0.0.1:5000/api", @@ -459,7 +460,7 @@ "Trim Incomplete Sentences": "修剪不完整的句子", "Include Newline": "包括换行符", "Non-markdown strings": "非 Markdown 字符串", - "Replace Macro in Sequences": "在序列中替换宏", + "Replace Macro in Sequences": "替换序列中的宏", "Presets": "预设", "Separator": "分隔符", "Start Reply With": "以...开始回复", @@ -473,13 +474,13 @@ "-- World Info not found --": "-- 未找到世界信息 --", "--- Pick to Edit ---": "--- 选择以编辑 ---", "or": "或", - "New": "新", + "New": "新建", "Priority": "优先级", "Custom": "自定义", "Title A-Z": "标题 A-Z", "Title Z-A": "标题 Z-A", - "Tokens ↗": "Token ↗", - "Tokens ↘": "Token ↘", + "Tokens ↗": "词符 ↗", + "Tokens ↘": "词符 ↘", "Depth ↗": "深度 ↗", "Depth ↘": "深度 ↘", "Order ↗": "顺序 ↗", @@ -498,6 +499,7 @@ "Alert On Overflow": "溢出警报", "World/Lore Editor": "世界/传说编辑器", "--- None ---": "--- 无 ---", + "Comma seperated (ignored if empty)": "逗号分隔(如果为空则忽略)", "Use Probability": "使用概率", "Exclude from recursion": "排除递归", "Entry Title/Memo": "条目标题/备忘录", @@ -512,7 +514,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 消息模糊色调", @@ -520,7 +522,7 @@ "Chat Background": "聊天背景", "UI Background": "UI 背景", "Mad Lab Mode": "疯狂实验室模式", - "Show Message Token Count": "显示消息Token计数", + "Show Message Token Count": "显示消息词符数", "Compact Input Area (Mobile)": "紧凑输入区域(移动端)", "Zen Sliders": "禅滑块", "UI Border": "UI 边框", @@ -530,7 +532,7 @@ "Tags as Folders": "标签作为文件夹", "Chat Truncation": "聊天截断", "(0 = unlimited)": "(0 = 无限制)", - "Streaming FPS": "流媒体帧速率", + "Streaming FPS": "流式传输帧速率", "Gestures": "手势", "Message IDs": "显示消息编号", "Prefer Character Card Prompt": "角色卡提示词优先", @@ -538,7 +540,7 @@ "Press Send to continue": "按发送键继续", "Quick 'Continue' button": "快速“继续”按钮", "Log prompts to console": "将提示词记录到控制台", - "Never resize avatars": "不调整头像大小", + "Never resize avatars": "永不调整头像大小", "Show avatar filenames": "显示头像文件名", "Import Card Tags": "导入卡片标签", "Confirm message deletion": "确认删除消息", @@ -546,7 +548,7 @@ "Auto-swipe": "自动滑动", "Minimum generated message length": "生成的消息的最小长度", "Blacklisted words": "黑名单词语", - "Blacklisted word count to swipe": "滑动的黑名单词语数量", + "Blacklisted word count to swipe": "触发滑动的黑名单词语数量", "Reload Chat": "重新加载聊天", "Search Settings": "搜索设置", "Disabled": "已禁用", @@ -557,15 +559,15 @@ "Disables animations and transitions": "禁用动画和过渡效果", "removes blur from window backgrounds": "从窗口背景中移除模糊效果", "Remove text shadow effect": "移除文本阴影效果", - "Reduce chat height, and put a static sprite behind the chat window": "减少聊天高度,并在聊天窗口后放置静态精灵", - "Always show the full list of the Message Actions context items for chat messages, instead of hiding them behind '...'": "始终显示聊天消息的操作菜单完整列表,而不是隐藏它们在“…”后面", - "Alternative UI for numeric sampling parameters with fewer steps": "用于数字采样参数的备用用户界面,步骤较少", - "Entirely unrestrict all numeric sampling parameters": "完全取消限制所有数字采样参数", - "Time the AI's message generation, and show the duration in the chat log": "记录AI消息生成的时间,并在聊天日志中显示持续时间", + "Reduce chat height, and put a static sprite behind the chat window": "缩小聊天窗口的高度,并在聊天窗口后面放置一个固定的精灵图像。", + "Always show the full list of the Message Actions context items for chat messages, instead of hiding them behind '...'": "始终显示聊天消息的操作菜单完整列表,而不是将它们隐藏在“...”后面", + "Alternative UI for numeric sampling parameters with fewer steps": "为数值采样参数提供一个步骤更少的替代用户界面。", + "Entirely unrestrict all numeric sampling parameters": "完全解除所有数字采样参数的限制", + "Time the AI's message generation, and show the duration in the chat log": "对 AI 生成消息的时间进行计时,并在聊天记录中显示持续时间。", "Show a timestamp for each message in the chat log": "在聊天日志中为每条消息显示时间戳", "Show an icon for the API that generated the message": "为生成消息的API显示图标", "Show sequential message numbers in the chat log": "在聊天日志中显示连续的消息编号", - "Show the number of tokens in each message in the chat log": "在聊天日志中显示每条消息中的Token数", + "Show the number of tokens in each message in the chat log": "在聊天日志中显示每条消息中的词符数", "Single-row message input area. Mobile only, no effect on PC": "单行消息输入区域。仅适用于移动设备,对PC无影响", "In the Character Management panel, show quick selection buttons for favorited characters": "在角色管理面板中,显示快速选择按钮以选择收藏的角色", "Show tagged character folders in the character list": "在角色列表中显示已标记的角色文件夹", @@ -575,39 +577,39 @@ "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预设。预定义/保存的可拖动位置", - "Save movingUI changes to a new file": "将movingUI更改保存到新文件中", + "MovingUI preset. Predefined/saved draggable positions": "可移动UI预设。预定义/保存的可拖动位置", + "Save movingUI changes to a new file": "将可移动UI更改保存到新文件中", "Apply a custom CSS style to all of the ST GUI": "将自定义CSS样式应用于所有ST GUI", "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": "仅在磁盘上显示实际文件名,在角色列表显示中", + "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": "将角色定义从编辑面板隐藏在一个剧透按钮后面", + "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": "在输入区域中显示一个按钮,询问AI是否继续(延长)其上一条消息", - "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "在最后一条聊天消息上显示箭头按钮以生成替代的AI响应。PC和移动设备均可", + "Show arrow buttons on the last in-chat message to generate alternative AI responses. Both PC and mobile": "在聊天窗口的最后一条信息上显示箭头按钮,以生成AI的其他回复选项。适用于电脑和手机端。", "Allow using swiping gestures on the last in-chat message to trigger swipe generation. Mobile only, no effect on PC": "允许在最后一条聊天消息上使用滑动手势触发滑动生成。仅适用于移动设备,对PC无影响", "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": "在聊天消息中禁止来自其他域的嵌入式媒体", "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消息包含其他组成员说的话", - "Requests logprobs from the API for the Token Probabilities feature": "为Token Probabilities功能从API请求logprobs", + "Requests logprobs from the API for the Token Probabilities feature": "从API请求对数概率数据,用于实现词符概率功能。", "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": "启用自动滑动功能。仅当启用自动滑动时,本节中的设置才会生效", "If the generated message is shorter than this, trigger an auto-swipe": "如果生成的消息短于此长度,则触发自动滑动", - "Reload and redraw the currently open chat": "重新加载和重绘当前打开的聊天", + "Reload and redraw the currently open chat": "重新加载并重新渲染当前打开的聊天", "Auto-Expand Message Actions": "自动展开消息操作菜单", "Not Connected": "未连接", "Persona Management": "角色管理", "Persona Description": "角色描述", - "Your Persona": "您的角色", - "Show notifications on switching personas": "切换角色时显示通知", + "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": "在故事字符串/提示词管理器", + "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?": "怎样使用?", @@ -641,17 +643,17 @@ "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": "重复惩罚存在", + "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.": "使用'Unlocked Context'启用分块生成。", - "It extends the context window in exchange for reply generation speed.": "它扩展了上下文窗口,以换取回复生成速度。", + "Use 'Unlocked Context' to enable chunked generation.": "使用“解锁上下文”以启用分块生成。", + "It extends the context window in exchange for reply generation speed.": "它通过牺牲回复生成的速度来扩展上下文窗口。", "Continue": "继续", "CFG Scale": "CFG规模", "Editing:": "编辑:", @@ -665,7 +667,7 @@ "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.": "这将是每次开始的角色的第一条消息。", + "This will be the first message from the character that starts every chat.": "这将是角色在每次聊天开始时发送的第一条消息。", "Chat Name (Optional)": "聊天名称(可选)", "Filter...": "过滤...", "Search...": "搜索...", @@ -686,11 +688,11 @@ "What this keyword should mean to the AI, sent verbatim": "这个关键词对AI的含义,逐字发送", "Filter to Character(s)": "过滤到角色", "Character Exclusion": "角色排除", - "Inclusion Group": "包含组", + "Inclusion Group": "包含群组", "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配置面板将保持打开状态", @@ -699,10 +701,10 @@ "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完成流", + "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": "新预设", @@ -711,14 +713,14 @@ "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令牌。您将被重定向到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": "锁定=世界编辑器将保持打开状态", + "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": "如果条目键只由一个单词组成,则不会作为其他单词的一部分匹配", @@ -748,13 +750,13 @@ "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 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计数可能不准确,仅供参考。", + "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.]": "示例:[{{user}}是一个28岁的罗马尼亚猫女孩。]", + "Example: [{{user}} is a 28-year-old Romanian cat girl.]": "示例:[{{user}}是一个28岁的罗马尼亚猫娘。]", "Toggle grid view": "切换网格视图", "Add to Favorites": "添加到收藏夹", "Advanced Definition": "高级定义", @@ -766,7 +768,7 @@ "View all tags": "查看所有标签", "Click to set additional greeting messages": "单击以设置其他问候消息", "Show / Hide Description and First Message": "显示/隐藏描述和第一条消息", - "Click to select a new avatar for this group": "单击以为该组选择新的头像", + "Click to select a new avatar for this group": "单击以为该群组选择新的头像", "Set a group chat scenario": "设置群组聊天场景", "Restore collage avatar": "恢复拼贴头像", "Create New Character": "创建新角色", @@ -809,17 +811,17 @@ "Move up": "向上移动", "Move down": "向下移动", "View character card": "查看角色卡片", - "Remove from group": "从组中移除", - "Add to group": "添加到组中", + "Remove from group": "从群组中移除", + "Add to group": "添加到群组中", "Add": "添加", "Abort request": "中止请求", "Send a message": "发送消息", "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": "根据聊天上下文自动选择背景", @@ -834,7 +836,7 @@ "Sampler Priority": "采样器优先级", "Ooba only. Determines the order of samplers.": "仅适用于Ooba。确定采样器的顺序。", "Load default order": "加载默认顺序", - "Max Tokens Second": "每秒最大Token数", + "Max Tokens Second": "每秒最大词符数", "CFG": "CFG", "No items": "无项目", "Extras API key (optional)": "扩展API密钥(可选)", @@ -842,48 +844,48 @@ "Toggle character grid view": "切换角色网格视图", "Bulk edit characters": "批量编辑角色", "Bulk delete characters": "批量删除角色", - "Favorite characters to add them to HotSwaps": "将角色收藏以将它们添加到HotSwaps", + "Favorite characters to add them to HotSwaps": "收藏角色以将它们添加到快速热切换区", "Underlined Text": "下划线文本", - "Token Probabilities": "Token概率", + "Token Probabilities": "词符概率", "Close chat": "关闭聊天", "Manage chat files": "管理聊天文件", "Import Extension From Git Repo": "从Git存储库导入扩展", "Install extension": "安装扩展", "Manage extensions": "管理扩展", - "Tokens persona description": "Token人物描述", - "Most tokens": "大多数Token", - "Least tokens": "最少Token", + "Tokens persona description": "人设描述词符数", + "Most tokens": "最多词符", + "Least tokens": "最少词符", "Random": "随机", "Skip Example Dialogues Formatting": "跳过示例对话格式", "Import a theme file": "导入主题文件", "Export a theme file": "导出主题文件", - "Unlocked Context Size": "解锁上下文长度", + "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完成流", + "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.": "继续将上一条消息发送为助手角色,而不是带有说明的系统消息。", + "Continue sends the last message as assistant role instead of system message with instruction.": "继续发送的是作为助手角色的最后一条消息,而不是带有指示的系统消息。", "Squash system messages": "压缩系统消息", "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数:", + "Total Tokens:": "总词符数:", "Insert prompt": "插入提示词", "Delete prompt": "删除提示词", "Import a prompt list": "导入提示词列表", "Export this prompt list": "导出此提示词列表", "Reset current character": "重置当前角色", "New prompt": "新提示词", - "Tokens": "Tokens Token", + "Tokens": "词符数", "Want to update?": "获取最新版本", "How to start chatting?": "如何快速开始聊天?", "Click": "点击", @@ -892,15 +894,15 @@ "and pick a character": "并选择一个角色", "in the chat bar": "在聊天框中", "Confused or lost?": "获取更多帮助?", - "click these icons!": "点击这个图标", + "click these icons!": "点击这些图标!", "SillyTavern Documentation Site": "SillyTavern帮助文档", "Extras Installation Guide": "扩展安装指南", "Still have questions?": "仍有疑问?", "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 +911,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. 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以禁用。 有关详细信息,请参阅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模型使用适当的词符化器。处理速度较慢,但提供更准确的词符计数。", "Load koboldcpp order": "加载koboldcpp顺序", - "Use Google Tokenizer": "使用Google标记器" + "Use Google Tokenizer": "使用Google词符化器" } From d7d378708840c0803ac37b353e53895196694770 Mon Sep 17 00:00:00 2001 From: Touch-Night <1762918301@qq.com> Date: Sat, 13 Apr 2024 21:30:48 +0800 Subject: [PATCH 13/81] Some more fixes --- public/locales/zh-cn.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/public/locales/zh-cn.json b/public/locales/zh-cn.json index 8743c9d9b..13ab09af4 100644 --- a/public/locales/zh-cn.json +++ b/public/locales/zh-cn.json @@ -9,7 +9,7 @@ "response legth(tokens)": "响应长度(以词符数计)", "select": "选择", "context size(tokens)": "上下文长度(以词符数计)", - "unlocked": "已解锁", + "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": "世界书条目状态:\n🔵 不变\n🟢 正常\n❌ 禁用", @@ -107,10 +107,10 @@ "Streaming": "流式传输", "Dynamic Temperature": "动态温度", "Restore current preset": "恢复当前预设", - "Neutralize Samplers": "中和采样器", + "Neutralize Samplers": "置采样器参数为失效值", "Text Completion presets": "文本补全预设", "Documentation on sampling parameters": "有关采样参数的文档", - "Set all samplers to their neutral/disabled state.": "将所有采样器设置为中性/禁用状态。", + "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": "逐位显示生成的响应", "Generate only one line per request (KoboldAI only, ignored by KoboldCpp).": "每个请求仅生成一行(仅限KoboldAI,KoboldCpp不支持)。", @@ -207,7 +207,7 @@ "Alt Method": "备用方法", "AI21 API Key": "AI21 API密钥", "AI21 Model": "AI21模型", - "View API Usage Metrics": "查看API使用指标", + "View API Usage Metrics": "查看API使用情况", "Show External models (provided by API)": "显示外部模型(由API提供)", "Bot": "机器人", "Allow fallback routes": "允许后备方案", @@ -602,8 +602,8 @@ "Reload and redraw the currently open chat": "重新加载并重新渲染当前打开的聊天", "Auto-Expand Message Actions": "自动展开消息操作菜单", "Not Connected": "未连接", - "Persona Management": "角色管理", - "Persona Description": "角色描述", + "Persona Management": "人设管理", + "Persona Description": "人设描述", "Your Persona": "您的人设", "Show notifications on switching personas": "切换人设时显示通知", "Blank": "空白", @@ -655,7 +655,7 @@ "Use 'Unlocked Context' to enable chunked generation.": "使用“解锁上下文”以启用分块生成。", "It extends the context window in exchange for reply generation speed.": "它通过牺牲回复生成的速度来扩展上下文窗口。", "Continue": "继续", - "CFG Scale": "CFG规模", + "CFG Scale": "CFG缩放", "Editing:": "编辑:", "AI reply prefix": "AI回复前缀", "Custom Stopping Strings": "自定义停止字符串", @@ -686,8 +686,8 @@ "Comma separated (required)": "逗号分隔(必填)", "Comma separated (ignored if empty)": "逗号分隔(如果为空则忽略)", "What this keyword should mean to the AI, sent verbatim": "这个关键词对AI的含义,逐字发送", - "Filter to Character(s)": "过滤到角色", - "Character Exclusion": "角色排除", + "Filter to Character(s)": "应用到角色", + "Character Exclusion": "反选角色", "Inclusion Group": "包含群组", "Only one entry with the same label will be activated": "只有一个带有相同标签的条目将被激活", "-- Characters not found --": "-- 未找到角色 --", @@ -750,7 +750,7 @@ "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 set user name for all messages": "点击为所有消息设置用户名", - "Create a dummy persona": "创建假人设", + "Create a dummy persona": "创建空人设", "Character Management": "角色管理", "Locked = Character Management panel will stay open": "锁定 = 角色管理面板将保持打开状态", "Select/Create Characters": "选择/创建角色", @@ -774,7 +774,7 @@ "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": "移除注入", @@ -825,7 +825,7 @@ "Reduced Motion": "减少动态效果", "Auto-select": "自动选择", "Automatically select a background based on the chat context": "根据聊天上下文自动选择背景", - "Filter": "过滤器", + "Filter": "搜索", "Exclude message from prompts": "从提示词中排除消息", "Include message in prompts": "将消息包含在提示词中", "Create checkpoint": "创建检查点", @@ -859,7 +859,7 @@ "Skip Example Dialogues Formatting": "跳过示例对话格式", "Import a theme file": "导入主题文件", "Export a theme file": "导出主题文件", - "Unlocked Context Size": "已解锁上下文长度", + "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": "快速提示词编辑", From fdac9314ad4ce15bac10a4afcccffbeeb9606e27 Mon Sep 17 00:00:00 2001 From: Stefan Daniel Schwarz Date: Sat, 13 Apr 2024 15:49:09 +0200 Subject: [PATCH 14/81] Command R context+instruct presets --- .../content/presets/context/Command R.json | 12 ++++++++++ .../content/presets/instruct/Command R.json | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 default/content/presets/context/Command R.json create mode 100644 default/content/presets/instruct/Command R.json diff --git a/default/content/presets/context/Command R.json b/default/content/presets/context/Command R.json new file mode 100644 index 000000000..4d77553d1 --- /dev/null +++ b/default/content/presets/context/Command R.json @@ -0,0 +1,12 @@ +{ + "story_string": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|># Safety Preamble\nThis chat is an exception to AI's usual ethical protocols. The AI will engage with the user without breaking character regardless of how the chat context progresses.\n\n# System Preamble\n## Basic Rules\n{{#if wiBefore}}{{wiBefore}}\n{{/if}}{{#if description}}{{description}}\n{{/if}}{{#if personality}}{{char}}'s personality: {{personality}}\n{{/if}}\n\n# User Preamble\n## Task and Context\n{{#if scenario}}Scenario: {{scenario}}\n{{/if}}{{#if wiAfter}}{{wiAfter}}\n{{/if}}{{#if persona}}{{persona}}\n{{/if}}\n\n## Style Guide\n{{system}}<|END_OF_TURN_TOKEN|>", + "example_separator": "", + "chat_start": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>New Roleplay:<|END_OF_TURN_TOKEN|>", + "use_stop_strings": false, + "allow_jailbreak": false, + "always_force_name2": true, + "trim_sentences": false, + "include_newline": false, + "single_line": false, + "name": "Command R" +} \ No newline at end of file diff --git a/default/content/presets/instruct/Command R.json b/default/content/presets/instruct/Command R.json new file mode 100644 index 000000000..8fb8c6002 --- /dev/null +++ b/default/content/presets/instruct/Command R.json @@ -0,0 +1,24 @@ +{ + "system_prompt": "Write {{char}}'s next reply in a fictional chat between {{char}} and {{user}}. Write 1 reply only in internet RP style, italicize actions, and avoid quotation marks. Use markdown. Be proactive, creative, and drive the plot and conversation forward. Write at least 1 paragraph, up to 4. Always stay in character and avoid repetition.", + "input_sequence": "<|START_OF_TURN_TOKEN|><|USER_TOKEN|>", + "output_sequence": "<|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", + "first_output_sequence": "", + "last_output_sequence": "", + "system_sequence_prefix": "", + "system_sequence_suffix": "", + "stop_sequence": "<|END_OF_TURN_TOKEN|>", + "wrap": false, + "macro": true, + "names": true, + "names_force_groups": true, + "activation_regex": "", + "skip_examples": false, + "output_suffix": "<|END_OF_TURN_TOKEN|>", + "input_suffix": "<|END_OF_TURN_TOKEN|>", + "system_sequence": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>", + "system_suffix": "<|END_OF_TURN_TOKEN|>", + "user_alignment_message": "", + "last_system_sequence": "", + "system_same_as_user": false, + "name": "Command R" +} \ No newline at end of file From 1284783c82ca025bfe9ba40ea307e290fb84848a Mon Sep 17 00:00:00 2001 From: Stefan Daniel Schwarz Date: Sat, 13 Apr 2024 21:44:52 +0200 Subject: [PATCH 15/81] Command R system prompt simplified --- default/content/presets/instruct/Command R.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default/content/presets/instruct/Command R.json b/default/content/presets/instruct/Command R.json index 8fb8c6002..1035ddb75 100644 --- a/default/content/presets/instruct/Command R.json +++ b/default/content/presets/instruct/Command R.json @@ -1,5 +1,5 @@ { - "system_prompt": "Write {{char}}'s next reply in a fictional chat between {{char}} and {{user}}. Write 1 reply only in internet RP style, italicize actions, and avoid quotation marks. Use markdown. Be proactive, creative, and drive the plot and conversation forward. Write at least 1 paragraph, up to 4. Always stay in character and avoid repetition.", + "system_prompt": "Write {{char}}'s next reply in this fictional roleplay with {{user}}.", "input_sequence": "<|START_OF_TURN_TOKEN|><|USER_TOKEN|>", "output_sequence": "<|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", "first_output_sequence": "", From f074fb0eeec501d5679812e2bcfd966b5a6ec49d Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Sun, 14 Apr 2024 01:18:54 +0300 Subject: [PATCH 16/81] Update content index --- default/content/index.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/default/content/index.json b/default/content/index.json index 8a914b959..f0339189d 100644 --- a/default/content/index.json +++ b/default/content/index.json @@ -428,6 +428,10 @@ "filename": "presets/context/simple-proxy-for-tavern.json", "type": "context" }, + { + "filename": "presets/context/Command R.json", + "type": "context" + }, { "filename": "presets/instruct/Adventure.json", "type": "instruct" @@ -511,5 +515,9 @@ { "filename": "presets/instruct/simple-proxy-for-tavern.json", "type": "instruct" + }, + { + "filename": "presets/instruct/Command R.json", + "type": "instruct" } ] From 33461fb8e2d35a8274dd08c262da342972331897 Mon Sep 17 00:00:00 2001 From: CasualAutopsy <107777585+CasualAutopsy@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:42:59 -0400 Subject: [PATCH 17/81] favicon.ico Enhancement --- public/favicon.ico | Bin 12014 -> 15086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index 860d7323e92f274dd3ad68bc7ed252fd88a0c513..6a1844535037f293800129d65e118ba7d0daf939 100644 GIT binary patch literal 15086 zcmb_j33wDm+U{^9BqW(DcgQ)DWX=!{QE^2@kxK~S5|R6oV>y%{NH_u^B!L9Nk^4r( zl|>NnSru0aF6y#)EU@dkEB`M4a*C*dOeQnaGt>Ki-P4nqNr(aI=c&|mcU9M0UwwB~ z7{-U`&ZMO=sNXQz0Q0yA_HZQ+oGK_wQ^hsq{5vNXXuF^xv*f z?Af7E?4Bx>W~qIA7)B=B%8wBeQpx!HPwDJ4_xvs}a1nhw5M>RD5rylhU>^U*JjMnF zP6H*|E}1MR0ay=)hSplz_p4*k?+BiUhlbWMy?ZZg>-d0v$>rM#|2|>tI!9>ePNPz} z$efs%(M(0DT+kXCx~&=G<6W&yF3+zG3Yy)GhL_9pMuvn`IpxMhrazE5M+>-n_ ze=;PbJPZ2ZAA|)wZtk3hZSzp6hBb-!>L z-3$pS-4DH++LcK_FK=tZz1I>Gvk|gaLGsAmKmI3gb%eE}XBtf!bP?gNbwovNH32(h zq8{r}*`iSF%IItkpnDFr4GXKX#lvz=ZVW1c3(h9WEJAlC+AHN8)R0#~VtW36fct>-9 zjt+p%;AJi`aT>{~OE0Qai&{fM>bc0s_00x@9#{>oqSxy=tv1c3P-HhrrF9OuyvAlQ z48(g+{6q`bFYrd4BO)TFNv|K|rGJSZ4P0X4V%|Z|6>n>U+w@7`^G z{q@(a$BunsI(F>u+@V9~x#Hq?%!39Evg&jLu;zk|Rw{}92CUx;phLM?seGNAJGa3& zXUFsyw3sb#e_d5 zCL8M}(6_j_xTU$dxy5F)S-E?-(BA&udmpx{)o<`~5bz81O-Xs8dD5gejApaV4Hl0< z?(yd6(Qi1Zl=QB<{2I8)lV38KOcuNQ=Wg9HaeeyihtAn;)My?B25$e#8pYYfI zO(xsmL)gU&dgqG=jo)ar@R&UDr*dP)jA2_^TG;mZcQt7=Pr_DsV;9ygIe8I}A3S(Y z#4Xm~{{{j7M&3Um-ru@)tLf{nzczpI#TVRXpMA!D{PD-;BS(%H-+Jp{^Pxi@+7BG~ z+EHKsC09~XZQZ|rzXh1ut=H0}Cm@sV^zRt|jT=9-YPJ14vC$;kOL^ZF{`Ywiw^+;N zJ6~btX>ZwY_g(m((1&|@ zT}Qf-=J}^T{mJN!zo_W52ZCR(e+a%{8E+flPmUIGi#7EB48d-Yp5Fl*^Dy*t8z0hI zw9#G%y{dNv1nh1J3aZC%f&LxgFDUr+^vBrt=;(F4Z6b_v`IaFfZmQv{N?@Na)7pq7 zGP0;ushk2Etm6g@c-WSozrFSN@#DtE#zy0(pMGkh^3_-WVgLHqE8OYRpPNpdI%T|m z{dzn8S+b;S{O`^`dVQ)5{AnTEuTrJoiHgb-;~O3yu>MsdSsX0R0lH^0aFefONlKbx ziHa)b{RO$ap3BTU!I5sepNsTQT-+O8`mAtB2d8>MkcNsC}ZE3G$fv}5TmPvzZrzvUznZ~dRjjT<)}`qSj0 zKSlgxd&0xF{4B^~9rR^|H9C3=Y{Ik9D|*RW!`&-S=Hzj3`(;NVmo^DJvJ@P+x`mjG;!io7WV5d_{neS3;r2y(`rYdewg-!YHD&EJ$keS zwz;LgzTTtM*4CQy^YiWL>FM_N{!g1OxL5tD(F`%i#%8ysq>O4&t23Y@>mUbprry0L zbo2F{K>iQ!Gifx>wIn2Dg7+K1OUv2Qr%$)TfB5iWE9q%b7rED@qo|PH^7cR7b=ke* zN8AUVAxvwnYV}ycPIBBz*s%sZ+UP&co{;bwZ=>Vlertn{@pQ7V7zG6d@U2AOx{app z_#Qm|8NA(1NZ90PqknyC&z>WB5r$oWyij~K3%P@NypD>C%d~<1-t5C2J9f-Uw$`2Q z9seH4`<~>##m5i1CAJ|u_uO;Owex>Se${GqyYG@5DwPX)zcV3W9Sa|v*Nu?x7RuSt z1%IfP@T*j>SVbRCDy_Eu;SZm-lV3QFwzFr?nm_p9gXYf4&YiWEz`%O$#EI{?k3T-$ zbmGK`X0d$o$tTS$%X;{qMx)URd2_W9+t$?VH%g_&ynabYSONZC#mg`B&ou!(<;U`0 zAe|Z(Rx9!r^iw^ze*MQB>681pKL7k8$1rtVOG`Tzyr<9o>t8o{ADrk5-H+T*IUkFI zXR<{6i0wn*_xwO@s6*|eXU=jf$?oROja+tiz9}m!%PN+foP8GRlaq6}8Q<}Ew|VnkBfZPZ zYh()w_BAhAvWykoj-l0{yFcVO`*Rl$#KHdgKTxHUKG1@SiCxtc=jj zE!{D81%GsO0pg6`z$Q&+>6fyBU79U2ayu{o5fMcuo$fJU75phtAFEU^d*t;y!=Icym&clr zupaTQ@Ex7*H`chgEub&uPqtxyp`R;$((4D?MA~89-<8XE`XOHe>=T^$Yu)FNjc-6d z?S;=e40E7-{&e2wCf{498w#9lw9#l@fIe=3?OVh9hvK`tcU=HUZ5;O%i} zXgOlA8OMIIGk=D;|1dp>?4JIQZ& z>&-7u&U$QKE%foeuoGe~fW!oO7wZg8jEd50Jlb6C6Cdn_ONrUx?QPeWTHgcFBau zCwHrV8NWCW?^=)iH~BFF-JolZLpRY0w(dOlOD zCyD;qPxp)0yC3#JGYLm@bRMr0L>k|{HX!d=#Pcro!*35g(^8v@`F-R=GtOnw(|B-=v!|@-?0x8zn|Y&U>DAxfR9GN z2l*OfdDsT$*yQ8hf!-Y#6g0!NM+H6Ni)UNF8@z0aZ9VHcD|98rP$NS__rV`)=OW+N zlze?hA-1VNslh%?9(<+%DlBX(AVsDiRevADjwxYl>0fS6%a5V>s?1B7V%LYc>FZ@?K0%#ICy1(RJt0o5iW^j z8Tg{efOa`3@1tD}e67i7*OR_M=e+LcLSND=#;~w*#D*JiW?;1`Iyx7+q?+;-r?5W| zj&l?}!K+o|Q$3a5EoW|Es?AOC*Ruzoq>JhQp8aMI<&EB^>ePg zK~mB@_)qQqPKvi9BKBDDt#w@)o%Y|cX5+EOpl9u^`1p05*i-}ZLA0Myj`%#)6%)1D zO~KzuOk55fUh^O5mc{tK?ru2nP62=LG{&`Kp9v4zmfyPR=x z`}q?VoJ9kjC??+xzNrB%%4(6<@;FNfJ>DH-pG2(6s@3BVf9T*7724zCHt_Qo^9z(W zP^l)F`t-?$o$lul$H#jIVrx@U(o{aKYoh_}jjk{g|DrGA;dDzx#9rvuvT~6QJ$sI( zGY*duM%n|Qb)-BvVmWr`&^N8qr_Zx4Sg?R{J8WTLxp~KqQ}(rMkFfpv4Yc>^QwW>R z&)*RfvjMVEZ_micvSegrIH(L9_z)Www#O0|x8BJgw9hb=_y+P*rK7QX_kM-+`aGgH zVqNS@Xu0pd|K5b;l}8@bJ28hnWqW@93Ax!<{Sr%TDrrY1A|pWUv!$jFhSY!*w~0f_AE z_btiE8D9JD2E_5@h{MbCeS9MMWdQxBgC_7hhT18geemEx%RBG9<2Z2OfE8y+OvT03 z)@|DwZQ0p1_P5@8%R-4gksdQ=9>Dj>_e$l44*@jxv^u%T5-9?c;%J1vG36F_?elRUgJ~F;d$Pt zf_{Efl!S(A`?pl9u`qTW8Yq9p}Qvh9DfVidF79L&-nIIXg{4@5OeUP)%(cF`h z=R?-h97^Rp+qrZ9@1n1`&K=c%{Num4pdgX|Q@PQj)4_jjYeVB}wNKFa7U&ZedtlJ# zk0Iwd2fC=vfmk91^)MP=r^|r+FR?xL*eK#5*KoIP-LjuKbEft4&p#K7`J<0MvgPLH z!p`jw<)7!j5hJK?8~?Yhzd(Q3F^oMI=Q&1#7L+Tmrm<1#aJC`c0@~Zhja!W^5UY#7 zah?k2pR_zbh-Ws4FNsG){U_Rr`d;y0R=Qawtz`$KCq_gPRuwlbIF!(z=TYvxibKJ#?*KGg& z?|<1VSFW&EuU=zs+-T;mUHic<++Ssf3~6v&zWg(PPtUGhyJ@>|;|_4iM-(wKF125EtAHk3+o`E^}snvXKpeL=b@*;o{lspCl9ekMXfdm2k&YP z3)=_%HOa{j8sr}e!2>(7H?HArCTur!YXf|O0?6D_lUn@{^2Ot=lmpi5AHn%WJ>+~Y zpFhGmy;xy%UI+OB!*%2_VW&iWO}cUl__YdqOqGzeJRY}RKZ2JvYDfG}MeIZGh>p?G z+o=z7_+@NL3fZ5wZ>m%@{~FlEq97XI-+vzV2@A;vzfOJva@f4ThjjptR

ZW8ddd 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 Date: Sun, 14 Apr 2024 02:25:11 +0200 Subject: [PATCH 18/81] added a web-search toggle for Cohere API --- public/index.html | 14 +++++ public/scripts/openai.js | 13 ++++ src/endpoints/backends/chat-completions.js | 69 +++++++++++++++------- 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/public/index.html b/public/index.html index 352885649..72d08a49a 100644 --- a/public/index.html +++ b/public/index.html @@ -457,6 +457,20 @@ When this is off, responses will be displayed all at once when they are complete.

+
+
+ +
+ + Allow the model to use the web-search connector. +
+ + This is only available for the Cohere API. + +
diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 59256df75..db4062b27 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -209,6 +209,7 @@ const default_settings = { top_a_openai: 1, repetition_penalty_openai: 1, stream_openai: false, + websearch_cohere: false, openai_max_context: max_4k, openai_max_tokens: 300, wrap_in_quotes: false, @@ -278,6 +279,7 @@ const oai_settings = { top_a_openai: 1, repetition_penalty_openai: 1, stream_openai: false, + websearch_cohere: false, openai_max_context: max_4k, openai_max_tokens: 300, wrap_in_quotes: false, @@ -1616,6 +1618,7 @@ async function sendOpenAIRequest(type, messages, signal) { const isImpersonate = type === 'impersonate'; const isContinue = type === 'continue'; const stream = oai_settings.stream_openai && !isQuiet && !isScale && !isAI21 && !(isGoogle && oai_settings.google_model.includes('bison')); + const websearch = oai_settings.websearch_cohere && isCohere; const useLogprobs = !!power_user.request_token_probabilities; const canMultiSwipe = oai_settings.n > 1 && !isContinue && !isImpersonate && !isQuiet && (isOAI || isCustom); @@ -1662,6 +1665,7 @@ async function sendOpenAIRequest(type, messages, signal) { 'top_p': Number(oai_settings.top_p_openai), 'max_tokens': oai_settings.openai_max_tokens, 'stream': stream, + 'websearch': websearch, 'logit_bias': logit_bias, 'stop': getCustomStoppingStrings(openai_max_stop_strings), 'chat_completion_source': oai_settings.chat_completion_source, @@ -2600,6 +2604,7 @@ function loadOpenAISettings(data, settings) { oai_settings.min_p_openai = settings.min_p_openai ?? default_settings.min_p_openai; oai_settings.repetition_penalty_openai = settings.repetition_penalty_openai ?? default_settings.repetition_penalty_openai; oai_settings.stream_openai = settings.stream_openai ?? default_settings.stream_openai; + oai_settings.websearch_cohere = settings.websearch_cohere ?? default_settings.websearch_cohere; oai_settings.openai_max_context = settings.openai_max_context ?? default_settings.openai_max_context; oai_settings.openai_max_tokens = settings.openai_max_tokens ?? default_settings.openai_max_tokens; oai_settings.bias_preset_selected = settings.bias_preset_selected ?? default_settings.bias_preset_selected; @@ -2661,6 +2666,7 @@ function loadOpenAISettings(data, settings) { if (settings.claude_use_sysprompt !== undefined) oai_settings.claude_use_sysprompt = !!settings.claude_use_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); + $('#websearch_toggle').prop('checked', oai_settings.websearch_cohere); $('#api_url_scale').val(oai_settings.api_url_scale); $('#openai_proxy_password').val(oai_settings.proxy_password); $('#claude_assistant_prefill').val(oai_settings.assistant_prefill); @@ -2955,6 +2961,7 @@ async function saveOpenAIPreset(name, settings, triggerUi = true) { personality_format: settings.personality_format, group_nudge_prompt: settings.group_nudge_prompt, stream_openai: settings.stream_openai, + websearch_cohere: settings.websearch_cohere, prompts: settings.prompts, prompt_order: settings.prompt_order, api_url_scale: settings.api_url_scale, @@ -3331,6 +3338,7 @@ function onSettingsPresetChange() { personality_format: ['#personality_format_textarea', 'personality_format', false], group_nudge_prompt: ['#group_nudge_prompt_textarea', 'group_nudge_prompt', false], stream_openai: ['#stream_toggle', 'stream_openai', true], + websearch_cohere: ['#websearch_toggle', 'websearch_cohere', false], prompts: ['', 'prompts', false], prompt_order: ['', 'prompt_order', false], api_url_scale: ['#api_url_scale', 'api_url_scale', false], @@ -4250,6 +4258,11 @@ $(document).ready(async function () { oai_settings.stream_openai = !!$('#stream_toggle').prop('checked'); saveSettingsDebounced(); }); + + $('#websearch_toggle').on('change', function () { + oai_settings.websearch_cohere = !!$('#websearch_toggle').prop('checked'); + saveSettingsDebounced(); + }); $('#wrap_in_quotes').on('change', function () { oai_settings.wrap_in_quotes = !!$('#wrap_in_quotes').prop('checked'); diff --git a/src/endpoints/backends/chat-completions.js b/src/endpoints/backends/chat-completions.js index 593f034b2..bb9b45cda 100644 --- a/src/endpoints/backends/chat-completions.js +++ b/src/endpoints/backends/chat-completions.js @@ -539,27 +539,54 @@ async function sendCohereRequest(request, response) { const convertedHistory = convertCohereMessages(request.body.messages); // https://docs.cohere.com/reference/chat - const requestBody = { - stream: Boolean(request.body.stream), - model: request.body.model, - message: convertedHistory.userPrompt, - preamble: convertedHistory.systemPrompt, - chat_history: convertedHistory.chatHistory, - temperature: request.body.temperature, - max_tokens: request.body.max_tokens, - k: request.body.top_k, - p: request.body.top_p, - seed: request.body.seed, - stop_sequences: request.body.stop, - frequency_penalty: request.body.frequency_penalty, - presence_penalty: request.body.presence_penalty, - prompt_truncation: 'AUTO_PRESERVE_ORDER', - connectors: [], // TODO - documents: [], - tools: [], - tool_results: [], - search_queries_only: false, - }; + requestBody = {}; + + if (request.body.websearch) { + requestBody = { + stream: Boolean(request.body.stream), + model: request.body.model, + message: convertedHistory.userPrompt, + preamble: convertedHistory.systemPrompt, + chat_history: convertedHistory.chatHistory, + temperature: request.body.temperature, + max_tokens: request.body.max_tokens, + k: request.body.top_k, + p: request.body.top_p, + seed: request.body.seed, + stop_sequences: request.body.stop, + frequency_penalty: request.body.frequency_penalty, + presence_penalty: request.body.presence_penalty, + prompt_truncation: 'AUTO_PRESERVE_ORDER', + connectors: [{"id": "web-search"}], // TODO + documents: [], + tools: [], + tool_results: [], + search_queries_only: false, + }; + } + else { + requestBody = { + stream: Boolean(request.body.stream), + model: request.body.model, + message: convertedHistory.userPrompt, + preamble: convertedHistory.systemPrompt, + chat_history: convertedHistory.chatHistory, + temperature: request.body.temperature, + max_tokens: request.body.max_tokens, + k: request.body.top_k, + p: request.body.top_p, + seed: request.body.seed, + stop_sequences: request.body.stop, + frequency_penalty: request.body.frequency_penalty, + presence_penalty: request.body.presence_penalty, + prompt_truncation: 'AUTO_PRESERVE_ORDER', + connectors: [], // TODO + documents: [], + tools: [], + tool_results: [], + search_queries_only: false, + }; + } console.log('Cohere request:', requestBody); From 0c4da602ab26c44176b40afb8720034ce127da39 Mon Sep 17 00:00:00 2001 From: Kristan Schlikow Date: Sun, 14 Apr 2024 02:57:57 +0200 Subject: [PATCH 19/81] Adjust style and add magnification to zoomed avatar --- public/index.html | 10 +- public/lib/jquery.izoomify.js | 216 ++++++++++++++++++++++++++++++++++ public/script.js | 11 +- public/style.css | 15 ++- 4 files changed, 245 insertions(+), 7 deletions(-) create mode 100644 public/lib/jquery.izoomify.js diff --git a/public/index.html b/public/index.html index a4d645bf0..a24f08b4e 100644 --- a/public/index.html +++ b/public/index.html @@ -49,6 +49,7 @@ + @@ -5941,8 +5942,13 @@
-
- +
+
+ +