Tiny steps toward V2 spec

This commit is contained in:
SillyLossy
2023-05-31 22:13:09 +03:00
parent ef90c31643
commit 264b8a3162
6 changed files with 94 additions and 42 deletions

6
package-lock.json generated
View File

@ -26,6 +26,7 @@
"jimp": "^0.22.7", "jimp": "^0.22.7",
"jquery": "^3.6.4", "jquery": "^3.6.4",
"json5": "^2.2.3", "json5": "^2.2.3",
"lodash": "^4.17.21",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"node-fetch": "^2.6.11", "node-fetch": "^2.6.11",
@ -1865,6 +1866,11 @@
"xtend": "^4.0.0" "xtend": "^4.0.0"
} }
}, },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lru-cache": { "node_modules/lru-cache": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",

View File

@ -17,6 +17,7 @@
"jimp": "^0.22.7", "jimp": "^0.22.7",
"jquery": "^3.6.4", "jquery": "^3.6.4",
"json5": "^2.2.3", "json5": "^2.2.3",
"lodash": "^4.17.21",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"node-fetch": "^2.6.11", "node-fetch": "^2.6.11",

View File

@ -2138,18 +2138,11 @@
<!-- these divs are invisible and used for server communication purposes --> <!-- these divs are invisible and used for server communication purposes -->
<div id="hidden-divs"> <div id="hidden-divs">
<div id="avatar_url_div"> <input id="character_json_data" name="json_data" type="hidden">
<input id="avatar_url_pole" name="avatar_url" class="text_pole" maxlength="999" size="2" value="" autocomplete="off"> <input id="avatar_url_pole" name="avatar_url" type="hidden">
</div> <input id="selected_chat_pole" name="chat" type="hidden">
<div id="selected_chat_div"> <input id="create_date_pole" name="create_date" type="hidden">
<input id="selected_chat_pole" name="chat" class="text_pole" maxlength="999" size="2" value="" autocomplete="off"> <input id="last_mes_pole" name="last_mes" type="hidden">
</div>
<div id="create_date_div">
<input id="create_date_pole" name="create_date" class="text_pole" maxlength="999" size="2" value="" autocomplete="off">
</div>
<div id="last_mes_div">
<input id="last_mes_pole" name="last_mes" class="text_pole" maxlength="999" size="2" value="" autocomplete="off">
</div>
</div> </div>
<!-- now back to normal divs for display purposes--> <!-- now back to normal divs for display purposes-->

View File

