You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
GPT-Brain/pages/1_Configs.py

170 lines
8.0 KiB
Python

import os
1 year ago
import streamlit as st
import streamlit_toggle as st_toggle
import streamlit_tags as st_tags
import modules.language as language
import modules.utilities as util
import modules.INFO as INFO
import streamlit_toolkit.tools as st_tools
SESSION_LANG = st.session_state['SESSION_LANGUAGE']
PROMPT_PATH = f'{INFO.USER_DIR}/prompt/{SESSION_LANG}/'
_ = language.set_language()
1 year ago
body = st.container()
def main():
with st.sidebar:
st.title(_('Settings'))
menu = st.radio(_('Menu'), [
_('📝Prompts'),
_('💽Brain Memory'),
_('🔑API Keys')
])
with body:
if menu == _('📝Prompts'):
st.title(_('📝Prompts'))
st.text(_('Configuration of prompts.'))
# read selected file
last_sel_file = util.read_json_at(INFO.BRAIN_MEMO, 'selected_prompt')
all_files = os.listdir(PROMPT_PATH)
# sort files base on creation time
all_files.sort(key=lambda x: os.path.getmtime(f'{PROMPT_PATH}{x}'), reverse=True)
# index of last selected file
try:
last_sel_file_index = all_files.index(last_sel_file)
except ValueError:
last_sel_file_index = 0
selected_file = st.selectbox(_('Prompt File'), all_files, last_sel_file_index)
col1, col2 = st.columns(2)
with col1:
if st_toggle.st_toggle_switch(_('New Prompt'), label_after=True):
new_file = st.text_input(_('New Prompt Name'), value=_('new_prompt'))
if st.button(_('Create')):
util.write_file('', f'{PROMPT_PATH}{new_file}.txt')
# change select file to new fie
util.update_json(INFO.BRAIN_MEMO, 'selected_prompt', selected_file)
# refresh page
st.experimental_rerun()
with col2:
is_core = selected_file == _('my-info') + '.txt' or \
selected_file == _('question') + '.txt' or \
selected_file == _('summarize') + '.txt'
if not is_core:
if st_toggle.st_toggle_switch(_('Delete Prompt'), label_after=True):
if st.button(_('❌Delete')):
util.delete_file(f'{PROMPT_PATH}{selected_file}')
# refresh page
st.experimental_rerun()
selected_path = PROMPT_PATH + selected_file
mod_text = st.text_area(_('Prompts'), value=util.read_file(selected_path), height=500)
st_tools.save(mod_text, selected_path)
if menu == _('💽Brain Memory'):
st.title(_('💽Brain Memory'))
st.text(_('Modify your brain knowledge base.'))
memory_data = util.read_file(f'{INFO.USER_DIR}/input.txt')
col1, col2 = st.columns(2)
with col1:
st.button(_('🔄Refresh'))
with col2:
if st.button(_('📁Select Note Directory')):
note_dir = st_tools.select_directory(util.read_json_at(INFO.BRAIN_MEMO, 'note_dir'))
util.update_json(INFO.BRAIN_MEMO, 'note_dir', note_dir)
note_dir = st.text_input(_('Note Directory'), value=util.read_json_at(INFO.BRAIN_MEMO, 'note_dir'),
placeholder=_('Select Note Directory'), key='note_dir')
col1, col2, col3, col4 = st.columns([1, 2, 2, 2])
with col1:
delimiter_memo = util.read_json_at(INFO.BRAIN_MEMO, 'delimiter')
delimiter = st.text_input(_('Delimiter'), delimiter_memo, placeholder='e.g. +++')
with col2:
append_mode = st.checkbox(_('Append Mode'), value=util.read_json_at(INFO.BRAIN_MEMO, 'append_mode'))
force_delimiter = st.checkbox(_('Force Delimiter'),
value=util.read_json_at(INFO.BRAIN_MEMO, 'force_mode'))
with col3:
advanced_mode = st_toggle.st_toggle_switch(_('Frontmatter Filter'),
label_after=True,
default_value=util.read_json_at(INFO.BRAIN_MEMO,
'advanced_mode', False))
directory_filter = st_toggle.st_toggle_switch(_('Directory Filter'),
label_after=True,
default_value=util.read_json_at(INFO.BRAIN_MEMO,
'is_enable_directory_filter',
False))
with col4:
if advanced_mode:
add_filter_button = st.button("" + _('Add Filter'))
del_filter_button = st.button("" + _('Delete Filter'))
# ==================== Default Values ====================
filter_info = {}
exclude_dir_user = ''
# ==================== Default Values ====================
# if note directory is selected
if note_dir != '':
exclude_dir_official = INFO.EXCLUDE_DIR_OFFICIAL
if directory_filter:
exclude_dir_user = st_tags.st_tags(value=util.read_json_at(INFO.BRAIN_MEMO, 'exclude_dir_user'),
label=_('#### Directory to Exclude'),
text=_('Enter file or directory name to exclude'))
if exclude_dir_user:
exclude_dir = exclude_dir_official + list(exclude_dir_user)
# remove duplicates
exclude_dir = list(dict.fromkeys(exclude_dir))
else:
exclude_dir = exclude_dir_official
else:
exclude_dir = exclude_dir_official
# if advanced mode enabled
if advanced_mode:
note_datas = util.read_bind_files(note_dir, single_string=False, exclude_dir=exclude_dir)
note_datas, filter_info = st_tools.filter_data(note_datas, add_filter_button, del_filter_button)
# note_datas, filter_key, filter_logic, filter_val = filter_data(note_datas, True)
modified_data = util.parse_data(note_datas, delimiter, force_delimiter)
else:
modified_data = util.read_bind_files(note_dir, single_string=True, delimiter=delimiter,
force=force_delimiter, exclude_dir=exclude_dir)
# append mode
if append_mode:
memory_data += modified_data
else:
memory_data = modified_data
mod_text = st.text_area(_('Raw Memory Inputs'), value=memory_data, height=500)
st_tools.save(mod_text, f'{INFO.USER_DIR}/input.txt', _('💽Brain Memory'), {
'delimiter': delimiter,
'append_mode': append_mode,
'force_mode': force_delimiter,
'advanced_mode': advanced_mode,
'filter_info': filter_info,
'filter_row_count': len(filter_info),
'is_enable_directory_filter': directory_filter,
'exclude_dir_user': exclude_dir_user
})
if menu == _('🔑API Keys'):
st.title(_('🔑API Keys'))
st.text(_('Configure your OpenAI API keys.'))
mod_text = st.text_input(_('API Keys'), value=util.read_file(f'{INFO.USER_DIR}/API-KEYS.txt'))
st_tools.save(mod_text, f'{INFO.USER_DIR}/API-KEYS.txt')
if __name__ == '__main__':
main()