hwonder Claude Opus 4.5 commited on
Commit
ef96488
·
1 Parent(s): e709f15

Restore full StackNet demo with all tabs

Browse files

- Full app with 6 tabs: Image, Video, Music generation
- Tab order: Image tabs first, Music tabs last
- API key input in Settings accordion
- All handlers wired up for generation functions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Files changed (2) hide show
  1. app.py +168 -13
  2. requirements.txt +3 -1
app.py CHANGED
@@ -1,25 +1,180 @@
1
  """
2
- StackNet Demo - Minimal Test
 
 
3
  """
4
 
5
  import gradio as gr
 
 
 
 
 
 
 
 
 
 
6
 
7
  def create_demo():
8
- with gr.Blocks(title="StackNet Demo") as demo:
9
- gr.Markdown("# StackNet Demo 1:1 Preview")
10
- gr.Markdown("Testing basic functionality...")
11
-
12
- test_input = gr.Textbox(label="Test Input", placeholder="Type something...")
13
- test_output = gr.Textbox(label="Test Output")
14
- test_btn = gr.Button("Test", variant="primary")
15
-
16
- test_btn.click(
17
- fn=lambda x: f"You typed: {x}",
18
- inputs=[test_input],
19
- outputs=[test_output]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  )
21
 
22
  return demo
23
 
 
24
  demo = create_demo()
25
  demo.launch()
 
1
  """
2
+ StackNet Demo - 1:1 Preview
3
+
4
+ A Gradio-based demo showcasing StackNet's AI-powered media generation capabilities.
5
  """
6
 
7
  import gradio as gr
8
+ from src.ui.tabs import (
9
+ create_text_to_image_tab,
10
+ create_image_to_image_tab,
11
+ create_text_to_video_tab,
12
+ create_image_to_video_tab,
13
+ create_text_to_music_tab,
14
+ create_music_to_music_tab
15
+ )
16
+ from src.ui.handlers import Handlers
17
+
18
 
19
  def create_demo():
