Add Novel preset converter
| @@ -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> |
| @@ -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'; |
| 10 | import { getCfgPrompt } from './cfg-scale.js'; | ||
| 11 | import { MAX_CONTEXT_DEFAULT, MAX_RESPONSE_DEFAULT, power_user } from './power-user.js'; | 9 | import { MAX_CONTEXT_DEFAULT, MAX_RESPONSE_DEFAULT, power_user } from './power-user.js'; |
| 12 | import { getTextTokens, tokenizers } from './tokenizers.js'; | 10 | import { getTextTokens, tokenizers } from './tokenizers.js'; |
| 13 | import { getEventSourceStream } from './sse-stream.js'; | 11 | import { getEventSourceStream } from './sse-stream.js'; |
| @@ -61,6 +59,19 @@ const nai_tiers = { | |||
| 61 | 3: 'Opus', | 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 | let novel_data = null; | 75 | let novel_data = null; |
| 65 | let badWordsCache = {}; | 76 | let badWordsCache = {}; |
| 66 | const BIAS_KEY = '#novel_api-settings'; | 77 | const BIAS_KEY = '#novel_api-settings'; |
| @@ -95,6 +106,37 @@ export function getKayraMaxResponseTokens() { | |||
| 95 | return maximum_output_length; | 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 | export function getNovelTier() { | 140 | export function getNovelTier() { |
| 99 | return nai_tiers[novel_data?.tier] ?? 'no_connection'; | 141 | return nai_tiers[novel_data?.tier] ?? 'no_connection'; |
| 100 | } | 142 | } |
| @@ -18,6 +18,7 @@ import { | |||
| 18 | import { groups, selected_group } from './group-chats.js'; | 18 | import { groups, selected_group } from './group-chats.js'; |
| 19 | import { instruct_presets } from './instruct-mode.js'; | 19 | import { instruct_presets } from './instruct-mode.js'; |
| 20 | import { kai_settings } from './kai-settings.js'; | 20 | import { kai_settings } from './kai-settings.js'; |
| 21 | import { convertNovelPreset } from './nai-settings.js'; | ||
| 21 | import { Popup, POPUP_RESULT, POPUP_TYPE } from './popup.js'; | 22 | import { Popup, POPUP_RESULT, POPUP_TYPE } from './popup.js'; |
| 22 | import { context_presets, getContextSettings, power_user } from './power-user.js'; | 23 | import { context_presets, getContextSettings, power_user } from './power-user.js'; |
| 23 | import { SlashCommand } from './slash-commands/SlashCommand.js'; | 24 | import { SlashCommand } from './slash-commands/SlashCommand.js'; |
| @@ -397,6 +398,10 @@ class PresetManager { | |||
| 397 | await checkForSystemPromptInInstructTemplate(name, settings); | 398 | await checkForSystemPromptInInstructTemplate(name, settings); |
| 398 | } | 399 | } |
| 399 | 400 | ||
| 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); |
| 401 | 406 | ||
| 402 | const response = await fetch('/api/presets/save', { | 407 | const response = await fetch('/api/presets/save', { |