S-Dreamer's picture
Upload 19 files
c99746f verified
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)}")