Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -27,11 +27,15 @@ def parse_files(raw_response):
|
|
27 |
if not cleaned_files and raw_response.strip():
|
28 |
if any(c in raw_response for c in ['<','>','{','}',';','(',')']):
|
29 |
lang = "html"
|
30 |
-
if "{" in raw_response and "}" in raw_response and ":" in raw_response:
|
31 |
-
|
|
|
|
|
32 |
default_filename = "index.html"
|
33 |
-
if lang == "css":
|
34 |
-
|
|
|
|
|
35 |
cleaned_files.append((default_filename, raw_response.strip()))
|
36 |
return cleaned_files
|
37 |
|
@@ -103,9 +107,6 @@ Start generating the files now.
|
|
103 |
gr.TabItem(label="Error", children=[gr.Textbox(value=error_message, label="Generation Error", lines=10)])
|
104 |
])
|
105 |
else:
|
106 |
-
print("\n--- Final Raw AI Response ---")
|
107 |
-
print(full_raw_response)
|
108 |
-
print("--------------------------\n")
|
109 |
files = parse_files(full_raw_response)
|
110 |
if not files:
|
111 |
no_files_msg = "AI finished, but did not return recognizable file content or the response was empty. See raw output above."
|
@@ -121,22 +122,31 @@ Start generating the files now.
|
|
121 |
if not name or not content:
|
122 |
continue
|
123 |
lang = "plaintext"
|
124 |
-
if name.endswith((".html", ".htm")):
|
125 |
-
|
126 |
-
elif name.endswith(".
|
127 |
-
|
128 |
-
elif name.endswith(".
|
129 |
-
|
130 |
-
elif name.endswith(
|
131 |
-
|
132 |
-
elif name.endswith(".
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
elem_id = f"tab_{re.sub(r'[^a-zA-Z0-9_-]', '_', name)}"
|
134 |
tab_item = gr.TabItem(label=name, elem_id=elem_id, children=[
|
135 |
gr.Code(value=content, language=lang, label=name, interactive=False)
|
136 |
])
|
137 |
tabs_content.append(tab_item)
|
138 |
if not tabs_content:
|
139 |
-
|
140 |
else:
|
141 |
final_tabs_update = gr.Tabs(tabs=tabs_content)
|
142 |
yield {
|
@@ -149,62 +159,21 @@ with gr.Blocks(css=".gradio-container { max-width: 95% !important; }") as demo:
|
|
149 |
gr.Markdown("Generates website code based on your description. Raw output streams live, final files appear in tabs below.")
|
150 |
with gr.Row():
|
151 |
with gr.Column(scale=2):
|
152 |
-
prompt = gr.Textbox(
|
153 |
-
|
154 |
-
placeholder="E.g., a simple landing page for a coffee shop with sections for menu, about, and contact.",
|
155 |
-
lines=3
|
156 |
-
)
|
157 |
-
backend = gr.Dropdown(
|
158 |
-
["Static", "Flask", "Node.js"],
|
159 |
-
value="Static",
|
160 |
-
label="Backend Technology"
|
161 |
-
)
|
162 |
with gr.Accordion("Advanced Options", open=False):
|
163 |
-
system_message = gr.Textbox(
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
lines=2
|
168 |
-
)
|
169 |
-
max_tokens = gr.Slider(
|
170 |
-
minimum=256,
|
171 |
-
maximum=4096,
|
172 |
-
value=2048,
|
173 |
-
step=64,
|
174 |
-
label="Max Tokens (Output Length)"
|
175 |
-
)
|
176 |
-
temperature = gr.Slider(
|
177 |
-
minimum=0.1,
|
178 |
-
maximum=1.5,
|
179 |
-
value=0.7,
|
180 |
-
step=0.1,
|
181 |
-
label="Temperature (Creativity)"
|
182 |
-
)
|
183 |
-
top_p = gr.Slider(
|
184 |
-
minimum=0.1,
|
185 |
-
maximum=1.0,
|
186 |
-
value=0.95,
|
187 |
-
step=0.05,
|
188 |
-
label="Top-p (Sampling Focus)"
|
189 |
-
)
|
190 |
generate_button = gr.Button("✨ Generate Code ✨", variant="primary")
|
191 |
with gr.Column(scale=3):
|
192 |
gr.Markdown("#### Live Raw Output Stream")
|
193 |
-
live_output = gr.Code(
|
194 |
-
label="Raw AI Stream",
|
195 |
-
language="plaintext",
|
196 |
-
lines=20,
|
197 |
-
interactive=False
|
198 |
-
)
|
199 |
gr.Markdown("---")
|
200 |
gr.Markdown("#### Final Generated Files (Tabs)")
|
201 |
final_tabs = gr.Tabs(elem_id="output_tabs")
|
202 |
-
generate_button.click(
|
203 |
-
stream_and_parse_code,
|
204 |
-
inputs=[prompt, backend, system_message, max_tokens, temperature, top_p],
|
205 |
-
outputs=[live_output, final_tabs],
|
206 |
-
show_progress="hidden"
|
207 |
-
)
|
208 |
|
209 |
if __name__ == "__main__":
|
210 |
demo.launch(debug=True)
|
|
|
27 |
if not cleaned_files and raw_response.strip():
|
28 |
if any(c in raw_response for c in ['<','>','{','}',';','(',')']):
|
29 |
lang = "html"
|
30 |
+
if "{" in raw_response and "}" in raw_response and ":" in raw_response:
|
31 |
+
lang = "css"
|
32 |
+
elif "function" in raw_response or "const" in raw_response or "let" in raw_response:
|
33 |
+
lang = "javascript"
|
34 |
default_filename = "index.html"
|
35 |
+
if lang == "css":
|
36 |
+
default_filename = "style.css"
|
37 |
+
elif lang == "javascript":
|
38 |
+
default_filename = "script.js"
|
39 |
cleaned_files.append((default_filename, raw_response.strip()))
|
40 |
return cleaned_files
|
41 |
|
|
|
107 |
gr.TabItem(label="Error", children=[gr.Textbox(value=error_message, label="Generation Error", lines=10)])
|
108 |
])
|
109 |
else:
|
|
|
|
|
|
|
110 |
files = parse_files(full_raw_response)
|
111 |
if not files:
|
112 |
no_files_msg = "AI finished, but did not return recognizable file content or the response was empty. See raw output above."
|
|
|
122 |
if not name or not content:
|
123 |
continue
|
124 |
lang = "plaintext"
|
125 |
+
if name.endswith((".html", ".htm")):
|
126 |
+
lang = "html"
|
127 |
+
elif name.endswith(".css"):
|
128 |
+
lang = "css"
|
129 |
+
elif name.endswith(".js"):
|
130 |
+
lang = "javascript"
|
131 |
+
elif name.endswith(".py"):
|
132 |
+
lang = "python"
|
133 |
+
elif name.endswith(".json"):
|
134 |
+
lang = "json"
|
135 |
+
elif name.endswith(".md"):
|
136 |
+
lang = "markdown"
|
137 |
+
elif name.endswith((".sh", ".bash")):
|
138 |
+
lang = "bash"
|
139 |
+
elif name.endswith((".xml", ".xaml", ".svg")):
|
140 |
+
lang = "xml"
|
141 |
+
elif name.endswith(".yaml") or name.endswith(".yml"):
|
142 |
+
lang = "yaml"
|
143 |
elem_id = f"tab_{re.sub(r'[^a-zA-Z0-9_-]', '_', name)}"
|
144 |
tab_item = gr.TabItem(label=name, elem_id=elem_id, children=[
|
145 |
gr.Code(value=content, language=lang, label=name, interactive=False)
|
146 |
])
|
147 |
tabs_content.append(tab_item)
|
148 |
if not tabs_content:
|
149 |
+
final_tabs_update = gr.Tabs(tabs=[gr.TabItem(label="Output", children=[gr.Textbox(value="No valid files generated after filtering.", label="Result")])])
|
150 |
else:
|
151 |
final_tabs_update = gr.Tabs(tabs=tabs_content)
|
152 |
yield {
|
|
|
159 |
gr.Markdown("Generates website code based on your description. Raw output streams live, final files appear in tabs below.")
|
160 |
with gr.Row():
|
161 |
with gr.Column(scale=2):
|
162 |
+
prompt = gr.Textbox(label="Describe your website", placeholder="E.g., a simple landing page...", lines=3)
|
163 |
+
backend = gr.Dropdown(["Static", "Flask", "Node.js"], value="Static", label="Backend Technology")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
with gr.Accordion("Advanced Options", open=False):
|
165 |
+
system_message = gr.Textbox(label="Extra instructions for the AI (System Message)", placeholder="Optional", value="", lines=2)
|
166 |
+
max_tokens = gr.Slider(minimum=256, maximum=4096, value=2048, step=64, label="Max Tokens (Output Length)")
|
167 |
+
temperature = gr.Slider(minimum=0.1, maximum=1.5, value=0.7, step=0.1, label="Temperature (Creativity)")
|
168 |
+
top_p = gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (Sampling Focus)")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
169 |
generate_button = gr.Button("✨ Generate Code ✨", variant="primary")
|
170 |
with gr.Column(scale=3):
|
171 |
gr.Markdown("#### Live Raw Output Stream")
|
172 |
+
live_output = gr.Code(label="Raw AI Stream", language="text", lines=20, interactive=False)
|
|
|
|
|
|
|
|
|
|
|
173 |
gr.Markdown("---")
|
174 |
gr.Markdown("#### Final Generated Files (Tabs)")
|
175 |
final_tabs = gr.Tabs(elem_id="output_tabs")
|
176 |
+
generate_button.click(stream_and_parse_code, inputs=[prompt, backend, system_message, max_tokens, temperature, top_p], outputs=[live_output, final_tabs], show_progress="hidden")
|
|
|
|
|
|
|
|
|
|
|
177 |
|
178 |
if __name__ == "__main__":
|
179 |
demo.launch(debug=True)
|