| 7913 | 7919 | |
| 7914 | 7920 | formData.append('extensions', JSON.stringify(create_save.extensions)); |
| 7915 | 7921 | |
| 7916 | | - await jQuery.ajax({ |
| 7922 | + const fetchResult = await fetch(url, { |
| 7917 | 7923 | typemethod: 'POST', |
| 7918 | 7924 | urlheaders: urlheaders, |
| 7919 | 7925 | databody: formData, |
| 7920 | | - beforeSend: function () { |
| 7926 | + cache: 'no-cache', |
| 7921 | | - $('#create_button').attr('disabled', String(true)); |
| 7927 | + }); |
| 7922 | | - $('#create_button').attr('value', '⏳'); |
| 7923 | | - }, |
| 7924 | | - cache: false, |
| 7925 | | - contentType: false, |
| 7926 | | - processData: false, |
| 7927 | | - success: async function (html) { |
| 7928 | | - $('#character_cross').trigger('click'); //closes the advanced character editing popup |
| 7929 | | - const fields = [ |
| 7930 | | - { id: '#character_name_pole', callback: value => create_save.name = value }, |
| 7931 | | - { id: '#description_textarea', callback: value => create_save.description = value }, |
| 7932 | | - { id: '#creator_notes_textarea', callback: value => create_save.creator_notes = value }, |
| 7933 | | - { id: '#character_version_textarea', callback: value => create_save.character_version = value }, |
| 7934 | | - { id: '#post_history_instructions_textarea', callback: value => create_save.post_history_instructions = value }, |
| 7935 | | - { id: '#system_prompt_textarea', callback: value => create_save.system_prompt = value }, |
| 7936 | | - { id: '#tags_textarea', callback: value => create_save.tags = value }, |
| 7937 | | - { id: '#creator_textarea', callback: value => create_save.creator = value }, |
| 7938 | | - { id: '#personality_textarea', callback: value => create_save.personality = value }, |
| 7939 | | - { id: '#firstmessage_textarea', callback: value => create_save.first_message = value }, |
| 7940 | | - { id: '#talkativeness_slider', callback: value => create_save.talkativeness = value, defaultValue: talkativeness_default }, |
| 7941 | | - { id: '#scenario_pole', callback: value => create_save.scenario = value }, |
| 7942 | | - { id: '#depth_prompt_prompt', callback: value => create_save.depth_prompt_prompt = value }, |
| 7943 | | - { id: '#depth_prompt_depth', callback: value => create_save.depth_prompt_depth = value, defaultValue: depth_prompt_depth_default }, |
| 7944 | | - { id: '#depth_prompt_role', callback: value => create_save.depth_prompt_role = value, defaultValue: depth_prompt_role_default }, |
| 7945 | | - { id: '#mes_example_textarea', callback: value => create_save.mes_example = value }, |
| 7946 | | - { id: '#character_json_data', callback: () => { } }, |
| 7947 | | - { id: '#alternate_greetings_template', callback: value => create_save.alternate_greetings = value, defaultValue: [] }, |
| 7948 | | - { id: '#character_world', callback: value => create_save.world = value }, |
| 7949 | | - { id: '#_character_extensions_fake', callback: value => create_save.extensions = {} }, |
| 7950 | | - ]; |
| 7951 | | - |
| 7952 | | - fields.forEach(field => { |
| 7953 | | - const fieldValue = field.defaultValue !== undefined ? field.defaultValue : ''; |
| 7954 | | - $(field.id).val(fieldValue); |
| 7955 | | - field.callback && field.callback(fieldValue); |
| 7956 | | - }); |
| 7957 | 7928 | |
| 7958 | | - $('#character_popup-button-h3').text('Create character'); |
| 7929 | + if (!fetchResult.ok) { |
| 7930 | + throw new Error('Fetch result is not ok'); |
| 7931 | + } |
| 7932 | + |
| 7933 | + const avatarId = await fetchResult.text(); |
| 7934 | + |
| 7935 | + $('#character_cross').trigger('click'); //closes the advanced character editing popup |
| 7936 | + const fields = [ |
| 7937 | + { id: '#character_name_pole', callback: value => create_save.name = value }, |
| 7938 | + { id: '#description_textarea', callback: value => create_save.description = value }, |
| 7939 | + { id: '#creator_notes_textarea', callback: value => create_save.creator_notes = value }, |
| 7940 | + { id: '#character_version_textarea', callback: value => create_save.character_version = value }, |
| 7941 | + { id: '#post_history_instructions_textarea', callback: value => create_save.post_history_instructions = value }, |
| 7942 | + { id: '#system_prompt_textarea', callback: value => create_save.system_prompt = value }, |
| 7943 | + { id: '#tags_textarea', callback: value => create_save.tags = value }, |
| 7944 | + { id: '#creator_textarea', callback: value => create_save.creator = value }, |
| 7945 | + { id: '#personality_textarea', callback: value => create_save.personality = value }, |
| 7946 | + { id: '#firstmessage_textarea', callback: value => create_save.first_message = value }, |
| 7947 | + { id: '#talkativeness_slider', callback: value => create_save.talkativeness = value, defaultValue: talkativeness_default }, |
| 7948 | + { id: '#scenario_pole', callback: value => create_save.scenario = value }, |
| 7949 | + { id: '#depth_prompt_prompt', callback: value => create_save.depth_prompt_prompt = value }, |
| 7950 | + { id: '#depth_prompt_depth', callback: value => create_save.depth_prompt_depth = value, defaultValue: depth_prompt_depth_default }, |
| 7951 | + { id: '#depth_prompt_role', callback: value => create_save.depth_prompt_role = value, defaultValue: depth_prompt_role_default }, |
| 7952 | + { id: '#mes_example_textarea', callback: value => create_save.mes_example = value }, |
| 7953 | + { id: '#character_json_data', callback: () => { } }, |
| 7954 | + { id: '#alternate_greetings_template', callback: value => create_save.alternate_greetings = value, defaultValue: [] }, |
| 7955 | + { id: '#character_world', callback: value => create_save.world = value }, |
| 7956 | + { id: '#_character_extensions_fake', callback: value => create_save.extensions = {} }, |
| 7957 | + ]; |
| 7958 | + |
| 7959 | + fields.forEach(field => { |
| 7960 | + const fieldValue = field.defaultValue !== undefined ? field.defaultValue : ''; |
| 7961 | + $(field.id).val(fieldValue); |
| 7962 | + field.callback && field.callback(fieldValue); |
| 7963 | + }); |
| 7959 | 7964 | |
| 7960 | | - create_save.avatar = ''; |
| 7965 | + $('#character_popup-button-h3').text('Create character'); |
| 7961 | 7966 | |
| 7962 | | - $('#create_button').removeAttr('disabled'); |
| 7967 | + create_save.avatar = ''; |
| 7963 | | - $('#add_avatar_button').replaceWith( |
| 7964 | | - $('#add_avatar_button').val('').clone(true), |
| 7965 | | - ); |
| 7966 | 7968 | |
| 7967 | 7969 | $('#create_buttonadd_avatar_button').attrreplaceWith('value', '✅'); |
| 7968 | | - let oldSelectedChar = null; |
| 7970 | + $('#add_avatar_button').val('').clone(true), |
| 7969 | | - if (this_chid !== undefined) { |
| 7971 | + ); |
| 7970 | | - oldSelectedChar = characters[this_chid].avatar; |
| 7971 | | - } |
| 7972 | 7972 | |
| 7973 | | - console.log(`new avatar id: ${html}`); |
| 7973 | + let oldSelectedChar = null; |
| 7974 | | - createTagMapFromList('#tagList', html); |
| 7974 | + if (this_chid !== undefined) { |
| 7975 | | - await getCharacters(); |
| 7975 | + oldSelectedChar = characters[this_chid].avatar; |
| 7976 | + } |
| 7976 | 7977 | |
| 7977 | | - select_rm_info('char_create', html, oldSelectedChar); |
| 7978 | + console.log(`new avatar id: ${avatarId}`); |
| 7979 | + createTagMapFromList('#tagList', avatarId); |
| 7980 | + await getCharacters(); |
| 7978 | 7981 | |
| 7979 | | - crop_data = undefined; |
| 7982 | + select_rm_info('char_create', avatarId, oldSelectedChar); |
| 7980 | | - }, |
| 7983 | + |
| 7981 | | - error: function (jqXHR, exception) { |
| 7984 | + crop_data = undefined; |
| 7982 | | - $('#create_button').removeAttr('disabled'); |
| 7985 | + |
| 7983 | | - }, |
| 7986 | + } catch (error) { |
| 7984 | | - }); |
| 7987 | + console.error('Error creating character', error); |
| 7985 | | - } else { |
| 7988 | + toastr.error('Failed to create character'); |
| 7986 | | - toastr.error('Name is required'); |
| 7987 | 7989 | } |
| 7988 | 7990 | } else { |
| 7989 | | - let url = '/api/characters/edit'; |
| 7991 | + try { |
| 7992 | + let url = '/api/characters/edit'; |
| 7990 | 7993 | |
| 7991 | 7994 | if (crop_data != undefined) { |
| 7992 | 7995 | url += `?crop=${encodeURIComponent(JSON.stringify(crop_data))}`; |
| 7993 | 7996 | } |
| 7994 | 7997 | |
| 7995 | 7998 | formData.delete('alternate_greetings'); |
| 7996 | 7999 | const chid = $('.open_alternate_greetings').data('chid'); |
| 7997 | 8000 | if (chid && Array.isArray(characters[chid]?.data?.alternate_greetings)) { |
| 7998 | 8001 | for (const value of characters[chid].data.alternate_greetings) { |
| 7999 | 8002 | formData.append('alternate_greetings', value); |
| 8003 | + } |
| 8000 | 8004 | } |
| 8001 | | - } |
| 8002 | 8005 | |
| 8003 | | - await jQuery.ajax({ |
| 8006 | + const fetchResult = await fetch(url, { |
| 8004 | 8007 | type method: 'POST', |
| 8005 | 8008 | url headers: urlheaders, |
| 8006 | 8009 | data body: formData, |
| 8007 | | - beforeSend: function () { |
| 8010 | + cache: 'no-cache', |
| 8008 | | - $('#create_button').attr('disabled', String(true)); |
| 8011 | + }); |
| 8009 | | - $('#create_button').attr('value', 'Save'); |
| 8010 | | - }, |
| 8011 | | - cache: false, |
| 8012 | | - contentType: false, |
| 8013 | | - processData: false, |
| 8014 | | - success: async function (html) { |
| 8015 | | - $('#create_button').removeAttr('disabled'); |
| 8016 | 8012 | |
| 8017 | | - await getOneCharacter(formData.get('avatar_url')); |
| 8013 | + if (!fetchResult.ok) { |
| 8018 | | - favsToHotswap(); // Update fav state |
| 8014 | + throw new Error('Fetch result is not ok'); |
| 8015 | + } |
| 8019 | 8016 | |
| 8020 | | - $('#add_avatar_button').replaceWith( |
| 8017 | + await getOneCharacter(formData.get('avatar_url')); |
| 8021 | | - $('#add_avatar_button').val('').clone(true), |
| 8018 | + favsToHotswap(); // Update fav state |
| 8022 | | - ); |
| 8019 | + |
| 8023 | 8020 | $('#create_buttonadd_avatar_button').attrreplaceWith('value', 'Save'); |
| 8024 | | - crop_data = undefined; |
| 8021 | + $('#add_avatar_button').val('').clone(true), |
| 8025 | | - eventSource.emit(event_types.CHARACTER_EDITED, { detail: { id: this_chid, character: characters[this_chid] } }); |
| 8022 | + ); |
| 8026 | | - |
| 8023 | + $('#create_button').attr('value', 'Save'); |
| 8027 | | - // Recreate the chat if it hasn't been used at least once (i.e. with continue). |
| 8024 | + crop_data = undefined; |
| 8028 | | - const message = getFirstMessage(); |
| 8025 | + await eventSource.emit(event_types.CHARACTER_EDITED, { detail: { id: this_chid, character: characters[this_chid] } }); |
| 8029 | | - const shouldRegenerateMessage = |
| 8026 | + |
| 8030 | | - !isNewChat && |
| 8027 | + // Recreate the chat if it hasn't been used at least once (i.e. with continue). |
| 8031 | | - message.mes && |
| 8028 | + const message = getFirstMessage(); |
| 8032 | | - !selected_group && |
| 8029 | + const shouldRegenerateMessage = |
| 8033 | | - !chat_metadata['tainted'] && |
| 8030 | + !isNewChat && |
| 8034 | | - (chat.length === 0 || (chat.length === 1 && !chat[0].is_user && !chat[0].is_system)); |
| 8031 | + message.mes && |
| 8035 | | - |
| 8032 | + !selected_group && |
| 8036 | | - if (shouldRegenerateMessage) { |
| 8033 | + !chat_metadata['tainted'] && |
| 8037 | | - chat.splice(0, chat.length, message); |
| 8034 | + (chat.length === 0 || (chat.length === 1 && !chat[0].is_user && !chat[0].is_system)); |
| 8038 | | - const messageId = (chat.length - 1); |
| 8035 | + |
| 8039 | | - await eventSource.emit(event_types.MESSAGE_RECEIVED, messageId); |
| 8036 | + if (shouldRegenerateMessage) { |
| 8040 | | - await clearChat(); |
| 8037 | + chat.splice(0, chat.length, message); |
| 8041 | | - await printMessages(); |
| 8038 | + const messageId = (chat.length - 1); |
| 8042 | 8039 | await eventSource.emit(event_types.CHARACTER_MESSAGE_RENDEREDMESSAGE_RECEIVED, messageId); |
| 8043 | 8040 | await saveChatConditionalclearChat(); |
| 8044 | | - } |
| 8041 | + await printMessages(); |
| 8045 | | - }, |
| 8042 | + await eventSource.emit(event_types.CHARACTER_MESSAGE_RENDERED, messageId); |
| 8046 | | - error: function (jqXHR, exception) { |
| 8043 | + await saveChatConditional(); |
| 8047 | | - $('#create_button').removeAttr('disabled'); |
| 8044 | + } |
| 8048 | | - console.log('Error! Either a file with the same name already existed, or the image file provided was in an invalid format. Double check that the image is not a webp.'); |
| 8045 | + } catch (error) { |
| 8049 | | - toastr.error('Something went wrong while saving the character, or the image file provided was in an invalid format. Double check that the image is not a webp.'); |
| 8046 | + console.log(error); |
| 8050 | | - }, |
| 8047 | + toastr.error('Something went wrong while saving the character, or the image file provided was in an invalid format. Double check that the image is not a webp.'); |
| 8051 | 8048 | }); |
| 8052 | 8049 | } |
| 8053 | 8050 | } |
| 8054 | 8051 | |