@ -544,6 +544,7 @@ var create_save_avatar = "";
var create_save_scenario = ""; var create_save_scenario = "";
var create_save_mes_example = ""; var create_save_mes_example = "";
var create_save_talkativeness = talkativeness_default; var create_save_talkativeness = talkativeness_default;
var create_save_json_data = "";
//animation right menu //animation right menu
var animation_duration = 250; var animation_duration = 250;
@ -4317,6 +4318,7 @@ export function select_selected_character(chid) {
$("#avatar_url_pole").val(characters[chid].avatar); $("#avatar_url_pole").val(characters[chid].avatar);
$("#chat_import_avatar_url").val(characters[chid].avatar); $("#chat_import_avatar_url").val(characters[chid].avatar);
$("#chat_import_character_name").val(characters[chid].name); $("#chat_import_character_name").val(characters[chid].name);
$("#character_json_data").val(characters[chid].json_data);
let this_avatar = default_avatar; let this_avatar = default_avatar;
if (characters[chid].avatar != "none") { if (characters[chid].avatar != "none") {
this_avatar = getThumbnailUrl('avatar', characters[chid].avatar); this_avatar = getThumbnailUrl('avatar', characters[chid].avatar);
@ -4370,6 +4372,7 @@ function select_rm_create() {
} else { } else {
$("#mes_example_textarea").val(create_save_mes_example); $("#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');
@ -5619,6 +5622,9 @@ $(document).ready(function () {
create_save_mes_example = ""; 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(
@ -5749,6 +5755,7 @@ $(document).ready(function () {
create_save_mes_example = $("#mes_example_textarea").val(); create_save_mes_example = $("#mes_example_textarea").val();
create_save_first_message = $("#firstmessage_textarea").val(); create_save_first_message = $("#firstmessage_textarea").val();
create_fav_chara = $("#fav_checkbox").val(); create_fav_chara = $("#fav_checkbox").val();
create_save_json_data = $("#character_json_data").val();
} else { } else {
saveCharacterDebounced(); saveCharacterDebounced();
} }

View File

@ -1329,22 +1329,6 @@ input[type=search]:focus::-webkit-search-cancel-button {
width: unset; width: unset;
} }
#avatar_url_div {
display: none;
}
#selected_chat_div {
display: none;
}
#create_date_div {
display: none;
}
#last_mes_div {
display: none;
}
/*LEFT SIDE BG MENU*/ /*LEFT SIDE BG MENU*/
#logo_block { #logo_block {

View File

@ -674,22 +674,76 @@ function tryParse(str) {
} }
} }
function convertToV2(char) {
// Simulate incoming data from frontend form
const result = charaFormatData({
json_data: JSON.stringify(char),
ch_name: char.name,
description: char.description,
personality: char.personality,
scenario: char.scenario,
first_mes: char.first_mes,
mes_example: char.mes_example,
creatorcomment: char.creatorcomment,
talkativeness: char.talkativeness,
fav: char.fav,
});
result.chat = char.chat;
result.create_date = char.create_date;
return result;
}
//***************** Main functions //***************** Main functions
function charaFormatData(data) { function charaFormatData(data) {
var char = { // This is supposed to save all the foreign keys that ST doesn't care about
"name": data.ch_name, const _ = require('lodash');
"description": data.description, const char = tryParse(data.json_data) || {};
"creatorcomment": data.creatorcomment,
"personality": data.personality, // Spec V1 fields
"first_mes": data.first_mes, _.set(char, 'name', data.ch_name);
"avatar": 'none', "chat": data.ch_name + ' - ' + humanizedISO8601DateTime(), _.set(char, 'description', data.description);
"mes_example": data.mes_example, _.set(char, 'personality', data.personality);
"scenario": data.scenario, _.set(char, 'scenario', data.scenario);
"create_date": humanizedISO8601DateTime(), _.set(char, 'first_mes', data.first_mes);
"talkativeness": data.talkativeness, _.set(char, 'mes_example', data.mes_example);
"fav": data.fav
}; // Old ST extension fields (for compatibility, will be deprecated)
_.set(char, 'creatorcomment', data.creatorcomment);
_.set(char, 'avatar', 'none');
_.set(char, 'chat', data.ch_name + ' - ' + humanizedISO8601DateTime());
_.set(char, 'talkativeness', data.talkativeness);
_.set(char, 'fav', data.fav);
_.set(char, 'create_date', humanizedISO8601DateTime());
// Spec V2 fields
_.set(char, 'spec', 'chara_card_v2');
_.set(char, 'spec_version', '2.0');
_.set(char, 'data.name', data.ch_name);
_.set(char, 'data.description', data.description);
_.set(char, 'data.personality', data.personality);
_.set(char, 'data.scenario', data.scenario);
_.set(char, 'data.first_mes', data.first_mes);
_.set(char, 'data.mes_example', data.mes_example);
// New V2 fields
_.set(char, 'data.creator_notes', data.creatorcomment);
_.set(char, 'data.system_prompt', data.system_prompt);
_.set(char, 'data.post_history_instructions', data.post_history_instructions);
_.set(char, 'data.tags', []);
_.set(char, 'data.creator', data.creator);
_.set(char, 'data.character_version', data.character_version);
// ST extension fields to V2 object
_.set(char, 'data.extensions.talkativeness', data.talkativeness);
_.set(char, 'data.extensions.fav', data.fav);
//_.set(char, 'data.extensions.create_date', humanizedISO8601DateTime());
//_.set(char, 'data.extensions.avatar', 'none');
//_.set(char, 'data.extensions.chat', data.ch_name + ' - ' + humanizedISO8601DateTime());
// TODO: Character book
_.set(char, 'data.character_book', undefined);
return char; return char;
} }
@ -918,10 +972,17 @@ app.post("/getcharacters", jsonParser, function (request, response) {
try { try {
var img_data = await charaRead(charactersPath + item); var img_data = await charaRead(charactersPath + item);
let jsonObject = json5.parse(img_data); let jsonObject = json5.parse(img_data);
if (jsonObject.spec === undefined) {
//console.log('Old character detected, converting to V2: ' + item);
jsonObject = convertToV2(jsonObject);
//console.log('Conversion complete.', jsonObject);
}
jsonObject.avatar = item; jsonObject.avatar = item;
//console.log(jsonObject);
characters[i] = {}; characters[i] = {};
characters[i] = jsonObject; characters[i] = jsonObject;
characters[i]['json_data'] = img_data;
try { try {
const charStat = fs.statSync(path.join(charactersPath, item)); const charStat = fs.statSync(path.join(charactersPath, item));