offerpk3 commited on
Commit
bd789e3
Β·
verified Β·
1 Parent(s): a08f0a2

Update generator.py

Browse files
Files changed (1) hide show
  1. generator.py +24 -129
generator.py CHANGED
@@ -1,129 +1,24 @@
1
- import os
2
- import gradio as gr
3
- from generator import generate_app, enhance_app
4
- from helpers import save_as_zip
5
- import uuid
6
- import time
7
-
8
- def extract_react_preview(code: str) -> str:
9
- # Wrap code in a full HTML React preview template
10
- return f"""
11
- <!DOCTYPE html>
12
- <html>
13
- <head>
14
- <meta charset='UTF-8' />
15
- <script crossorigin src=\"https://unpkg.com/react@18/umd/react.development.js\"></script>
16
- <script crossorigin src=\"https://unpkg.com/react-dom@18/umd/react-dom.development.js\"></script>
17
- <script src=\"https://unpkg.com/@babel/standalone/babel.min.js\"></script>
18
- <style>
19
- body {{ font-family: sans-serif; padding: 20px; }}
20
- </style>
21
- </head>
22
- <body>
23
- <div id='root'></div>
24
- <script type='text/babel'>
25
- {code}
26
- ReactDOM.createRoot(document.getElementById('root')).render(<App />);
27
- </script>
28
- </body>
29
- </html>
30
- """
31
-
32
- def run_app(user_input, enhance_prompt, action, state, progress=gr.Progress()):
33
- import google.generativeai as genai
34
- from dotenv import load_dotenv
35
- load_dotenv()
36
-
37
- progress(0, desc="Authenticating with Gemini...")
38
- genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
39
- model = genai.GenerativeModel("gemini-pro")
40
-
41
- progress(0.2, desc="Sending prompt to Gemini...")
42
- prompt_text = f"""Create a full React app based on this idea:
43
- {user_input}
44
- Return only relevant files like App.jsx, index.html, styles, utils or components in plain code blocks with filenames."""
45
-
46
- try:
47
- response = model.generate_content(prompt_text)
48
- print("πŸ” FULL GEMINI RESPONSE RAW >>>\n", response)
49
- print("πŸ” Gemini TEXT PREVIEW >>>\n", getattr(response, "text", "(no .text found)"))
50
- if not hasattr(response, "text") or not response.text.strip():
51
- raise ValueError("Gemini response is empty.")
52
- parts = response.text.split("```")
53
- except Exception as e:
54
- print("❌ Gemini error:", e)
55
- return (
56
- "❌ Error: Could not generate app from Gemini.",
57
- None,
58
- "<p style='color:red;'>Gemini API failed or returned empty. Try again.</p>",
59
- {},
60
- {}
61
- )
62
-
63
- files = {}
64
- current_file = None
65
- for part in parts:
66
- if part.strip().startswith("jsx") or part.strip().startswith("javascript") or part.strip().startswith("html"):
67
- lines = part.strip().split("\n")
68
- if len(lines) > 1 and lines[1].startswith("// filename:"):
69
- current_file = lines[1].replace("// filename:", "").strip()
70
- files[current_file] = "\n".join(lines[2:])
71
-
72
- app_code = files.get("App.jsx", next(iter(files.values()), ""))
73
- preview_html = extract_react_preview(app_code)
74
- zip_bytes = save_as_zip({"files": files})
75
-
76
- with open("generated_app.zip", "wb") as f:
77
- f.write(zip_bytes)
78
-
79
- state = {"bundle": {"full_code": app_code, "files": files}, "history": []}
80
- return app_code, "generated_app.zip", preview_html, files, state
81
-
82
- with gr.Blocks(title="Auto App Builder") as iface:
83
- gr.Markdown("# ⚑ Auto App Builder (Gemini Powered)\n_Powered by Google Gemini API_")
84
-
85
- with gr.Row():
86
- inp = gr.Textbox(label="App Idea", placeholder="e.g. Inventory system with login", lines=2)
87
- btn = gr.Button("πŸš€ Generate App")
88
-
89
- with gr.Row():
90
- with gr.Column():
91
- code_out = gr.Code(label="πŸ“„ Generated Code")
92
- enh = gr.Textbox(label="Enhancement Prompt", placeholder="e.g. Add login, PDF export, dark mode...", lines=1)
93
- btn_enh = gr.Button("✨ Enhance")
94
- zip_file = gr.File(label="⬇️ Download App ZIP", interactive=True)
95
-
96
- gr.Markdown("### πŸ“ File Explorer")
97
- file_selector = gr.Dropdown(choices=[], label="Select File")
98
- file_viewer = gr.Code(label="πŸ“‚ File Content")
99
- with gr.Column():
100
- gr.Markdown("### πŸ” Live React Preview")
101
- preview = gr.HTML(label="React App Preview")
102
-
103
- state = gr.State()
104
-
105
- def update_file_tree(code, zip_name, preview_path, files, state):
106
- if isinstance(files, dict) and len(files) > 0:
107
- keys = list(files.keys())
108
- default_key = keys[0] if keys else None
109
- return gr.update(choices=keys, value=default_key), files.get(default_key, "")
110
- else:
111
- return gr.update(choices=[], value=None), ""
112
-
113
- btn.click(
114
- fn=run_app,
115
- inputs=[inp, enh, gr.State(""), state],
116
- outputs=[code_out, zip_file, preview, file_selector, state]
117
- ).then(
118
- fn=lambda code, zip_name, preview_path, state_obj: update_file_tree(code, zip_name, preview_path, state_obj.get("bundle", {}).get("files", {}), state_obj),
119
- inputs=[code_out, zip_file, preview, state],
120
- outputs=[file_selector, file_viewer]
121
- )
122
-
123
- file_selector.change(
124
- lambda name, state: state["bundle"]["files"].get(name, "") if state and "bundle" in state else "",
125
- inputs=[file_selector, state],
126
- outputs=file_viewer
127
- )
128
-
129
- iface.launch()
 
1
+ def generate_app(prompt: str):
2
+ print("🧠 Simulating Gemini API call...")
3
+ return {
4
+ "full_code": f'''
5
+ function App() {{
6
+ return <div>⚑ Hello, this is your generated app for: {prompt}</div>;
7
+ }}
8
+ export default App;
9
+ ''',
10
+ "files": {
11
+ "App.jsx": f'''
12
+ function App() {{
13
+ return <div>⚑ Hello, this is your generated app for: {prompt}</div>;
14
+ }}
15
+ export default App;
16
+ '''
17
+ }
18
+ }
19
+
20
+ def enhance_app(existing_bundle: dict, enhancement_prompt: str):
21
+ updated_code = existing_bundle["full_code"] + f"\n// Enhancement applied: {enhancement_prompt}"
22
+ existing_bundle["full_code"] = updated_code
23
+ existing_bundle["files"]["App.jsx"] = updated_code
24
+ return existing_bundle