Merge branch 'staging' into hidden-reasoning-tracking

33fa5aaab812917ec8d87f5817699b8525da90b4

Wolfsblvt <wolfsblvt@gmail.com>

31 files changed, +149 -47Showing whitespace changes
public/index.html+24 -15
@@ -3749,8 +3749,8 @@
3749 </div>3749 </div>
3750 <label class="checkbox_label" for="custom_stopping_strings_macro">3750 <label class="checkbox_label" for="custom_stopping_strings_macro">
3751 <input id="custom_stopping_strings_macro" type="checkbox" checked>3751 <input id="custom_stopping_strings_macro" type="checkbox" checked>
3752 <small data-i18n="Replace Macro in Custom Stopping Strings">3752 <small data-i18n="Replace Macro in Stop Strings">
3753 Replace Macro in Custom Stopping Strings3753 Replace Macro in Stop Strings
3754 </small>3754 </small>
3755 </label>3755 </label>
3756 </div>3756 </div>
@@ -3797,24 +3797,36 @@
3797 <span data-i18n="Reasoning">Reasoning</span>3797 <span data-i18n="Reasoning">Reasoning</span>
3798 </h4>3798 </h4>
3799 <div>3799 <div>
3800 <label class="checkbox_label" for="reasoning_auto_parse" title="Automatically parse reasoning blocks from main content between the reasoning prefix/suffix. Both fields must be defined and non-empty." data-i18n="[title]reasoning_auto_parse">3800 <div class="flex-container alignItemsBaseline">
3801 <label class="checkbox_label flex1" for="reasoning_auto_parse" title="Automatically parse reasoning blocks from main content between the reasoning prefix/suffix. Both fields must be defined and non-empty." data-i18n="[title]reasoning_auto_parse">
3801 <input id="reasoning_auto_parse" type="checkbox" />3802 <input id="reasoning_auto_parse" type="checkbox" />
3802 <small data-i18n="Auto-Parse Reasoning">3803 <small data-i18n="Auto-Parse">
3803 Auto-Parse Reasoning3804 Auto-Parse
3804 </small>3805 </small>
3805 </label>3806 </label>
3806 <label class="checkbox_label" for="reasoning_auto_expand" title="Automatically expand reasoning blocks." data-i18n="[title]reasoning_auto_expand">3807 <label class="checkbox_label flex1" for="reasoning_auto_expand" title="Automatically expand reasoning blocks." data-i18n="[title]reasoning_auto_expand">
3807 <input id="reasoning_auto_expand" type="checkbox" />3808 <input id="reasoning_auto_expand" type="checkbox" />
3808 <small data-i18n="Auto-Expand Reasoning">3809 <small data-i18n="Auto-Expand">
3809 Auto-Expand Reasoning3810 Auto-Expand
3810 </small>3811 </small>
3811 </label>3812 </label>
3812 <label class="checkbox_label" for="reasoning_add_to_prompts" title="Add existing reasoning blocks to prompts. To add a new reasoning block, use the message edit menu." data-i18n="[title]reasoning_add_to_prompts">3813 </div>
3814 <div class="flex-container alignItemsBaseline">
3815 <label class="checkbox_label flex1" for="reasoning_add_to_prompts" title="Add existing reasoning blocks to prompts. To add a new reasoning block, use the message edit menu." data-i18n="[title]reasoning_add_to_prompts">
3813 <input id="reasoning_add_to_prompts" type="checkbox" />3816 <input id="reasoning_add_to_prompts" type="checkbox" />
3814 <small data-i18n="Add Reasoning to Prompts">3817 <small data-i18n="Add to Prompts">
3815 Add Reasoning to Prompts3818 Add to Prompts
3816 </small>3819 </small>
3817 </label>3820 </label>
3821 <div class="flex1 flex-container alignItemsBaseline" title="Maximum number of reasoning blocks to be added per prompt, counting from the last message." data-i18n="[title]reasoning_max_additions">
3822 <input id="reasoning_max_additions" class="text_pole textarea_compact widthUnset" type="number" min="0" max="999"></textarea>
3823 <small data-i18n="Max">Max</small>
3824 </div>
3825 </div>
3826 <details>
3827 <summary data-i18n="Reasoning Formatting">
3828 Reasoning Formatting
3829 </summary>
3818 <div class="flex-container">3830 <div class="flex-container">
3819 <div class="flex1" title="Inserted before the reasoning content." data-i18n="[title]reasoning_prefix">3831 <div class="flex1" title="Inserted before the reasoning content." data-i18n="[title]reasoning_prefix">
3820 <small data-i18n="Prefix">Prefix</small>3832 <small data-i18n="Prefix">Prefix</small>
@@ -3830,11 +3842,8 @@
3830 <small data-i18n="Separator">Separator</small>3842 <small data-i18n="Separator">Separator</small>
3831 <textarea id="reasoning_separator" class="text_pole textarea_compact autoSetHeight"></textarea>3843 <textarea id="reasoning_separator" class="text_pole textarea_compact autoSetHeight"></textarea>
3832 </div>3844 </div>
3833 <div class="flex1" title="Maximum number of reasoning blocks to be added per prompt, counting from the last message." data-i18n="[title]reasoning_max_additions">
3834 <small data-i18n="Max Additions">Max Additions</small>
3835 <input id="reasoning_max_additions" class="text_pole textarea_compact" type="number" min="0" max="999"></textarea>
3836 </div>
3837 </div>3845 </div>
3846 </details>
3838 </div>3847 </div>
3839 </div>3848 </div>
3840 <div>3849 <div>
public/locales/ar-sa.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "فصل بفواصل دون مسافة بينها",482 "separate with commas w/o space between": "فصل بفواصل دون مسافة بينها",
483 "Custom Stopping Strings": "سلاسل توقف مخصصة",483 "Custom Stopping Strings": "سلاسل توقف مخصصة",
484 "JSON serialized array of strings": "مصفوفة سلسلة JSON متسلسلة",484 "JSON serialized array of strings": "مصفوفة سلسلة JSON متسلسلة",
485 "Replace Macro in Custom Stopping Strings": "استبدال الماكرو في سلاسل التوقف المخصصة",485 "Replace Macro in Stop Strings": "استبدال الماكرو في سلاسل التوقف المخصصة",
486 "Auto-Continue": "المتابعة التلقائية",486 "Auto-Continue": "المتابعة التلقائية",
487 "Allow for Chat Completion APIs": "السماح بواجهات برمجة التطبيقات لإكمال الدردشة",487 "Allow for Chat Completion APIs": "السماح بواجهات برمجة التطبيقات لإكمال الدردشة",
488 "Target length (tokens)": "الطول المستهدف (رموز)",488 "Target length (tokens)": "الطول المستهدف (رموز)",
public/locales/de-de.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "getrennt durch Kommas ohne Leerzeichen dazwischen",482 "separate with commas w/o space between": "getrennt durch Kommas ohne Leerzeichen dazwischen",
483 "Custom Stopping Strings": "Benutzerdefinierte Stoppzeichenfolgen",483 "Custom Stopping Strings": "Benutzerdefinierte Stoppzeichenfolgen",
484 "JSON serialized array of strings": "JSON serialisierte Reihe von Zeichenfolgen",484 "JSON serialized array of strings": "JSON serialisierte Reihe von Zeichenfolgen",
485 "Replace Macro in Custom Stopping Strings": "Makro in benutzerdefinierten Stoppzeichenfolgen ersetzen",485 "Replace Macro in Stop Strings": "Makro in benutzerdefinierten Stoppzeichenfolgen ersetzen",
486 "Auto-Continue": "Automatisch fortsetzen",486 "Auto-Continue": "Automatisch fortsetzen",
487 "Allow for Chat Completion APIs": "Erlaube Chat-Vervollständigungs-APIs",487 "Allow for Chat Completion APIs": "Erlaube Chat-Vervollständigungs-APIs",
488 "Target length (tokens)": "Ziel-Länge (Tokens)",488 "Target length (tokens)": "Ziel-Länge (Tokens)",
public/locales/es-es.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "separe con comas sin espacio entre ellas",482 "separate with commas w/o space between": "separe con comas sin espacio entre ellas",
483 "Custom Stopping Strings": "Cadenas de Detención Personalizadas",483 "Custom Stopping Strings": "Cadenas de Detención Personalizadas",
484 "JSON serialized array of strings": "Arreglo de cadenas serializado en JSON",484 "JSON serialized array of strings": "Arreglo de cadenas serializado en JSON",
485 "Replace Macro in Custom Stopping Strings": "Reemplazar macro en Cadenas de Detención Personalizadas",485 "Replace Macro in Stop Strings": "Reemplazar macro en Cadenas de Detención Personalizadas",
486 "Auto-Continue": "Autocontinuar",486 "Auto-Continue": "Autocontinuar",
487 "Allow for Chat Completion APIs": "Permitir para APIs de Completado de Chat",487 "Allow for Chat Completion APIs": "Permitir para APIs de Completado de Chat",
488 "Target length (tokens)": "Longitud objetivo (tokens)",488 "Target length (tokens)": "Longitud objetivo (tokens)",
public/locales/fr-fr.json+1 -1
@@ -434,7 +434,7 @@
434 "Non-markdown strings": "Chaînes non Markdown",434 "Non-markdown strings": "Chaînes non Markdown",
435 "Custom Stopping Strings": "Chaînes d'arrêt personnalisées",435 "Custom Stopping Strings": "Chaînes d'arrêt personnalisées",
436 "JSON serialized array of strings": "Tableau de chaînes sérialisé JSON",436 "JSON serialized array of strings": "Tableau de chaînes sérialisé JSON",
437 "Replace Macro in Custom Stopping Strings": "Remplacer les macro dans les chaînes d'arrêt personnalisées",437 "Replace Macro in Stop Strings": "Remplacer les macro dans les chaînes d'arrêt personnalisées",
438 "Auto-Continue": "Auto-Continue",438 "Auto-Continue": "Auto-Continue",
439 "Allow for Chat Completion APIs": "Autoriser les APIs de complétion de chat",439 "Allow for Chat Completion APIs": "Autoriser les APIs de complétion de chat",
440 "Target length (tokens)": "Longueur cible (tokens)",440 "Target length (tokens)": "Longueur cible (tokens)",
public/locales/is-is.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "aðskilið með kommum án bila milli",482 "separate with commas w/o space between": "aðskilið með kommum án bila milli",
483 "Custom Stopping Strings": "Eigin stopp-strengir",483 "Custom Stopping Strings": "Eigin stopp-strengir",
484 "JSON serialized array of strings": "JSON raðað fylki af strengjum",484 "JSON serialized array of strings": "JSON raðað fylki af strengjum",
485 "Replace Macro in Custom Stopping Strings": "Skiptu út í macro í sérsniðnum stoppa strengjum",485 "Replace Macro in Stop Strings": "Skiptu út í macro í sérsniðnum stoppa strengjum",
486 "Auto-Continue": "Sjálfvirk Forná",486 "Auto-Continue": "Sjálfvirk Forná",
487 "Allow for Chat Completion APIs": "Leyfa fyrir spjall Loka APIs",487 "Allow for Chat Completion APIs": "Leyfa fyrir spjall Loka APIs",
488 "Target length (tokens)": "Markaðarlengd (texti)",488 "Target length (tokens)": "Markaðarlengd (texti)",
public/locales/it-it.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "separati con virgole senza spazio tra loro",482 "separate with commas w/o space between": "separati con virgole senza spazio tra loro",
483 "Custom Stopping Strings": "Stringhe di Stop Personalizzate",483 "Custom Stopping Strings": "Stringhe di Stop Personalizzate",
484 "JSON serialized array of strings": "Matrice serializzata JSON di stringhe",484 "JSON serialized array of strings": "Matrice serializzata JSON di stringhe",
485 "Replace Macro in Custom Stopping Strings": "Sostituisci Macro in Stringhe di Arresto Personalizzate",485 "Replace Macro in Stop Strings": "Sostituisci Macro in Stringhe di Arresto Personalizzate",
486 "Auto-Continue": "Auto-continua",486 "Auto-Continue": "Auto-continua",
487 "Allow for Chat Completion APIs": "Consenti per API di completamento chat",487 "Allow for Chat Completion APIs": "Consenti per API di completamento chat",
488 "Target length (tokens)": "Lunghezza obiettivo (token)",488 "Target length (tokens)": "Lunghezza obiettivo (token)",
public/locales/ja-jp.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "間にスペースのないカンマで区切ります",482 "separate with commas w/o space between": "間にスペースのないカンマで区切ります",
483 "Custom Stopping Strings": "カスタム停止文字列",483 "Custom Stopping Strings": "カスタム停止文字列",
484 "JSON serialized array of strings": "文字列のJSONシリアル化配列",484 "JSON serialized array of strings": "文字列のJSONシリアル化配列",
485 "Replace Macro in Custom Stopping Strings": "カスタム停止文字列内のマクロを置換する",485 "Replace Macro in Stop Strings": "カスタム停止文字列内のマクロを置換する",
486 "Auto-Continue": "自動継続",486 "Auto-Continue": "自動継続",
487 "Allow for Chat Completion APIs": "チャット補完APIを許可",487 "Allow for Chat Completion APIs": "チャット補完APIを許可",
488 "Target length (tokens)": "ターゲット長さ(トークン)",488 "Target length (tokens)": "ターゲット長さ(トークン)",
public/locales/ko-kr.json+1 -1
@@ -492,7 +492,7 @@
492 "separate with commas w/o space between": "쉼표로 구분 (공백 없이)",492 "separate with commas w/o space between": "쉼표로 구분 (공백 없이)",
493 "Custom Stopping Strings": "사용자 정의 중지 문자열",493 "Custom Stopping Strings": "사용자 정의 중지 문자열",
494 "JSON serialized array of strings": "문자열의 JSON 직렬화된 배열",494 "JSON serialized array of strings": "문자열의 JSON 직렬화된 배열",
495 "Replace Macro in Custom Stopping Strings": "사용자 정의 중단 문자열에서 매크로 교체",495 "Replace Macro in Stop Strings": "사용자 정의 중단 문자열에서 매크로 교체",
496 "Auto-Continue": "자동 계속하기",496 "Auto-Continue": "자동 계속하기",
497 "Allow for Chat Completion APIs": "채팅 완성 API 허용",497 "Allow for Chat Completion APIs": "채팅 완성 API 허용",
498 "Target length (tokens)": "대상 길이 (토큰)",498 "Target length (tokens)": "대상 길이 (토큰)",
public/locales/nl-nl.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "gescheiden met komma's zonder spatie ertussen",482 "separate with commas w/o space between": "gescheiden met komma's zonder spatie ertussen",
483 "Custom Stopping Strings": "Aangepaste Stopreeksen",483 "Custom Stopping Strings": "Aangepaste Stopreeksen",
484 "JSON serialized array of strings": "JSON geserialiseerde reeks van strings",484 "JSON serialized array of strings": "JSON geserialiseerde reeks van strings",
485 "Replace Macro in Custom Stopping Strings": "Macro vervangen in aangepaste stopreeksen",485 "Replace Macro in Stop Strings": "Macro vervangen in aangepaste stopreeksen",
486 "Auto-Continue": "Automatisch doorgaan",486 "Auto-Continue": "Automatisch doorgaan",
487 "Allow for Chat Completion APIs": "Chatvervolledigings-API's toestaan",487 "Allow for Chat Completion APIs": "Chatvervolledigings-API's toestaan",
488 "Target length (tokens)": "Doellengte (tokens)",488 "Target length (tokens)": "Doellengte (tokens)",
public/locales/pt-pt.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "separe com vírgulas sem espaço entre",482 "separate with commas w/o space between": "separe com vírgulas sem espaço entre",
483 "Custom Stopping Strings": "Cadeias de parada personalizadas",483 "Custom Stopping Strings": "Cadeias de parada personalizadas",
484 "JSON serialized array of strings": "Matriz de strings serializada em JSON",484 "JSON serialized array of strings": "Matriz de strings serializada em JSON",
485 "Replace Macro in Custom Stopping Strings": "Substituir Macro em Strings de Parada Personalizadas",485 "Replace Macro in Stop Strings": "Substituir Macro em Strings de Parada Personalizadas",
486 "Auto-Continue": "Auto-Continuar",486 "Auto-Continue": "Auto-Continuar",
487 "Allow for Chat Completion APIs": "Permitir APIs de Completar Chat",487 "Allow for Chat Completion APIs": "Permitir APIs de Completar Chat",
488 "Target length (tokens)": "Comprimento alvo (tokens)",488 "Target length (tokens)": "Comprimento alvo (tokens)",
public/locales/ru-ru.json+1 -1
@@ -161,7 +161,7 @@
161 "View hidden API keys": "Посмотреть скрытые API-ключи",161 "View hidden API keys": "Посмотреть скрытые API-ключи",
162 "Advanced Formatting": "Расширенное форматирование",162 "Advanced Formatting": "Расширенное форматирование",
163 "Context Template": "Шаблон контекста",163 "Context Template": "Шаблон контекста",
164 "Replace Macro in Custom Stopping Strings": "Заменять макросы в пользовательских стоп-строках",164 "Replace Macro in Stop Strings": "Заменять макросы в пользовательских стоп-строках",
165 "Story String": "Строка истории",165 "Story String": "Строка истории",
166 "Example Separator": "Разделитель примеров сообщений",166 "Example Separator": "Разделитель примеров сообщений",
167 "Chat Start": "Начало чата",167 "Chat Start": "Начало чата",
public/locales/uk-ua.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "розділяйте комами без пропусків між ними",482 "separate with commas w/o space between": "розділяйте комами без пропусків між ними",
483 "Custom Stopping Strings": "Власні рядки зупинки",483 "Custom Stopping Strings": "Власні рядки зупинки",
484 "JSON serialized array of strings": "JSON-серіалізований масив рядків",484 "JSON serialized array of strings": "JSON-серіалізований масив рядків",
485 "Replace Macro in Custom Stopping Strings": "Замінювати макроси у власних рядках зупинки",485 "Replace Macro in Stop Strings": "Замінювати макроси у власних рядках зупинки",
486 "Auto-Continue": "Автоматичне продовження",486 "Auto-Continue": "Автоматичне продовження",
487 "Allow for Chat Completion APIs": "Дозволити для Chat Completion API",487 "Allow for Chat Completion APIs": "Дозволити для Chat Completion API",
488 "Target length (tokens)": "Цільова довжина (токени)",488 "Target length (tokens)": "Цільова довжина (токени)",
public/locales/vi-vn.json+1 -1
@@ -482,7 +482,7 @@
482 "separate with commas w/o space between": "phân tách bằng dấu phẩy không có khoảng trắng giữa",482 "separate with commas w/o space between": "phân tách bằng dấu phẩy không có khoảng trắng giữa",
483 "Custom Stopping Strings": "Chuỗi dừng tùy chỉnh",483 "Custom Stopping Strings": "Chuỗi dừng tùy chỉnh",
484 "JSON serialized array of strings": "Mảng chuỗi được tuần tự hóa JSON",484 "JSON serialized array of strings": "Mảng chuỗi được tuần tự hóa JSON",
485 "Replace Macro in Custom Stopping Strings": "Thay thế Macro trong Chuỗi Dừng Tùy chỉnh",485 "Replace Macro in Stop Strings": "Thay thế Macro trong Chuỗi Dừng Tùy chỉnh",
486 "Auto-Continue": "Tự động Tiếp tục",486 "Auto-Continue": "Tự động Tiếp tục",
487 "Allow for Chat Completion APIs": "Cho phép các API hoàn thành Trò chuyện",487 "Allow for Chat Completion APIs": "Cho phép các API hoàn thành Trò chuyện",
488 "Target length (tokens)": "Độ dài mục tiêu (token)",488 "Target length (tokens)": "Độ dài mục tiêu (token)",
public/locales/zh-cn.json+1 -1
@@ -559,7 +559,7 @@
559 "Prompt Content": "提示词内容",559 "Prompt Content": "提示词内容",
560 "Custom Stopping Strings": "自定义停止字符串",560 "Custom Stopping Strings": "自定义停止字符串",
561 "JSON serialized array of strings": "JSON序列化的字符串数组",561 "JSON serialized array of strings": "JSON序列化的字符串数组",
562 "Replace Macro in Custom Stopping Strings": "替换自定义停止字符串中的宏",562 "Replace Macro in Stop Strings": "替换自定义停止字符串中的宏",
563 "Token Padding": "词符填充",563 "Token Padding": "词符填充",
564 "Miscellaneous": "杂项",564 "Miscellaneous": "杂项",
565 "Non-markdown strings": "非 Markdown 字符串",565 "Non-markdown strings": "非 Markdown 字符串",
public/locales/zh-tw.json+1 -1
@@ -483,7 +483,7 @@
483 "separate with commas w/o space between": "用逗號分隔,之間無空格",483 "separate with commas w/o space between": "用逗號分隔,之間無空格",
484 "Custom Stopping Strings": "自訂停止字串",484 "Custom Stopping Strings": "自訂停止字串",
485 "JSON serialized array of strings": "JSON 序列化字串數組",485 "JSON serialized array of strings": "JSON 序列化字串數組",
486 "Replace Macro in Custom Stopping Strings": "取代自訂停止字串中的巨集",486 "Replace Macro in Stop Strings": "取代自訂停止字串中的巨集",
487 "Auto-Continue": "自動繼續",487 "Auto-Continue": "自動繼續",
488 "Allow for Chat Completion APIs": "允許聊天補全 API",488 "Allow for Chat Completion APIs": "允許聊天補全 API",
489 "Target length (tokens)": "目標長度(符元)",489 "Target length (tokens)": "目標長度(符元)",
public/script.js+6 -6
@@ -3451,7 +3451,7 @@ export async function generateRaw(prompt, api, instructOverride, quietToLoud, sy
3451 break;3451 break;
3452 }3452 }
3453 case 'textgenerationwebui':3453 case 'textgenerationwebui':
3454 generateData = getTextGenGenerationData(prompt, amount_gen, false, false, null, 'quiet');3454 generateData = await getTextGenGenerationData(prompt, amount_gen, false, false, null, 'quiet');
3455 TempResponseLength.restore(api);3455 TempResponseLength.restore(api);
3456 break;3456 break;
3457 case 'openai': {3457 case 'openai': {
@@ -4588,7 +4588,7 @@ export async function Generate(type, { automatic_trigger, force_name2, quiet_pro
4588 break;4588 break;
4589 case 'textgenerationwebui': {4589 case 'textgenerationwebui': {
4590 const cfgValues = useCfgPrompt ? { guidanceScale: cfgGuidanceScale, negativePrompt: await getCombinedPrompt(true) } : null;4590 const cfgValues = useCfgPrompt ? { guidanceScale: cfgGuidanceScale, negativePrompt: await getCombinedPrompt(true) } : null;
4591 generate_data = getTextGenGenerationData(finalPrompt, maxLength, isImpersonate, isContinue, cfgValues, type);4591 generate_data = await getTextGenGenerationData(finalPrompt, maxLength, isImpersonate, isContinue, cfgValues, type);
4592 break;4592 break;
4593 }4593 }
4594 case 'novel': {4594 case 'novel': {
@@ -6928,7 +6928,7 @@ export async function getSettings() {
6928 loadProxyPresets(settings);6928 loadProxyPresets(settings);
69296929
6930 // Allow subscribers to mutate settings6930 // Allow subscribers to mutate settings
6931 eventSource.emit(event_types.SETTINGS_LOADED_AFTER, settings);6931 await eventSource.emit(event_types.SETTINGS_LOADED_AFTER, settings);
69326932
6933 // Set context size after loading power user (may override the max value)6933 // Set context size after loading power user (may override the max value)
6934 $('#max_context').val(max_context);6934 $('#max_context').val(max_context);
@@ -6988,7 +6988,7 @@ export async function getSettings() {
6988 }6988 }
6989 await validateDisabledSamplers();6989 await validateDisabledSamplers();
6990 settingsReady = true;6990 settingsReady = true;
6991 eventSource.emit(event_types.SETTINGS_LOADED);6991 await eventSource.emit(event_types.SETTINGS_LOADED);
6992}6992}
69936993
6994function selectKoboldGuiPreset() {6994function selectKoboldGuiPreset() {
@@ -11405,7 +11405,7 @@ jQuery(async function () {
11405 );11405 );
11406 break;*/11406 break;*/
11407 default:11407 default:
11408 eventSource.emit('charManagementDropdown', target);11408 await eventSource.emit('charManagementDropdown', target);
11409 }11409 }
11410 $('#char-management-dropdown').prop('selectedIndex', 0);11410 $('#char-management-dropdown').prop('selectedIndex', 0);
11411 });11411 });
@@ -11567,7 +11567,7 @@ jQuery(async function () {
1156711567
11568 $(document).on('click', '.open_characters_library', async function () {11568 $(document).on('click', '.open_characters_library', async function () {
11569 await getCharacters();11569 await getCharacters();
11570 eventSource.emit(event_types.OPEN_CHARACTER_LIBRARY);11570 await eventSource.emit(event_types.OPEN_CHARACTER_LIBRARY);
11571 });11571 });
1157211572
11573 // Added here to prevent execution before script.js is loaded and get rid of quirky timeouts11573 // Added here to prevent execution before script.js is loaded and get rid of quirky timeouts
public/scripts/chats.js+37 -2
@@ -621,21 +621,56 @@ async function enlargeMessageImage() {
621}621}
622622
623async function deleteMessageImage() {623async function deleteMessageImage() {
624 const value = await callGenericPopup('<h3>Delete image from message?<br>This action can\'t be undone.</h3>', POPUP_TYPE.CONFIRM);624 const value = await callGenericPopup('<h3>Delete image from message?<br>This action can\'t be undone.</h3>', POPUP_TYPE.TEXT, '', {
625 okButton: t`Delete one`,
626 customButtons: [
627 {
628 text: t`Delete all`,
629 appendAtEnd: true,
630 result: POPUP_RESULT.CUSTOM1,
631 },
632 {
633 text: t`Cancel`,
634 appendAtEnd: true,
635 result: POPUP_RESULT.CANCELLED,
636 },
637 ],
638 });
625639
626 if (value !== POPUP_RESULT.AFFIRMATIVE) {640 if (!value) {
627 return;641 return;
628 }642 }
629643
630 const mesBlock = $(this).closest('.mes');644 const mesBlock = $(this).closest('.mes');
631 const mesId = mesBlock.attr('mesid');645 const mesId = mesBlock.attr('mesid');
632 const message = chat[mesId];646 const message = chat[mesId];
647
648 let isLastImage = true;
649
650 if (Array.isArray(message.extra.image_swipes)) {
651 const indexOf = message.extra.image_swipes.indexOf(message.extra.image);
652 if (indexOf > -1) {
653 message.extra.image_swipes.splice(indexOf, 1);
654 isLastImage = message.extra.image_swipes.length === 0;
655 if (!isLastImage) {
656 const newIndex = Math.min(indexOf, message.extra.image_swipes.length - 1);
657 message.extra.image = message.extra.image_swipes[newIndex];
658 }
659 }
660 }
661
662 if (isLastImage || value === POPUP_RESULT.CUSTOM1) {
633 delete message.extra.image;663 delete message.extra.image;
634 delete message.extra.inline_image;664 delete message.extra.inline_image;
635 delete message.extra.title;665 delete message.extra.title;
636 delete message.extra.append_title;666 delete message.extra.append_title;
667 delete message.extra.image_swipes;
637 mesBlock.find('.mes_img_container').removeClass('img_extra');668 mesBlock.find('.mes_img_container').removeClass('img_extra');
638 mesBlock.find('.mes_img').attr('src', '');669 mesBlock.find('.mes_img').attr('src', '');
670 } else {
671 appendMediaToMessage(message, mesBlock);
672 }
673
639 await saveChatConditional();674 await saveChatConditional();
640}675}
641676
public/scripts/extensions/caption/settings.html+1 -1
@@ -10,7 +10,7 @@
10 <select id="caption_source" class="text_pole">10 <select id="caption_source" class="text_pole">
11 <option value="local" data-i18n="Local">Local</option>11 <option value="local" data-i18n="Local">Local</option>
12 <option value="multimodal" data-i18n="Multimodal (OpenAI / Anthropic / llama / Google)">Multimodal (OpenAI / Anthropic / llama / Google)</option>12 <option value="multimodal" data-i18n="Multimodal (OpenAI / Anthropic / llama / Google)">Multimodal (OpenAI / Anthropic / llama / Google)</option>
13 <option value="extras" data-i18n="Extras">Extras</option>13 <option value="extras" data-i18n="Extras">Extras (deprecated)</option>
14 <option value="horde" data-i18n="Horde">Horde</option>14 <option value="horde" data-i18n="Horde">Horde</option>
15 </select>15 </select>
16 <div id="caption_multimodal_block" class="flex-container wide100p">16 <div id="caption_multimodal_block" class="flex-container wide100p">
public/scripts/extensions/expressions/settings.html+1 -1
@@ -23,7 +23,7 @@
23 <small data-i18n="Select the API for classifying expressions.">Select the API for classifying expressions.</small>23 <small data-i18n="Select the API for classifying expressions.">Select the API for classifying expressions.</small>
24 <select id="expression_api" class="flex1 margin0">24 <select id="expression_api" class="flex1 margin0">
25 <option value="0" data-i18n="Local">Local</option>25 <option value="0" data-i18n="Local">Local</option>
26 <option value="1" data-i18n="Extras">Extras</option>26 <option value="1" data-i18n="Extras">Extras (deprecated)</option>
27 <option value="2" data-i18n="Main API">Main API</option>27 <option value="2" data-i18n="Main API">Main API</option>
28 <option value="3" data-i18n="WebLLM Extension">WebLLM Extension</option>28 <option value="3" data-i18n="WebLLM Extension">WebLLM Extension</option>
29 </select>29 </select>
public/scripts/extensions/memory/settings.html+1 -1
@@ -12,7 +12,7 @@
12 <label for="summary_source" data-i18n="ext_sum_with">Summarize with:</label>12 <label for="summary_source" data-i18n="ext_sum_with">Summarize with:</label>
13 <select id="summary_source">13 <select id="summary_source">
14 <option value="main" data-i18n="ext_sum_main_api">Main API</option>14 <option value="main" data-i18n="ext_sum_main_api">Main API</option>
15 <option value="extras">Extras API</option>15 <option value="extras">Extras API (deprecated)</option>
16 <option value="webllm" data-i18n="ext_sum_webllm">WebLLM Extension</option>16 <option value="webllm" data-i18n="ext_sum_webllm">WebLLM Extension</option>
17 </select><br>17 </select><br>
1818
public/scripts/extensions/stable-diffusion/settings.html+1 -1
@@ -41,7 +41,7 @@
41 <option value="blockentropy">Block Entropy</option>41 <option value="blockentropy">Block Entropy</option>
42 <option value="comfy">ComfyUI</option>42 <option value="comfy">ComfyUI</option>
43 <option value="drawthings">DrawThings HTTP API</option>43 <option value="drawthings">DrawThings HTTP API</option>
44 <option value="extras">Extras API (local / remote)</option>44 <option value="extras">Extras API (deprecated)</option>
45 <option value="huggingface">HuggingFace Inference API (serverless)</option>45 <option value="huggingface">HuggingFace Inference API (serverless)</option>
46 <option value="nanogpt">NanoGPT</option>46 <option value="nanogpt">NanoGPT</option>
47 <option value="novel">NovelAI Diffusion</option>47 <option value="novel">NovelAI Diffusion</option>
public/scripts/extensions/vectors/settings.html+1 -1
@@ -11,7 +11,7 @@
11 </label>11 </label>
12 <select id="vectors_source" class="text_pole">12 <select id="vectors_source" class="text_pole">
13 <option value="cohere">Cohere</option>13 <option value="cohere">Cohere</option>
14 <option value="extras">Extras</option>14 <option value="extras">Extras (deprecated)</option>
15 <option value="palm">Google AI Studio</option>15 <option value="palm">Google AI Studio</option>
16 <option value="llamacpp">llama.cpp</option>16 <option value="llamacpp">llama.cpp</option>
17 <option value="transformers" data-i18n="Local (Transformers)">Local (Transformers)</option>17 <option value="transformers" data-i18n="Local (Transformers)">Local (Transformers)</option>
public/scripts/popup.js+9 -0
@@ -24,6 +24,15 @@ export const POPUP_RESULT = {
24 AFFIRMATIVE: 1,24 AFFIRMATIVE: 1,
25 NEGATIVE: 0,25 NEGATIVE: 0,
26 CANCELLED: null,26 CANCELLED: null,
27 CUSTOM1: 1001,
28 CUSTOM2: 1002,
29 CUSTOM3: 1003,
30 CUSTOM4: 1004,
31 CUSTOM5: 1005,
32 CUSTOM6: 1006,
33 CUSTOM7: 1007,
34 CUSTOM8: 1008,
35 CUSTOM9: 1009,
27};36};
2837
29/**38/**
public/scripts/power-user.js+1 -1
@@ -2451,7 +2451,7 @@ async function resetMovablePanels(type) {
2451 }2451 }
24522452
2453 saveSettingsDebounced();2453 saveSettingsDebounced();
2454 eventSource.emit(event_types.MOVABLE_PANELS_RESET);2454 await eventSource.emit(event_types.MOVABLE_PANELS_RESET);
24552455
2456 eventSource.once(event_types.SETTINGS_UPDATED, () => {2456 eventSource.once(event_types.SETTINGS_UPDATED, () => {
2457 $('.resizing').removeClass('resizing');2457 $('.resizing').removeClass('resizing');
public/scripts/secrets.js+1 -0
@@ -40,6 +40,7 @@ export const SECRET_KEYS = {
40 BFL: 'api_key_bfl',40 BFL: 'api_key_bfl',
41 GENERIC: 'api_key_generic',41 GENERIC: 'api_key_generic',
42 DEEPSEEK: 'api_key_deepseek',42 DEEPSEEK: 'api_key_deepseek',
43 SERPER: 'api_key_serper',
43};44};
4445
45const INPUT_MAP = {46const INPUT_MAP = {
public/scripts/textgen-settings.js+2 -2
@@ -1221,7 +1221,7 @@ function replaceMacrosInList(str) {
1221 }1221 }
1222}1222}
12231223
1224export function getTextGenGenerationData(finalPrompt, maxTokens, isImpersonate, isContinue, cfgValues, type) {1224export async function getTextGenGenerationData(finalPrompt, maxTokens, isImpersonate, isContinue, cfgValues, type) {
1225 const canMultiSwipe = !isContinue && !isImpersonate && type !== 'quiet';1225 const canMultiSwipe = !isContinue && !isImpersonate && type !== 'quiet';
1226 const dynatemp = isDynamicTemperatureSupported();1226 const dynatemp = isDynamicTemperatureSupported();
1227 const { banned_tokens, banned_strings } = getCustomTokenBans();1227 const { banned_tokens, banned_strings } = getCustomTokenBans();
@@ -1449,7 +1449,7 @@ export function getTextGenGenerationData(finalPrompt, maxTokens, isImpersonate,
1449 }1449 }
1450 }1450 }
14511451
1452 eventSource.emitAndWait(event_types.TEXT_COMPLETION_SETTINGS_READY, params);1452 await eventSource.emit(event_types.TEXT_COMPLETION_SETTINGS_READY, params);
14531453
1454 // Grammar conflicts with with json_schema1454 // Grammar conflicts with with json_schema
1455 if (settings.type === LLAMACPP) {1455 if (settings.type === LLAMACPP) {
public/scripts/world-info.js+1 -1
@@ -3452,7 +3452,7 @@ async function _save(name, data) {
3452 headers: getRequestHeaders(),3452 headers: getRequestHeaders(),
3453 body: JSON.stringify({ name: name, data: data }),3453 body: JSON.stringify({ name: name, data: data }),
3454 });3454 });
3455 eventSource.emit(event_types.WORLDINFO_UPDATED, name, data);3455 await eventSource.emit(event_types.WORLDINFO_UPDATED, name, data);
3456}3456}
34573457
34583458
public/style.css+2 -0
@@ -5745,11 +5745,13 @@ body:not(.movingUI) .drawer-content.maximized {
5745 overflow-wrap: anywhere;5745 overflow-wrap: anywhere;
5746}5746}
57475747
5748#SystemPromptColumn summary,
5748#InstructSequencesColumn summary {5749#InstructSequencesColumn summary {
5749 font-size: 0.95em;5750 font-size: 0.95em;
5750 cursor: pointer;5751 cursor: pointer;
5751}5752}
57525753
5754#SystemPromptColumn details,
5753#InstructSequencesColumn details:not(:last-of-type) {5755#InstructSequencesColumn details:not(:last-of-type) {
5754 margin-bottom: 5px;5756 margin-bottom: 5px;
5755}5757}
src/endpoints/search.js+45 -0
@@ -112,6 +112,7 @@ router.post('/serpapi', jsonParser, async (request, response) => {
112 }112 }
113113
114 const data = await result.json();114 const data = await result.json();
115 console.debug('SerpApi response', data);
115 return response.json(data);116 return response.json(data);
116 } catch (error) {117 } catch (error) {
117 console.error(error);118 console.error(error);
@@ -255,6 +256,7 @@ router.post('/tavily', jsonParser, async (request, response) => {
255 }256 }
256257
257 const data = await result.json();258 const data = await result.json();
259 console.debug('Tavily response', data);
258 return response.json(data);260 return response.json(data);
259 } catch (error) {261 } catch (error) {
260 console.error(error);262 console.error(error);
@@ -290,6 +292,49 @@ router.post('/koboldcpp', jsonParser, async (request, response) => {
290 }292 }
291293
292 const data = await result.json();294 const data = await result.json();
295 console.debug('KoboldCpp search response', data);
296 return response.json(data);
297 } catch (error) {
298 console.error(error);
299 return response.sendStatus(500);
300 }
301});
302
303router.post('/serper', jsonParser, async (request, response) => {
304 try {
305 const key = readSecret(request.user.directories, SECRET_KEYS.SERPER);
306
307 if (!key) {
308 console.error('No Serper key found');
309 return response.sendStatus(400);
310 }
311
312 const { query, images } = request.body;
313
314 const url = images
315 ? 'https://google.serper.dev/images'
316 : 'https://google.serper.dev/search';
317
318 const result = await fetch(url, {
319 method: 'POST',
320 headers: {
321 'X-API-KEY': key,
322 'Content-Type': 'application/json',
323 },
324 redirect: 'follow',
325 body: JSON.stringify({ q: query }),
326 });
327
328 console.debug('Serper query', query);
329
330 if (!result.ok) {
331 const text = await result.text();
332 console.warn('Serper request failed', result.statusText, text);
333 return response.status(500).send(text);
334 }
335
336 const data = await result.json();
337 console.debug('Serper response', data);
293 return response.json(data);338 return response.json(data);
294 } catch (error) {339 } catch (error) {
295 console.error(error);340 console.error(error);
src/endpoints/secrets.js+1 -0
@@ -52,6 +52,7 @@ export const SECRET_KEYS = {
52 BFL: 'api_key_bfl',52 BFL: 'api_key_bfl',
53 GENERIC: 'api_key_generic',53 GENERIC: 'api_key_generic',
54 DEEPSEEK: 'api_key_deepseek',54 DEEPSEEK: 'api_key_deepseek',
55 SERPER: 'api_key_serper',
55};56};
5657
57// These are the keys that are safe to expose, even if allowKeysExposure is false58// These are the keys that are safe to expose, even if allowKeysExposure is false