mirror of
https://github.com/oobabooga/text-generation-webui.git
synced 2024-11-25 09:19:23 +01:00
UI: Add a new "User description" field for user personality/biography (#5691)
This commit is contained in:
parent
63701f59cf
commit
28076928ac
@ -103,10 +103,11 @@ class ChatCompletionRequestParams(BaseModel):
|
|||||||
instruction_template_str: str | None = Field(default=None, description="A Jinja2 instruction template. If set, will take precedence over everything else.")
|
instruction_template_str: str | None = Field(default=None, description="A Jinja2 instruction template. If set, will take precedence over everything else.")
|
||||||
|
|
||||||
character: str | None = Field(default=None, description="A character defined under text-generation-webui/characters. If not set, the default \"Assistant\" character will be used.")
|
character: str | None = Field(default=None, description="A character defined under text-generation-webui/characters. If not set, the default \"Assistant\" character will be used.")
|
||||||
user_name: str | None = Field(default=None, description="Your name (the user). By default, it's \"You\".", alias="name1")
|
|
||||||
bot_name: str | None = Field(default=None, description="Overwrites the value set by character field.", alias="name2")
|
bot_name: str | None = Field(default=None, description="Overwrites the value set by character field.", alias="name2")
|
||||||
context: str | None = Field(default=None, description="Overwrites the value set by character field.")
|
context: str | None = Field(default=None, description="Overwrites the value set by character field.")
|
||||||
greeting: str | None = Field(default=None, description="Overwrites the value set by character field.")
|
greeting: str | None = Field(default=None, description="Overwrites the value set by character field.")
|
||||||
|
user_name: str | None = Field(default=None, description="Your name (the user). By default, it's \"You\".", alias="name1")
|
||||||
|
user_bio: str | None = Field(default=None, description="The user description/personality.")
|
||||||
chat_template_str: str | None = Field(default=None, description="Jinja2 template for chat.")
|
chat_template_str: str | None = Field(default=None, description="Jinja2 template for chat.")
|
||||||
|
|
||||||
chat_instruct_command: str | None = None
|
chat_instruct_command: str | None = None
|
||||||
|
@ -86,10 +86,16 @@ def generate_chat_prompt(user_input, state, **kwargs):
|
|||||||
if state['mode'] != 'instruct':
|
if state['mode'] != 'instruct':
|
||||||
chat_template_str = replace_character_names(chat_template_str, state['name1'], state['name2'])
|
chat_template_str = replace_character_names(chat_template_str, state['name1'], state['name2'])
|
||||||
|
|
||||||
chat_template = jinja_env.from_string(chat_template_str)
|
|
||||||
instruction_template = jinja_env.from_string(state['instruction_template_str'])
|
instruction_template = jinja_env.from_string(state['instruction_template_str'])
|
||||||
chat_renderer = partial(chat_template.render, add_generation_prompt=False, name1=state['name1'], name2=state['name2'])
|
|
||||||
instruct_renderer = partial(instruction_template.render, add_generation_prompt=False)
|
instruct_renderer = partial(instruction_template.render, add_generation_prompt=False)
|
||||||
|
chat_template = jinja_env.from_string(chat_template_str)
|
||||||
|
chat_renderer = partial(
|
||||||
|
chat_template.render,
|
||||||
|
add_generation_prompt=False,
|
||||||
|
name1=state['name1'],
|
||||||
|
name2=state['name2'],
|
||||||
|
user_bio=replace_character_names(state['user_bio'], state['name1'], state['name2']),
|
||||||
|
)
|
||||||
|
|
||||||
messages = []
|
messages = []
|
||||||
|
|
||||||
@ -99,7 +105,7 @@ def generate_chat_prompt(user_input, state, **kwargs):
|
|||||||
messages.append({"role": "system", "content": state['custom_system_message']})
|
messages.append({"role": "system", "content": state['custom_system_message']})
|
||||||
else:
|
else:
|
||||||
renderer = chat_renderer
|
renderer = chat_renderer
|
||||||
if state['context'].strip() != '':
|
if state['context'].strip() != '' or state['user_bio'].strip() != '':
|
||||||
context = replace_character_names(state['context'], state['name1'], state['name2'])
|
context = replace_character_names(state['context'], state['name1'], state['name2'])
|
||||||
messages.append({"role": "system", "content": context})
|
messages.append({"role": "system", "content": context})
|
||||||
|
|
||||||
@ -140,6 +146,7 @@ def generate_chat_prompt(user_input, state, **kwargs):
|
|||||||
command = state['chat-instruct_command']
|
command = state['chat-instruct_command']
|
||||||
command = command.replace('<|character|>', state['name2'] if not impersonate else state['name1'])
|
command = command.replace('<|character|>', state['name2'] if not impersonate else state['name1'])
|
||||||
command = command.replace('<|prompt|>', prompt)
|
command = command.replace('<|prompt|>', prompt)
|
||||||
|
command = replace_character_names(command, state['name1'], state['name2'])
|
||||||
|
|
||||||
if _continue:
|
if _continue:
|
||||||
prefix = get_generation_prompt(renderer, impersonate=impersonate, strip_trailing_spaces=False)[0]
|
prefix = get_generation_prompt(renderer, impersonate=impersonate, strip_trailing_spaces=False)[0]
|
||||||
|
@ -57,9 +57,10 @@ settings = {
|
|||||||
'stream': True,
|
'stream': True,
|
||||||
'character': 'Assistant',
|
'character': 'Assistant',
|
||||||
'name1': 'You',
|
'name1': 'You',
|
||||||
|
'user_bio': '',
|
||||||
'custom_system_message': '',
|
'custom_system_message': '',
|
||||||
'instruction_template_str': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}",
|
'instruction_template_str': "{%- set ns = namespace(found=false) -%}\n{%- for message in messages -%}\n {%- if message['role'] == 'system' -%}\n {%- set ns.found = true -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if not ns.found -%}\n {{- '' + 'Below is an instruction that describes a task. Write a response that appropriately completes the request.' + '\\n\\n' -}}\n{%- endif %}\n{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- '' + message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{-'### Instruction:\\n' + message['content'] + '\\n\\n'-}}\n {%- else -%}\n {{-'### Response:\\n' + message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{-'### Response:\\n'-}}\n{%- endif -%}",
|
||||||
'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}",
|
'chat_template_str': "{%- for message in messages %}\n {%- if message['role'] == 'system' -%}\n {%- if message['content'] -%}\n {{- message['content'] + '\\n\\n' -}}\n {%- endif -%}\n {%- if user_bio -%}\n {{- user_bio + '\\n\\n' -}}\n {%- endif -%}\n {%- else -%}\n {%- if message['role'] == 'user' -%}\n {{- name1 + ': ' + message['content'] + '\\n'-}}\n {%- else -%}\n {{- name2 + ': ' + message['content'] + '\\n' -}}\n {%- endif -%}\n {%- endif -%}\n{%- endfor -%}",
|
||||||
'chat-instruct_command': 'Continue the chat dialogue below. Write a single reply for the character "<|character|>".\n\n<|prompt|>',
|
'chat-instruct_command': 'Continue the chat dialogue below. Write a single reply for the character "<|character|>".\n\n<|prompt|>',
|
||||||
'autoload_model': False,
|
'autoload_model': False,
|
||||||
'gallery-items_per_page': 50,
|
'gallery-items_per_page': 50,
|
||||||
|
@ -170,6 +170,7 @@ def list_interface_input_elements():
|
|||||||
'character_menu',
|
'character_menu',
|
||||||
'history',
|
'history',
|
||||||
'name1',
|
'name1',
|
||||||
|
'user_bio',
|
||||||
'name2',
|
'name2',
|
||||||
'greeting',
|
'greeting',
|
||||||
'context',
|
'context',
|
||||||
|
@ -94,20 +94,51 @@ def create_ui():
|
|||||||
|
|
||||||
def create_chat_settings_ui():
|
def create_chat_settings_ui():
|
||||||
mu = shared.args.multi_user
|
mu = shared.args.multi_user
|
||||||
with gr.Tab('Character'):
|
with gr.Tab('Chat'):
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
with gr.Column(scale=8):
|
with gr.Column(scale=8):
|
||||||
|
with gr.Tab("Character"):
|
||||||
with gr.Row():
|
with gr.Row():
|
||||||
shared.gradio['character_menu'] = gr.Dropdown(value=None, choices=utils.get_available_characters(), label='Character', elem_id='character-menu', info='Used in chat and chat-instruct modes.', elem_classes='slim-dropdown')
|
shared.gradio['character_menu'] = gr.Dropdown(value=None, choices=utils.get_available_characters(), label='Character', elem_id='character-menu', info='Used in chat and chat-instruct modes.', elem_classes='slim-dropdown')
|
||||||
ui.create_refresh_button(shared.gradio['character_menu'], lambda: None, lambda: {'choices': utils.get_available_characters()}, 'refresh-button', interactive=not mu)
|
ui.create_refresh_button(shared.gradio['character_menu'], lambda: None, lambda: {'choices': utils.get_available_characters()}, 'refresh-button', interactive=not mu)
|
||||||
shared.gradio['save_character'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['save_character'] = gr.Button('💾', elem_classes='refresh-button', interactive=not mu)
|
||||||
shared.gradio['delete_character'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
shared.gradio['delete_character'] = gr.Button('🗑️', elem_classes='refresh-button', interactive=not mu)
|
||||||
|
|
||||||
shared.gradio['name1'] = gr.Textbox(value=shared.settings['name1'], lines=1, label='Your name')
|
|
||||||
shared.gradio['name2'] = gr.Textbox(value='', lines=1, label='Character\'s name')
|
shared.gradio['name2'] = gr.Textbox(value='', lines=1, label='Character\'s name')
|
||||||
shared.gradio['context'] = gr.Textbox(value='', lines=10, label='Context', elem_classes=['add_scrollbar'])
|
shared.gradio['context'] = gr.Textbox(value='', lines=10, label='Context', elem_classes=['add_scrollbar'])
|
||||||
shared.gradio['greeting'] = gr.Textbox(value='', lines=5, label='Greeting', elem_classes=['add_scrollbar'])
|
shared.gradio['greeting'] = gr.Textbox(value='', lines=5, label='Greeting', elem_classes=['add_scrollbar'])
|
||||||
|
|
||||||
|
with gr.Tab("User"):
|
||||||
|
shared.gradio['name1'] = gr.Textbox(value=shared.settings['name1'], lines=1, label='Name')
|
||||||
|
shared.gradio['user_bio'] = gr.Textbox(value='', lines=5, label='Description', info='Here you can optionally write a description of yourself.', placeholder='{{user}}\'s personality: ...', elem_classes=['add_scrollbar'])
|
||||||
|
|
||||||
|
with gr.Tab('Chat history'):
|
||||||
|
with gr.Row():
|
||||||
|
with gr.Column():
|
||||||
|
shared.gradio['save_chat_history'] = gr.Button(value='Save history')
|
||||||
|
|
||||||
|
with gr.Column():
|
||||||
|
shared.gradio['load_chat_history'] = gr.File(type='binary', file_types=['.json', '.txt'], label='Upload History JSON')
|
||||||
|
|
||||||
|
with gr.Tab('Upload character'):
|
||||||
|
with gr.Tab('YAML or JSON'):
|
||||||
|
with gr.Row():
|
||||||
|
shared.gradio['upload_json'] = gr.File(type='binary', file_types=['.json', '.yaml'], label='JSON or YAML File', interactive=not mu)
|
||||||
|
shared.gradio['upload_img_bot'] = gr.Image(type='pil', label='Profile Picture (optional)', interactive=not mu)
|
||||||
|
|
||||||
|
shared.gradio['Submit character'] = gr.Button(value='Submit', interactive=False)
|
||||||
|
|
||||||
|
with gr.Tab('TavernAI PNG'):
|
||||||
|
with gr.Row():
|
||||||
|
with gr.Column():
|
||||||
|
shared.gradio['upload_img_tavern'] = gr.Image(type='pil', label='TavernAI PNG File', elem_id='upload_img_tavern', interactive=not mu)
|
||||||
|
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.Column(scale=1):
|
with gr.Column(scale=1):
|
||||||
shared.gradio['character_picture'] = gr.Image(label='Character picture', type='pil', interactive=not mu)
|
shared.gradio['character_picture'] = gr.Image(label='Character picture', type='pil', interactive=not mu)
|
||||||
shared.gradio['your_picture'] = gr.Image(label='Your picture', type='pil', value=Image.open(Path('cache/pfp_me.png')) if Path('cache/pfp_me.png').exists() else None, interactive=not mu)
|
shared.gradio['your_picture'] = gr.Image(label='Your picture', type='pil', value=Image.open(Path('cache/pfp_me.png')) if Path('cache/pfp_me.png').exists() else None, interactive=not mu)
|
||||||
@ -137,33 +168,6 @@ def create_chat_settings_ui():
|
|||||||
with gr.Column():
|
with gr.Column():
|
||||||
shared.gradio['chat_template_str'] = gr.Textbox(value=shared.settings['chat_template_str'], label='Chat template', lines=22, elem_classes=['add_scrollbar', 'monospace'])
|
shared.gradio['chat_template_str'] = gr.Textbox(value=shared.settings['chat_template_str'], label='Chat template', lines=22, elem_classes=['add_scrollbar', 'monospace'])
|
||||||
|
|
||||||
with gr.Tab('Chat history'):
|
|
||||||
with gr.Row():
|
|
||||||
with gr.Column():
|
|
||||||
shared.gradio['save_chat_history'] = gr.Button(value='Save history')
|
|
||||||
|
|
||||||
with gr.Column():
|
|
||||||
shared.gradio['load_chat_history'] = gr.File(type='binary', file_types=['.json', '.txt'], label='Upload History JSON')
|
|
||||||
|
|
||||||
with gr.Tab('Upload character'):
|
|
||||||
with gr.Tab('YAML or JSON'):
|
|
||||||
with gr.Row():
|
|
||||||
shared.gradio['upload_json'] = gr.File(type='binary', file_types=['.json', '.yaml'], label='JSON or YAML File', interactive=not mu)
|
|
||||||
shared.gradio['upload_img_bot'] = gr.Image(type='pil', label='Profile Picture (optional)', interactive=not mu)
|
|
||||||
|
|
||||||
shared.gradio['Submit character'] = gr.Button(value='Submit', interactive=False)
|
|
||||||
|
|
||||||
with gr.Tab('TavernAI PNG'):
|
|
||||||
with gr.Row():
|
|
||||||
with gr.Column():
|
|
||||||
shared.gradio['upload_img_tavern'] = gr.Image(type='pil', label='TavernAI PNG File', elem_id='upload_img_tavern', interactive=not mu)
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
def create_event_handlers():
|
def create_event_handlers():
|
||||||
|
|
||||||
|
@ -54,7 +54,12 @@ instruction_template_str: |-
|
|||||||
chat_template_str: |-
|
chat_template_str: |-
|
||||||
{%- for message in messages %}
|
{%- for message in messages %}
|
||||||
{%- if message['role'] == 'system' -%}
|
{%- if message['role'] == 'system' -%}
|
||||||
|
{%- if message['content'] -%}
|
||||||
{{- message['content'] + '\n\n' -}}
|
{{- message['content'] + '\n\n' -}}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- if user_bio -%}
|
||||||
|
{{- user_bio + '\n\n' -}}
|
||||||
|
{%- endif -%}
|
||||||
{%- else -%}
|
{%- else -%}
|
||||||
{%- if message['role'] == 'user' -%}
|
{%- if message['role'] == 'user' -%}
|
||||||
{{- name1 + ': ' + message['content'] + '\n'-}}
|
{{- name1 + ': ' + message['content'] + '\n'-}}
|
||||||
|
Loading…
Reference in New Issue
Block a user