Update app.py
Browse files
app.py
CHANGED
@@ -124,13 +124,82 @@ class AnyCoder:
|
|
124 |
choices=[f"{model['name']} ({model['category']})" for model in AVAILABLE_MODELS],
|
125 |
value=f"{DEFAULT_MODEL['name']} ({DEFAULT_MODEL['category']})",
|
126 |
label="Select Model",
|
127 |
-
info="Choose your AI model based on task requirements",
|
128 |
container=False
|
129 |
)
|
130 |
|
131 |
# Model info display
|
132 |
model_info = gr.HTML(self.get_model_info_html(DEFAULT_MODEL))
|
133 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
# Project Configuration
|
135 |
with gr.Group(elem_classes=["control-group"]):
|
136 |
gr.HTML('<div class="group-title">โ๏ธ Project Settings</div>')
|
@@ -152,17 +221,12 @@ class AnyCoder:
|
|
152 |
container=False
|
153 |
)
|
154 |
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
advanced_mode = gr.Checkbox(
|
162 |
-
label="Advanced Mode",
|
163 |
-
value=False,
|
164 |
-
info="Show advanced options"
|
165 |
-
)
|
166 |
|
167 |
# Input Sources
|
168 |
with gr.Group(elem_classes=["control-group"]):
|
@@ -182,39 +246,17 @@ class AnyCoder:
|
|
182 |
|
183 |
image_input = gr.Image(
|
184 |
label="Design Reference Image",
|
185 |
-
visible=False,
|
186 |
container=False
|
187 |
)
|
188 |
|
189 |
-
#
|
190 |
with gr.Group(elem_classes=["control-group"], visible=False) as advanced_controls:
|
191 |
-
gr.HTML('<div class="group-title"
|
192 |
-
|
193 |
-
with gr.Row():
|
194 |
-
enable_images = gr.Checkbox(label="Images", value=False, scale=1)
|
195 |
-
enable_videos = gr.Checkbox(label="Videos", value=False, scale=1)
|
196 |
-
enable_music = gr.Checkbox(label="Music", value=False, scale=1)
|
197 |
|
198 |
media_prompts = gr.Textbox(
|
199 |
label="Media Generation Prompts",
|
200 |
placeholder="Describe media to generate...",
|
201 |
lines=2,
|
202 |
-
visible=False,
|
203 |
-
container=False
|
204 |
-
)
|
205 |
-
|
206 |
-
# Quick Examples
|
207 |
-
with gr.Group(elem_classes=["control-group"]):
|
208 |
-
gr.HTML('<div class="group-title">๐ Quick Start</div>')
|
209 |
-
|
210 |
-
example_gallery = gr.Gallery(
|
211 |
-
value=[demo["title"] for demo in DEMO_LIST[:6]], # text only, no NoneType
|
212 |
-
label="Example Projects",
|
213 |
-
show_label=False,
|
214 |
-
elem_classes=["example-gallery"],
|
215 |
-
columns=2,
|
216 |
-
rows=3,
|
217 |
-
height="auto",
|
218 |
container=False
|
219 |
)
|
220 |
|
@@ -229,13 +271,14 @@ class AnyCoder:
|
|
229 |
)
|
230 |
|
231 |
with gr.Row():
|
232 |
-
import_btn = gr.Button("Import", variant="secondary",
|
233 |
-
import_status = gr.HTML("", visible=False)
|
234 |
|
235 |
# Store sidebar components for event handling
|
236 |
self.sidebar_components = {
|
237 |
'model_dropdown': model_dropdown,
|
238 |
'model_info': model_info,
|
|
|
239 |
'language_dropdown': language_dropdown,
|
240 |
'search_toggle': search_toggle,
|
241 |
'advanced_mode': advanced_mode,
|
@@ -244,32 +287,64 @@ class AnyCoder:
|
|
244 |
'image_input': image_input,
|
245 |
'advanced_controls': advanced_controls,
|
246 |
'enable_images': enable_images,
|
247 |
-
'
|
|
|
|
|
248 |
'enable_music': enable_music,
|
249 |
'media_prompts': media_prompts,
|
250 |
-
'
|
251 |
'import_url': import_url,
|
252 |
'import_btn': import_btn,
|
253 |
'import_status': import_status
|
254 |
}
|
255 |
|
|
|
|
|
|
|
|
|
|
|
|
|
256 |
# Show advanced controls when enabled
|
257 |
-
advanced_mode.change(
|
258 |
lambda checked: gr.update(visible=checked),
|
259 |
-
inputs=[advanced_mode],
|
260 |
-
outputs=[advanced_controls]
|
261 |
)
|
262 |
|
263 |
# Show media prompts when any media generation is enabled
|
264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
265 |
checkbox.change(
|
266 |
lambda *args: gr.update(visible=any(args)),
|
267 |
-
inputs=
|
268 |
-
outputs=[media_prompts]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
269 |
)
|
270 |
-
|
271 |
-
|
272 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
273 |
|
274 |
def create_main_content(self, history, current_model):
|
275 |
"""Create the main content area"""
|
@@ -454,12 +529,13 @@ class AnyCoder:
|
|
454 |
]
|
455 |
)
|
456 |
|
457 |
-
#
|
458 |
-
self.sidebar_components['
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
|
|
463 |
|
464 |
def handle_generation(self, prompt, file, website_url, image, language,
|
465 |
enable_search, current_model_state, history_state, session_state):
|
@@ -506,14 +582,18 @@ class AnyCoder:
|
|
506 |
# Apply media generation if enabled
|
507 |
if any([
|
508 |
session_state.get('enable_images', False),
|
509 |
-
session_state.get('
|
|
|
|
|
510 |
session_state.get('enable_music', False)
|
511 |
]):
|
512 |
processed_code = apply_generated_media_to_html(
|
513 |
processed_code,
|
514 |
prompt,
|
515 |
enable_text_to_image=session_state.get('enable_images', False),
|
516 |
-
|
|
|
|
|
517 |
enable_text_to_music=session_state.get('enable_music', False),
|
518 |
session_id=session_id
|
519 |
)
|
@@ -781,15 +861,6 @@ class AnyCoder:
|
|
781 |
[] # history
|
782 |
)
|
783 |
|
784 |
-
def handle_example_select(self, evt: gr.SelectData):
|
785 |
-
"""Handle example selection from gallery"""
|
786 |
-
try:
|
787 |
-
if evt.index is not None and evt.index < len(DEMO_LIST):
|
788 |
-
return DEMO_LIST[evt.index]['description']
|
789 |
-
return ""
|
790 |
-
except Exception:
|
791 |
-
return ""
|
792 |
-
|
793 |
def get_model_info_html(self, model):
|
794 |
"""Generate HTML for model information"""
|
795 |
vision_badge = '<span class="feature-badge vision">๐๏ธ Vision</span>' if model.get('supports_vision') else ''
|
@@ -906,7 +977,7 @@ class AnyCoder:
|
|
906 |
}
|
907 |
|
908 |
.control-group {
|
909 |
-
margin-bottom:
|
910 |
background: white;
|
911 |
padding: 16px;
|
912 |
border-radius: 8px;
|
@@ -923,6 +994,26 @@ class AnyCoder:
|
|
923 |
gap: 8px;
|
924 |
}
|
925 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
926 |
.input-group {
|
927 |
background: white;
|
928 |
padding: 24px;
|
@@ -1062,11 +1153,6 @@ class AnyCoder:
|
|
1062 |
color: #92400e;
|
1063 |
}
|
1064 |
|
1065 |
-
.example-gallery {
|
1066 |
-
border-radius: 8px;
|
1067 |
-
border: 1px solid #e5e7eb;
|
1068 |
-
}
|
1069 |
-
|
1070 |
.preview-message {
|
1071 |
text-align: center;
|
1072 |
padding: 40px 20px;
|
@@ -1094,22 +1180,6 @@ class AnyCoder:
|
|
1094 |
color: #6b7280;
|
1095 |
}
|
1096 |
|
1097 |
-
/* Dark mode adjustments */
|
1098 |
-
.dark .sidebar {
|
1099 |
-
background: #1f2937;
|
1100 |
-
border-color: #374151;
|
1101 |
-
}
|
1102 |
-
|
1103 |
-
.dark .control-group {
|
1104 |
-
background: #111827;
|
1105 |
-
border-color: #374151;
|
1106 |
-
}
|
1107 |
-
|
1108 |
-
.dark .input-group {
|
1109 |
-
background: #111827;
|
1110 |
-
border-color: #374151;
|
1111 |
-
}
|
1112 |
-
|
1113 |
/* Responsive design */
|
1114 |
@media (max-width: 768px) {
|
1115 |
.header-content {
|
|
|
124 |
choices=[f"{model['name']} ({model['category']})" for model in AVAILABLE_MODELS],
|
125 |
value=f"{DEFAULT_MODEL['name']} ({DEFAULT_MODEL['category']})",
|
126 |
label="Select Model",
|
|
|
127 |
container=False
|
128 |
)
|
129 |
|
130 |
# Model info display
|
131 |
model_info = gr.HTML(self.get_model_info_html(DEFAULT_MODEL))
|
132 |
|
133 |
+
# Web Search Toggle
|
134 |
+
with gr.Group(elem_classes=["control-group"]):
|
135 |
+
search_toggle = gr.Checkbox(
|
136 |
+
label="๐ Web search",
|
137 |
+
value=False,
|
138 |
+
info="Include generated images in your outputs using Qwen image model",
|
139 |
+
container=False
|
140 |
+
)
|
141 |
+
|
142 |
+
# Media Generation Controls
|
143 |
+
with gr.Group(elem_classes=["control-group"]):
|
144 |
+
gr.HTML('<div class="group-title">๐จ Media Generation</div>')
|
145 |
+
|
146 |
+
enable_images = gr.Checkbox(
|
147 |
+
label="๐ผ๏ธ Generate Images (text โ image)",
|
148 |
+
value=False,
|
149 |
+
info="Include generated images in your outputs using Qwen image model",
|
150 |
+
container=False
|
151 |
+
)
|
152 |
+
|
153 |
+
enable_image_to_image = gr.Checkbox(
|
154 |
+
label="๐ผ๏ธ Image to Image (uses input image)",
|
155 |
+
value=False,
|
156 |
+
info="Transform your uploaded image using Qwen image/edit",
|
157 |
+
container=False
|
158 |
+
)
|
159 |
+
|
160 |
+
enable_image_to_video = gr.Checkbox(
|
161 |
+
label="๐ฌ Image to Video (uses input image)",
|
162 |
+
value=False,
|
163 |
+
info="Generate a short video from your uploaded image using Lightricks LTX-Video",
|
164 |
+
container=False
|
165 |
+
)
|
166 |
+
|
167 |
+
enable_text_to_video = gr.Checkbox(
|
168 |
+
label="๐ฌ Generate Video (text โ video)",
|
169 |
+
value=False,
|
170 |
+
info="Generate a short video directly from your prompt using WanAi/Wan2.2-TIZV-S8",
|
171 |
+
container=False
|
172 |
+
)
|
173 |
+
|
174 |
+
enable_music = gr.Checkbox(
|
175 |
+
label="๐ต Generate Music (text โ music)",
|
176 |
+
value=False,
|
177 |
+
info="Compose short music from your prompt using ElevenLabs Music",
|
178 |
+
container=False
|
179 |
+
)
|
180 |
+
|
181 |
+
# Model Information
|
182 |
+
with gr.Group(elem_classes=["control-group"]):
|
183 |
+
model_display = gr.HTML(
|
184 |
+
'<div class="model-name">Qwen3-Coder-4800-A535-Instruc</div>',
|
185 |
+
elem_classes=["model-display"]
|
186 |
+
)
|
187 |
+
|
188 |
+
# Quick Start Examples
|
189 |
+
with gr.Group(elem_classes=["control-group"]):
|
190 |
+
gr.HTML('<div class="group-title">๐ Quick Start</div>')
|
191 |
+
|
192 |
+
# Create buttons for each demo instead of gallery
|
193 |
+
quick_start_buttons = []
|
194 |
+
for demo in DEMO_LIST[:6]:
|
195 |
+
btn = gr.Button(
|
196 |
+
demo["title"],
|
197 |
+
variant="secondary",
|
198 |
+
size="sm",
|
199 |
+
elem_classes=["quick-start-btn"]
|
200 |
+
)
|
201 |
+
quick_start_buttons.append(btn)
|
202 |
+
|
203 |
# Project Configuration
|
204 |
with gr.Group(elem_classes=["control-group"]):
|
205 |
gr.HTML('<div class="group-title">โ๏ธ Project Settings</div>')
|
|
|
221 |
container=False
|
222 |
)
|
223 |
|
224 |
+
advanced_mode = gr.Checkbox(
|
225 |
+
label="Advanced Mode",
|
226 |
+
value=False,
|
227 |
+
info="Show advanced options",
|
228 |
+
container=False
|
229 |
+
)
|
|
|
|
|
|
|
|
|
|
|
230 |
|
231 |
# Input Sources
|
232 |
with gr.Group(elem_classes=["control-group"]):
|
|
|
246 |
|
247 |
image_input = gr.Image(
|
248 |
label="Design Reference Image",
|
|
|
249 |
container=False
|
250 |
)
|
251 |
|
252 |
+
# Advanced Controls (initially hidden)
|
253 |
with gr.Group(elem_classes=["control-group"], visible=False) as advanced_controls:
|
254 |
+
gr.HTML('<div class="group-title">๐ง Advanced Options</div>')
|
|
|
|
|
|
|
|
|
|
|
255 |
|
256 |
media_prompts = gr.Textbox(
|
257 |
label="Media Generation Prompts",
|
258 |
placeholder="Describe media to generate...",
|
259 |
lines=2,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
260 |
container=False
|
261 |
)
|
262 |
|
|
|
271 |
)
|
272 |
|
273 |
with gr.Row():
|
274 |
+
import_btn = gr.Button("Import", variant="secondary", size="sm")
|
275 |
+
import_status = gr.HTML("", visible=False)
|
276 |
|
277 |
# Store sidebar components for event handling
|
278 |
self.sidebar_components = {
|
279 |
'model_dropdown': model_dropdown,
|
280 |
'model_info': model_info,
|
281 |
+
'model_display': model_display,
|
282 |
'language_dropdown': language_dropdown,
|
283 |
'search_toggle': search_toggle,
|
284 |
'advanced_mode': advanced_mode,
|
|
|
287 |
'image_input': image_input,
|
288 |
'advanced_controls': advanced_controls,
|
289 |
'enable_images': enable_images,
|
290 |
+
'enable_image_to_image': enable_image_to_image,
|
291 |
+
'enable_image_to_video': enable_image_to_video,
|
292 |
+
'enable_text_to_video': enable_text_to_video,
|
293 |
'enable_music': enable_music,
|
294 |
'media_prompts': media_prompts,
|
295 |
+
'quick_start_buttons': quick_start_buttons,
|
296 |
'import_url': import_url,
|
297 |
'import_btn': import_btn,
|
298 |
'import_status': import_status
|
299 |
}
|
300 |
|
301 |
+
# Setup sidebar event handlers
|
302 |
+
self.setup_sidebar_events(session_state)
|
303 |
+
|
304 |
+
def setup_sidebar_events(self, session_state):
|
305 |
+
"""Setup sidebar-specific event handlers"""
|
306 |
+
|
307 |
# Show advanced controls when enabled
|
308 |
+
self.sidebar_components['advanced_mode'].change(
|
309 |
lambda checked: gr.update(visible=checked),
|
310 |
+
inputs=[self.sidebar_components['advanced_mode']],
|
311 |
+
outputs=[self.sidebar_components['advanced_controls']]
|
312 |
)
|
313 |
|
314 |
# Show media prompts when any media generation is enabled
|
315 |
+
media_checkboxes = [
|
316 |
+
self.sidebar_components['enable_images'],
|
317 |
+
self.sidebar_components['enable_image_to_image'],
|
318 |
+
self.sidebar_components['enable_image_to_video'],
|
319 |
+
self.sidebar_components['enable_text_to_video'],
|
320 |
+
self.sidebar_components['enable_music']
|
321 |
+
]
|
322 |
+
|
323 |
+
for checkbox in media_checkboxes:
|
324 |
checkbox.change(
|
325 |
lambda *args: gr.update(visible=any(args)),
|
326 |
+
inputs=media_checkboxes,
|
327 |
+
outputs=[self.sidebar_components['media_prompts']]
|
328 |
+
)
|
329 |
+
|
330 |
+
# Update session state when media options change
|
331 |
+
for i, checkbox in enumerate(media_checkboxes):
|
332 |
+
checkbox.change(
|
333 |
+
self.update_media_settings,
|
334 |
+
inputs=[checkbox],
|
335 |
+
outputs=[session_state]
|
336 |
)
|
337 |
+
|
338 |
+
def update_media_settings(self, *checkbox_values):
|
339 |
+
"""Update media generation settings in session state"""
|
340 |
+
settings = {
|
341 |
+
'enable_images': checkbox_values[0] if len(checkbox_values) > 0 else False,
|
342 |
+
'enable_image_to_image': checkbox_values[1] if len(checkbox_values) > 1 else False,
|
343 |
+
'enable_image_to_video': checkbox_values[2] if len(checkbox_values) > 2 else False,
|
344 |
+
'enable_text_to_video': checkbox_values[3] if len(checkbox_values) > 3 else False,
|
345 |
+
'enable_music': checkbox_values[4] if len(checkbox_values) > 4 else False
|
346 |
+
}
|
347 |
+
return settings
|
348 |
|
349 |
def create_main_content(self, history, current_model):
|
350 |
"""Create the main content area"""
|
|
|
529 |
]
|
530 |
)
|
531 |
|
532 |
+
# Quick start button handlers
|
533 |
+
for i, btn in enumerate(self.sidebar_components['quick_start_buttons']):
|
534 |
+
if i < len(DEMO_LIST):
|
535 |
+
btn.click(
|
536 |
+
lambda demo_idx=i: DEMO_LIST[demo_idx]['description'],
|
537 |
+
outputs=[self.main_components['input_textbox']]
|
538 |
+
)
|
539 |
|
540 |
def handle_generation(self, prompt, file, website_url, image, language,
|
541 |
enable_search, current_model_state, history_state, session_state):
|
|
|
582 |
# Apply media generation if enabled
|
583 |
if any([
|
584 |
session_state.get('enable_images', False),
|
585 |
+
session_state.get('enable_image_to_image', False),
|
586 |
+
session_state.get('enable_image_to_video', False),
|
587 |
+
session_state.get('enable_text_to_video', False),
|
588 |
session_state.get('enable_music', False)
|
589 |
]):
|
590 |
processed_code = apply_generated_media_to_html(
|
591 |
processed_code,
|
592 |
prompt,
|
593 |
enable_text_to_image=session_state.get('enable_images', False),
|
594 |
+
enable_image_to_image=session_state.get('enable_image_to_image', False),
|
595 |
+
enable_image_to_video=session_state.get('enable_image_to_video', False),
|
596 |
+
enable_text_to_video=session_state.get('enable_text_to_video', False),
|
597 |
enable_text_to_music=session_state.get('enable_music', False),
|
598 |
session_id=session_id
|
599 |
)
|
|
|
861 |
[] # history
|
862 |
)
|
863 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
864 |
def get_model_info_html(self, model):
|
865 |
"""Generate HTML for model information"""
|
866 |
vision_badge = '<span class="feature-badge vision">๐๏ธ Vision</span>' if model.get('supports_vision') else ''
|
|
|
977 |
}
|
978 |
|
979 |
.control-group {
|
980 |
+
margin-bottom: 16px;
|
981 |
background: white;
|
982 |
padding: 16px;
|
983 |
border-radius: 8px;
|
|
|
994 |
gap: 8px;
|
995 |
}
|
996 |
|
997 |
+
.model-display {
|
998 |
+
background: #f3f4f6;
|
999 |
+
padding: 8px 12px;
|
1000 |
+
border-radius: 6px;
|
1001 |
+
border: 1px solid #d1d5db;
|
1002 |
+
}
|
1003 |
+
|
1004 |
+
.model-display .model-name {
|
1005 |
+
font-family: 'Monaco', 'Consolas', monospace;
|
1006 |
+
font-size: 0.85rem;
|
1007 |
+
color: #374151;
|
1008 |
+
}
|
1009 |
+
|
1010 |
+
.quick-start-btn {
|
1011 |
+
width: 100%;
|
1012 |
+
margin-bottom: 4px;
|
1013 |
+
text-align: left;
|
1014 |
+
justify-content: flex-start;
|
1015 |
+
}
|
1016 |
+
|
1017 |
.input-group {
|
1018 |
background: white;
|
1019 |
padding: 24px;
|
|
|
1153 |
color: #92400e;
|
1154 |
}
|
1155 |
|
|
|
|
|
|
|
|
|
|
|
1156 |
.preview-message {
|
1157 |
text-align: center;
|
1158 |
padding: 40px 20px;
|
|
|
1180 |
color: #6b7280;
|
1181 |
}
|
1182 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1183 |
/* Responsive design */
|
1184 |
@media (max-width: 768px) {
|
1185 |
.header-content {
|