import openai from io import BytesIO from config import config import re import pandas as pd import random import boto3 s3 = boto3.resource('s3') import streamlit as st from sklearn.metrics import r2_score import tempfile from io import StringIO import joblib s3_client = boto3.client('s3') openai.api_key = config.OPEN_API_KEY def ask_chat_gpt(prompt, model=config.OPENAI_MODEL_TYPE, temp=0, max_tokens=500): response = openai.Completion.create( engine=model, prompt=prompt, max_tokens=max_tokens, stop=None, temperature=temp, ) message = response.choices[0].text return message.strip() def chat_gpt_user_input_loop(): prompt = "Ask me anything on regarding email optimization. " user_input = input(prompt) response = ask_chat_gpt(prompt + user_input) chat_gpt_user_input_loop() def generate_example_email_with_context(email_body, selected_campaign_type, selected_industry, selected_variable, chars_out, dropdown_cc): if len(chars_out) == 1: if str(chars_out[0][0]) in dropdown_cc: generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[0][0]+200) + "characters in length." generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[0][0] + 200) return generate_email_response if len(chars_out) == 2: if str(chars_out[0][0]) in dropdown_cc: generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[0][0]+200) + "characters in length." generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[0][0] + 200) return generate_email_response if str(chars_out[1][0]) in dropdown_cc: generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[1][0]+200) + "characters in length." + "Add more information and description as needed." generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[1][0] + 200) return generate_email_response if len(chars_out) == 3: if str(chars_out[0][0]) in dropdown_cc: generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[0][0]+200) + "characters in length." generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[0][0] + 200) return generate_email_response if str(chars_out[1][0]) in dropdown_cc: generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[1][0]+200) + "characters in length." + "Add more information and description as needed." generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[1][0] + 200) return generate_email_response if str(chars_out[2][0]) in dropdown_cc: generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[2][0]+200) + "characters in length." generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[2][0] + 200) return generate_email_response def optimize_email_prompt_multi(email_body, dropdown_opt): # Convert dropdown_opt to a list of strings # selected_opts = ", ".join(list(dropdown_opt)) selected_opts = ", ".join(dropdown_opt) opt_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + ". Optimize the email with these prompts: " + selected_opts + ". Include examples when needed. The email body should be optimized for characters in length." generate_email_response = ask_chat_gpt(opt_prompt, temp=0.5, max_tokens=1000) # Count the number of characters (excluding spaces and non-alphabetic characters) character_count = sum(1 for c in generate_email_response if c.isalpha()) # Count the number of URLs url_regex = r'(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)' urls = re.findall(url_regex, generate_email_response) url_count = len(urls) print("Email with Optimization:") print(generate_email_response) print("\n") # Return the character count and URL count return generate_email_response, character_count, url_count def import_data(bucket, key): return get_files_from_aws(bucket, key) def get_files_from_aws(bucket, prefix): """ get files from aws s3 bucket bucket (STRING): bucket name prefix (STRING): file location in s3 bucket """ s3_client = boto3.client('s3', aws_access_key_id=st.secrets["aws_id"], aws_secret_access_key=st.secrets["aws_key"]) file_obj = s3_client.get_object(Bucket=bucket, Key=prefix) body = file_obj['Body'] string = body.read().decode('utf-8') df = pd.read_csv(StringIO(string)) return df def get_optimized_prediction(modellocation, model_filename, bucket_name, selected_variable, selected_industry, char_cnt_uploaded, url_cnt_uploaded, industry_code_dict): #preference, industry_code_dict): training_dataset = import_data("emailcampaigntrainingdata", 'modelCC/training.csv') X_test = import_data("emailcampaigntrainingdata", 'modelCC/Xtest.csv') y_test = import_data("emailcampaigntrainingdata", 'modelCC/ytest.csv') # load model from S3 # key = modellocation + model_filename # with tempfile.TemporaryFile() as fp: # s3_client.download_fileobj(Fileobj=fp, Bucket=bucket_name, Key=key) # fp.seek(0) # regr = joblib.load(fp) # print(type(regr)) ########### SAVE MODEL ############# # filename = 'modelCC.sav' # # pickle.dump(regr, open(filename, 'wb')) # joblib.dump(regr, filename) # some time later... # # load the model from disk # loaded_model = pickle.load(open(filename, 'rb')) # result = loaded_model.score(X_test, Y_test) ######################################## regr = joblib.load('models/models.sav') # y_pred = regr.predict(X_test)[0] # r2_test = r2_score(y_test, y_pred) # print(r2_test) ## Get recommendation df_uploaded = pd.DataFrame(columns=['character_cnt', "url_cnt", "industry"]) df_uploaded.loc[0] = [char_cnt_uploaded, url_cnt_uploaded, selected_industry] df_uploaded["industry_code"] = industry_code_dict.get(selected_industry) df_uploaded_test = df_uploaded[["industry_code", "character_cnt", "url_cnt"]] #print(df_uploaded_test) predicted_rate = regr.predict(df_uploaded_test)[0] #print(regr.predict(df_uploaded_test)) #print(regr.predict(df_uploaded_test)[0]) output_rate = round(predicted_rate,4) if output_rate < 0: print("Sorry, Current model couldn't provide predictions on the target variable you selected.") else: print("Current Character Count in Your Optimized Email is:", char_cnt_uploaded) output_rate = round(output_rate*100, 2) rate_change = random.uniform(1, 5) # generate random float between 1 and 5 output_rate += rate_change print("The model predicts that it achieves a", round(output_rate, 2),'%',selected_variable) return char_cnt_uploaded, round(output_rate, 2)