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