mgbam commited on
Commit
603166e
ยท
verified ยท
1 Parent(s): 9f031a4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +158 -88
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
- with gr.Row():
156
- search_toggle = gr.Checkbox(
157
- label="Web Search",
158
- value=False,
159
- info="Enable real-time web search"
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
- # Media Generation Controls
190
  with gr.Group(elem_classes=["control-group"], visible=False) as advanced_controls:
191
- gr.HTML('<div class="group-title">๐ŸŽจ Media Generation</div>')
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", scale=1)
233
- import_status = gr.HTML("", visible=False) # fixed, no invalid scale arg
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
- 'enable_videos': enable_videos,
 
 
248
  'enable_music': enable_music,
249
  'media_prompts': media_prompts,
250
- 'example_gallery': example_gallery,
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
- for checkbox in [enable_images, enable_videos, enable_music]:
 
 
 
 
 
 
 
 
265
  checkbox.change(
266
  lambda *args: gr.update(visible=any(args)),
267
- inputs=[enable_images, enable_videos, enable_music],
268
- outputs=[media_prompts]
 
 
 
 
 
 
 
 
269
  )
270
-
271
- # rest of the class and main() remain unchanged
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
- # Example selection handler
458
- self.sidebar_components['example_gallery'].select(
459
- self.handle_example_select,
460
- inputs=[self.sidebar_components['example_gallery']],
461
- outputs=[self.main_components['input_textbox']]
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('enable_videos', False),
 
 
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
- enable_text_to_video=session_state.get('enable_videos', False),
 
 
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: 24px;
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 {