From d63bc325ee4eec8cfbffdbc88815b88e1f22b323 Mon Sep 17 00:00:00 2001 From: Umang Mistry Date: Mon, 15 Apr 2024 17:02:59 -0500 Subject: [PATCH 01/21] Updated error message for SSO failure --- streamlit/interface_0.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/streamlit/interface_0.py b/streamlit/interface_0.py index c41bdc7..38eaa6d 100644 --- a/streamlit/interface_0.py +++ b/streamlit/interface_0.py @@ -36,8 +36,8 @@ st.set_page_config(layout = "wide") _,c1= st.columns([5,1]) try: util.setup_page(REDIRECT_URI) -except: - st.write("SSO Failed") +except Exception as e: + st.write(f"SSO Failed = {e}") st.session_state['user_info'] = {'mail': 'maamseek@aarete.com', 'displayName': 'Mayank Aamseek'} try: c1.write(f"User: **{st.session_state.user_info['displayName']}**") From d447006548ba268bd89b31e368c17798551bb01b Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Tue, 16 Apr 2024 15:31:32 +0530 Subject: [PATCH 02/21] post processing for contract_num added --- .gitignore | 4 ++-- streamlit/interface_3.py | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 0367060..da68c9a 100644 --- a/.gitignore +++ b/.gitignore @@ -55,11 +55,11 @@ streamlit/DB/ streamlit/RAW_DOCUMENTS/ streamlit/SOURCE_DOCUMENTS/ streamlit/contract_field_values.csv -# streamlit/contract_fields.csv +streamlit/contract_fields.csv streamlit/sample.csv streamlit/temp1.csv streamlit/temp2.csv -# streamlit/results.csv +streamlit/results.csv # env streamlit/venv diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index ce6d51b..4f605d6 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -523,6 +523,11 @@ if st.session_state.user_info['mail'] in user_list: answer_list = [answer if str(answer) != "one year" else "1 year" for answer in answer_list] answer_list = [answer if str(answer) != "one" else "1 year" for answer in answer_list] answer_list = [answer if str(answer) != "one (1) year" else "1 year" for answer in answer_list] + answer_list = [answer if str(answer) != "twelve" else "1 year" for answer in answer_list] + answer_list = [answer if str(answer) != "XI" else "11" for answer in answer_list] + answer_list = [answer if str(answer) != "Third" else "3" for answer in answer_list] + answer_list = [answer if str(answer) != "Six" else "6" for answer in answer_list] + answer_list = [answer.rstrip(".") for answer in answer_list] else: answer_list = [answer.rstrip(".") for answer in answer_list] @@ -564,7 +569,8 @@ if st.session_state.user_info['mail'] in user_list: field_values_1['Contract Name'] = document_name field_values_2 = pd.concat([field_values_2, field_values_1], ignore_index = True) - df = pd.merge(df, field_values_2, how ='left', on =['Contract Name', 'SF_DB_COL_NAME']) + df = pd.merge(df, field_values_2, how ='right', on =['Contract Name', 'SF_DB_COL_NAME']) + df = df.drop_duplicates(subset=['SF_DB_COL_NAME', 'Contract Name'], keep="first") df['Original Page Number'] = df['Original Page Number'].apply(lambda x: re.search(r'\d+', x).group( ) if isinstance(x, str) and re.search(r'\d+', x) is not None else " ") @@ -581,6 +587,10 @@ if st.session_state.user_info['mail'] in user_list: df['Actual Value Stored'] = df['Actual Value Stored'].apply(lambda x: x.strip() if isinstance(x, str) else '') df['New Extracted value'] = df['New Extracted value'].apply(lambda x: x.strip() if isinstance(x, str) else '') actual_value_list = list(df['Actual Value Stored']) + actual_value_list = [answer if str(answer) != "12 months" else "1 year" for answer in actual_value_list] + actual_value_list = [answer if str(answer) != "Fifth" else "5" for answer in actual_value_list] + actual_value_list = [answer if str(answer) != "Seventh" else "7" for answer in actual_value_list] + answer_list = list(df['New Extracted value']) actual_value_list = [s.replace('-', '').replace(' ', '').replace('[', '').replace(']', '').lower() for s in actual_value_list] answer_list = [s.replace('-', '').replace(' ', '').replace('[', '').replace(']', '').lower() for s in answer_list] From b003b9c7c6d64fef11aa63e6c354a631ac82f7e4 Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Tue, 16 Apr 2024 15:46:46 +0530 Subject: [PATCH 03/21] contract count fixed --- streamlit/interface_3.py | 1 + 1 file changed, 1 insertion(+) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 4f605d6..577acbf 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -570,6 +570,7 @@ if st.session_state.user_info['mail'] in user_list: field_values_2 = pd.concat([field_values_2, field_values_1], ignore_index = True) df = pd.merge(df, field_values_2, how ='right', on =['Contract Name', 'SF_DB_COL_NAME']) + df = df[df['SF_DB_COL_NAME'].isin(list(field_prompt_mapping.keys()))] df = df.drop_duplicates(subset=['SF_DB_COL_NAME', 'Contract Name'], keep="first") df['Original Page Number'] = df['Original Page Number'].apply(lambda x: re.search(r'\d+', x).group( ) if isinstance(x, str) and re.search(r'\d+', x) is not None else " ") From 850cd5b12c06a92f96c8f2f2c2c67a52a02e6fdc Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Tue, 16 Apr 2024 15:53:22 +0530 Subject: [PATCH 04/21] contract count fixed --- streamlit/interface_3.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 577acbf..94acb7e 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -570,7 +570,10 @@ if st.session_state.user_info['mail'] in user_list: field_values_2 = pd.concat([field_values_2, field_values_1], ignore_index = True) df = pd.merge(df, field_values_2, how ='right', on =['Contract Name', 'SF_DB_COL_NAME']) - df = df[df['SF_DB_COL_NAME'].isin(list(field_prompt_mapping.keys()))] + if mode == 'Multiple fields': + df = df[df['SF_DB_COL_NAME'].isin(list(field_prompt_mapping.keys()))] + else: + df = df[df['SF_DB_COL_NAME'].isin([field])] df = df.drop_duplicates(subset=['SF_DB_COL_NAME', 'Contract Name'], keep="first") df['Original Page Number'] = df['Original Page Number'].apply(lambda x: re.search(r'\d+', x).group( ) if isinstance(x, str) and re.search(r'\d+', x) is not None else " ") From 3b792cb7c139d3bf44d6314269f2d1980a3861ff Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Tue, 16 Apr 2024 16:00:28 +0530 Subject: [PATCH 05/21] contract id fixed --- streamlit/interface_3.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 94acb7e..40efa4a 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -534,9 +534,6 @@ if st.session_state.user_info['mail'] in user_list: # answer_list = [str(x).rsplit(':',1)[0] if len(str(x).rsplit(':',1)) < 2 else str(x).rsplit(':',1)[1] for x in answer_list] except: print('post processing failed') - - # df['Contract ID'] = contract_list_f - df['Contract ID'] = range(len(contract_list_f)) # to be deleted later # contract_list_f = [contract.rsplit('/',1)[1].replace(' MU','').replace('_MU','').replace('.txt','') for contract in contract_list_f] @@ -601,7 +598,10 @@ if st.session_state.user_info['mail'] in user_list: result_list = [(i in j) or (j in i) if isinstance(i, str) and isinstance( j, str) and ((i != '') == (j != '')) else False for i, j in zip(actual_value_list, answer_list)] df['Result'] = [str(x) for x in result_list] - df = df[~df['Contract ID'].isnull()] + + # df = df[~df['Contract ID'].isnull()] + # df['Contract ID'] = contract_list_f + df['Contract ID'] = range(len(actual_value_list)) df = df[['Contract Name','Contract ID', 'SF_DB_COL_NAME', 'Actual Value Stored', 'Raw value', 'New Extracted value','Confidence Level' ,'Snippet','Original Page Number', 'New Page Number', 'Revised Prompt', 'Result']] From 3cc0518dcbc87f91ec42f167198c4e30856be7d5 Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Wed, 17 Apr 2024 13:03:06 +0530 Subject: [PATCH 06/21] Claude 3 added --- streamlit/interface_3.py | 65 +++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 40efa4a..ef8ffb2 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -214,7 +214,8 @@ if st.session_state.user_info['mail'] in user_list: # st.write(df) # st.write(len(contract_list)) # contract_list = [contract for contract in contract_list if contract.rsplit('/',1)[1].replace(' MU','').replace('_MU','').replace('.txt','') in list(field_values['Document_Name'])] - contract_list = [contract for contract in contract_list if contract.rsplit('/',1)[1].replace('.txt','.pdf') in list(field_values['Document_Name'])] + contract_list = [contract.replace('.txt','.pdf') for contract in contract_list] + contract_list = [contract for contract in contract_list if contract.rsplit('/',1)[1] in list(field_values['Document_Name'])] # st.write(len(contract_list)) if contract_count == 'All': @@ -247,8 +248,8 @@ if st.session_state.user_info['mail'] in user_list: with llm_row[0]: st.write("**Langauge Model**") with llm_row[1]: - llm_selected = st.selectbox('Langauge Model',('Claude 2', 'Claude Instant', 'Llama 2 Chat 70B' - , 'Titan Text Express'), index=1, label_visibility = "collapsed") + llm_selected = st.selectbox('Langauge Model',('Claude 2', 'Claude 3 - Haiku', 'Claude 3 - Sonnet', 'Claude Instant' + , 'Llama 2 Chat 70B', 'Titan Text Express'), index=3, label_visibility = "collapsed") st.write("**Prompt**") if mode == 'Multiple fields': @@ -276,6 +277,7 @@ if st.session_state.user_info['mail'] in user_list: # # , column_name+'_PG': 'Original Page Number'}, inplace=True) field_values.rename(columns={'Document_Name': 'Contract Name'}, inplace=True) field_values = field_values.drop_duplicates(subset='Contract Name', keep="first").sort_values('Contract Name') + field_values = field_values[field_values['Contract Name'].isin([contract.rsplit('/',1)[1] for contract in contract_list])] # Setup bedrock bedrock_runtime = boto3.client( @@ -313,7 +315,7 @@ if st.session_state.user_info['mail'] in user_list: for contract in contract_list: # with open(os.path.join(SOURCE_DIRECTORY, contract[:-4]+'.txt'), 'r') as infile: # context = infile.read() - data = s3_client.get_object(Bucket=bucket, Key=contract) + data = s3_client.get_object(Bucket=bucket, Key=contract.replace('.pdf','.txt')) contents = data['Body'].read() context = contents.decode("utf-8") # st.write(question_with_schema) @@ -357,7 +359,7 @@ if st.session_state.user_info['mail'] in user_list: body=json.dumps(payload) model_id="meta.llama2-70b-chat-v1" - elif llm_selected in ['Claude Instant', 'Claude 2']: + elif llm_selected in ['Claude Instant', 'Claude 2', 'Claude 3 - Haiku', 'Claude 3 - Sonnet']: if llm_selected == 'Claude Instant': context = context[:175000] @@ -370,18 +372,49 @@ if st.session_state.user_info['mail'] in user_list: Question: {question_with_schema} Assistant: Answer in JSON format: {{""" - body = json.dumps( - {"prompt": anthropic.HUMAN_PROMPT + prompt_data + anthropic.AI_PROMPT, - "max_tokens_to_sample": 2048, - "temperature":0.0, - "top_p":1, - "top_k":250, - "stop_sequences":[anthropic.HUMAN_PROMPT] - }) + if llm_selected == "Claude 2": model_id = "anthropic.claude-v2:1" + body = json.dumps( + {"prompt": anthropic.HUMAN_PROMPT + prompt_data + anthropic.AI_PROMPT, + "max_tokens_to_sample": 2048, + "temperature":0.0, + "top_p":1, + "top_k":250, + "stop_sequences":[anthropic.HUMAN_PROMPT] + }) + elif llm_selected in ["Claude 3 - Haiku", "Claude 3 - Sonnet"]: + if llm_selected == "Claude 3 - Haiku": + model_id = 'anthropic.claude-3-haiku-20240307-v1:0' + else: + model_id = 'anthropic.claude-3-sonnet-20240229-v1:0' + body = json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 2048, + "messages": [ + { + "role": "user", + "content": [ + { + "type": "text", + "text":anthropic.HUMAN_PROMPT + prompt_data + anthropic.AI_PROMPT + } + ] + } + ], + "temperature": 0.0 + } + ) else: model_id = "anthropic.claude-instant-v1" + body = json.dumps( + {"prompt": anthropic.HUMAN_PROMPT + prompt_data + anthropic.AI_PROMPT, + "max_tokens_to_sample": 2048, + "temperature":0.0, + "top_p":1, + "top_k":250, + "stop_sequences":[anthropic.HUMAN_PROMPT] + }) try: response = bedrock_runtime.invoke_model( @@ -398,6 +431,8 @@ if st.session_state.user_info['mail'] in user_list: response_text = response_body['generation'] elif llm_selected in ['Claude Instant', 'Claude 2']: response_text = response_body['completion'] + elif llm_selected in ['Claude 3 - Haiku', 'Claude 3 - Sonnet']: + response_text = response_body['content'][0]['text'] except: response_text = "failed" @@ -504,7 +539,7 @@ if st.session_state.user_info['mail'] in user_list: answer_list = [answer if "None" not in str(answer) else " " for answer in answer_list] answer_list = [answer if "Not specified in the contract" not in str(answer) else " " for answer in answer_list] answer_list = [answer if "Not applicable" not in str(answer) else " " for answer in answer_list] - elif llm_selected in ['Claude 2', 'Claude Instant']: + elif llm_selected in ['Claude 2','Claude 3 - Haiku', 'Claude 3 - Sonnet', 'Claude Instant']: answer_list = [answer if "do not have" not in str(answer) else " " for answer in answer_list] answer_list = [answer if "do not see" not in str(answer) else " " for answer in answer_list] answer_list = [answer if "does not specify" not in str(answer) else " " for answer in answer_list] @@ -566,6 +601,8 @@ if st.session_state.user_info['mail'] in user_list: field_values_1['Contract Name'] = document_name field_values_2 = pd.concat([field_values_2, field_values_1], ignore_index = True) + # st.write(df) + # st.write(field_values_2) df = pd.merge(df, field_values_2, how ='right', on =['Contract Name', 'SF_DB_COL_NAME']) if mode == 'Multiple fields': df = df[df['SF_DB_COL_NAME'].isin(list(field_prompt_mapping.keys()))] From 9d5ac51f4e3e1ac42470ecd72a7b7f322018fb32 Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Wed, 17 Apr 2024 13:46:33 +0530 Subject: [PATCH 07/21] Claude 3 added --- streamlit/interface_3.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index ef8ffb2..d09e575 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -214,7 +214,7 @@ if st.session_state.user_info['mail'] in user_list: # st.write(df) # st.write(len(contract_list)) # contract_list = [contract for contract in contract_list if contract.rsplit('/',1)[1].replace(' MU','').replace('_MU','').replace('.txt','') in list(field_values['Document_Name'])] - contract_list = [contract.replace('.txt','.pdf') for contract in contract_list] + contract_list = [str(contract)[:-4]+'.pdf' for contract in contract_list] contract_list = [contract for contract in contract_list if contract.rsplit('/',1)[1] in list(field_values['Document_Name'])] # st.write(len(contract_list)) @@ -315,7 +315,7 @@ if st.session_state.user_info['mail'] in user_list: for contract in contract_list: # with open(os.path.join(SOURCE_DIRECTORY, contract[:-4]+'.txt'), 'r') as infile: # context = infile.read() - data = s3_client.get_object(Bucket=bucket, Key=contract.replace('.pdf','.txt')) + data = s3_client.get_object(Bucket=bucket, Key=str(contract)[:-4]+'.txt') contents = data['Body'].read() context = contents.decode("utf-8") # st.write(question_with_schema) @@ -572,7 +572,7 @@ if st.session_state.user_info['mail'] in user_list: # to be deleted later # contract_list_f = [contract.rsplit('/',1)[1].replace(' MU','').replace('_MU','').replace('.txt','') for contract in contract_list_f] - contract_list_f = [contract.rsplit('/',1)[1].replace('.txt','.pdf') for contract in contract_list_f] + contract_list_f = [contract.rsplit('/',1)[1] for contract in contract_list_f] df['Contract Name'] = contract_list_f df['New Extracted value'] = answer_list @@ -589,7 +589,7 @@ if st.session_state.user_info['mail'] in user_list: for file_name in contract_list: # document_name = [x for x in list(field_values['Contract Name']) if not pd.isna(x) and file_name.rsplit('/',1)[1].replace(' MU','').replace( # '_MU','').replace('.txt','') in x][0] - document_name = [x for x in list(field_values['Contract Name']) if not pd.isna(x) and file_name.rsplit('/',1)[1].replace('.txt','.pdf') in x][0] + document_name = [x for x in list(field_values['Contract Name']) if not pd.isna(x) and file_name.rsplit('/',1)[1] in x][0] field_values_1 = field_values[field_values['Contract Name'] == document_name].head(1).transpose().reset_index() field_values_1.columns = ['SF_DB_COL_NAME', 'Actual Value Stored'] field_values_p1 = field_values_1[~field_values_1['SF_DB_COL_NAME'].str.endswith('_PG')] From 27fcd2295e2952f3f70276a5b157e75a327398ae Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Wed, 17 Apr 2024 23:09:39 +0530 Subject: [PATCH 08/21] Claude 3 bug fixed --- streamlit/interface_3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index d09e575..db9f041 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -529,7 +529,7 @@ if st.session_state.user_info['mail'] in user_list: # date_list.append(extracted_date) # answer_list = date_list try: - answer_list = [answer.strip("\n").strip().strip("{").strip("}").strip('"').rstrip('"').strip( + answer_list = [str(answer).strip("\n").strip().strip("[").strip("]").strip("{").strip("}").strip('"').rstrip('"').strip( ' ') if answer is not None else None for answer in answer_list] if llm_selected in ['Llama 2 Chat 13B', 'Llama 2 Chat 70B']: answer_list = [answer.rstrip(".") for answer in answer_list] From 86db57a9a745a9e8fffbe6819e5dfefeeb4215f3 Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Thu, 18 Apr 2024 01:16:34 +0530 Subject: [PATCH 09/21] Claude 3 bug fixed --- streamlit/interface_3.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index db9f041..bda7b87 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -554,21 +554,12 @@ if st.session_state.user_info['mail'] in user_list: answer_list = [answer if "don't have" not in str(answer) else " " for answer in answer_list] answer_list = [answer if "Does not apply" not in str(answer) else " " for answer in answer_list] answer_list = [answer if "Nothing found" not in str(answer) else " " for answer in answer_list] - answer_list = [answer if str(answer) != "one-year" else "1 year" for answer in answer_list] - answer_list = [answer if str(answer) != "one year" else "1 year" for answer in answer_list] - answer_list = [answer if str(answer) != "one" else "1 year" for answer in answer_list] - answer_list = [answer if str(answer) != "one (1) year" else "1 year" for answer in answer_list] - answer_list = [answer if str(answer) != "twelve" else "1 year" for answer in answer_list] - answer_list = [answer if str(answer) != "XI" else "11" for answer in answer_list] - answer_list = [answer if str(answer) != "Third" else "3" for answer in answer_list] - answer_list = [answer if str(answer) != "Six" else "6" for answer in answer_list] - answer_list = [answer.rstrip(".") for answer in answer_list] else: answer_list = [answer.rstrip(".") for answer in answer_list] # answer_list = [str(x).rsplit(':',1)[0] if len(str(x).rsplit(':',1)) < 2 else str(x).rsplit(':',1)[1] for x in answer_list] - except: - print('post processing failed') + except Exception as e: + st.write(e) # to be deleted later # contract_list_f = [contract.rsplit('/',1)[1].replace(' MU','').replace('_MU','').replace('.txt','') for contract in contract_list_f] @@ -628,8 +619,17 @@ if st.session_state.user_info['mail'] in user_list: actual_value_list = [answer if str(answer) != "12 months" else "1 year" for answer in actual_value_list] actual_value_list = [answer if str(answer) != "Fifth" else "5" for answer in actual_value_list] actual_value_list = [answer if str(answer) != "Seventh" else "7" for answer in actual_value_list] - + answer_list = list(df['New Extracted value']) + answer_list = [answer if str(answer) != "one-year" else "1 year" for answer in answer_list] + answer_list = [answer if str(answer) != "one year" else "1 year" for answer in answer_list] + answer_list = [answer if str(answer) != "one" else "1 year" for answer in answer_list] + answer_list = [answer if str(answer) != "one (1) year" else "1 year" for answer in answer_list] + answer_list = [answer if str(answer) != "twelve" else "1 year" for answer in answer_list] + answer_list = [answer if str(answer) != "XI" else "11" for answer in answer_list] + answer_list = [answer if str(answer) != "Third" else "3" for answer in answer_list] + answer_list = [answer if str(answer) != "Six" else "6" for answer in answer_list] + actual_value_list = [s.replace('-', '').replace(' ', '').replace('[', '').replace(']', '').lower() for s in actual_value_list] answer_list = [s.replace('-', '').replace(' ', '').replace('[', '').replace(']', '').lower() for s in answer_list] result_list = [(i in j) or (j in i) if isinstance(i, str) and isinstance( From 9a8a4b64d3af2af21a9483ca193f4261da5ae07f Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Thu, 18 Apr 2024 11:37:56 +0530 Subject: [PATCH 10/21] select field option added --- streamlit/interface_3.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index bda7b87..9397b6d 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -176,13 +176,14 @@ if st.session_state.user_info['mail'] in user_list: field_row = st.columns([0.15, 0.45, 0.4]) with field_row[0]: - if mode != 'Multiple fields': - st.write("**Field Name**") + st.write("**Field Name**") with field_row[1]: if mode != 'Multiple fields': field = st.selectbox('Field Name',sorted(set(field_prompt_mapping.keys())), index=0, label_visibility = "collapsed") else: - field = sorted(set(field_prompt_mapping.keys())) + field = st.multiselect('Field Name',sorted(set(field_prompt_mapping.keys())), sorted( + set(field_prompt_mapping.keys())), label_visibility = "collapsed") + field_prompt_mapping = {key: field_prompt_mapping[key] for key in field} contract_count_row = st.columns([0.15, 0.45, 0.4]) with contract_count_row[0]: From 6c70180a9fc40c97f2e608deb398e327aee4cdd1 Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Thu, 18 Apr 2024 13:19:13 +0530 Subject: [PATCH 11/21] post processing date --- streamlit/interface_3.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 9397b6d..65d12ec 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -603,7 +603,7 @@ if st.session_state.user_info['mail'] in user_list: df = df.drop_duplicates(subset=['SF_DB_COL_NAME', 'Contract Name'], keep="first") df['Original Page Number'] = df['Original Page Number'].apply(lambda x: re.search(r'\d+', x).group( ) if isinstance(x, str) and re.search(r'\d+', x) is not None else " ") - + df['Raw value 2'] = df['Actual Value Stored'] df_date = df[df['SF_DB_COL_NAME'].str.contains('_DT', na=False)] df_others = df[~df['SF_DB_COL_NAME'].str.contains('_DT', na=False)] @@ -641,7 +641,7 @@ if st.session_state.user_info['mail'] in user_list: # df['Contract ID'] = contract_list_f df['Contract ID'] = range(len(actual_value_list)) - df = df[['Contract Name','Contract ID', 'SF_DB_COL_NAME', 'Actual Value Stored', 'Raw value', 'New Extracted value','Confidence Level' + df = df[['Contract Name','Contract ID', 'SF_DB_COL_NAME', 'Actual Value Stored', 'Raw value', 'Raw value 2', 'New Extracted value','Confidence Level' ,'Snippet','Original Page Number', 'New Page Number', 'Revised Prompt', 'Result']] try: From b997a37d3619f40ef99700a1d8e16b599609b503 Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Thu, 18 Apr 2024 14:28:47 +0530 Subject: [PATCH 12/21] post processing date fix --- streamlit/interface_3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 65d12ec..dc6ff69 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -603,7 +603,7 @@ if st.session_state.user_info['mail'] in user_list: df = df.drop_duplicates(subset=['SF_DB_COL_NAME', 'Contract Name'], keep="first") df['Original Page Number'] = df['Original Page Number'].apply(lambda x: re.search(r'\d+', x).group( ) if isinstance(x, str) and re.search(r'\d+', x) is not None else " ") - df['Raw value 2'] = df['Actual Value Stored'] + df['Raw value 2'] = df['New Extracted value'] df_date = df[df['SF_DB_COL_NAME'].str.contains('_DT', na=False)] df_others = df[~df['SF_DB_COL_NAME'].str.contains('_DT', na=False)] From ee726b2730876b36ca9f4808896628a05656c27c Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Thu, 18 Apr 2024 14:40:10 +0530 Subject: [PATCH 13/21] post processing date fix --- streamlit/interface_3.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index dc6ff69..102c221 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -613,7 +613,7 @@ if st.session_state.user_info['mail'] in user_list: df.sort_values(['SF_DB_COL_NAME', 'Contract Name'], inplace=True) df.fillna(" ", inplace=True) - + df['Raw value 3'] = df['New Extracted value'] df['Actual Value Stored'] = df['Actual Value Stored'].apply(lambda x: x.strip() if isinstance(x, str) else '') df['New Extracted value'] = df['New Extracted value'].apply(lambda x: x.strip() if isinstance(x, str) else '') actual_value_list = list(df['Actual Value Stored']) @@ -641,8 +641,8 @@ if st.session_state.user_info['mail'] in user_list: # df['Contract ID'] = contract_list_f df['Contract ID'] = range(len(actual_value_list)) - df = df[['Contract Name','Contract ID', 'SF_DB_COL_NAME', 'Actual Value Stored', 'Raw value', 'Raw value 2', 'New Extracted value','Confidence Level' - ,'Snippet','Original Page Number', 'New Page Number', 'Revised Prompt', 'Result']] + df = df[['Contract Name','Contract ID', 'SF_DB_COL_NAME', 'Actual Value Stored', 'Raw value', 'Raw value 2', 'Raw value 3' + , 'New Extracted value','Confidence Level','Snippet','Original Page Number', 'New Page Number', 'Revised Prompt', 'Result']] try: accuracy = round(sum(bool(x) for x in result_list) * 100 / len(list(df['Result'])), 2) From 688efcfa54df0ee989af9fc8525c71aa4591df30 Mon Sep 17 00:00:00 2001 From: Umang Mistry Date: Thu, 18 Apr 2024 15:33:13 -0500 Subject: [PATCH 14/21] Fixing SSO --- streamlit/security.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/streamlit/security.py b/streamlit/security.py index 1ad59fd..69e0b91 100644 --- a/streamlit/security.py +++ b/streamlit/security.py @@ -3,7 +3,7 @@ import msal import requests import boto3 from botocore.exceptions import ClientError - +import json # Replace with your own values CLIENT_ID = 'effafe90-7ed7-43a3-ab03-19a0be2f1758' @@ -14,6 +14,7 @@ AUTHORITY = 'https://login.microsoftonline.com/organizations/' SCOPE = ['User.Read'] REDIRECT_URI = 'https://171.29.20.126:8501' +# Initialize boto3 client to interact with AWS Secrets Manager @@ -24,12 +25,12 @@ def get_secret(): region_name = "us-east-2" # Create a Secrets Manager client - session = boto3.session.Session() - client = session.client( - service_name='secretsmanager', - region_name=region_name - ) - + # session = boto3.session.Session() + # client = session.client( + # service_name='secretsmanager', + # region_name=region_name + # ) + client = boto3.client('secretsmanager', region_name=region_name) try: get_secret_value_response = client.get_secret_value( SecretId=secret_name @@ -38,6 +39,7 @@ def get_secret(): raise e secret = get_secret_value_response['SecretString'] + secret = json.loads(secret)['CLIENT_SECRET'] return secret From f342eba1d5100de00ea7ce9b3e04c97d92e21de9 Mon Sep 17 00:00:00 2001 From: Umang Mistry Date: Thu, 18 Apr 2024 16:38:56 -0500 Subject: [PATCH 15/21] Changed client config to client_logs --- streamlit/sf_conn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/streamlit/sf_conn.py b/streamlit/sf_conn.py index 98dc084..199f1a5 100644 --- a/streamlit/sf_conn.py +++ b/streamlit/sf_conn.py @@ -106,7 +106,7 @@ def get_client_names(): cursor = conn.cursor() # Query to get client names and their s3_paths - query = "SELECT DISTINCT client_name, s3_bucket_path FROM STG.CLIENT_CONFIG" + query = "SELECT DISTINCT client_name, bucket_name FROM STG.CLIENT_LOGS" cursor.execute(query) # Create 2 lists from the query results client_names = [] @@ -114,7 +114,7 @@ def get_client_names(): for row in cursor: client_names.append(row[0]) - s3_paths.append(row[1].replace('s3://','').split('/')[0]) # Extracting the bucket name from the s3 path + s3_paths.append(row[1]) # Extracting the bucket name from the s3 path cursor.close() conn.close() return client_names, s3_paths From fc8224754b75c060e16b536c9886f6714dff31cb Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Fri, 19 Apr 2024 16:27:57 +0530 Subject: [PATCH 16/21] s3 txt file path changed --- streamlit/interface_2.py | 2 +- streamlit/interface_3.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/streamlit/interface_2.py b/streamlit/interface_2.py index 65fd044..2130a9d 100644 --- a/streamlit/interface_2.py +++ b/streamlit/interface_2.py @@ -95,7 +95,7 @@ s3_client = boto3.client('s3', region_name="us-east-2" ) bucket = 'doczy-dev-infra-textract' -objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/contract-text-file/") +objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="batches/batch_1/contract-text-file/") file_list = [] for obj in objects['Contents']: if not obj['Key'].endswith('/'): diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 102c221..3eb4d16 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -195,7 +195,7 @@ if st.session_state.user_info['mail'] in user_list: region_name="us-east-2" ) bucket = 'doczy-dev-infra-textract' - objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/contract-text-file/") + objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="batches/batch_1/contract-text-file/") file_list = [] for obj in objects['Contents']: if not obj['Key'].endswith('/'): From 7294f9a8e44b04abe8cc51bcc8187d7137cfd4bd Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Fri, 19 Apr 2024 17:10:38 +0530 Subject: [PATCH 17/21] s3 txt file path reverted --- streamlit/interface_2.py | 2 +- streamlit/interface_3.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/streamlit/interface_2.py b/streamlit/interface_2.py index 2130a9d..65fd044 100644 --- a/streamlit/interface_2.py +++ b/streamlit/interface_2.py @@ -95,7 +95,7 @@ s3_client = boto3.client('s3', region_name="us-east-2" ) bucket = 'doczy-dev-infra-textract' -objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="batches/batch_1/contract-text-file/") +objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/contract-text-file/") file_list = [] for obj in objects['Contents']: if not obj['Key'].endswith('/'): diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 3eb4d16..102c221 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -195,7 +195,7 @@ if st.session_state.user_info['mail'] in user_list: region_name="us-east-2" ) bucket = 'doczy-dev-infra-textract' - objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="batches/batch_1/contract-text-file/") + objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/contract-text-file/") file_list = [] for obj in objects['Contents']: if not obj['Key'].endswith('/'): From 59c8cac29f41bffd5afa7972f307b006239e0da7 Mon Sep 17 00:00:00 2001 From: Mayank Aamseek Date: Fri, 19 Apr 2024 17:16:13 +0530 Subject: [PATCH 18/21] s3 txt file path reverted --- streamlit/interface_2.py | 2 +- streamlit/interface_3.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/streamlit/interface_2.py b/streamlit/interface_2.py index 65fd044..7bc7afc 100644 --- a/streamlit/interface_2.py +++ b/streamlit/interface_2.py @@ -95,7 +95,7 @@ s3_client = boto3.client('s3', region_name="us-east-2" ) bucket = 'doczy-dev-infra-textract' -objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/contract-text-file/") +objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/") file_list = [] for obj in objects['Contents']: if not obj['Key'].endswith('/'): diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 102c221..711bf34 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -195,7 +195,7 @@ if st.session_state.user_info['mail'] in user_list: region_name="us-east-2" ) bucket = 'doczy-dev-infra-textract' - objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/contract-text-file/") + objects = s3_client.list_objects_v2(Bucket=bucket, Prefix="training-data/") file_list = [] for obj in objects['Contents']: if not obj['Key'].endswith('/'): From 933e4fc855df3d9939fea0d1605422e95c6a1ea5 Mon Sep 17 00:00:00 2001 From: Umang Mistry Date: Fri, 19 Apr 2024 10:59:02 -0500 Subject: [PATCH 19/21] Added Himani to userlist --- streamlit/interface_0.py | 2 +- streamlit/interface_1.py | 2 +- streamlit/interface_2.py | 2 +- streamlit/interface_2_rag.py | 2 +- streamlit/interface_3.py | 2 +- streamlit/interface_3_rag.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/streamlit/interface_0.py b/streamlit/interface_0.py index 38eaa6d..567a264 100644 --- a/streamlit/interface_0.py +++ b/streamlit/interface_0.py @@ -18,7 +18,7 @@ create_batch_url = 'https://lfksus2t62.execute-api.us-east-2.amazonaws.com/dev/c REDIRECT_URI = 'https://doczy.aarete.com:8500' user_list = ['maamseek@aarete.com', 'smahdavian@aarete.com', 'ahinge@aarete.com', 'akadam@aarete.com', 'pkatariya@aarete.com' , 'piragavarapu@aarete.com', 'umistry@aarete.com', 'ahutchison@aarete.com', 'bgrunst@aarete.com', 'ddimeglio@aarete.com' -, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com'] +, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com','hupreti@aarete.com'] st.set_page_config(layout = "wide") # # Sidebar contents # with st.sidebar: diff --git a/streamlit/interface_1.py b/streamlit/interface_1.py index 74da14f..6a12402 100644 --- a/streamlit/interface_1.py +++ b/streamlit/interface_1.py @@ -15,7 +15,7 @@ doczy_pipeline = 'https://8ir4vi1ri4.execute-api.us-east-2.amazonaws.com/dev/' REDIRECT_URI = 'https://doczy.aarete.com:8501' user_list = ['maamseek@aarete.com', 'smahdavian@aarete.com', 'ahinge@aarete.com', 'akadam@aarete.com', 'pkatariya@aarete.com' , 'piragavarapu@aarete.com', 'umistry@aarete.com', 'ahutchison@aarete.com', 'bgrunst@aarete.com', 'ddimeglio@aarete.com' -, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com'] +, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com','hupreti@aarete.com'] st.set_page_config(layout = "wide") # # Sidebar contents # with st.sidebar: diff --git a/streamlit/interface_2.py b/streamlit/interface_2.py index 7bc7afc..1a4bd78 100644 --- a/streamlit/interface_2.py +++ b/streamlit/interface_2.py @@ -22,7 +22,7 @@ import re REDIRECT_URI = 'https://doczy.aarete.com:8502' user_list = ['maamseek@aarete.com', 'smahdavian@aarete.com', 'ahinge@aarete.com', 'akadam@aarete.com', 'pkatariya@aarete.com' , 'piragavarapu@aarete.com', 'umistry@aarete.com', 'ahutchison@aarete.com', 'bgrunst@aarete.com', 'ddimeglio@aarete.com' -, 'vnair@aarete.com', 'kminhas@aarete.com','dculotta@aarete.com','cbull@aarete.com','sclark@aarete.com', 'fmohiuddin@aarete.com'] +, 'vnair@aarete.com', 'kminhas@aarete.com','dculotta@aarete.com','cbull@aarete.com','sclark@aarete.com', 'fmohiuddin@aarete.com', 'hupreti@aarete.com'] st.set_page_config(layout = "wide") # Sidebar contents diff --git a/streamlit/interface_2_rag.py b/streamlit/interface_2_rag.py index 6e57a7e..f0ab1d1 100644 --- a/streamlit/interface_2_rag.py +++ b/streamlit/interface_2_rag.py @@ -17,7 +17,7 @@ import util REDIRECT_URI = 'https://doczy.aarete.com:8502' user_list = ['maamseek@aarete.com', 'smahdavian@aarete.com', 'ahinge@aarete.com', 'akadam@aarete.com', 'pkatariya@aarete.com' , 'piragavarapu@aarete.com', 'umistry@aarete.com', 'ahutchison@aarete.com', 'bgrunst@aarete.com', 'ddimeglio@aarete.com' -, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com'] +, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com','hupreti@aarete.com'] st.set_page_config(layout = "wide") # Sidebar contents diff --git a/streamlit/interface_3.py b/streamlit/interface_3.py index 711bf34..ef18786 100644 --- a/streamlit/interface_3.py +++ b/streamlit/interface_3.py @@ -27,7 +27,7 @@ from io import StringIO REDIRECT_URI = 'https://doczy.aarete.com:8503' user_list = ['maamseek@aarete.com', 'smahdavian@aarete.com', 'ahinge@aarete.com', 'akadam@aarete.com', 'pkatariya@aarete.com' , 'piragavarapu@aarete.com', 'umistry@aarete.com', 'ahutchison@aarete.com', 'bgrunst@aarete.com', 'ddimeglio@aarete.com' -, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com'] +, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com','hupreti@aarete.com'] st.set_page_config(layout = "wide") # Sidebar contents diff --git a/streamlit/interface_3_rag.py b/streamlit/interface_3_rag.py index 2cc6cbc..538ddd5 100644 --- a/streamlit/interface_3_rag.py +++ b/streamlit/interface_3_rag.py @@ -20,7 +20,7 @@ import util REDIRECT_URI = 'http://172.29.20.126:8503' user_list = ['maamseek@aarete.com', 'smahdavian@aarete.com', 'ahinge@aarete.com', 'akadam@aarete.com', 'pkatariya@aarete.com' , 'piragavarapu@aarete.com', 'umistry@aarete.com', 'ahutchison@aarete.com', 'bgrunst@aarete.com', 'ddimeglio@aarete.com' -, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com'] +, 'vnair@aarete.com', 'kminhas@aarete.com', 'fmohiuddin@aarete.com', 'slitewka@aarete.com', 'qdoest@aarete.com', 'bkoryga@aarete.com', 'bcielecki@aarete.com', 'mszymanski@aarete.com','hupreti@aarete.com'] st.set_page_config(layout = "wide") # Sidebar contents From 4a54bd7252e83d333b20e140fb0f3d6ea5b0a533 Mon Sep 17 00:00:00 2001 From: Umang Mistry Date: Fri, 19 Apr 2024 14:07:16 -0500 Subject: [PATCH 20/21] Updated destination bucket for UI 0 --- streamlit/interface_0.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/streamlit/interface_0.py b/streamlit/interface_0.py index 567a264..e2bf49b 100644 --- a/streamlit/interface_0.py +++ b/streamlit/interface_0.py @@ -68,9 +68,8 @@ if user_mail in user_list: with client_row[1]: client = st.selectbox('Client Name',(client_list), label_visibility = "collapsed") - client = client_s3_paths.get(client) - # # to be deleted when buckets for different clients are ready; below line is added only for testing the corresponding DAG - client = 'doczy-ai-client-1' + client_bucket = client_s3_paths.get(client) + # client = 'doczy-ai-client-1' file_row = st.columns([0.1, 0.8]) with file_row[0]: @@ -86,7 +85,7 @@ if user_mail in user_list: with buttons[1]: if st.button("Create Batch"): - myobj = { "client-bucket-name": client } + myobj = { "client-bucket-name": client_bucket } response = requests.post(create_batch_url, json = myobj) if response.status_code >= 200 and response.status_code < 300: try: @@ -104,7 +103,7 @@ if user_mail in user_list: stringio.seek(0) # s3_client.put_object(Bucket='doczy-dev-infra-raw-data-ingestion', Body=stringio.getvalue(), Key= # 'config_interface/'+str(uploaded_file.name)) - s3_client.put_object(Bucket=client, Body=stringio.getvalue(), Key= + s3_client.put_object(Bucket=client_bucket, Body=stringio.getvalue(), Key= batch_id+'/'+landing_zone+'/'+str(uploaded_file.name)) # TODO: Test this insert function with snowflake From 3d5cb15d5a05213f0b2aaddb48aa85f6f75a86da Mon Sep 17 00:00:00 2001 From: Umang Mistry Date: Fri, 19 Apr 2024 14:11:43 -0500 Subject: [PATCH 21/21] Updated upload confirmation message in UI 0 --- streamlit/interface_0.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/streamlit/interface_0.py b/streamlit/interface_0.py index e2bf49b..ea658ab 100644 --- a/streamlit/interface_0.py +++ b/streamlit/interface_0.py @@ -101,8 +101,6 @@ if user_mail in user_list: for uploaded_file in file_list: stringio = BytesIO(uploaded_file.getvalue()) stringio.seek(0) - # s3_client.put_object(Bucket='doczy-dev-infra-raw-data-ingestion', Body=stringio.getvalue(), Key= - # 'config_interface/'+str(uploaded_file.name)) s3_client.put_object(Bucket=client_bucket, Body=stringio.getvalue(), Key= batch_id+'/'+landing_zone+'/'+str(uploaded_file.name)) @@ -112,7 +110,7 @@ if user_mail in user_list: file_names.append(str(uploaded_file.name)) st.write(f"{batch_id} created") - st.write(f"Files uploaded to s3://{client}/{batch_id}/{landing_zone}") + st.write(f"Files uploaded to s3://{client_bucket}/{batch_id}/{landing_zone}") # @st.cache_data