Add Novel preset converter
| @@ -119,7 +119,7 @@ | ||
| 119 | 119 | <option value="gui" data-i18n="Default">Default</option> |
| 120 | 120 | </select> |
| 121 | 121 | <div class="flex-container marginLeft5 "> |
| 122 | 122 | <input type="file" hidden data-preset-manager-file="novel" accept=".json, .settings, .preset"> |
| 123 | 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 | 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 | 125 | <i data-preset-manager-import="novel" class="menu_button fa-solid fa-file-import" title="Import preset" data-i18n="[title]Import preset"></i> |
| @@ -5,9 +5,7 @@ import { | ||
| 5 | 5 | novelai_setting_names, |
| 6 | 6 | saveSettingsDebounced, |
| 7 | 7 | setGenerationParamsFromPreset, |
| 8 | - substituteParams, | |
| 9 | 8 | } from '../script.js'; |
| 10 | -import { getCfgPrompt } from './cfg-scale.js'; | |
| 11 | 9 | import { MAX_CONTEXT_DEFAULT, MAX_RESPONSE_DEFAULT, power_user } from './power-user.js'; |
| 12 | 10 | import { getTextTokens, tokenizers } from './tokenizers.js'; |
| 13 | 11 | import { getEventSourceStream } from './sse-stream.js'; |
| @@ -61,6 +59,19 @@ const nai_tiers = { | ||
| 61 | 59 | 3: 'Opus', |
| 62 | 60 | }; |
| 63 | 61 | |
| 62 | +const 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 | + | |
| 64 | 75 | let novel_data = null; |
| 65 | 76 | let badWordsCache = {}; |
| 66 | 77 | const BIAS_KEY = '#novel_api-settings'; |
| @@ -95,6 +106,37 @@ export function getKayraMaxResponseTokens() { | ||
| 95 | 106 | return maximum_output_length; |
| 96 | 107 | } |
| 97 | 108 | |
| 109 | +export 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 | + | |
| 98 | 140 | export function getNovelTier() { |
| 99 | 141 | return nai_tiers[novel_data?.tier] ?? 'no_connection'; |
| 100 | 142 | } |
| @@ -18,6 +18,7 @@ import { | ||
| 18 | 18 | import { groups, selected_group } from './group-chats.js'; |
| 19 | 19 | import { instruct_presets } from './instruct-mode.js'; |
| 20 | 20 | import { kai_settings } from './kai-settings.js'; |
| 21 | +import { convertNovelPreset } from './nai-settings.js'; | |
| 21 | 22 | import { Popup, POPUP_RESULT, POPUP_TYPE } from './popup.js'; |
| 22 | 23 | import { context_presets, getContextSettings, power_user } from './power-user.js'; |
| 23 | 24 | import { SlashCommand } from './slash-commands/SlashCommand.js'; |
| @@ -397,6 +398,10 @@ class PresetManager { | ||
| 397 | 398 | await checkForSystemPromptInInstructTemplate(name, settings); |
| 398 | 399 | } |
| 399 | 400 | |
| 401 | + if (this.apiId === 'novel' && settings) { | |
| 402 | + settings = convertNovelPreset(settings); | |
| 403 | + } | |
| 404 | + | |
| 400 | 405 | const preset = settings ?? this.getPresetSettings(name); |
| 401 | 406 | |
| 402 | 407 | const response = await fetch('/api/presets/save', { |