Move NovelAI settings to respective module (#4238) * Move NovelAI settings to respective module * Update public/scripts/nai-settings.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

2f56a733684daf66e564f07399915388f1fca6c4

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

Signed
2 files changed, +88 -90Ignore whitespace
public/script.js+7 -71
@@ -119,13 +119,13 @@ import {
119119 generateNovelWithStreaming,
120120 getNovelGenerationData,
121121 getKayraMaxContextTokens,
122- getNovelTier,
123- loadNovelPreset,
124122 loadNovelSettings,
125123 nai_settings,
126124 adjustNovelInstructionPrompt,
127- loadNovelSubscriptionData,
128125 parseNovelAILogprobs,
126+ novelai_settings,
127+ novelai_setting_names,
128+ initNovelAISettings,
129129} from './scripts/nai-settings.js';
130130
131131import {
@@ -210,7 +210,6 @@ import {
210210 SECRET_KEYS,
211211 initSecrets,
212212 readSecretState,
213- secret_state,
214213 writeSecret,
215214} from './scripts/secrets.js';
216215import { EventEmitter } from './lib/eventemitter.js';
@@ -325,6 +324,8 @@ export {
325324 findItemizedPromptSet,
326325 koboldai_settings,
327326 koboldai_setting_names,
327+ novelai_settings,
328+ novelai_setting_names,
328329};
329330
330331/**
@@ -918,9 +919,6 @@ var swipes = true;
918919export let extension_prompts = {};
919920
920921export let main_api;// = "kobold";
921-//novel settings
922-export let novelai_settings;
923-export let novelai_setting_names;
924922/** @type {AbortController} */
925923let abortController;
926924
@@ -1006,6 +1004,7 @@ async function firstLoadInit() {
10061004 initTextGenModels();
10071005 initOpenAI();
10081006 initKoboldSettings();
1007+ initNovelAISettings();
10091008 initSystemPrompts();
10101009 initExtensions();
10111010 initExtensionSlashCommands();
@@ -1256,22 +1255,6 @@ async function getStatusTextgen() {
12561255 return resultCheckStatus();
12571256}
12581257
1259-async function getStatusNovel() {
1260- try {
1261- const result = await loadNovelSubscriptionData();
1262-
1263- if (!result) {
1264- throw new Error('Could not load subscription data');
1265- }
1266-
1267- setOnlineStatus(getNovelTier());
1268- } catch {
1269- setOnlineStatus('no_connection');
1270- }
1271-
1272- resultCheckStatus();
1273-}
1274-
12751258export function startStatusLoading() {
12761259 $('.api_loading').show();
12771260 $('.api_button').addClass('disabled');
@@ -7282,22 +7265,6 @@ export async function getSettings() {
72827265 // Allow subscribers to mutate settings
72837266 await eventSource.emit(event_types.SETTINGS_LOADED_BEFORE, settings);
72847267
7285- novelai_setting_names = data.novelai_setting_names;
7286- novelai_settings = data.novelai_settings;
7287- novelai_settings.forEach(function (item, i, arr) {
7288- novelai_settings[i] = JSON.parse(item);
7289- });
7290- const arr_holder = {};
7291-
7292- $('#settings_preset_novel').empty();
7293-
7294- novelai_setting_names.forEach(function (item, i, arr) {
7295- arr_holder[item] = i;
7296- $('#settings_preset_novel').append(`<option value=${i}>${item}</option>`);
7297- });
7298- novelai_setting_names = {};
7299- novelai_setting_names = arr_holder;
7300-
73017268 //Load AI model config settings
73027269 amount_gen = settings.amount_gen;
73037270 if (settings.max_context !== undefined)
@@ -7312,8 +7279,7 @@ export async function getSettings() {
73127279 loadKoboldSettings(data, settings.kai_settings ?? settings, settings);
73137280
73147281 // Novel
73157282 loadNovelSettings(data, settings.nai_settings ?? settings);
7316- $(`#settings_preset_novel option[value=${novelai_setting_names[nai_settings.preset_settings_novel]}]`).attr('selected', 'true');
73177283
73187284 // TextGen
73197285 loadTextGenSettings(data, settings);
@@ -10825,23 +10791,6 @@ jQuery(async function () {
1082510791 getStatusTextgen();
1082610792 });
1082710793
10828- $('#api_button_novel').on('click', async function (e) {
10829- e.stopPropagation();
10830- const api_key_novel = String($('#api_key_novel').val()).trim();
10831-
10832- if (api_key_novel.length) {
10833- await writeSecret(SECRET_KEYS.NOVEL, api_key_novel);
10834- }
10835-
10836- if (!secret_state[SECRET_KEYS.NOVEL]) {
10837- console.log('No secret key saved for NovelAI');
10838- return;
10839- }
10840-
10841- startStatusLoading();
10842- // Check near immediately rather than waiting for up to 90s
10843- await getStatusNovel();
10844- });
1084510794
1084610795 const button = $('#options_button');
1084710796 const menu = $('#options');
@@ -11063,19 +11012,6 @@ jQuery(async function () {
1106311012 is_delete_mode = false;
1106411013 });
1106511014
11066- $('#settings_preset_novel').on('change', function () {
11067- nai_settings.preset_settings_novel = $('#settings_preset_novel')
11068- .find(':selected')
11069- .text();
11070-
11071- const preset = novelai_settings[novelai_setting_names[nai_settings.preset_settings_novel]];
11072- loadNovelPreset(preset);
11073- amount_gen = Number($('#amount_gen').val());
11074- max_context = Number($('#max_context').val());
11075-
11076- saveSettingsDebounced();
11077- });
11078-
1107911015 $('#main_api').on('change', function () {
1108011016 cancelStatusCheck('Canceled because main api changed');
1108111017 changeMainAPI();
public/scripts/nai-settings.js+81 -19
@@ -2,9 +2,11 @@ import {
22 abortStatusCheck,
33 getRequestHeaders,
44 getStoppingStrings,
55 novelai_setting_namesresultCheckStatus,
66 saveSettingsDebounced,
77 setGenerationParamsFromPreset,
8+ setOnlineStatus,
9+ startStatusLoading,
810} from '../script.js';
911import { MAX_CONTEXT_DEFAULT, MAX_RESPONSE_DEFAULT, power_user } from './power-user.js';
1012import { getTextTokens, tokenizers } from './tokenizers.js';
@@ -15,6 +17,7 @@ import {
1517 onlyUnique,
1618} from './utils.js';
1719import { BIAS_CACHE, createNewLogitBiasEntry, displayLogitBias, getLogitBiasListResult } from './logit-bias.js';
20+import { SECRET_KEYS, secret_state, writeSecret } from './secrets.js';
1821
1922const default_preamble = '[ Style: chat, complex, sensory, visceral ]';
2023const default_order = [1, 5, 0, 2, 3, 4];
@@ -25,6 +28,9 @@ const default_presets = {
2528 'llama-3-erato-v1': 'Erato-Dragonfruit',
2629};
2730
31+export let novelai_settings;
32+export let novelai_setting_names;
33+
2834export const nai_settings = {
2935 temperature: 1.5,
3036 repetition_penalty: 2.25,
@@ -202,7 +208,21 @@ export function loadNovelPreset(preset) {
202208 loadNovelSettingsUi(nai_settings);
203209}
204210
205211export function loadNovelSettings(data, settings) {
212+ novelai_setting_names = data.novelai_setting_names;
213+ novelai_settings = data.novelai_settings;
214+ novelai_settings.forEach(function (item, i, arr) {
215+ novelai_settings[i] = JSON.parse(item);
216+ });
217+
218+ $('#settings_preset_novel').empty();
219+ const presetNames = {};
220+ novelai_setting_names.forEach(function (item, i, arr) {
221+ presetNames[item] = i;
222+ $('#settings_preset_novel').append(`<option value=${i}>${item}</option>`);
223+ });
224+ novelai_setting_names = presetNames;
225+
206226 //load the rest of the Novel settings without any checks
207227 nai_settings.model_novel = settings.model_novel;
208228 $('#model_novel_select').val(nai_settings.model_novel);
@@ -282,6 +302,7 @@ function loadNovelSettingsUi(ui_settings) {
282302 $('#math1_quad_counter_novel').val(Number(ui_settings.math1_quad).toFixed(2));
283303 $('#math1_quad_entropy_scale_novel').val(ui_settings.math1_quad_entropy_scale);
284304 $('#math1_quad_entropy_scale_counter_novel').val(Number(ui_settings.math1_quad_entropy_scale).toFixed(2));
305+ $(`#settings_preset_novel option[value=${novelai_setting_names[nai_settings.preset_settings_novel]}]`).prop('selected', true);
285306
286307 $('#streaming_novel').prop('checked', ui_settings.streaming_novel);
287308 sortItemsByOrder(ui_settings.order);
@@ -293,85 +314,85 @@ const sliders = [
293314 sliderId: '#temp_novel',
294315 counterId: '#temp_counter_novel',
295316 format: (val) => Number(val).toFixed(2),
296317 setValue: (val) => { nai_settings.temperature = Number(val).toFixed(2); },
297318 },
298319 {
299320 sliderId: '#rep_pen_novel',
300321 counterId: '#rep_pen_counter_novel',
301322 format: (val) => Number(val).toFixed(3),
302323 setValue: (val) => { nai_settings.repetition_penalty = Number(val).toFixed(3); },
303324 },
304325 {
305326 sliderId: '#rep_pen_size_novel',
306327 counterId: '#rep_pen_size_counter_novel',
307328 format: (val) => `${val}`,
308329 setValue: (val) => { nai_settings.repetition_penalty_range = Number(val).toFixed(0); },
309330 },
310331 {
311332 sliderId: '#rep_pen_slope_novel',
312333 counterId: '#rep_pen_slope_counter_novel',
313334 format: (val) => `${val}`,
314335 setValue: (val) => { nai_settings.repetition_penalty_slope = Number(val).toFixed(2); },
315336 },
316337 {
317338 sliderId: '#rep_pen_freq_novel',
318339 counterId: '#rep_pen_freq_counter_novel',
319340 format: (val) => Number(val).toFixed(2),
320341 setValue: (val) => { nai_settings.repetition_penalty_frequency = Number(val).toFixed(3); },
321342 },
322343 {
323344 sliderId: '#rep_pen_presence_novel',
324345 counterId: '#rep_pen_presence_counter_novel',
325346 format: (val) => `${val}`,
326347 setValue: (val) => { nai_settings.repetition_penalty_presence = Number(val).toFixed(3); },
327348 },
328349 {
329350 sliderId: '#tail_free_sampling_novel',
330351 counterId: '#tail_free_sampling_counter_novel',
331352 format: (val) => `${val}`,
332353 setValue: (val) => { nai_settings.tail_free_sampling = Number(val).toFixed(3); },
333354 },
334355 {
335356 sliderId: '#top_k_novel',
336357 counterId: '#top_k_counter_novel',
337358 format: (val) => `${val}`,
338359 setValue: (val) => { nai_settings.top_k = Number(val).toFixed(0); },
339360 },
340361 {
341362 sliderId: '#top_p_novel',
342363 counterId: '#top_p_counter_novel',
343364 format: (val) => Number(val).toFixed(3),
344365 setValue: (val) => { nai_settings.top_p = Number(val).toFixed(3); },
345366 },
346367 {
347368 sliderId: '#top_a_novel',
348369 counterId: '#top_a_counter_novel',
349370 format: (val) => Number(val).toFixed(2),
350371 setValue: (val) => { nai_settings.top_a = Number(val).toFixed(3); },
351372 },
352373 {
353374 sliderId: '#typical_p_novel',
354375 counterId: '#typical_p_counter_novel',
355376 format: (val) => Number(val).toFixed(3),
356377 setValue: (val) => { nai_settings.typical_p = Number(val).toFixed(3); },
357378 },
358379 {
359380 sliderId: '#mirostat_tau_novel',
360381 counterId: '#mirostat_tau_counter_novel',
361382 format: (val) => Number(val).toFixed(2),
362383 setValue: (val) => { nai_settings.mirostat_tau = Number(val).toFixed(2); },
363384 },
364385 {
365386 sliderId: '#mirostat_lr_novel',
366387 counterId: '#mirostat_lr_counter_novel',
367388 format: (val) => Number(val).toFixed(2),
368389 setValue: (val) => { nai_settings.mirostat_lr = Number(val).toFixed(2); },
369390 },
370391 {
371392 sliderId: '#min_length_novel',
372393 counterId: '#min_length_counter_novel',
373394 format: (val) => `${val}`,
374395 setValue: (val) => { nai_settings.min_length = Number(val).toFixed(0); },
375396 },
376397 {
377398 sliderId: '#nai_banned_tokens',
@@ -777,7 +798,7 @@ export async function generateNovelWithStreaming(generate_data, signal) {
777798 * for a single token into a TokenLogprobs object used by the Token Probabilities
778799 * feature.
779800 * @param {NAITokenLogprobs} data - NAI logprobs object for one token
780801 * @returns {import('./logprobs.js').TokenLogprobs | null} converted logprobs
781802 */
782803export function parseNovelAILogprobs(data) {
783804 if (!data) {
@@ -806,6 +827,7 @@ export function parseNovelAILogprobs(data) {
806827 // text so we will use the IDs instead and bulk decode them in
807828 // StreamingProcessor. JSDoc typechecking may complain about this, but it's
808829 // intentional.
830+ // @ts-ignore
809831 return { token: chosenId, topLogprobs: merged };
810832}
811833
@@ -820,7 +842,23 @@ $('#nai_preamble_restore').on('click', function () {
820842 saveSettingsDebounced();
821843});
822844
823845jQuery(export async function getStatusNovel() {
846+ try {
847+ const result = await loadNovelSubscriptionData();
848+
849+ if (!result) {
850+ throw new Error('Could not load subscription data');
851+ }
852+
853+ setOnlineStatus(getNovelTier());
854+ } catch {
855+ setOnlineStatus('no_connection');
856+ }
857+
858+ return resultCheckStatus();
859+}
860+
861+export function initNovelAISettings() {
824862 sliders.forEach(slider => {
825863 $(document).on('input', slider.sliderId, function () {
826864 const value = $(this).val();
@@ -831,6 +869,30 @@ jQuery(function () {
831869 });
832870 });
833871
872+ $('#api_button_novel').on('click', async function (e) {
873+ e.stopPropagation();
874+ const api_key_novel = String($('#api_key_novel').val()).trim();
875+
876+ if (api_key_novel.length) {
877+ await writeSecret(SECRET_KEYS.NOVEL, api_key_novel);
878+ }
879+
880+ if (!secret_state[SECRET_KEYS.NOVEL]) {
881+ console.log('No secret key saved for NovelAI');
882+ return;
883+ }
884+
885+ startStatusLoading();
886+ await getStatusNovel();
887+ });
888+
889+ $('#settings_preset_novel').on('change', function () {
890+ nai_settings.preset_settings_novel = $('#settings_preset_novel').find(':selected').text();
891+ const preset = novelai_settings[novelai_setting_names[nai_settings.preset_settings_novel]];
892+ loadNovelPreset(preset);
893+ saveSettingsDebounced();
894+ });
895+
834896 $('#streaming_novel').on('input', function () {
835897 const value = !!$(this).prop('checked');
836898 nai_settings.streaming_novel = value;
@@ -872,4 +934,4 @@ jQuery(function () {
872934 });
873935
874936 $('#novelai_logit_bias_new_entry').on('click', () => createNewLogitBiasEntry(nai_settings.logit_bias, BIAS_KEY));
875937});