From ac0f96e7852a217158d91ae8cca48531f86e1d2f Mon Sep 17 00:00:00 2001 From: missionfloyd Date: Thu, 29 Jun 2023 11:56:25 -0600 Subject: [PATCH] Some more character import tweaks. (#2921) --- modules/chat.py | 23 +++++++++++++++-------- server.py | 25 ++++++++++++++++--------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/modules/chat.py b/modules/chat.py index 4329f673..c5d8a36f 100644 --- a/modules/chat.py +++ b/modules/chat.py @@ -1,16 +1,17 @@ import base64 import copy import functools -import io import json import re from datetime import datetime from pathlib import Path +import gradio as gr import yaml from PIL import Image import modules.shared as shared +from modules import utils from modules.extensions import apply_extensions from modules.html_generator import chat_html_wrapper, make_thumbnail from modules.logging_colors import logger @@ -567,16 +568,22 @@ def upload_character(json_file, img, tavern=False): img.save(Path(f'characters/{outfile_name}.png')) logger.info(f'New character saved to "characters/{outfile_name}.json".') - return outfile_name + return gr.update(value=outfile_name, choices=utils.get_available_characters()) -def upload_tavern_character(img, name1, name2): - _img = Image.open(io.BytesIO(img)) - _img.getexif() - decoded_string = base64.b64decode(_img.info['chara']) - _json = json.loads(decoded_string) +def upload_tavern_character(img, _json): _json = {"char_name": _json['name'], "char_persona": _json['description'], "char_greeting": _json["first_mes"], "example_dialogue": _json['mes_example'], "world_scenario": _json['scenario']} - return upload_character(json.dumps(_json), _img, tavern=True) + return upload_character(json.dumps(_json), img, tavern=True) + + +def check_tavern_character(img): + if "chara" not in img.info: + return "Not a TavernAI card", None, None, gr.update(interactive=False) + decoded_string = base64.b64decode(img.info['chara']) + _json = json.loads(decoded_string) + if "data" in _json: + _json = _json["data"] + return _json['name'], _json['description'], _json, gr.update(interactive=True) def upload_your_profile_picture(img): diff --git a/server.py b/server.py index 80198e3a..bf4e74b3 100644 --- a/server.py +++ b/server.py @@ -630,11 +630,18 @@ def create_interface(): shared.gradio['upload_json'] = gr.File(type='binary', file_types=['.json'], label='JSON File') shared.gradio['upload_img_bot'] = gr.Image(type='pil', label='Profile Picture (optional)') - shared.gradio['Upload character'] = gr.Button(value='Submit', interactive=False) + shared.gradio['Submit character'] = gr.Button(value='Submit', interactive=False) with gr.Tab('TavernAI'): - shared.gradio['upload_img_tavern'] = gr.File(type='binary', file_types=['image'], label='TavernAI PNG File') - shared.gradio['Upload tavern character'] = gr.Button(value='Submit', interactive=False) + with gr.Row(): + with gr.Column(): + shared.gradio['upload_img_tavern'] = gr.Image(type='pil', label='TavernAI PNG File', elem_id="upload_img_tavern") + shared.gradio['tavern_json'] = gr.State() + with gr.Column(): + shared.gradio['tavern_name'] = gr.Textbox(value='', lines=1, label='Name', interactive=False) + shared.gradio['tavern_desc'] = gr.Textbox(value='', lines=4, max_lines=4, label='Description', interactive=False) + + shared.gradio['Submit tavern character'] = gr.Button(value='Submit', interactive=False) with gr.Tab("Parameters", elem_id="parameters"): create_settings_menus(default_preset) @@ -876,17 +883,17 @@ def create_interface(): lambda: gr.update(visible=True), None, shared.gradio['file_deleter']) shared.gradio['download_button'].click(lambda x: chat.save_history(x, timestamp=True, user_request=True), shared.gradio['mode'], shared.gradio['download']) - shared.gradio['Upload character'].click(chat.upload_character, [shared.gradio['upload_json'], shared.gradio['upload_img_bot']], [shared.gradio['character_menu']]) - shared.gradio['upload_json'].upload(lambda: gr.update(interactive=True), None, [shared.gradio['Upload character']]) - shared.gradio['upload_json'].clear(lambda: gr.update(interactive=False), None, [shared.gradio['Upload character']]) + shared.gradio['Submit character'].click(chat.upload_character, [shared.gradio['upload_json'], shared.gradio['upload_img_bot']], [shared.gradio['character_menu']]) + shared.gradio['upload_json'].upload(lambda: gr.update(interactive=True), None, [shared.gradio['Submit character']]) + shared.gradio['upload_json'].clear(lambda: gr.update(interactive=False), None, [shared.gradio['Submit character']]) shared.gradio['character_menu'].change( partial(chat.load_character, instruct=False), [shared.gradio[k] for k in ['character_menu', 'name1', 'name2']], [shared.gradio[k] for k in ['name1', 'name2', 'character_picture', 'greeting', 'context', 'dummy']]).then( chat.redraw_html, shared.reload_inputs, shared.gradio['display']) - shared.gradio['Upload tavern character'].click(chat.upload_tavern_character, [shared.gradio['upload_img_tavern'], shared.gradio['name1'], shared.gradio['name2']], [shared.gradio['character_menu']]) - shared.gradio['upload_img_tavern'].upload(lambda: gr.update(interactive=True), None, [shared.gradio['Upload tavern character']]) - shared.gradio['upload_img_tavern'].clear(lambda: gr.update(interactive=False), None, [shared.gradio['Upload tavern character']]) + shared.gradio['Submit tavern character'].click(chat.upload_tavern_character, [shared.gradio['upload_img_tavern'], shared.gradio['tavern_json']], [shared.gradio['character_menu']]) + shared.gradio['upload_img_tavern'].upload(chat.check_tavern_character, shared.gradio['upload_img_tavern'], [shared.gradio[k] for k in ['tavern_name', 'tavern_desc', 'tavern_json', 'Submit tavern character']], show_progress=False) + shared.gradio['upload_img_tavern'].clear(lambda: (None, None, None, gr.update(interactive=False)), None, [shared.gradio[k] for k in ['tavern_name', 'tavern_desc', 'tavern_json', 'Submit tavern character']], show_progress=False) shared.gradio['your_picture'].change( chat.upload_your_profile_picture, shared.gradio['your_picture'], None).then( partial(chat.redraw_html, reset_cache=True), shared.reload_inputs, shared.gradio['display'])