20
+ """Create the main Gradio demo application."""
21
+ with gr.Blocks(
22
+ title="StackNet 1:1 Preview Demo",
23
+ theme=gr.themes.Soft()
24
+ ) as demo:
25
+ gr.Markdown("# StackNet 1:1 Preview Demo")
26
+ gr.Markdown("AI-powered media generation - Images, Videos, and Music")
27
+
28
+ # API Key input at the top
29
+ with gr.Accordion("Settings", open=False):
30
+ api_key = gr.Textbox(
31
+ label="StackNet API Key",
32
+ placeholder="Enter your API key (e.g., gn_xxxxx)",
33
+ type="password"
34
+ )
35
+
36
+ tabs = {}
37
+
38
+ # Create tabs in the requested order: Image/Video first, Music last
39
+ with gr.Tabs():
40
+ with gr.Tab("Text to Image", id="text-to-image"):
41
+ tabs["text_to_image"] = create_text_to_image_tab()
42
+
43
+ with gr.Tab("Image to Image", id="image-to-image"):
44
+ tabs["image_to_image"] = create_image_to_image_tab()
45
+
46
+ with gr.Tab("Text to Video", id="text-to-video"):
47
+ tabs["text_to_video"] = create_text_to_video_tab()
48
+
49
+ with gr.Tab("Image to Video", id="image-to-video"):
50
+ tabs["image_to_video"] = create_image_to_video_tab()
51
+
52
+ with gr.Tab("Text to Music", id="text-to-music"):
53
+ tabs["text_to_music"] = create_text_to_music_tab()
54
+
55
+ with gr.Tab("Music to Music", id="music-to-music"):
56
+ tabs["music_to_music"] = create_music_to_music_tab()
57
+
58
+ # Wire up event handlers
59
+
60
+ # Text to Image
61
+ tabs["text_to_image"]["generate_btn"].click(
62
+ fn=Handlers.generate_image,
63
+ inputs=[
64
+ tabs["text_to_image"]["prompt"],
65
+ tabs["text_to_image"]["style"],
66
+ tabs["text_to_image"]["aspect_ratio"],
67
+ api_key
68
+ ],
69
+ outputs=[
70
+ tabs["text_to_image"]["output_image"],
71
+ tabs["text_to_image"]["status"]
72
+ ],
73
+ api_name=None
74
+ )
75
+
76
+ # Image to Image
77
+ tabs["image_to_image"]["edit_btn"].click(
78
+ fn=Handlers.edit_image,
79
+ inputs=[
80
+ tabs["image_to_image"]["input_image"],
81
+ tabs["image_to_image"]["edit_prompt"],
82
+ tabs["image_to_image"]["strength"],
83
+ api_key
84
+ ],
85
+ outputs=[
86
+ tabs["image_to_image"]["output_image"],
87
+ tabs["image_to_image"]["status"]
88
+ ],
89
+ api_name=None
90
+ )
91
+
92
+ # Text to Video
93
+ tabs["text_to_video"]["generate_btn"].click(
94
+ fn=Handlers.generate_video,
95
+ inputs=[
96
+ tabs["text_to_video"]["prompt"],
97
+ tabs["text_to_video"]["duration"],
98
+ tabs["text_to_video"]["style"],
99
+ api_key
100
+ ],
101
+ outputs=[
102
+ tabs["text_to_video"]["output_video"],
103
+ tabs["text_to_video"]["status"]
104
+ ],
105
+ api_name=None
106
+ )
107
+
108
+ # Image to Video
109
+ tabs["image_to_video"]["animate_btn"].click(
110
+ fn=Handlers.animate_image,
111
+ inputs=[
112
+ tabs["image_to_video"]["input_image"],
113
+ tabs["image_to_video"]["motion_prompt"],
114
+ tabs["image_to_video"]["duration"],
115
+ api_key
116
+ ],
117
+ outputs=[
118
+ tabs["image_to_video"]["output_video"],
119
+ tabs["image_to_video"]["status"]
120
+ ],
121
+ api_name=None
122
+ )
123
+
124
+ # Text to Music
125
+ tabs["text_to_music"]["generate_btn"].click(
126
+ fn=Handlers.generate_music,
127
+ inputs=[
128
+ tabs["text_to_music"]["prompt"],
129
+ tabs["text_to_music"]["tags"],
130
+ tabs["text_to_music"]["instrumental"],
131
+ tabs["text_to_music"]["lyrics"],
132
+ tabs["text_to_music"]["title"],
133
+ api_key
134
+ ],
135
+ outputs=[
136
+ tabs["text_to_music"]["output_audio"],
137
+ tabs["text_to_music"]["status"]
138
+ ],
139
+ api_name=None
140
+ )
141
+
142
+ # Music to Music - Cover
143
+ tabs["music_to_music"]["cover_btn"].click(
144
+ fn=Handlers.create_cover,
145
+ inputs=[
146
+ tabs["music_to_music"]["cover_audio_input"],
147
+ tabs["music_to_music"]["cover_style_prompt"],
148
+ tabs["music_to_music"]["cover_tags"],
149
+ tabs["music_to_music"]["cover_title"],
150
+ api_key
151
+ ],
152
+ outputs=[
153
+ tabs["music_to_music"]["cover_output"],
154
+ tabs["music_to_music"]["cover_status"]
155
+ ],
156
+ api_name=None
157
+ )
158
+
159
+ # Music to Music - Stems
160
+ tabs["music_to_music"]["stems_btn"].click(
161
+ fn=Handlers.extract_stems,
162
+ inputs=[
163
+ tabs["music_to_music"]["stems_audio_input"],
164
+ api_key
165
+ ],
166
+ outputs=[
167
+ tabs["music_to_music"]["vocals_output"],
168
+ tabs["music_to_music"]["drums_output"],
169
+ tabs["music_to_music"]["bass_output"],
170
+ tabs["music_to_music"]["other_output"],
171
+ tabs["music_to_music"]["stems_status"]
172
+ ],
173
+ api_name=None
174
  )
175
 
176
  return demo
177
 
178
+
179
  demo = create_demo()
180
  demo.launch()
requirements.txt CHANGED
@@ -1 +1,3 @@
1
- gradio
 
 
 
1
+ gradio>=4.0.0
2
+ httpx>=0.25.0
3
+ python-dotenv>=1.0.0