Add Novel preset converter

d8f268a807a52d00b948ed3603a65efef4004229

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

3 files changed, +50 -3Showing whitespace changes
public/index.html+1 -1
@@ -119,7 +119,7 @@
119 <option value="gui" data-i18n="Default">Default</option>119 <option value="gui" data-i18n="Default">Default</option>
120 </select>120 </select>
121 <div class="flex-container marginLeft5 ">121 <div class="flex-container marginLeft5 ">
122 <input type="file" hidden data-preset-manager-file="novel" accept=".json, .settings">122 <input type="file" hidden data-preset-manager-file="novel" accept=".json, .settings, .preset">
123 <i data-preset-manager-update="novel" class="menu_button fa-solid fa-save" title="Update current preset" data-i18n="[title]Update current preset"></i>123 <i data-preset-manager-update="novel" class="menu_button fa-solid fa-save" title="Update current preset" data-i18n="[title]Update current preset"></i>
124 <i data-preset-manager-new="novel" class="menu_button fa-solid fa-file-circle-plus" title="Save preset as" data-i18n="[title]Save preset as"></i>124 <i data-preset-manager-new="novel" class="menu_button fa-solid fa-file-circle-plus" title="Save preset as" data-i18n="[title]Save preset as"></i>
125 <i data-preset-manager-import="novel" class="menu_button fa-solid fa-file-import" title="Import preset" data-i18n="[title]Import preset"></i>125 <i data-preset-manager-import="novel" class="menu_button fa-solid fa-file-import" title="Import preset" data-i18n="[title]Import preset"></i>
public/scripts/nai-settings.js+44 -2
@@ -5,9 +5,7 @@ import {
5 novelai_setting_names,5 novelai_setting_names,
6 saveSettingsDebounced,6 saveSettingsDebounced,
7 setGenerationParamsFromPreset,7 setGenerationParamsFromPreset,
8 substituteParams,
9} from '../script.js';8} from '../script.js';
10import { getCfgPrompt } from './cfg-scale.js';
11import { MAX_CONTEXT_DEFAULT, MAX_RESPONSE_DEFAULT, power_user } from './power-user.js';9import { MAX_CONTEXT_DEFAULT, MAX_RESPONSE_DEFAULT, power_user } from './power-user.js';
12import { getTextTokens, tokenizers } from './tokenizers.js';10import { getTextTokens, tokenizers } from './tokenizers.js';
13import { getEventSourceStream } from './sse-stream.js';11import { getEventSourceStream } from './sse-stream.js';
@@ -61,6 +59,19 @@ const nai_tiers = {
61 3: 'Opus',59 3: 'Opus',
62};60};
6361
62const samplers = {
63 temperature: 0,
64 top_k: 1,
65 top_p: 2,
66 tfs: 3,
67 top_a: 4,
68 typical_p: 5,
69 // removed samplers were here
70 mirostat: 8,
71 math1: 9,
72 min_p: 10,
73};
74
64let novel_data = null;75let novel_data = null;
65let badWordsCache = {};76let badWordsCache = {};
66const BIAS_KEY = '#novel_api-settings';77const BIAS_KEY = '#novel_api-settings';
@@ -95,6 +106,37 @@ export function getKayraMaxResponseTokens() {
95 return maximum_output_length;106 return maximum_output_length;
96}107}
97108
109export function convertNovelPreset(data) {
110 if (!data || typeof data !== 'object' || data.presetVersion !== 3 || !data.parameters || typeof data.parameters !== 'object') {
111 return data;
112 }
113
114 return {
115 max_context: 8000,
116 temperature: data.parameters.temperature,
117 max_length: data.parameters.max_length,
118 min_length: data.parameters.min_length,
119 top_k: data.parameters.top_k,
120 top_p: data.parameters.top_p,
121 top_a: data.parameters.top_a,
122 typical_p: data.parameters.typical_p,
123 tail_free_sampling: data.parameters.tail_free_sampling,
124 repetition_penalty: data.parameters.repetition_penalty,
125 repetition_penalty_range: data.parameters.repetition_penalty_range,
126 repetition_penalty_slope: data.parameters.repetition_penalty_slope,
127 repetition_penalty_frequency: data.parameters.repetition_penalty_frequency,
128 repetition_penalty_presence: data.parameters.repetition_penalty_presence,
129 phrase_rep_pen: data.parameters.phrase_rep_pen,
130 mirostat_lr: data.parameters.mirostat_lr,
131 mirostat_tau: data.parameters.mirostat_tau,
132 math1_temp: data.parameters.math1_temp,
133 math1_quad: data.parameters.math1_quad,
134 math1_quad_entropy_scale: data.parameters.math1_quad_entropy_scale,
135 min_p: data.parameters.min_p,
136 order: Array.isArray(data.parameters.order) ? data.parameters.order.filter(s => s.enabled && Object.keys(samplers).includes(s.id)).map(s => samplers[s.id]) : default_order,
137 };
138}
139
98export function getNovelTier() {140export function getNovelTier() {
99 return nai_tiers[novel_data?.tier] ?? 'no_connection';141 return nai_tiers[novel_data?.tier] ?? 'no_connection';
100}142}
public/scripts/preset-manager.js+5 -0
@@ -18,6 +18,7 @@ import {
18import { groups, selected_group } from './group-chats.js';18import { groups, selected_group } from './group-chats.js';
19import { instruct_presets } from './instruct-mode.js';19import { instruct_presets } from './instruct-mode.js';
20import { kai_settings } from './kai-settings.js';20import { kai_settings } from './kai-settings.js';
21import { convertNovelPreset } from './nai-settings.js';
21import { Popup, POPUP_RESULT, POPUP_TYPE } from './popup.js';22import { Popup, POPUP_RESULT, POPUP_TYPE } from './popup.js';
22import { context_presets, getContextSettings, power_user } from './power-user.js';23import { context_presets, getContextSettings, power_user } from './power-user.js';
23import { SlashCommand } from './slash-commands/SlashCommand.js';24import { SlashCommand } from './slash-commands/SlashCommand.js';
@@ -397,6 +398,10 @@ class PresetManager {
397 await checkForSystemPromptInInstructTemplate(name, settings);398 await checkForSystemPromptInInstructTemplate(name, settings);
398 }399 }
399400
401 if (this.apiId === 'novel' && settings) {
402 settings = convertNovelPreset(settings);
403 }
404
400 const preset = settings ?? this.getPresetSettings(name);405 const preset = settings ?? this.getPresetSettings(name);
401406
402 const response = await fetch('/api/presets/save', {407 const response = await fetch('/api/presets/save', {