import streamlit as st | |
from landing import show_landing_content | |
from agent_manager import AgentManager | |
from dashboard.logs import show_logs | |
from stripe_checkout import create_stripe_session | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 1. GLOBAL CONFIGURATION | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
st.set_page_config( | |
page_title="AutoExec AI", | |
page_icon="π", | |
layout="wide", | |
initial_sidebar_state="expanded", | |
) | |
# Define your navigation pages and labels here | |
PAGES = { | |
"Home": "π Home", | |
"Launch": "π Launch", | |
"Logs": "π Logs", | |
"Settings": "βοΈ Settings" | |
} | |
# Initialize state | |
if "current_page" not in st.session_state: | |
st.session_state.current_page = "Home" | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 2. SIDEBAR NAVIGATION COMPONENT | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def render_sidebar() -> str: | |
"""Renders the sidebar and returns the selected page key.""" | |
st.sidebar.title("AutoExec AI") | |
choice = st.sidebar.radio( | |
label="Navigate to:", | |
options=list(PAGES.values()), | |
index=list(PAGES.values()).index(PAGES[st.session_state.current_page]), | |
key="nav_radio", | |
) | |
# Map label back to internal key | |
for key, label in PAGES.items(): | |
if label == choice: | |
return key | |
return "Home" | |
st.session_state.current_page = render_sidebar() | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 3. PAGE DISPATCHER | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def main(): | |
page = st.session_state.current_page | |
if page == "Home": | |
render_home() | |
elif page == "Launch": | |
render_launch() | |
elif page == "Logs": | |
render_logs() | |
elif page == "Settings": | |
render_settings() | |
else: | |
st.error("Page not found!") | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 4. PAGE RENDERERS | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def render_home(): | |
"""Renders the Home (Landing) page with hero and features.""" | |
# Hero section | |
st.markdown( | |
""" | |
<div style="text-align:center; margin:2rem 0;"> | |
<h1 style="font-size:3rem; margin-bottom:0.5rem;">π AutoExec AI</h1> | |
<p style="font-size:1.25rem; color:#555;"> | |
Launch, manage, and optimize AIβpowered businesses with a single click. | |
</p> | |
</div> | |
""", | |
unsafe_allow_html=True, | |
) | |
show_landing_content() | |
def render_launch(): | |
"""Renders the Launch page with a form to kick off the agent pipeline.""" | |
st.markdown("## π Launch a New AI Business") | |
with st.form("launch_form", clear_on_submit=False): | |
niche = st.text_input( | |
label="π― Niche", | |
placeholder="e.g., fitness wear", | |
help="Define the market or audience for your business.", | |
) | |
business_type = st.selectbox( | |
label="π¦ Business Type", | |
options=["Dropshipping", "Print-on-Demand", "Newsletter", "Course"], | |
help="Select the kind of business model to generate.", | |
) | |
submit = st.form_submit_button("Generate & Deploy") | |
if submit: | |
if not niche.strip(): | |
st.warning("Please enter a valid niche to continue.") | |
return | |
_run_agents(niche.strip(), business_type) | |
def render_logs(): | |
"""Renders the Logs dashboard.""" | |
st.markdown("## π Agent Memory Log Dashboard") | |
show_logs() | |
def render_settings(): | |
"""Renders the Settings & Billing page.""" | |
st.markdown("## βοΈ Settings & Billing") | |
st.markdown( | |
""" | |
**Secrets to configure** (Settings β Secrets): | |
- `API_KEY` | |
- `OPENAI_API_KEY` | |
- `GEMINI_API_KEY` | |
- `STRIPE_API_KEY` | |
""" | |
) | |
if st.button("π³ Create Stripe Checkout Session"): | |
session_url = create_stripe_session() | |
st.markdown(f"[Proceed to Payment]({session_url})", unsafe_allow_html=True) | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 5. AGENT EXECUTION HELPER | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def _run_agents(niche: str, business_type: str): | |
"""Internal helper to run the AgentManager and display results.""" | |
with st.spinner("π€ Running AI agents... please wait"): | |
manager = AgentManager(niche, business_type) | |
results = manager.run_all() | |
st.success("β Business Launched Successfully!") | |
st.json(results) | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# 6. FOOTER | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
def render_footer(): | |
st.markdown("---") | |
st.markdown( | |
""" | |
<div style="text-align:center; color:#888; font-size:0.9rem;"> | |
Powered by Streamlit β’ FastAPI β’ Celery β’ Redis β’ Hugging Face Spaces | |
</div> | |
""", | |
unsafe_allow_html=True, | |
) | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
# ENTRY POINT | |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
if __name__ == "__main__": | |
main() | |
render_footer() | |