From 264b8a316263a9169b698f2087d161ac54d2ba84 Mon Sep 17 00:00:00 2001 From: SillyLossy Date: Wed, 31 May 2023 22:13:09 +0300 Subject: [PATCH] Tiny steps toward V2 spec --- package-lock.json | 6 ++++ package.json | 1 + public/index.html | 17 +++------ public/script.js | 7 ++++ public/style.css | 16 --------- server.js | 89 +++++++++++++++++++++++++++++++++++++++-------- 6 files changed, 94 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a7a23223..5589bf203 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "jimp": "^0.22.7", "jquery": "^3.6.4", "json5": "^2.2.3", + "lodash": "^4.17.21", "mime-types": "^2.1.35", "multer": "^1.4.5-lts.1", "node-fetch": "^2.6.11", @@ -1865,6 +1866,11 @@ "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": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", diff --git a/package.json b/package.json index 60ac015cb..7630a0214 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "jimp": "^0.22.7", "jquery": "^3.6.4", "json5": "^2.2.3", + "lodash": "^4.17.21", "mime-types": "^2.1.35", "multer": "^1.4.5-lts.1", "node-fetch": "^2.6.11", diff --git a/public/index.html b/public/index.html index 0ef31e641..9cc57bbc7 100644 --- a/public/index.html +++ b/public/index.html @@ -2138,18 +2138,11 @@
-
- -
-
- -
-
- -
-
- -
+ + + + +
diff --git a/public/script.js b/public/script.js index fd33d2c1d..aa046019e 100644 --- a/public/script.js +++ b/public/script.js @@ -544,6 +544,7 @@ var create_save_avatar = ""; var create_save_scenario = ""; var create_save_mes_example = ""; var create_save_talkativeness = talkativeness_default; +var create_save_json_data = ""; //animation right menu var animation_duration = 250; @@ -4317,6 +4318,7 @@ export function select_selected_character(chid) { $("#avatar_url_pole").val(characters[chid].avatar); $("#chat_import_avatar_url").val(characters[chid].avatar); $("#chat_import_character_name").val(characters[chid].name); + $("#character_json_data").val(characters[chid].json_data); let this_avatar = default_avatar; if (characters[chid].avatar != "none") { this_avatar = getThumbnailUrl('avatar', characters[chid].avatar); @@ -4370,6 +4372,7 @@ function select_rm_create() { } else { $("#mes_example_textarea").val(create_save_mes_example); } + $("#characted_json_data").val(create_save_json_data); $("#avatar_div").css("display", "flex"); $("#avatar_load_preview").attr("src", default_avatar); $("#renameCharButton").css('display', 'none'); @@ -5619,6 +5622,9 @@ $(document).ready(function () { create_save_mes_example = ""; create_save_avatar = ""; + create_save_json_data = ""; + + $("#character_json_data").val(""); $("#create_button").removeAttr("disabled"); $("#add_avatar_button").replaceWith( @@ -5749,6 +5755,7 @@ $(document).ready(function () { 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 { saveCharacterDebounced(); } diff --git a/public/style.css b/public/style.css index c91244cfe..2c667baef 100644 --- a/public/style.css +++ b/public/style.css @@ -1329,22 +1329,6 @@ input[type=search]:focus::-webkit-search-cancel-button { 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*/ #logo_block { diff --git a/server.js b/server.js index 028759ce3..fa52ae996 100644 --- a/server.js +++ b/server.js @@ -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 function charaFormatData(data) { - var char = { - "name": data.ch_name, - "description": data.description, - "creatorcomment": data.creatorcomment, - "personality": data.personality, - "first_mes": data.first_mes, - "avatar": 'none', "chat": data.ch_name + ' - ' + humanizedISO8601DateTime(), - "mes_example": data.mes_example, - "scenario": data.scenario, - "create_date": humanizedISO8601DateTime(), - "talkativeness": data.talkativeness, - "fav": data.fav - }; + // This is supposed to save all the foreign keys that ST doesn't care about + const _ = require('lodash'); + const char = tryParse(data.json_data) || {}; + + // Spec V1 fields + _.set(char, 'name', data.ch_name); + _.set(char, 'description', data.description); + _.set(char, 'personality', data.personality); + _.set(char, 'scenario', data.scenario); + _.set(char, 'first_mes', data.first_mes); + _.set(char, 'mes_example', data.mes_example); + + // 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; } @@ -918,10 +972,17 @@ app.post("/getcharacters", jsonParser, function (request, response) { try { var img_data = await charaRead(charactersPath + item); 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; - //console.log(jsonObject); characters[i] = {}; characters[i] = jsonObject; + characters[i]['json_data'] = img_data; try { const charStat = fs.statSync(path.join(charactersPath, item));