FrancisSilva/Loyalty_Strategy
0
1# app.py2import streamlit as st3from transformers import pipeline4import requests5from bs4 import BeautifulSoup6import json7import os8from dotenv import load_dotenv9 10# Load environment variables11load_dotenv()12 13# Initialize session state14if 'current_strategy' not in st.session_state:15 st.session_state.current_strategy = None16if 'rejected_components' not in st.session_state:17 st.session_state.rejected_components = set()18 19def get_competitor_info(competitor_name):20 """21 Scrape basic information about competitors.22 Note: In a production environment, you'd want to use proper APIs23 """24 headers = {25 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'26 }27 28 try:29 response = requests.get(30 f"https://www.google.com/search?q={competitor_name}+loyalty+program",31 headers=headers32 )33 soup = BeautifulSoup(response.text, 'html.parser')34 # Extract relevant text (simplified for example)35 snippets = soup.find_all('div', class_='VwiC3b')36 return ' '.join([s.text for s in snippets[:3]])37 except Exception as e:38 return f"Error fetching competitor info: {str(e)}"39 40def generate_loyalty_strategy(inputs, competitor_info, rejected_components):41 """42 Generate loyalty strategy using an LLM43 """44 # Initialize HuggingFace pipeline45 generator = pipeline('text-generation', 46 model='gpt2', # Replace with your preferred model47 token=os.getenv('HUGGINGFACE_TOKEN'))48 49 # Construct prompt50 prompt = f"""51 Create a loyalty strategy based on these inputs:52 Industry: {inputs['industry']}53 Target Customer: {inputs['target_customer']}54 Budget Level: {inputs['budget']}55 56 Competitor Information:57 {competitor_info}58 59 Previously rejected components:60 {', '.join(rejected_components) if rejected_components else 'None'}61 62 Generate a loyalty strategy with 5 distinct components.63 """64 65 # Generate strategy66 response = generator(prompt, max_length=500, num_return_sequences=1)[0]['generated_text']67 68 # Parse response into components (simplified)69 components = [comp.strip() for comp in response.split('\n') if comp.strip()]70 return components[:5] # Ensure we return exactly 5 components71 72def main():73 st.title("Loyalty Strategy Generator")74 75 # Input Section76 st.header("Input Parameters")77 with st.form("input_form"):78 industry = st.text_input("Industry")79 target_customer = st.text_input("Target Customer Profile")80 budget = st.selectbox("Budget Level", ["Low", "Medium", "High"])81 competitors = st.text_area("Competitor Names (one per line)")82 submitted = st.form_submit_button("Generate Strategy")83 84 if submitted:85 # Get competitor information86 competitor_list = [comp.strip() for comp in competitors.split('\n') if comp.strip()]87 competitor_info = '\n'.join([88 f"{comp}: {get_competitor_info(comp)}"89 for comp in competitor_list90 ])91 92 # Generate strategy93 inputs = {94 'industry': industry,95 'target_customer': target_customer,96 'budget': budget97 }98 99 components = generate_loyalty_strategy(100 inputs, 101 competitor_info, 102 st.session_state.rejected_components103 )104 st.session_state.current_strategy = components105 106 # Display and evaluate strategy components107 if st.session_state.current_strategy:108 st.header("Evaluate Strategy Components")109 st.write("Select ✓ to keep or ✗ to reject each component:")110 111 rejected_this_round = set()112 for i, component in enumerate(st.session_state.current_strategy):113 col1, col2, col3 = st.columns([3, 1, 1])114 with col1:115 st.write(f"{i+1}. {component}")116 with col2:117 if st.button("✓", key=f"accept_{i}"):118 pass # Keep component119 with col3:120 if st.button("✗", key=f"reject_{i}"):121 rejected_this_round.add(component)122 123 # Update rejected components and regenerate if needed124 if rejected_this_round:125 st.session_state.rejected_components.update(rejected_this_round)126 if st.button("Regenerate Strategy"):127 components = generate_loyalty_strategy(128 inputs,129 competitor_info,130 st.session_state.rejected_components131 )132 st.session_state.current_strategy = components133 st.experimental_rerun()134 135if __name__ == "__main__":136 main()