Spaces:
Running
Running
beta chat ui
Browse files
app.py
CHANGED
|
@@ -4640,6 +4640,14 @@ with gr.Blocks(
|
|
| 4640 |
margin: 8px 0;
|
| 4641 |
text-align: center;
|
| 4642 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4643 |
"""
|
| 4644 |
) as demo:
|
| 4645 |
history = gr.State([])
|
|
@@ -4652,6 +4660,57 @@ with gr.Blocks(
|
|
| 4652 |
|
| 4653 |
with gr.Sidebar() as sidebar:
|
| 4654 |
login_button = gr.LoginButton()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4655 |
|
| 4656 |
# Theme Selector (hidden for end users, developers can modify code)
|
| 4657 |
with gr.Column(visible=False):
|
|
@@ -4671,8 +4730,8 @@ with gr.Blocks(
|
|
| 4671 |
label="Project URL",
|
| 4672 |
placeholder="https://huggingface.co/spaces/user/space OR https://huggingface.co/user/model OR https://github.com/owner/repo",
|
| 4673 |
lines=1
|
| 4674 |
-
)
|
| 4675 |
-
load_project_btn = gr.Button("Import Project", variant="secondary", size="sm")
|
| 4676 |
load_project_status = gr.Markdown(visible=False)
|
| 4677 |
|
| 4678 |
input = gr.Textbox(
|
|
@@ -4794,34 +4853,37 @@ with gr.Blocks(
|
|
| 4794 |
visible=False
|
| 4795 |
)
|
| 4796 |
|
| 4797 |
-
def on_image_to_image_toggle(toggled):
|
| 4798 |
-
#
|
| 4799 |
-
|
|
|
|
| 4800 |
|
| 4801 |
-
def on_text_to_image_toggle(toggled):
|
| 4802 |
-
|
|
|
|
| 4803 |
|
| 4804 |
image_to_image_toggle.change(
|
| 4805 |
on_image_to_image_toggle,
|
| 4806 |
-
inputs=[image_to_image_toggle],
|
| 4807 |
outputs=[generation_image_input, image_to_image_prompt]
|
| 4808 |
)
|
| 4809 |
-
def on_image_to_video_toggle(toggled):
|
| 4810 |
-
|
|
|
|
| 4811 |
|
| 4812 |
image_to_video_toggle.change(
|
| 4813 |
on_image_to_video_toggle,
|
| 4814 |
-
inputs=[image_to_video_toggle],
|
| 4815 |
outputs=[generation_image_input, image_to_video_prompt]
|
| 4816 |
)
|
| 4817 |
image_generation_toggle.change(
|
| 4818 |
on_text_to_image_toggle,
|
| 4819 |
-
inputs=[image_generation_toggle],
|
| 4820 |
outputs=[text_to_image_prompt]
|
| 4821 |
)
|
| 4822 |
text_to_video_toggle.change(
|
| 4823 |
on_text_to_image_toggle,
|
| 4824 |
-
inputs=[text_to_video_toggle],
|
| 4825 |
outputs=[text_to_video_prompt]
|
| 4826 |
)
|
| 4827 |
model_dropdown = gr.Dropdown(
|
|
@@ -4831,7 +4893,7 @@ with gr.Blocks(
|
|
| 4831 |
visible=True
|
| 4832 |
)
|
| 4833 |
provider_state = gr.State("auto")
|
| 4834 |
-
gr.Markdown("**Quick start**", visible=True)
|
| 4835 |
with gr.Column(visible=True) as quick_examples_col:
|
| 4836 |
for i, demo_item in enumerate(DEMO_LIST[:3]):
|
| 4837 |
demo_card = gr.Button(
|
|
@@ -5060,12 +5122,12 @@ with gr.Blocks(
|
|
| 5060 |
)
|
| 5061 |
|
| 5062 |
def begin_generation_ui():
|
| 5063 |
-
#
|
| 5064 |
-
return [gr.update(
|
| 5065 |
|
| 5066 |
def end_generation_ui():
|
| 5067 |
-
# Keep sidebar
|
| 5068 |
-
return [gr.update(
|
| 5069 |
|
| 5070 |
btn.click(
|
| 5071 |
begin_generation_ui,
|
|
@@ -5089,6 +5151,285 @@ with gr.Blocks(
|
|
| 5089 |
inputs=[history],
|
| 5090 |
outputs=[space_name_input, deploy_btn]
|
| 5091 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5092 |
# Update preview when code or language changes
|
| 5093 |
code_output.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
| 5094 |
language_dropdown.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
|
|
|
| 4640 |
margin: 8px 0;
|
| 4641 |
text-align: center;
|
| 4642 |
}
|
| 4643 |
+
/* Darker chat bubbles for better contrast in dark theme */
|
| 4644 |
+
#beta_chat .message.user, #beta_chat .message.assistant {
|
| 4645 |
+
background: rgba(60, 60, 60, 0.85);
|
| 4646 |
+
color: #f5f5f5;
|
| 4647 |
+
}
|
| 4648 |
+
#beta_chat .message.user {
|
| 4649 |
+
background: rgba(70, 70, 70, 0.95);
|
| 4650 |
+
}
|
| 4651 |
"""
|
| 4652 |
) as demo:
|
| 4653 |
history = gr.State([])
|
|
|
|
| 4660 |
|
| 4661 |
with gr.Sidebar() as sidebar:
|
| 4662 |
login_button = gr.LoginButton()
|
| 4663 |
+
beta_toggle = gr.Checkbox(
|
| 4664 |
+
value=False,
|
| 4665 |
+
label="Beta: Chat UI",
|
| 4666 |
+
info="Switch to the new chat-based sidebar interface"
|
| 4667 |
+
)
|
| 4668 |
+
|
| 4669 |
+
# Simple chat-based controller for sidebar
|
| 4670 |
+
sidebar_chatbot = gr.Chatbot(
|
| 4671 |
+
type="messages",
|
| 4672 |
+
show_label=False,
|
| 4673 |
+
height=320,
|
| 4674 |
+
layout="bubble",
|
| 4675 |
+
bubble_full_width=True,
|
| 4676 |
+
group_consecutive_messages=True,
|
| 4677 |
+
visible=False,
|
| 4678 |
+
elem_id="beta_chat"
|
| 4679 |
+
)
|
| 4680 |
+
sidebar_msg = gr.MultimodalTextbox(
|
| 4681 |
+
placeholder=(
|
| 4682 |
+
"Describe what to build. Examples: 'use streamlit', 'text to video: <prompt>'. "
|
| 4683 |
+
"See Advanced Commands below for the full list."
|
| 4684 |
+
),
|
| 4685 |
+
submit_btn=True,
|
| 4686 |
+
stop_btn=False,
|
| 4687 |
+
show_label=False,
|
| 4688 |
+
sources=["upload", "microphone"],
|
| 4689 |
+
visible=False
|
| 4690 |
+
)
|
| 4691 |
+
chat_clear_btn = gr.ClearButton([sidebar_msg, sidebar_chatbot], visible=False)
|
| 4692 |
+
|
| 4693 |
+
# Collapsed Advanced Commands reference
|
| 4694 |
+
with gr.Accordion(label="Advanced Commands", open=False, visible=False) as advanced_commands:
|
| 4695 |
+
gr.Markdown(
|
| 4696 |
+
value=(
|
| 4697 |
+
"### Command Reference\n"
|
| 4698 |
+
"- **Language**: 'use streamlit' | 'use gradio' | 'use html'\n"
|
| 4699 |
+
"- **Web search**: 'enable web search' | 'disable web search'\n"
|
| 4700 |
+
"- **Model**: 'model <name>' (exact match to items in the Model dropdown)\n"
|
| 4701 |
+
"- **Website redesign**: include a URL in your message (e.g., 'https://example.com')\n"
|
| 4702 |
+
"- **Text → Image**: 'generate images: <prompt>' or 'text to image: <prompt>'\n"
|
| 4703 |
+
"- **Image → Image**: 'image to image: <prompt>' (attach an image)\n"
|
| 4704 |
+
"- **Image → Video**: 'image to video: <prompt>' (attach an image)\n"
|
| 4705 |
+
"- **Text → Video**: 'text to video: <prompt>' or 'generate video: <prompt>'\n"
|
| 4706 |
+
"- **Files & media**: attach documents or images directly; the first image is used for generation, the first non-image is treated as a reference file\n"
|
| 4707 |
+
"- **Multiple directives**: separate with commas. The first segment is the main build prompt.\n\n"
|
| 4708 |
+
"Examples:\n"
|
| 4709 |
+
"- anycoder coffee shop, text to video: coffee pouring into cup\n"
|
| 4710 |
+
"- redesign https://example.com, use streamlit, enable web search\n"
|
| 4711 |
+
"- dashboard ui, generate images: minimalist pastel hero"
|
| 4712 |
+
)
|
| 4713 |
+
)
|
| 4714 |
|
| 4715 |
# Theme Selector (hidden for end users, developers can modify code)
|
| 4716 |
with gr.Column(visible=False):
|
|
|
|
| 4730 |
label="Project URL",
|
| 4731 |
placeholder="https://huggingface.co/spaces/user/space OR https://huggingface.co/user/model OR https://github.com/owner/repo",
|
| 4732 |
lines=1
|
| 4733 |
+
, visible=True)
|
| 4734 |
+
load_project_btn = gr.Button("Import Project", variant="secondary", size="sm", visible=True)
|
| 4735 |
load_project_status = gr.Markdown(visible=False)
|
| 4736 |
|
| 4737 |
input = gr.Textbox(
|
|
|
|
| 4853 |
visible=False
|
| 4854 |
)
|
| 4855 |
|
| 4856 |
+
def on_image_to_image_toggle(toggled, beta_enabled):
|
| 4857 |
+
# Only show in classic mode (beta disabled)
|
| 4858 |
+
vis = bool(toggled) and not bool(beta_enabled)
|
| 4859 |
+
return gr.update(visible=vis), gr.update(visible=vis)
|
| 4860 |
|
| 4861 |
+
def on_text_to_image_toggle(toggled, beta_enabled):
|
| 4862 |
+
vis = bool(toggled) and not bool(beta_enabled)
|
| 4863 |
+
return gr.update(visible=vis)
|
| 4864 |
|
| 4865 |
image_to_image_toggle.change(
|
| 4866 |
on_image_to_image_toggle,
|
| 4867 |
+
inputs=[image_to_image_toggle, beta_toggle],
|
| 4868 |
outputs=[generation_image_input, image_to_image_prompt]
|
| 4869 |
)
|
| 4870 |
+
def on_image_to_video_toggle(toggled, beta_enabled):
|
| 4871 |
+
vis = bool(toggled) and not bool(beta_enabled)
|
| 4872 |
+
return gr.update(visible=vis), gr.update(visible=vis)
|
| 4873 |
|
| 4874 |
image_to_video_toggle.change(
|
| 4875 |
on_image_to_video_toggle,
|
| 4876 |
+
inputs=[image_to_video_toggle, beta_toggle],
|
| 4877 |
outputs=[generation_image_input, image_to_video_prompt]
|
| 4878 |
)
|
| 4879 |
image_generation_toggle.change(
|
| 4880 |
on_text_to_image_toggle,
|
| 4881 |
+
inputs=[image_generation_toggle, beta_toggle],
|
| 4882 |
outputs=[text_to_image_prompt]
|
| 4883 |
)
|
| 4884 |
text_to_video_toggle.change(
|
| 4885 |
on_text_to_image_toggle,
|
| 4886 |
+
inputs=[text_to_video_toggle, beta_toggle],
|
| 4887 |
outputs=[text_to_video_prompt]
|
| 4888 |
)
|
| 4889 |
model_dropdown = gr.Dropdown(
|
|
|
|
| 4893 |
visible=True
|
| 4894 |
)
|
| 4895 |
provider_state = gr.State("auto")
|
| 4896 |
+
quick_start_md = gr.Markdown("**Quick start**", visible=True)
|
| 4897 |
with gr.Column(visible=True) as quick_examples_col:
|
| 4898 |
for i, demo_item in enumerate(DEMO_LIST[:3]):
|
| 4899 |
demo_card = gr.Button(
|
|
|
|
| 5122 |
)
|
| 5123 |
|
| 5124 |
def begin_generation_ui():
|
| 5125 |
+
# If beta chat UI is active, keep sidebar visible; otherwise, default behavior
|
| 5126 |
+
return [gr.update(), gr.update(visible=False)]
|
| 5127 |
|
| 5128 |
def end_generation_ui():
|
| 5129 |
+
# Keep sidebar as is; hide the status
|
| 5130 |
+
return [gr.update(), gr.update(visible=False)]
|
| 5131 |
|
| 5132 |
btn.click(
|
| 5133 |
begin_generation_ui,
|
|
|
|
| 5151 |
inputs=[history],
|
| 5152 |
outputs=[space_name_input, deploy_btn]
|
| 5153 |
)
|
| 5154 |
+
|
| 5155 |
+
# --- Chat-based sidebar controller logic ---
|
| 5156 |
+
def _find_model_by_name(name: str):
|
| 5157 |
+
for m in AVAILABLE_MODELS:
|
| 5158 |
+
if m["name"].lower() == name.lower():
|
| 5159 |
+
return m
|
| 5160 |
+
return None
|
| 5161 |
+
|
| 5162 |
+
def _extract_url(text: str) -> str | None:
|
| 5163 |
+
import re
|
| 5164 |
+
match = re.search(r"https?://[^\s]+", text or "")
|
| 5165 |
+
return match.group(0) if match else None
|
| 5166 |
+
|
| 5167 |
+
def apply_chat_command(message, chat_messages):
|
| 5168 |
+
# Support plain text or dict from MultimodalTextbox
|
| 5169 |
+
text = message if isinstance(message, str) else (message.get("text", "") if isinstance(message, dict) else "")
|
| 5170 |
+
files = []
|
| 5171 |
+
if isinstance(message, dict):
|
| 5172 |
+
files = message.get("files", []) or []
|
| 5173 |
+
|
| 5174 |
+
# Defaults to skip updates where unchanged
|
| 5175 |
+
upd_input = gr.skip()
|
| 5176 |
+
upd_language = gr.skip()
|
| 5177 |
+
upd_url = gr.skip()
|
| 5178 |
+
upd_file = gr.skip()
|
| 5179 |
+
upd_image_for_gen = gr.skip()
|
| 5180 |
+
upd_search = gr.skip()
|
| 5181 |
+
upd_img_gen = gr.skip()
|
| 5182 |
+
upd_t2i_prompt = gr.skip()
|
| 5183 |
+
upd_i2i_toggle = gr.skip()
|
| 5184 |
+
upd_i2i_prompt = gr.skip()
|
| 5185 |
+
upd_i2v_toggle = gr.skip()
|
| 5186 |
+
upd_i2v_prompt = gr.skip()
|
| 5187 |
+
upd_t2v_toggle = gr.skip()
|
| 5188 |
+
upd_t2v_prompt = gr.skip()
|
| 5189 |
+
upd_model_dropdown = gr.skip()
|
| 5190 |
+
upd_current_model = gr.skip()
|
| 5191 |
+
|
| 5192 |
+
# Split by comma to separate main prompt and directives
|
| 5193 |
+
segments = [seg.strip() for seg in (text or "").split(",") if seg.strip()]
|
| 5194 |
+
main_prompt = segments[0] if segments else text
|
| 5195 |
+
|
| 5196 |
+
# Helper to get text after ':' in original casing
|
| 5197 |
+
def after_colon(original_segment: str) -> str:
|
| 5198 |
+
parts = original_segment.split(":", 1)
|
| 5199 |
+
return parts[1].strip() if len(parts) == 2 else ""
|
| 5200 |
+
|
| 5201 |
+
# Process directives from all segments (including first if user puts directives there),
|
| 5202 |
+
# but always set the main build prompt from the first segment only
|
| 5203 |
+
for seg in segments:
|
| 5204 |
+
seg_norm = seg.lower()
|
| 5205 |
+
# Language
|
| 5206 |
+
if "use streamlit" in seg_norm:
|
| 5207 |
+
upd_language = gr.update(value="streamlit")
|
| 5208 |
+
elif "use gradio" in seg_norm:
|
| 5209 |
+
upd_language = gr.update(value="gradio")
|
| 5210 |
+
elif "use html" in seg_norm or "as html" in seg_norm:
|
| 5211 |
+
upd_language = gr.update(value="html")
|
| 5212 |
+
|
| 5213 |
+
# Web search
|
| 5214 |
+
if (
|
| 5215 |
+
"enable web search" in seg_norm
|
| 5216 |
+
or "web search on" in seg_norm
|
| 5217 |
+
or "with web search" in seg_norm
|
| 5218 |
+
or "search the web" in seg_norm
|
| 5219 |
+
):
|
| 5220 |
+
upd_search = gr.update(value=True)
|
| 5221 |
+
if (
|
| 5222 |
+
"disable web search" in seg_norm
|
| 5223 |
+
or "no web search" in seg_norm
|
| 5224 |
+
or "web search off" in seg_norm
|
| 5225 |
+
):
|
| 5226 |
+
upd_search = gr.update(value=False)
|
| 5227 |
+
|
| 5228 |
+
# Text-to-image
|
| 5229 |
+
if ("generate images" in seg_norm) or ("text to image" in seg_norm) or ("text-to-image" in seg_norm):
|
| 5230 |
+
upd_img_gen = gr.update(value=True)
|
| 5231 |
+
p = after_colon(seg)
|
| 5232 |
+
if p:
|
| 5233 |
+
upd_t2i_prompt = gr.update(value=p)
|
| 5234 |
+
|
| 5235 |
+
# Image-to-image
|
| 5236 |
+
if ("image to image" in seg_norm) or ("image-to-image" in seg_norm) or ("transform image" in seg_norm):
|
| 5237 |
+
upd_i2i_toggle = gr.update(value=True)
|
| 5238 |
+
p = after_colon(seg)
|
| 5239 |
+
if p:
|
| 5240 |
+
upd_i2i_prompt = gr.update(value=p)
|
| 5241 |
+
|
| 5242 |
+
# Image-to-video
|
| 5243 |
+
if ("image to video" in seg_norm) or ("image-to-video" in seg_norm):
|
| 5244 |
+
upd_i2v_toggle = gr.update(value=True)
|
| 5245 |
+
p = after_colon(seg)
|
| 5246 |
+
if p:
|
| 5247 |
+
upd_i2v_prompt = gr.update(value=p)
|
| 5248 |
+
|
| 5249 |
+
# Text-to-video
|
| 5250 |
+
if ("text to video" in seg_norm) or ("text-to-video" in seg_norm) or ("generate video" in seg_norm):
|
| 5251 |
+
upd_t2v_toggle = gr.update(value=True)
|
| 5252 |
+
p = after_colon(seg)
|
| 5253 |
+
if p:
|
| 5254 |
+
upd_t2v_prompt = gr.update(value=p)
|
| 5255 |
+
|
| 5256 |
+
# URL (website redesign)
|
| 5257 |
+
url = _extract_url(seg)
|
| 5258 |
+
if url:
|
| 5259 |
+
upd_url = gr.update(value=url)
|
| 5260 |
+
|
| 5261 |
+
# Model selection
|
| 5262 |
+
if "model " in seg_norm:
|
| 5263 |
+
try:
|
| 5264 |
+
model_name = seg.split("model", 1)[1].strip()
|
| 5265 |
+
except Exception:
|
| 5266 |
+
model_name = ""
|
| 5267 |
+
if model_name:
|
| 5268 |
+
model_obj = _find_model_by_name(model_name)
|
| 5269 |
+
if model_obj is not None:
|
| 5270 |
+
upd_model_dropdown = gr.update(value=model_obj["name"]) # keep dropdown in sync
|
| 5271 |
+
upd_current_model = model_obj # pass directly to State for immediate effect
|
| 5272 |
+
|
| 5273 |
+
# Files: attach first non-image to file_input; image to generation_image_input
|
| 5274 |
+
img_assigned = False
|
| 5275 |
+
non_img_assigned = False
|
| 5276 |
+
for f in files:
|
| 5277 |
+
try:
|
| 5278 |
+
path = f["path"] if isinstance(f, dict) and "path" in f else f
|
| 5279 |
+
except Exception:
|
| 5280 |
+
path = None
|
| 5281 |
+
if not path:
|
| 5282 |
+
continue
|
| 5283 |
+
if not img_assigned and any(str(path).lower().endswith(ext) for ext in [".png", ".jpg", ".jpeg", ".bmp", ".gif", ".webp", ".tiff", ".tif"]):
|
| 5284 |
+
upd_image_for_gen = gr.update(value=path)
|
| 5285 |
+
img_assigned = True
|
| 5286 |
+
elif not non_img_assigned:
|
| 5287 |
+
upd_file = gr.update(value=path)
|
| 5288 |
+
non_img_assigned = True
|
| 5289 |
+
|
| 5290 |
+
# Set main build intent from first segment (if present), otherwise full text
|
| 5291 |
+
if main_prompt:
|
| 5292 |
+
upd_input = gr.update(value=main_prompt)
|
| 5293 |
+
|
| 5294 |
+
# Build assistant acknowledgement
|
| 5295 |
+
ack = "Configured. Running generation with your latest instructions."
|
| 5296 |
+
if not chat_messages:
|
| 5297 |
+
chat_messages = []
|
| 5298 |
+
chat_messages.append({"role": "user", "content": text})
|
| 5299 |
+
chat_messages.append({"role": "assistant", "content": ack})
|
| 5300 |
+
|
| 5301 |
+
return (
|
| 5302 |
+
"",
|
| 5303 |
+
gr.update(value=chat_messages, visible=True),
|
| 5304 |
+
upd_input,
|
| 5305 |
+
upd_language,
|
| 5306 |
+
upd_url,
|
| 5307 |
+
upd_file,
|
| 5308 |
+
upd_image_for_gen,
|
| 5309 |
+
upd_search,
|
| 5310 |
+
upd_img_gen,
|
| 5311 |
+
upd_t2i_prompt,
|
| 5312 |
+
upd_i2i_toggle,
|
| 5313 |
+
upd_i2i_prompt,
|
| 5314 |
+
upd_i2v_toggle,
|
| 5315 |
+
upd_i2v_prompt,
|
| 5316 |
+
upd_t2v_toggle,
|
| 5317 |
+
upd_t2v_prompt,
|
| 5318 |
+
upd_model_dropdown,
|
| 5319 |
+
upd_current_model,
|
| 5320 |
+
)
|
| 5321 |
+
|
| 5322 |
+
# Wire chat submit -> apply settings -> run generation
|
| 5323 |
+
sidebar_msg.submit(
|
| 5324 |
+
apply_chat_command,
|
| 5325 |
+
inputs=[sidebar_msg, sidebar_chatbot],
|
| 5326 |
+
outputs=[
|
| 5327 |
+
sidebar_msg,
|
| 5328 |
+
sidebar_chatbot,
|
| 5329 |
+
input,
|
| 5330 |
+
language_dropdown,
|
| 5331 |
+
website_url_input,
|
| 5332 |
+
file_input,
|
| 5333 |
+
generation_image_input,
|
| 5334 |
+
search_toggle,
|
| 5335 |
+
image_generation_toggle,
|
| 5336 |
+
text_to_image_prompt,
|
| 5337 |
+
image_to_image_toggle,
|
| 5338 |
+
image_to_image_prompt,
|
| 5339 |
+
image_to_video_toggle,
|
| 5340 |
+
image_to_video_prompt,
|
| 5341 |
+
text_to_video_toggle,
|
| 5342 |
+
text_to_video_prompt,
|
| 5343 |
+
model_dropdown,
|
| 5344 |
+
current_model,
|
| 5345 |
+
],
|
| 5346 |
+
queue=False,
|
| 5347 |
+
).then(
|
| 5348 |
+
begin_generation_ui,
|
| 5349 |
+
inputs=None,
|
| 5350 |
+
outputs=[sidebar, generating_status],
|
| 5351 |
+
show_progress="hidden",
|
| 5352 |
+
).then(
|
| 5353 |
+
generation_code,
|
| 5354 |
+
inputs=[input, image_input, generation_image_input, file_input, website_url_input, setting, history, current_model, search_toggle, language_dropdown, provider_state, image_generation_toggle, image_to_image_toggle, image_to_image_prompt, text_to_image_prompt, image_to_video_toggle, image_to_video_prompt, text_to_video_toggle, text_to_video_prompt],
|
| 5355 |
+
outputs=[code_output, history, sandbox, history_output]
|
| 5356 |
+
).then(
|
| 5357 |
+
end_generation_ui,
|
| 5358 |
+
inputs=None,
|
| 5359 |
+
outputs=[sidebar, generating_status]
|
| 5360 |
+
).then(
|
| 5361 |
+
show_deploy_components,
|
| 5362 |
+
None,
|
| 5363 |
+
[space_name_input, sdk_dropdown, deploy_btn]
|
| 5364 |
+
).then(
|
| 5365 |
+
preserve_space_info_for_followup,
|
| 5366 |
+
inputs=[history],
|
| 5367 |
+
outputs=[space_name_input, deploy_btn]
|
| 5368 |
+
)
|
| 5369 |
+
|
| 5370 |
+
# Toggle between classic controls and beta chat UI
|
| 5371 |
+
def toggle_beta(checked: bool, t2i: bool, i2i: bool, i2v: bool, t2v: bool):
|
| 5372 |
+
# Prompts only visible in classic mode and when their toggles are on
|
| 5373 |
+
t2i_vis = (not checked) and bool(t2i)
|
| 5374 |
+
i2i_vis = (not checked) and bool(i2i)
|
| 5375 |
+
i2v_vis = (not checked) and bool(i2v)
|
| 5376 |
+
t2v_vis = (not checked) and bool(t2v)
|
| 5377 |
+
|
| 5378 |
+
return (
|
| 5379 |
+
# Chat UI group
|
| 5380 |
+
gr.update(visible=checked), # sidebar_chatbot
|
| 5381 |
+
gr.update(visible=checked), # sidebar_msg
|
| 5382 |
+
gr.update(visible=checked), # advanced_commands
|
| 5383 |
+
gr.update(visible=checked), # chat_clear_btn
|
| 5384 |
+
# Classic controls
|
| 5385 |
+
gr.update(visible=not checked), # input
|
| 5386 |
+
gr.update(visible=not checked), # language_dropdown
|
| 5387 |
+
gr.update(visible=not checked), # website_url_input
|
| 5388 |
+
gr.update(visible=not checked), # file_input
|
| 5389 |
+
gr.update(visible=not checked), # btn
|
| 5390 |
+
gr.update(visible=not checked), # clear_btn
|
| 5391 |
+
gr.update(visible=not checked), # search_toggle
|
| 5392 |
+
gr.update(visible=not checked), # image_generation_toggle
|
| 5393 |
+
gr.update(visible=t2i_vis), # text_to_image_prompt
|
| 5394 |
+
gr.update(visible=not checked), # image_to_image_toggle
|
| 5395 |
+
gr.update(visible=i2i_vis), # image_to_image_prompt
|
| 5396 |
+
gr.update(visible=not checked), # image_to_video_toggle
|
| 5397 |
+
gr.update(visible=i2v_vis), # image_to_video_prompt
|
| 5398 |
+
gr.update(visible=not checked), # text_to_video_toggle
|
| 5399 |
+
gr.update(visible=t2v_vis), # text_to_video_prompt
|
| 5400 |
+
gr.update(visible=not checked), # model_dropdown
|
| 5401 |
+
gr.update(visible=not checked), # quick_start_md
|
| 5402 |
+
gr.update(visible=not checked), # quick_examples_col
|
| 5403 |
+
)
|
| 5404 |
+
|
| 5405 |
+
beta_toggle.change(
|
| 5406 |
+
toggle_beta,
|
| 5407 |
+
inputs=[beta_toggle, image_generation_toggle, image_to_image_toggle, image_to_video_toggle, text_to_video_toggle],
|
| 5408 |
+
outputs=[
|
| 5409 |
+
sidebar_chatbot,
|
| 5410 |
+
sidebar_msg,
|
| 5411 |
+
advanced_commands,
|
| 5412 |
+
chat_clear_btn,
|
| 5413 |
+
input,
|
| 5414 |
+
language_dropdown,
|
| 5415 |
+
website_url_input,
|
| 5416 |
+
file_input,
|
| 5417 |
+
btn,
|
| 5418 |
+
clear_btn,
|
| 5419 |
+
search_toggle,
|
| 5420 |
+
image_generation_toggle,
|
| 5421 |
+
text_to_image_prompt,
|
| 5422 |
+
image_to_image_toggle,
|
| 5423 |
+
image_to_image_prompt,
|
| 5424 |
+
image_to_video_toggle,
|
| 5425 |
+
image_to_video_prompt,
|
| 5426 |
+
text_to_video_toggle,
|
| 5427 |
+
text_to_video_prompt,
|
| 5428 |
+
model_dropdown,
|
| 5429 |
+
quick_start_md,
|
| 5430 |
+
quick_examples_col,
|
| 5431 |
+
],
|
| 5432 |
+
)
|
| 5433 |
# Update preview when code or language changes
|
| 5434 |
code_output.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
| 5435 |
language_dropdown.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|