mgbam commited on
Commit
e8a79f3
ยท
verified ยท
1 Parent(s): 757c773

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +167 -104
app.py CHANGED
@@ -117,27 +117,89 @@ class AnyCoder:
117
  """Create the professional sidebar"""
118
 
119
  # Model Selection
120
- # Quick Examples
121
- with gr.Group(elem_classes=["control-group"]):
122
- gr.HTML('<div class="group-title">๐Ÿš€ Quick Start</div>')
123
-
124
- example_gallery = gr.Gallery(
125
- value=[
126
- (demo.get("image", None), demo["title"]) for demo in DEMO_LIST[:6]
127
- ],
128
- label="Example Projects",
129
- show_label=False,
130
- elem_classes=["example-gallery"],
131
- columns=2,
132
- rows=3,
133
- height="auto",
134
- container=False
135
- )
136
-
137
 
138
  # Model info display
139
  model_info = gr.HTML(self.get_model_info_html(DEFAULT_MODEL))
140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  # Project Configuration
142
  with gr.Group(elem_classes=["control-group"]):
143
  gr.HTML('<div class="group-title">โš™๏ธ Project Settings</div>')
@@ -159,17 +221,12 @@ with gr.Group(elem_classes=["control-group"]):
159
  container=False
160
  )
161
 
162
- with gr.Row():
163
- search_toggle = gr.Checkbox(
164
- label="Web Search",
165
- value=False,
166
- info="Enable real-time web search"
167
- )
168
- advanced_mode = gr.Checkbox(
169
- label="Advanced Mode",
170
- value=False,
171
- info="Show advanced options"
172
- )
173
 
174
  # Input Sources
175
  with gr.Group(elem_classes=["control-group"]):
@@ -189,39 +246,17 @@ with gr.Group(elem_classes=["control-group"]):
189
 
190
  image_input = gr.Image(
191
  label="Design Reference Image",
192
- visible=False,
193
  container=False
194
  )
195
 
196
- # Media Generation Controls
197
  with gr.Group(elem_classes=["control-group"], visible=False) as advanced_controls:
198
- gr.HTML('<div class="group-title">๐ŸŽจ Media Generation</div>')
199
-
200
- with gr.Row():
201
- enable_images = gr.Checkbox(label="Images", value=False, scale=1)
202
- enable_videos = gr.Checkbox(label="Videos", value=False, scale=1)
203
- enable_music = gr.Checkbox(label="Music", value=False, scale=1)
204
 
205
  media_prompts = gr.Textbox(
206
  label="Media Generation Prompts",
207
  placeholder="Describe media to generate...",
208
  lines=2,
209
- visible=False,
210
- container=False
211
- )
212
-
213
- # Quick Examples
214
- with gr.Group(elem_classes=["control-group"]):
215
- gr.HTML('<div class="group-title">๐Ÿš€ Quick Start</div>')
216
-
217
- example_gallery = gr.Gallery(
218
- value=[demo["title"] for demo in DEMO_LIST[:6]], # text only, no NoneType
219
- label="Example Projects",
220
- show_label=False,
221
- elem_classes=["example-gallery"],
222
- columns=2,
223
- rows=3,
224
- height="auto",
225
  container=False
226
  )
227
 
@@ -236,13 +271,14 @@ with gr.Group(elem_classes=["control-group"]):
236
  )
237
 
238
  with gr.Row():
239
- import_btn = gr.Button("Import", variant="secondary", scale=1)
240
- import_status = gr.HTML("", visible=False) # fixed, no invalid scale arg
241
 
242
  # Store sidebar components for event handling
243
  self.sidebar_components = {
244
  'model_dropdown': model_dropdown,
245
  'model_info': model_info,
 
246
  'language_dropdown': language_dropdown,
247
  'search_toggle': search_toggle,
248
  'advanced_mode': advanced_mode,
@@ -251,32 +287,64 @@ with gr.Group(elem_classes=["control-group"]):
251
  'image_input': image_input,
252
  'advanced_controls': advanced_controls,
253
  'enable_images': enable_images,
254
- 'enable_videos': enable_videos,
 
 
255
  'enable_music': enable_music,
256
  'media_prompts': media_prompts,
257
- 'example_gallery': example_gallery,
258
  'import_url': import_url,
259
  'import_btn': import_btn,
260
  'import_status': import_status
261
  }
262
 
 
 
 
 
 
 
263
  # Show advanced controls when enabled
