Add spec_v2 fields

This commit is contained in:
SillyLossy
2023-06-02 19:36:32 +03:00
parent 556bbfe865
commit 64ef09ab5f
3 changed files with 187 additions and 90 deletions

View File

@ -2314,13 +2314,62 @@
<div id="character_popup_text"> <div id="character_popup_text">
<h3 id="character_popup_text_h3"></h3> - Advanced Definitions <h3 id="character_popup_text_h3"></h3> - Advanced Definitions
</div> </div>
<hr> <hr class="margin-bot-10px">
<div id="character_cross" class="fa-solid fa-circle-xmark"></div> <div id="character_cross" class="fa-solid fa-circle-xmark"></div>
<div id="creatorcomment_div"> <div class="inline-drawer">
Creator's Comment <div class="inline-drawer-toggle inline-drawer-header">
<h5>This is not sent to the AI Prompt. <h4>
<textarea id="creatorcomment_textarea" name="creatorcomment" placeholder="(Describe the bot to the user, list the chat models it has been tested on, and any other useful tips)" form="form_create" class="text_pole" autocomplete="off" rows="2" maxlength="20000"></textarea> AI Prompt Overrides
<small>(Affects the generation)</small>
</h4>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">
<div>
<h4>System Prompt</h4>
<textarea id="system_prompt_textarea" name="system_prompt"
placeholder="(Overrides the main prompt for OpenAI and/or system prompt for Instruct Mode if not empty)"
form="form_create" class="text_pole" autocomplete="off" rows="3" maxlength="20000"></textarea>
</div>
<div>
<h4>Post History Instructions</h4>
<textarea id="post_history_instructions_textarea" name="post_history_instructions" placeholder="(Overrides the default jailbreak for OpenAI if not empty)" form="form_create" class="text_pole"
autocomplete="off" rows="3" maxlength="100"></textarea>
</div>
</div>
</div>
<div class="inline-drawer">
<div class="inline-drawer-toggle inline-drawer-header">
<h4>
Creator's Metadata
<small>(Not sent with the AI Prompt)</small>
</h4>
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
</div>
<div class="inline-drawer-content">
<div>
<h4>Creator's Name</h4>
<textarea id="creator_textarea" name="creator" placeholder="(Botmaker's name / Contact info)" form="form_create" class="text_pole"
autocomplete="off" rows="1" maxlength="100"></textarea>
</div>
<div>
<h4>Creator's Notes</h4>
<textarea id="creator_notes_textarea" name="creator_notes"
placeholder="(Describe the bot to the user, list the chat models it has been tested on, and any other useful tips)"
form="form_create" class="text_pole" autocomplete="off" rows="2" maxlength="20000"></textarea>
</div>
<div>
<h4>Creators's Tags</h4>
<textarea id="tags_textarea" name="tags" placeholder="(List of freeform comma-separated tags)" form="form_create"
class="text_pole" autocomplete="off" rows="1" maxlength="2000"></textarea>
</div>
<div>
<h4>Character Version</h4>
<textarea id="character_version_textarea" name="character_version" placeholder="(Optional string to track character versions)"
form="form_create" class="text_pole" autocomplete="off" rows="1" maxlength="100"></textarea>
</div>
</div>
</div> </div>
<div id="personality_div"> <div id="personality_div">
@ -2358,7 +2407,7 @@
<h4>Example Dialogue</h4> <h4>Example Dialogue</h4>
<h5>Important to set the character's writing style. <a href="/notes#examplesofdialogue" class="notes-link" target="_blank"><span class="note-link-span">?</span></a></h5> <h5>Important to set the character's writing style. <a href="/notes#examplesofdialogue" class="notes-link" target="_blank"><span class="note-link-span">?</span></a></h5>
</div> </div>
<textarea id="mes_example_textarea" class="flexGrow" name="mes_example" placeholder="(Examples of chat dialog. Begin each example with <start> on a new line.)" form="form_create" maxlength="20000"></textarea> <textarea id="mes_example_textarea" class="flexGrow" name="mes_example" placeholder="(Examples of chat dialog. Begin each example with <start> on a new line.)" form="form_create" maxlength="20000" rows="6"></textarea>
</div> </div>
<div id="character_popup_ok" class="menu_button">Save</div> <div id="character_popup_ok" class="menu_button">Save</div>

View File

