mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2024-12-11 17:07:07 +01:00
Selectable NovelAI module
This commit is contained in:
parent
f434a96ad6
commit
dd21091807
@ -835,6 +835,21 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="novel_api-settings">
|
<div id="novel_api-settings">
|
||||||
|
<div class="range-block">
|
||||||
|
<div class="range-block-title justifyLeft">
|
||||||
|
AI Module
|
||||||
|
</div>
|
||||||
|
<div class="toggle-description justifyLeft" data-i18n="Change the style of the generated text. Set to Vanilla to use the default style.">
|
||||||
|
Change the style of the generated text. Set to Vanilla to use the default style.
|
||||||
|
</div>
|
||||||
|
<select id="nai_prefix">
|
||||||
|
<option value="" data-i18n="Auto-select">Auto-select</option>
|
||||||
|
<option value="vanilla" data-i18n="Vanilla">Vanilla</option>
|
||||||
|
<option value="special_instruct" data-i18n="Instruct">Instruct</option>
|
||||||
|
<option value="special_proseaugmenter" data-i18n="Prose Augmenter">Prose Augmenter</option>
|
||||||
|
<option value="theme_textadventure" data-i18n="Text Adventure">Text Adventure</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
<div class="range-block">
|
<div class="range-block">
|
||||||
<div class="range-block-title openai_restorable">
|
<div class="range-block-title openai_restorable">
|
||||||
<span data-i18n="Preamble">Preamble</span>
|
<span data-i18n="Preamble">Preamble</span>
|
||||||
|
@ -26,12 +26,14 @@ const nai_settings = {
|
|||||||
top_k: 0,
|
top_k: 0,
|
||||||
top_p: 1,
|
top_p: 1,
|
||||||
top_a: 1,
|
top_a: 1,
|
||||||
|
top_g: 0,
|
||||||
typical_p: 1,
|
typical_p: 1,
|
||||||
min_length: 0,
|
min_length: 0,
|
||||||
model_novel: "euterpe-v2",
|
model_novel: "euterpe-v2",
|
||||||
preset_settings_novel: "Classic-Euterpe",
|
preset_settings_novel: "Classic-Euterpe",
|
||||||
streaming_novel: false,
|
streaming_novel: false,
|
||||||
nai_preamble: default_preamble,
|
nai_preamble: default_preamble,
|
||||||
|
prefix: '',
|
||||||
};
|
};
|
||||||
|
|
||||||
const nai_tiers = {
|
const nai_tiers = {
|
||||||
@ -92,6 +94,7 @@ function loadNovelPreset(preset) {
|
|||||||
nai_settings.top_g = preset.top_g;
|
nai_settings.top_g = preset.top_g;
|
||||||
nai_settings.mirostat_lr = preset.mirostat_lr;
|
nai_settings.mirostat_lr = preset.mirostat_lr;
|
||||||
nai_settings.mirostat_tau = preset.mirostat_tau;
|
nai_settings.mirostat_tau = preset.mirostat_tau;
|
||||||
|
nai_settings.prefix = preset.prefix;
|
||||||
loadNovelSettingsUi(nai_settings);
|
loadNovelSettingsUi(nai_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,6 +124,7 @@ function loadNovelSettings(settings) {
|
|||||||
nai_settings.mirostat_lr = settings.mirostat_lr;
|
nai_settings.mirostat_lr = settings.mirostat_lr;
|
||||||
nai_settings.mirostat_tau = settings.mirostat_tau;
|
nai_settings.mirostat_tau = settings.mirostat_tau;
|
||||||
nai_settings.streaming_novel = !!settings.streaming_novel;
|
nai_settings.streaming_novel = !!settings.streaming_novel;
|
||||||
|
nai_settings.prefix = settings.prefix;
|
||||||
loadNovelSettingsUi(nai_settings);
|
loadNovelSettingsUi(nai_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +197,7 @@ function loadNovelSettingsUi(ui_settings) {
|
|||||||
$("#min_length_novel").val(ui_settings.min_length);
|
$("#min_length_novel").val(ui_settings.min_length);
|
||||||
$("#min_length_counter_novel").text(Number(ui_settings.min_length).toFixed(0));
|
$("#min_length_counter_novel").text(Number(ui_settings.min_length).toFixed(0));
|
||||||
$('#nai_preamble_textarea').val(ui_settings.nai_preamble);
|
$('#nai_preamble_textarea').val(ui_settings.nai_preamble);
|
||||||
|
$('#nai_prefix').val(ui_settings.prefix || "");
|
||||||
|
|
||||||
$("#streaming_novel").prop('checked', ui_settings.streaming_novel);
|
$("#streaming_novel").prop('checked', ui_settings.streaming_novel);
|
||||||
}
|
}
|
||||||
@ -302,10 +307,9 @@ const sliders = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export function getNovelGenerationData(finalPromt, this_settings, this_amount_gen, isImpersonate) {
|
export function getNovelGenerationData(finalPrompt, this_settings, this_amount_gen, isImpersonate) {
|
||||||
const clio = nai_settings.model_novel.includes('clio');
|
const clio = nai_settings.model_novel.includes('clio');
|
||||||
const kayra = nai_settings.model_novel.includes('kayra');
|
const kayra = nai_settings.model_novel.includes('kayra');
|
||||||
const isNewModel = clio || kayra;
|
|
||||||
|
|
||||||
const tokenizerType = kayra ? tokenizers.NERD2 : (clio ? tokenizers.NERD : tokenizers.NONE);
|
const tokenizerType = kayra ? tokenizers.NERD2 : (clio ? tokenizers.NERD : tokenizers.NONE);
|
||||||
const stopSequences = (tokenizerType !== tokenizers.NONE)
|
const stopSequences = (tokenizerType !== tokenizers.NONE)
|
||||||
@ -313,15 +317,10 @@ export function getNovelGenerationData(finalPromt, this_settings, this_amount_ge
|
|||||||
.map(t => getTextTokens(tokenizerType, t))
|
.map(t => getTextTokens(tokenizerType, t))
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
let useInstruct = false;
|
const prefix = nai_settings.prefix || autoSelectPrefix(finalPrompt);
|
||||||
if (isNewModel) {
|
|
||||||
// NovelAI claims they scan backwards 1000 characters (not tokens!) to look for instruct brackets. That's really short.
|
|
||||||
const tail = finalPromt.slice(-1500);
|
|
||||||
useInstruct = tail.includes("}");
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"input": finalPromt,
|
"input": finalPrompt,
|
||||||
"model": nai_settings.model_novel,
|
"model": nai_settings.model_novel,
|
||||||
"use_string": true,
|
"use_string": true,
|
||||||
"temperature": parseFloat(nai_settings.temperature),
|
"temperature": parseFloat(nai_settings.temperature),
|
||||||
@ -350,12 +349,28 @@ export function getNovelGenerationData(finalPromt, this_settings, this_amount_ge
|
|||||||
"use_cache": false,
|
"use_cache": false,
|
||||||
"use_string": true,
|
"use_string": true,
|
||||||
"return_full_text": false,
|
"return_full_text": false,
|
||||||
"prefix": useInstruct ? "special_instruct" : (isNewModel ? "special_proseaugmenter" : "vanilla"),
|
"prefix": prefix,
|
||||||
"order": this_settings.order,
|
"order": this_settings.order,
|
||||||
"streaming": nai_settings.streaming_novel,
|
"streaming": nai_settings.streaming_novel,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function autoSelectPrefix(finalPromt) {
|
||||||
|
let useInstruct = false;
|
||||||
|
const clio = nai_settings.model_novel.includes('clio');
|
||||||
|
const kayra = nai_settings.model_novel.includes('kayra');
|
||||||
|
const isNewModel = clio || kayra;
|
||||||
|
|
||||||
|
if (isNewModel) {
|
||||||
|
// NovelAI claims they scan backwards 1000 characters (not tokens!) to look for instruct brackets. That's really short.
|
||||||
|
const tail = finalPromt.slice(-1500);
|
||||||
|
useInstruct = tail.includes("}");
|
||||||
|
}
|
||||||
|
|
||||||
|
const prefix = useInstruct ? "special_instruct" : (isNewModel ? "special_proseaugmenter" : "vanilla");
|
||||||
|
return prefix;
|
||||||
|
}
|
||||||
|
|
||||||
export async function generateNovelWithStreaming(generate_data, signal) {
|
export async function generateNovelWithStreaming(generate_data, signal) {
|
||||||
const response = await fetch('/generate_novelai', {
|
const response = await fetch('/generate_novelai', {
|
||||||
headers: getRequestHeaders(),
|
headers: getRequestHeaders(),
|
||||||
@ -431,4 +446,9 @@ $(document).ready(function () {
|
|||||||
nai_settings.model_novel = $("#model_novel_select").find(":selected").val();
|
nai_settings.model_novel = $("#model_novel_select").find(":selected").val();
|
||||||
saveSettingsDebounced();
|
saveSettingsDebounced();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#nai_prefix").on('change', function () {
|
||||||
|
nai_settings.prefix = $("#nai_prefix").find(":selected").val();
|
||||||
|
saveSettingsDebounced();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user