import os import time import google.generativeai as genai import streamlit as st from dotenv import load_dotenv from ui.streamlit_ui import ( load_css, render_code_display, render_footer, render_framework_selector, render_generate_button, render_header, render_task_selector, ) # Initialize session state if "api_key" not in st.session_state: st.session_state["api_key"] = None if "generated_code" not in st.session_state: st.session_state["generated_code"] = None if "selected_framework" not in st.session_state: st.session_state["selected_framework"] = None def with_retry(func, max_retries=3, delay=1): for attempt in range(max_retries): try: return func() except Exception as e: if attempt == max_retries - 1: raise e time.sleep(delay) # Set page configuration st.set_page_config( page_title="Multi-Model App Builder", page_icon="🛠️", layout="wide", initial_sidebar_state="expanded", ) # Load custom CSS load_css() # Load environment variables load_dotenv() # Configure Google Generative AI api_key = os.getenv("GOOGLE_API_KEY") if api_key and api_key != "your_api_key_here": try: with st.spinner("Configuring API connection..."): with_retry(lambda: genai.configure(api_key=api_key)) st.session_state["api_key"] = api_key st.success("Google API key configured successfully!") except Exception as e: st.error(f"Error configuring Google API key: {e}") st.info("The app will continue to run with limited functionality.") else: st.sidebar.warning( "Google API key not configured. Please add your API key to the .env file as GOOGLE_API_KEY." ) st.sidebar.info("You can get a Google API key from https://ai.google.dev/") api_key_input = st.sidebar.text_input( "Or enter your Google API key here:", type="password" ) if api_key_input: try: with st.spinner("Configuring API connection..."): with_retry(lambda: genai.configure(api_key=api_key_input)) st.session_state["api_key"] = api_key_input st.success("Google API key configured successfully!") except Exception as e: st.error(f"Error configuring Google API key: {e}") st.session_state["api_key"] = None def generate_app_code(framework, task): if not st.session_state.get("api_key"): return "API key not configured. Please provide a Google API key to generate code." try: prompt = ( f"Create a {framework} app for the following task: {task}. " "Provide the full Python code and ensure it is functional." ) def get_response(): model = genai.GenerativeModel("gemini-1.5-flash") return model.generate_content(prompt) response = with_retry(get_response) if hasattr(response, "text"): return response.text return "Error: Unable to generate code. Invalid response format." except Exception as e: return f"An error occurred: {e}" def main(): render_header() col1, col2 = st.columns([2, 1]) with col1: framework = render_framework_selector() st.session_state["selected_framework"] = framework task = render_task_selector() if render_generate_button(): with st.spinner("Generating code with AI..."): app_code = generate_app_code(framework, task) if app_code: st.session_state["generated_code"] = app_code st.success("Code generated successfully!") else: st.error("Failed to generate the app code. Please try again.") with col2: st.markdown("### App Preview") st.info( f"Framework: {st.session_state['selected_framework'] if st.session_state['selected_framework'] else 'Not selected'}" ) st.markdown("### Sample Apps") st.image( "https://streamlit.io/images/brand/streamlit-logo-secondary-colormark-darktext.png", width=200, ) st.image("https://gradio.app/images/logo.svg", width=200) st.markdown("### Tips") st.info( "• Be specific in your task description\n• Run the generated code in a new file\n• Experiment with different frameworks" ) if st.session_state["generated_code"]: render_code_display(st.session_state["generated_code"]) render_footer() if __name__ == "__main__": try: main() except Exception as e: st.error(f"An error occurred: {str(e)}")