From 0359e60d7ff0f0809c5ea4eaf0ca8d4bb6e15ef4 Mon Sep 17 00:00:00 2001 From: sean1832 Date: Mon, 20 Feb 2023 04:04:48 +1100 Subject: [PATCH] refactor: create project wise constants --- GPT/query.py | 4 +-- Seanium_Brain.py | 87 +++++++++++++++++++-------------------------- modules/INFO.py | 35 ++++++++++++++++++ modules/__init__.py | 1 + modules/language.py | 1 + pages/1_Configs.py | 58 ++++++++++++++---------------- 6 files changed, 102 insertions(+), 84 deletions(-) create mode 100644 modules/INFO.py diff --git a/GPT/query.py b/GPT/query.py index fef2928..8f3af09 100644 --- a/GPT/query.py +++ b/GPT/query.py @@ -8,8 +8,8 @@ import GPT openai.api_key = util.read_file(r'.user\API-KEYS.txt').strip() -if 'SESSION_LANGUAGE' not in st.session_state: - st.session_state['SESSION_LANGUAGE'] = util.read_json_at('.user/language.json', 'SESSION_LANGUAGE', 'en_US') +# if 'SESSION_LANGUAGE' not in st.session_state: +# st.session_state['SESSION_LANGUAGE'] = util.read_json_at('.user/language.json', 'SESSION_LANGUAGE', 'en_US') SESSION_LANG = st.session_state['SESSION_LANGUAGE'] prompt_dir = f'.user/prompt/{SESSION_LANG}' diff --git a/Seanium_Brain.py b/Seanium_Brain.py index 7ff150d..2d3c63b 100644 --- a/Seanium_Brain.py +++ b/Seanium_Brain.py @@ -6,48 +6,34 @@ import streamlit as st import modules as mod import GPT import modules.utilities as util +import modules.INFO as INFO -# activate session -if 'SESSION_TIME' not in st.session_state: - st.session_state['SESSION_TIME'] = time.strftime("%Y%m%d-%H%H%S") - -st.set_page_config( - page_title='GPT Brain' -) - -util.remove_oldest_file('.user/log', 10) - -LOG_PATH = '.user/log' -SESSION_TIME = st.session_state['SESSION_TIME'] SESSION_LANG = st.session_state['SESSION_LANGUAGE'] PROMPT_PATH = f'.user/prompt/{SESSION_LANG}' -CURRENT_LOG_FILE = f'{LOG_PATH}/log_{SESSION_TIME}.log' -BRAIN_MEMO = '.user/brain-memo.json' -MANIFEST = '.core/manifest.json' -model_options = ['text-davinci-003', 'text-curie-001', 'text-babbage-001', 'text-ada-001'] + +util.remove_oldest_file(INFO.LOG_PATH, 10) + header = st.container() body = st.container() def create_log(): - if not os.path.exists(CURRENT_LOG_FILE): - util.write_file(f'Session {SESSION_TIME}\n\n', CURRENT_LOG_FILE) - return CURRENT_LOG_FILE + if not os.path.exists(INFO.CURRENT_LOG_FILE): + util.write_file(f'Session {INFO.SESSION_TIME}\n\n', INFO.CURRENT_LOG_FILE) + return INFO.CURRENT_LOG_FILE def log(content, delimiter=''): log_file = create_log() - if delimiter != '': delimiter = f'\n\n=============={delimiter}==============\n' - util.write_file(f'\n{delimiter + content}', log_file, 'a') def clear_log(): - log_file_name = f'log_{SESSION_TIME}.log' - for root, dirs, files in os.walk(LOG_PATH): + log_file_name = f'log_{INFO.SESSION_TIME}.log' + for root, dirs, files in os.walk(INFO.LOG_PATH): for file in files: if not file == log_file_name: os.remove(os.path.join(root, file)) @@ -55,12 +41,12 @@ def clear_log(): def save_as(): # download log file - with open(CURRENT_LOG_FILE, 'rb') as f: + with open(INFO.CURRENT_LOG_FILE, 'rb') as f: content = f.read() st.download_button( label=_("📥download log"), data=content, - file_name=f'log_{SESSION_TIME}.txt', + file_name=f'log_{INFO.SESSION_TIME}.txt', mime='text/plain' ) @@ -104,36 +90,37 @@ with st.sidebar: operation_options = list(prompt_dictionary.keys()) operations = st.multiselect(_('Operations'), operation_options, - default=util.read_json_at(BRAIN_MEMO, f'operations_{SESSION_LANG}', + default=util.read_json_at(INFO.BRAIN_MEMO, f'operations_{SESSION_LANG}', operation_options[0])) - last_question_model = util.read_json_at(BRAIN_MEMO, 'question_model', model_options[0]) + last_question_model = util.read_json_at(INFO.BRAIN_MEMO, 'question_model', INFO.MODELS_OPTIONS[0]) # get index of last question model - question_model_index = util.get_index(model_options, last_question_model) - question_model = st.selectbox(_('Question Model'), model_options, index=question_model_index) + question_model_index = util.get_index(INFO.MODELS_OPTIONS, last_question_model) + question_model = st.selectbox(_('Question Model'), INFO.MODELS_OPTIONS, index=question_model_index) operations_no_question = [op for op in operations if op != _('question')] other_models = [] replace_tokens = [] for operation in operations_no_question: - last_model = util.read_json_at(BRAIN_MEMO, f'{operation}_model', model_options[0]) + last_model = util.read_json_at(INFO.BRAIN_MEMO, f'{operation}_model', INFO.MODELS_OPTIONS[0]) # get index of last model - model_index = util.get_index(model_options, last_model) - model = st.selectbox(f"{operation} " + _('Model'), model_options, index=model_index) + model_index = util.get_index(INFO.MODELS_OPTIONS, last_model) + model = st.selectbox(f"{operation} " + _('Model'), INFO.MODELS_OPTIONS, index=model_index) other_models.append(model) - temp = st.slider(_('Temperature'), 0.0, 1.0, value=util.read_json_at(BRAIN_MEMO, 'temp', 0.1)) - max_tokens = st.slider(_('Max Tokens'), 850, 4500, value=util.read_json_at(BRAIN_MEMO, 'max_tokens', 1000)) + temp = st.slider(_('Temperature'), 0.0, 1.0, value=util.read_json_at(INFO.BRAIN_MEMO, 'temp', 0.1)) + max_tokens = st.slider(_('Max Tokens'), 850, 4500, value=util.read_json_at(INFO.BRAIN_MEMO, 'max_tokens', 1000)) with st.expander(label=_('Advanced Options')): - top_p = st.slider(_('Top_P'), 0.0, 1.0, value=util.read_json_at(BRAIN_MEMO, 'top_p', 1.0)) + top_p = st.slider(_('Top_P'), 0.0, 1.0, value=util.read_json_at(INFO.BRAIN_MEMO, 'top_p', 1.0)) freq_panl = st.slider(_('Frequency penalty'), 0.0, 1.0, - value=util.read_json_at(BRAIN_MEMO, 'frequency_penalty', 0.0)) + value=util.read_json_at(INFO.BRAIN_MEMO, 'frequency_penalty', 0.0)) pres_panl = st.slider(_('Presence penalty'), 0.0, 1.0, - value=util.read_json_at(BRAIN_MEMO, 'present_penalty', 0.0)) + value=util.read_json_at(INFO.BRAIN_MEMO, 'present_penalty', 0.0)) - chunk_size = st.slider(_('Chunk size'), 1500, 4500, value=util.read_json_at(BRAIN_MEMO, 'chunk_size', 4000)) - chunk_count = st.slider(_('Answer count'), 1, 5, value=util.read_json_at(BRAIN_MEMO, 'chunk_count', 1)) + chunk_size = st.slider(_('Chunk size'), 1500, 4500, + value=util.read_json_at(INFO.BRAIN_MEMO, 'chunk_size', 4000)) + chunk_count = st.slider(_('Answer count'), 1, 5, value=util.read_json_at(INFO.BRAIN_MEMO, 'chunk_count', 1)) param = GPT.model_param.param(temp=temp, max_tokens=max_tokens, @@ -148,17 +135,17 @@ with st.sidebar: # info st.markdown('---') - st.markdown(f"# {util.read_json_at(MANIFEST, 'name')}") - st.markdown(_('Version') + f": {util.read_json_at(MANIFEST, 'version')}") - st.markdown(_('Author') + f": {util.read_json_at(MANIFEST, 'author')}") - st.markdown("[" + _('Report bugs') + "]" + f"({util.read_json_at(MANIFEST, 'bugs')})") - st.markdown("[" + _('Github Repo') + "]" + f"({util.read_json_at(MANIFEST, 'homepage')})") + st.markdown(f"# {util.read_json_at(INFO.MANIFEST, 'name')}") + st.markdown(_('Version') + f": {util.read_json_at(INFO.MANIFEST, 'version')}") + st.markdown(_('Author') + f": {util.read_json_at(INFO.MANIFEST, 'author')}") + st.markdown("[" + _('Report bugs') + "]" + f"({util.read_json_at(INFO.MANIFEST, 'bugs')})") + st.markdown("[" + _('Github Repo') + "]" + f"({util.read_json_at(INFO.MANIFEST, 'homepage')})") with header: st.title(_('🧠GPT-Brain')) st.text(_('This is my personal AI powered brain feeding my own Obsidian notes. Ask anything.')) - message(_("This is a beta version. Please [🪲report bugs](") + util.read_json_at(MANIFEST, 'bugs') + _( + message(_("This is a beta version. Please [🪲report bugs](") + util.read_json_at(INFO.MANIFEST, 'bugs') + _( ") if you find any.")) @@ -196,17 +183,17 @@ def execute_brain(q): # write param to json for key in param_dict: value = param_dict[key] - util.update_json(BRAIN_MEMO, key, value) + util.update_json(INFO.BRAIN_MEMO, key, value) # write operation to json - util.update_json(BRAIN_MEMO, f'operations_{SESSION_LANG}', operations) + util.update_json(INFO.BRAIN_MEMO, f'operations_{SESSION_LANG}', operations) # write question model to json - util.update_json(BRAIN_MEMO, 'question_model', question_model) + util.update_json(INFO.BRAIN_MEMO, 'question_model', question_model) # write other models to json for i in range(len(operations_no_question)): - util.update_json(BRAIN_MEMO, f'{operations_no_question[i]}_model', other_models[i]) + util.update_json(INFO.BRAIN_MEMO, f'{operations_no_question[i]}_model', other_models[i]) # main @@ -216,7 +203,7 @@ with body: with col1: send = st.button(_('📩Send')) with col2: - if os.path.exists(CURRENT_LOG_FILE): + if os.path.exists(INFO.CURRENT_LOG_FILE): save_as() # execute brain calculation if not question == '' and send: diff --git a/modules/INFO.py b/modules/INFO.py new file mode 100644 index 0000000..a0fcf95 --- /dev/null +++ b/modules/INFO.py @@ -0,0 +1,35 @@ +import streamlit as st +import time +import modules.utilities as util + +st.set_page_config( + page_title='GPT Brain' +) + +# path +USER_DIR = '.user' +LOG_PATH = '.user/log' +BRAIN_MEMO = '.user/brain-memo.json' +MANIFEST = '.core/manifest.json' +SELECTED_LANGUAGE = '.user/language.json' + + +# activate session +if 'SESSION_TIME' not in st.session_state: + st.session_state['SESSION_TIME'] = time.strftime("%Y%m%d-%H%H%S") + +if 'SESSION_LANGUAGE' not in st.session_state: + st.session_state['SESSION_LANGUAGE'] = util.read_json_at(SELECTED_LANGUAGE, 'SESSION_LANGUAGE') + +if 'FILTER_ROW_COUNT' not in st.session_state: + st.session_state['FILTER_ROW_COUNT'] = util.read_json_at(BRAIN_MEMO, 'filter_row_count') + + +SESSION_TIME = st.session_state['SESSION_TIME'] + +CURRENT_LOG_FILE = f'{LOG_PATH}/log_{SESSION_TIME}.log' + + + +# models +MODELS_OPTIONS = ['text-davinci-003', 'text-curie-001', 'text-babbage-001', 'text-ada-001'] \ No newline at end of file diff --git a/modules/__init__.py b/modules/__init__.py index b2bcb8f..e5316de 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -1,3 +1,4 @@ from modules import language from modules import utilities from modules import check_update +from modules import INFO \ No newline at end of file diff --git a/modules/language.py b/modules/language.py index d4a887e..17e84e8 100644 --- a/modules/language.py +++ b/modules/language.py @@ -2,6 +2,7 @@ import gettext import streamlit as st import modules.utilities as util + languages = util.read_json('.locals/languages.json') diff --git a/pages/1_Configs.py b/pages/1_Configs.py index 605d05c..57225e7 100644 --- a/pages/1_Configs.py +++ b/pages/1_Configs.py @@ -8,15 +8,10 @@ from tkinter import filedialog import modules.language as language import modules.utilities as util +import modules.INFO as INFO - -user_dir = '.user/' SESSION_LANG = st.session_state['SESSION_LANGUAGE'] -prompt_dir = f'{user_dir}prompt/{SESSION_LANG}/' -brain_memo = f'{user_dir}brain-memo.json' - -if 'FILTER_ROW_COUNT' not in st.session_state: - st.session_state['FILTER_ROW_COUNT'] = util.read_json_at(brain_memo, 'filter_row_count') +PROMPT_PATH = f'{INFO.USER_DIR}/prompt/{SESSION_LANG}/' _ = language.set_language() @@ -36,12 +31,12 @@ def save(content, path, page='', json_value: dict = None): st.success(_('✅File saved!')) # write to json file if page == '💽Brain Memory': - util.update_json(brain_memo, 'delimiter', json_value['delimiter']) - util.update_json(brain_memo, 'append_mode', json_value['append_mode']) - util.update_json(brain_memo, 'force_mode', json_value['force_mode']) - util.update_json(brain_memo, 'advanced_mode', json_value['advanced_mode']) - util.update_json(brain_memo, 'filter_info', json_value['filter_info']) - util.update_json(brain_memo, 'filter_row_count', json_value['filter_row_count']) + util.update_json(INFO.BRAIN_MEMO, 'delimiter', json_value['delimiter']) + util.update_json(INFO.BRAIN_MEMO, 'append_mode', json_value['append_mode']) + util.update_json(INFO.BRAIN_MEMO, 'force_mode', json_value['force_mode']) + util.update_json(INFO.BRAIN_MEMO, 'advanced_mode', json_value['advanced_mode']) + util.update_json(INFO.BRAIN_MEMO, 'filter_info', json_value['filter_info']) + util.update_json(INFO.BRAIN_MEMO, 'filter_row_count', json_value['filter_row_count']) time.sleep(1) # refresh page st.experimental_rerun() @@ -162,7 +157,7 @@ def add_filter(num, val_filter_key, val_filter_logic, val_filter_val): def filter_data(pages: list, add_filter_button, del_filter_button): - init_filter_infos = util.read_json_at(brain_memo, 'filter_info') + init_filter_infos = util.read_json_at(INFO.BRAIN_MEMO, 'filter_info') filter_datas = [] if add_filter_button: @@ -185,7 +180,6 @@ def filter_data(pages: list, add_filter_button, del_filter_button): init_logic = 'CONTAINS' init_val = '' - if i == 0: continue # add filter @@ -213,10 +207,10 @@ def main(): st.text(_('Configuration of prompts.')) # read selected file - last_sel_file = util.read_json_at(brain_memo, 'selected_prompt') - all_files = os.listdir(prompt_dir) + 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_dir}{x}'), reverse=True) + all_files.sort(key=lambda x: os.path.getmtime(f'{PROMPT_PATH}{x}'), reverse=True) # index of last selected file try: @@ -231,9 +225,9 @@ def main(): 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_dir}{new_file}.txt') + util.write_file('', f'{PROMPT_PATH}{new_file}.txt') # change select file to new fie - util.update_json(brain_memo, 'selected_prompt', selected_file) + util.update_json(INFO.BRAIN_MEMO, 'selected_prompt', selected_file) # refresh page st.experimental_rerun() with col2: @@ -243,18 +237,18 @@ def main(): if not is_core: if st_toggle.st_toggle_switch(_('Delete Prompt'), label_after=True): if st.button(_('❌Delete')): - util.delete_file(f'{prompt_dir}{selected_file}') + util.delete_file(f'{PROMPT_PATH}{selected_file}') # refresh page st.experimental_rerun() - selected_path = prompt_dir + selected_file + selected_path = PROMPT_PATH + selected_file mod_text = st.text_area(_('Prompts'), value=util.read_file(selected_path), height=500) 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'{user_dir}input.txt') + memory_data = util.read_file(f'{INFO.USER_DIR}/input.txt') col1, col2 = st.columns(2) with col1: @@ -262,23 +256,23 @@ def main(): with col2: if st.button(_('📁Select Note Directory')): note_dir = select_directory() - util.update_json(brain_memo, 'note_dir', note_dir) - note_dir = st.text_input(_('Note Directory'), value=util.read_json_at(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(brain_memo, 'delimiter') + 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(brain_memo, 'append_mode')) + 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(brain_memo, 'force_mode')) + value=util.read_json_at(INFO.BRAIN_MEMO, 'force_mode')) with col3: advanced_mode = st_toggle.st_toggle_switch(_('Filter Mode'), label_after=True, - default_value=util.read_json_at(brain_memo, + default_value=util.read_json_at(INFO.BRAIN_MEMO, 'advanced_mode', False)) with col4: if advanced_mode: @@ -304,7 +298,7 @@ def main(): memory_data = modified_data mod_text = st.text_area(_('Raw Memory Inputs'), value=memory_data, height=500) - save(mod_text, f'{user_dir}input.txt', _('💽Brain Memory'), { + save(mod_text, f'{INFO.USER_DIR}/input.txt', _('💽Brain Memory'), { 'delimiter': delimiter, 'append_mode': append_mode, 'force_mode': force_delimiter, @@ -316,8 +310,8 @@ def main(): 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'{user_dir}API-KEYS.txt')) - save(mod_text, f'{user_dir}API-KEYS.txt') + mod_text = st.text_input(_('API Keys'), value=util.read_file(f'{INFO.USER_DIR}/API-KEYS.txt')) + save(mod_text, f'{INFO.USER_DIR}/API-KEYS.txt') if __name__ == '__main__':