mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Tiny steps toward V2 spec
This commit is contained in:
6
package-lock.json
generated
6
package-lock.json
generated
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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-->
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
89
server.js
89
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
|
//***************** 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));
|
||||||
|
Reference in New Issue
Block a user