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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import os
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()
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()