264
- advanced_mode.change(
265
  lambda checked: gr.update(visible=checked),
266
- inputs=[advanced_mode],
267
- outputs=[advanced_controls]
268
  )
269
 
270
  # Show media prompts when any media generation is enabled
271
- for checkbox in [enable_images, enable_videos, enable_music]:
 
 
 
 
 
 
 
 
272
  checkbox.change(
273
  lambda *args: gr.update(visible=any(args)),
274
- inputs=[enable_images, enable_videos, enable_music],
275
- outputs=[media_prompts]
 
 
 
 
 
 
 
 
276
  )
277
-
278
- # rest of the class and main() remain unchanged
279
-
 
 
 
 
 
 
 
 
280
 
281
  def create_main_content(self, history, current_model):
282
  """Create the main content area"""
@@ -461,12 +529,13 @@ with gr.Group(elem_classes=["control-group"]):
461
  ]
462
  )
463
 
464
- # Example selection handler
465
- self.sidebar_components['example_gallery'].select(
466
- self.handle_example_select,
467
- inputs=[self.sidebar_components['example_gallery']],
468
- outputs=[self.main_components['input_textbox']]
469
- )
 
470
 
471
  def handle_generation(self, prompt, file, website_url, image, language,
472
  enable_search, current_model_state, history_state, session_state):
@@ -513,14 +582,18 @@ with gr.Group(elem_classes=["control-group"]):
513
  # Apply media generation if enabled
514
  if any([
515
  session_state.get('enable_images', False),
516
- session_state.get('enable_videos', False),
 
 
517
  session_state.get('enable_music', False)
518
  ]):
519
  processed_code = apply_generated_media_to_html(
520
  processed_code,
521
  prompt,
522
  enable_text_to_image=session_state.get('enable_images', False),
523
- enable_text_to_video=session_state.get('enable_videos', False),
 
 
524
  enable_text_to_music=session_state.get('enable_music', False),
525
  session_id=session_id
526
  )
@@ -788,15 +861,6 @@ with gr.Group(elem_classes=["control-group"]):
788
  [] # history
789
  )
790
 
791
- def handle_example_select(self, evt: gr.SelectData):
792
- """Handle example selection from gallery"""
793
- try:
794
- if evt.index is not None and evt.index < len(DEMO_LIST):
795
- return DEMO_LIST[evt.index]['description']
796
- return ""
797
- except Exception:
798
- return ""
799
-
800
  def get_model_info_html(self, model):
801
  """Generate HTML for model information"""
802
  vision_badge = '<span class="feature-badge vision">๐Ÿ‘๏ธ Vision</span>' if model.get('supports_vision') else ''
@@ -913,7 +977,7 @@ with gr.Group(elem_classes=["control-group"]):
913
  }
914
 
915
  .control-group {
916
- margin-bottom: 24px;
917
  background: white;
918
  padding: 16px;
919
  border-radius: 8px;
@@ -930,6 +994,26 @@ with gr.Group(elem_classes=["control-group"]):
930
  gap: 8px;
931
  }
932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
933
  .input-group {
934
  background: white;
935
  padding: 24px;
@@ -1069,11 +1153,6 @@ with gr.Group(elem_classes=["control-group"]):
1069
  color: #92400e;
1070
  }
1071
 
1072
- .example-gallery {
1073
- border-radius: 8px;
1074
- border: 1px solid #e5e7eb;
1075
- }
1076
-
1077
  .preview-message {
1078
  text-align: center;
1079
  padding: 40px 20px;
@@ -1101,22 +1180,6 @@ with gr.Group(elem_classes=["control-group"]):
1101
  color: #6b7280;
1102
  }
1103
 
1104
- /* Dark mode adjustments */
1105
- .dark .sidebar {
1106
- background: #1f2937;
1107
- border-color: #374151;
1108
- }
1109
-
1110
- .dark .control-group {
1111
- background: #111827;
1112
- border-color: #374151;
1113
- }
1114
-
1115
- .dark .input-group {
1116
- background: #111827;
1117
- border-color: #374151;
1118
- }
1119
-
1120
  /* Responsive design */
1121
  @media (max-width: 768px) {
1122
  .header-content {
 
117
  """Create the professional sidebar"""
118
 
119
  # Model Selection
120
+ with gr.Group(elem_classes=["control-group"]):
121
+ gr.HTML('<div class="group-title">๐Ÿค– AI Model</div>')
122
+
123
+ model_dropdown = gr.Dropdown(
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 {