@ -143,7 +143,6 @@ import {
secret_state, secret_state,
writeSecret writeSecret
} from "./scripts/secrets.js"; } from "./scripts/secrets.js";
import uniqolor from "./scripts/uniqolor.js";
import { EventEmitter } from './scripts/eventemitter.js'; import { EventEmitter } from './scripts/eventemitter.js';
import { context_settings, loadContextTemplatesFromSettings } from "./scripts/context-template.js"; import { context_settings, loadContextTemplatesFromSettings } from "./scripts/context-template.js";
@ -536,39 +535,42 @@ var is_advanced_char_open = false;
var menu_type = ""; //what is selected in the menu var menu_type = ""; //what is selected in the menu
var selected_button = ""; //which button pressed var selected_button = ""; //which button pressed
//create pole save //create pole save
var create_save_name = ""; let create_save_name = "";
var create_fav_chara = ""; let create_save_description = "";
var create_save_description = ""; let create_save_creator_notes = "";
var create_save_creatorcomment = ""; let create_save_post_history_instructions = "";
var create_save_personality = ""; let create_save_character_version = "";
var create_save_first_message = ""; let create_save_system_prompt = "";
var create_save_avatar = ""; let create_save_tags = "";
var create_save_scenario = ""; let create_save_creator = "";
var create_save_mes_example = ""; let create_save_personality = "";
var create_save_talkativeness = talkativeness_default; let create_save_first_message = "";
var create_save_json_data = ""; let create_save_avatar = "";
let create_save_scenario = "";
let create_save_mes_example = "";
let create_save_talkativeness = talkativeness_default;
//animation right menu //animation right menu
var animation_duration = 250; let animation_duration = 250;
var animation_easing = "ease-in-out"; let animation_easing = "ease-in-out";
var popup_type = ""; let popup_type = "";
var bg_file_for_del = ""; let bg_file_for_del = "";
var chat_file_for_del = ""; let chat_file_for_del = "";
var online_status = "no_connection"; let online_status = "no_connection";
var api_server = ""; let api_server = "";
var api_server_textgenerationwebui = ""; let api_server_textgenerationwebui = "";
//var interval_timer = setInterval(getStatus, 2000); //var interval_timer = setInterval(getStatus, 2000);
var interval_timer_novel = setInterval(getStatusNovel, 90000); let interval_timer_novel = setInterval(getStatusNovel, 90000);
var is_get_status = false; let is_get_status = false;
var is_get_status_novel = false; let is_get_status_novel = false;
var is_api_button_press = false; let is_api_button_press = false;
var is_api_button_press_novel = false; let is_api_button_press_novel = false;
var is_send_press = false; //Send generation let is_send_press = false; //Send generation
var add_mes_without_animation = false; let add_mes_without_animation = false;
var this_del_mes = 0; let this_del_mes = 0;
//message editing and chat scroll posistion persistence //message editing and chat scroll posistion persistence
var this_edit_mes_text = ""; var this_edit_mes_text = "";
@ -4321,11 +4323,17 @@ export function select_selected_character(chid) {
$("#character_popup_text_h3").text(characters[chid].name); $("#character_popup_text_h3").text(characters[chid].name);
$("#character_name_pole").val(characters[chid].name); $("#character_name_pole").val(characters[chid].name);
$("#description_textarea").val(characters[chid].description); $("#description_textarea").val(characters[chid].description);
$("#creatorcomment_textarea").val(characters[chid].creatorcomment); $("#creator_notes_textarea").val(characters[chid].data?.creator_notes || characters[chid].creatorcomment);
$("#character_version_textarea").val(characters[chid].data?.character_version || '');
$("#system_prompt_textarea").val(characters[chid].data?.system_prompt || '');
$("#post_history_instructions_textarea").val(characters[chid].data?.post_history_instructions || '');
$("#tags_textarea").val(Array.isArray(characters[chid].data?.tags) ? characters[chid].data.tags.join(', ') : '');
$("#creator_textarea").val(characters[chid].data?.creator);
$("#character_version_textarea").val(characters[chid].data?.character_version || '');
$("#personality_textarea").val(characters[chid].personality); $("#personality_textarea").val(characters[chid].personality);
$("#firstmessage_textarea").val(characters[chid].first_mes); $("#firstmessage_textarea").val(characters[chid].first_mes);
$("#scenario_pole").val(characters[chid].scenario); $("#scenario_pole").val(characters[chid].scenario);
$("#talkativeness_slider").val(characters[chid].talkativeness ?? talkativeness_default); $("#talkativeness_slider").val(characters[chid].talkativeness || talkativeness_default);
$("#mes_example_textarea").val(characters[chid].mes_example); $("#mes_example_textarea").val(characters[chid].mes_example);
$("#selected_chat_pole").val(characters[chid].chat); $("#selected_chat_pole").val(characters[chid].chat);
$("#create_date_pole").val(characters[chid].create_date); $("#create_date_pole").val(characters[chid].create_date);
@ -4376,17 +4384,17 @@ function select_rm_create() {
$("#character_popup_text_h3").text("Create character"); $("#character_popup_text_h3").text("Create character");
$("#character_name_pole").val(create_save_name); $("#character_name_pole").val(create_save_name);
$("#description_textarea").val(create_save_description); $("#description_textarea").val(create_save_description);
$("#creatorcomment_textarea").val(create_save_creatorcomment); $("#creator_notes_textarea").val(create_save_creator_notes);
$("#post_history_instructions_textarea").val(create_save_post_history_instructions);
$("#system_prompt_textarea").val(create_save_system_prompt);
$("#tags_textarea").val(create_save_tags);
$("#creator_textarea").val(create_save_creator);
$("#character_version_textarea").val(create_save_character_version);
$("#personality_textarea").val(create_save_personality); $("#personality_textarea").val(create_save_personality);
$("#firstmessage_textarea").val(create_save_first_message); $("#firstmessage_textarea").val(create_save_first_message);
$("#talkativeness_slider").val(create_save_talkativeness); $("#talkativeness_slider").val(create_save_talkativeness);
$("#scenario_pole").val(create_save_scenario); $("#scenario_pole").val(create_save_scenario);
if ($.trim(create_save_mes_example).length == 0) { $("#mes_example_textarea").val(create_save_mes_example.trim().length === 0 ? '<START>' : create_save_mes_example);
$("#mes_example_textarea").val("<START>");
} else {
$("#mes_example_textarea").val(create_save_mes_example);
}
$("#characted_json_data").val(create_save_json_data);
$("#avatar_div").css("display", "flex"); $("#avatar_div").css("display", "flex");
$("#avatar_load_preview").attr("src", default_avatar); $("#avatar_load_preview").attr("src", default_avatar);
$("#renameCharButton").css('display', 'none'); $("#renameCharButton").css('display', 'none');
@ -5620,31 +5628,33 @@ $(document).ready(function () {
contentType: false, contentType: false,
processData: false, processData: false,
success: async function (html) { success: async function (html) {
$("#character_cross").click(); //closes the advanced character editing popup $("#character_cross").trigger('click'); //closes the advanced character editing popup
$("#character_name_pole").val(""); const fields = [
create_save_name = ""; { id: '#character_name_pole', callback: value => create_save_name = value },
$("#description_textarea").val(""); { id: '#description_textarea', callback: value => create_save_description = value },
create_save_description = ""; { id: '#creator_notes_textarea', callback: value => create_save_creator_notes = value },
$("#creatorcomment_textarea").val(""); { id: '#character_version_textarea', callback: value => create_save_character_version = value },
create_save_creatorcomment = ""; { id: '#post_history_instructions_textarea', callback: value => create_save_post_history_instructions = value },
$("#personality_textarea").val(""); { id: '#system_prompt_textarea', callback: value => create_save_system_prompt = value },
create_save_personality = ""; { id: '#tags_textarea', callback: value => create_save_tags = value },
$("#firstmessage_textarea").val(""); { id: '#creator_textarea', callback: value => create_save_creator = value },
create_save_first_message = ""; { id: '#personality_textarea', callback: value => create_save_personality = value },
$("#talkativeness_slider").val(talkativeness_default); { id: '#firstmessage_textarea', callback: value => create_save_first_message = value },
create_save_talkativeness = talkativeness_default; { id: '#talkativeness_slider', callback: value => create_save_talkativeness = value, defaultValue: talkativeness_default },
{ id: '#scenario_pole', callback: value => create_save_scenario = value },
{ id: '#mes_example_textarea', callback: value => create_save_mes_example = value },
{ id: '#character_json_data', callback: () => { } },
];
fields.forEach(field => {
const fieldValue = field.defaultValue !== undefined ? field.defaultValue : '';
$(field.id).val(fieldValue);
field.callback && field.callback(fieldValue);
});
$("#character_popup_text_h3").text("Create character"); $("#character_popup_text_h3").text("Create character");
$("#scenario_pole").val("");
create_save_scenario = "";
$("#mes_example_textarea").val("");
create_save_mes_example = "";
create_save_avatar = ""; create_save_avatar = "";
create_save_json_data = "";
$("#character_json_data").val("");
$("#create_button").removeAttr("disabled"); $("#create_button").removeAttr("disabled");
$("#add_avatar_button").replaceWith( $("#add_avatar_button").replaceWith(
@ -5765,27 +5775,35 @@ $(document).ready(function () {
} }
}); });
$("#description_textarea, #creatorcomment_textarea, #personality_textarea, #scenario_pole, #mes_example_textarea, #firstmessage_textarea") const elementsToUpdate = {
.on("input", function () { '#description_textarea': function() { create_save_description = $("#description_textarea").val(); },
'#creator_notes_textarea': function() { create_save_creator_notes = $("#creator_notes_textarea").val(); },
'#character_version_textarea': function() { create_save_character_version = $("#character_version_textarea").val(); },
'#system_prompt_textarea': function() { create_save_system_prompt = $("#system_prompt_textarea").val(); },
'#post_history_instructions_textarea': function() { create_save_post_history_instructions = $("#post_history_instructions_textarea").val(); },
'#creator_textarea': function() { create_save_creator = $("#creator_textarea").val(); },
'#tags_textarea': function() { create_save_tags = $("#tags_textarea").val(); },
'#personality_textarea': function() { create_save_personality = $("#personality_textarea").val(); },
'#scenario_pole': function() { create_save_scenario = $("#scenario_pole").val(); },
'#mes_example_textarea': function() { create_save_mes_example = $("#mes_example_textarea").val(); },
'#firstmessage_textarea': function() { create_save_first_message = $("#firstmessage_textarea").val(); },
'#talkativeness_slider': function() { create_save_talkativeness = $("#talkativeness_slider").val(); },
};
Object.keys(elementsToUpdate).forEach(function(id) {
$(id).on("input", function() {
if (menu_type == "create") { if (menu_type == "create") {
create_save_description = $("#description_textarea").val(); elementsToUpdate[id]();
create_save_creatorcomment = $("#creatorcomment_textarea").val();
create_save_personality = $("#personality_textarea").val();
create_save_scenario = $("#scenario_pole").val();
create_save_mes_example = $("#mes_example_textarea").val();
create_save_first_message = $("#firstmessage_textarea").val();
create_fav_chara = $("#fav_checkbox").val();
create_save_json_data = $("#character_json_data").val();
} else { } else {
saveCharacterDebounced(); saveCharacterDebounced();
} }
}); });
});
$("#favorite_button").on('click', function () { $("#favorite_button").on('click', function () {
updateFavButtonState(!fav_ch_checked); updateFavButtonState(!fav_ch_checked);
if (menu_type != "create") { if (menu_type != "create") {
saveCharacterDebounced(); saveCharacterDebounced();
} }
}); });
@ -5891,14 +5909,6 @@ $(document).ready(function () {
} }
}); });
$("#talkativeness_slider").on("input", function () {
if (menu_type == "create") {
create_save_talkativeness = $("#talkativeness_slider").val();
} else {
saveCharacterDebounced();
}
});
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
$("#api_button").click(function (e) { $("#api_button").click(function (e) {

View File

@ -686,7 +686,7 @@ function convertToV2(char) {
scenario: char.scenario, scenario: char.scenario,
first_mes: char.first_mes, first_mes: char.first_mes,
mes_example: char.mes_example, mes_example: char.mes_example,
creatorcomment: char.creatorcomment, creator_notes: char.creatorcomment,
talkativeness: char.talkativeness, talkativeness: char.talkativeness,
fav: char.fav, fav: char.fav,
}); });
@ -696,6 +696,40 @@ function convertToV2(char) {
return result; return result;
} }
function readFromV2(char) {
const _ = require('lodash');
if (_.isUndefined(char.data)) {
console.warn('Spec v2 data missing');
return char;
}
const fieldMappings = {
name: 'name',
description: 'description',
personality: 'personality',
scenario: 'scenario',
first_mes: 'first_mes',
mes_example: 'mes_example',
talkativeness: 'extensions.talkativeness',
fav: 'extensions.fav',
};
_.forEach(fieldMappings, (v2Path, charField) => {
//console.log(`Migrating field: ${charField} from ${v2Path}`);
const v2Value = _.get(char.data, v2Path);
if (_.isUndefined(v2Value)) {
console.debug(`Spec v2 data missing for field: ${charField}`);
return;
}
if (!_.isUndefined(char[charField]) && !_.isUndefined(v2Value) && char[charField] !== v2Value) {
console.debug(`Spec v2 data mismatch with Spec v1 for field: ${charField}`);
}
char[charField] = v2Value;
});
return char;
}
//***************** Main functions //***************** Main functions
function charaFormatData(data) { function charaFormatData(data) {
// This is supposed to save all the foreign keys that ST doesn't care about // This is supposed to save all the foreign keys that ST doesn't care about
@ -710,8 +744,8 @@ function charaFormatData(data) {
_.set(char, 'first_mes', data.first_mes); _.set(char, 'first_mes', data.first_mes);
_.set(char, 'mes_example', data.mes_example); _.set(char, 'mes_example', data.mes_example);
// Old ST extension fields (for compatibility, will be deprecated) // Old ST extension fields (for backward compatibility, will be deprecated)
_.set(char, 'creatorcomment', data.creatorcomment); _.set(char, 'creatorcomment', data.creator_notes);
_.set(char, 'avatar', 'none'); _.set(char, 'avatar', 'none');
_.set(char, 'chat', data.ch_name + ' - ' + humanizedISO8601DateTime()); _.set(char, 'chat', data.ch_name + ' - ' + humanizedISO8601DateTime());
_.set(char, 'talkativeness', data.talkativeness); _.set(char, 'talkativeness', data.talkativeness);
@ -729,12 +763,13 @@ function charaFormatData(data) {
_.set(char, 'data.mes_example', data.mes_example); _.set(char, 'data.mes_example', data.mes_example);
// New V2 fields // New V2 fields
_.set(char, 'data.creator_notes', data.creatorcomment); _.set(char, 'data.creator_notes', data.creator_notes);
_.set(char, 'data.system_prompt', data.system_prompt); _.set(char, 'data.system_prompt', data.system_prompt);
_.set(char, 'data.post_history_instructions', data.post_history_instructions); _.set(char, 'data.post_history_instructions', data.post_history_instructions);
_.set(char, 'data.tags', []); _.set(char, 'data.tags', typeof data.tags == 'string' ? (data.tags.split(',').map(x => x.trim()).filter(x => x)) : []);
_.set(char, 'data.creator', data.creator); _.set(char, 'data.creator', data.creator);
_.set(char, 'data.character_version', data.character_version); _.set(char, 'data.character_version', data.character_version);
_.set(char, 'data.alternative_greetings', data.alternate_greetings);
// ST extension fields to V2 object // ST extension fields to V2 object
_.set(char, 'data.extensions.talkativeness', data.talkativeness); _.set(char, 'data.extensions.talkativeness', data.talkativeness);
@ -976,9 +1011,9 @@ app.post("/getcharacters", jsonParser, function (request, response) {
let jsonObject = json5.parse(img_data); let jsonObject = json5.parse(img_data);
if (jsonObject.spec === undefined) { if (jsonObject.spec === undefined) {
//console.log('Old character detected, converting to V2: ' + item);
jsonObject = convertToV2(jsonObject); jsonObject = convertToV2(jsonObject);
//console.log('Conversion complete.', jsonObject); } else {
jsonObject = readFromV2(jsonObject);
} }
jsonObject.avatar = item; jsonObject.avatar = item;
@ -1558,6 +1593,7 @@ app.post("/importcharacter", urlencodedParser, async function (request, response
"create_date": humanizedISO8601DateTime(), "create_date": humanizedISO8601DateTime(),
"talkativeness": jsonData.talkativeness ?? 0.5 "talkativeness": jsonData.talkativeness ?? 0.5
}; };
char = convertToV2(char);
char = JSON.stringify(char); char = JSON.stringify(char);
charaWrite(defaultAvatarPath, char, png_name, response, { file_name: png_name }); charaWrite(defaultAvatarPath, char, png_name, response, { file_name: png_name });
} else if (jsonData.char_name !== undefined) {//json Pygmalion notepad } else if (jsonData.char_name !== undefined) {//json Pygmalion notepad
@ -1577,6 +1613,7 @@ app.post("/importcharacter", urlencodedParser, async function (request, response
"create_date": humanizedISO8601DateTime(), "create_date": humanizedISO8601DateTime(),
"talkativeness": jsonData.talkativeness ?? 0.5 "talkativeness": jsonData.talkativeness ?? 0.5
}; };
char = convertToV2(char);
char = JSON.stringify(char); char = JSON.stringify(char);
charaWrite(defaultAvatarPath, char, png_name, response, { file_name: png_name }); charaWrite(defaultAvatarPath, char, png_name, response, { file_name: png_name });
} else { } else {
@ -1618,6 +1655,7 @@ app.post("/importcharacter", urlencodedParser, async function (request, response
"create_date": humanizedISO8601DateTime(), "create_date": humanizedISO8601DateTime(),
"talkativeness": jsonData.talkativeness ?? 0.5 "talkativeness": jsonData.talkativeness ?? 0.5
}; };
char = convertToV2(char);
char = JSON.stringify(char); char = JSON.stringify(char);
await charaWrite(uploadPath, char, png_name, response, { file_name: png_name }); await charaWrite(uploadPath, char, png_name, response, { file_name: png_name });
} }