Spaces:
Running
Running
transformers js multi file support
Browse files
app.py
CHANGED
|
@@ -5144,6 +5144,15 @@ with gr.Blocks(
|
|
| 5144 |
interactive=True,
|
| 5145 |
label="Generated code"
|
| 5146 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5147 |
with gr.Tab("Preview"):
|
| 5148 |
sandbox = gr.HTML(label="Live preview")
|
| 5149 |
# Removed Import Logs tab for cleaner UI
|
|
@@ -5261,7 +5270,51 @@ with gr.Blocks(
|
|
| 5261 |
language_dropdown.change(update_code_language, inputs=language_dropdown, outputs=code_output)
|
| 5262 |
language_dropdown.change(update_sdk_based_on_language, inputs=language_dropdown, outputs=sdk_dropdown)
|
| 5263 |
|
| 5264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5265 |
if language == "html":
|
| 5266 |
return send_to_sandbox(code)
|
| 5267 |
if language == "streamlit":
|
|
@@ -5273,7 +5326,10 @@ with gr.Blocks(
|
|
| 5273 |
return send_streamlit_to_stlite(code)
|
| 5274 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview available only for Streamlit apps in Python. Add `import streamlit as st`.</div>"
|
| 5275 |
if language == "transformers.js":
|
| 5276 |
-
|
|
|
|
|
|
|
|
|
|
| 5277 |
if files['index.html']:
|
| 5278 |
return send_transformers_to_sandbox(files)
|
| 5279 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML. Please download your code using the download button above.</div>"
|
|
@@ -5281,6 +5337,17 @@ with gr.Blocks(
|
|
| 5281 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML. Please download your Svelte code and deploy it to see the result.</div>"
|
| 5282 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML.</div>"
|
| 5283 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5284 |
def show_deploy_components(*args):
|
| 5285 |
return [gr.Textbox(visible=True), gr.Dropdown(visible=True), gr.Button(visible=True)]
|
| 5286 |
|
|
@@ -5354,6 +5421,11 @@ with gr.Blocks(
|
|
| 5354 |
end_generation_ui,
|
| 5355 |
inputs=None,
|
| 5356 |
outputs=[sidebar, generating_status]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5357 |
).then(
|
| 5358 |
show_deploy_components,
|
| 5359 |
None,
|
|
@@ -5606,6 +5678,10 @@ with gr.Blocks(
|
|
| 5606 |
end_generation_ui,
|
| 5607 |
inputs=None,
|
| 5608 |
outputs=[sidebar, generating_status]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5609 |
).then(
|
| 5610 |
show_deploy_components,
|
| 5611 |
None,
|
|
@@ -5684,9 +5760,9 @@ with gr.Blocks(
|
|
| 5684 |
quick_examples_col,
|
| 5685 |
],
|
| 5686 |
)
|
| 5687 |
-
# Update preview when code or language changes
|
| 5688 |
-
code_output.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
| 5689 |
-
language_dropdown.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
| 5690 |
# Update deploy button text when space name changes
|
| 5691 |
space_name_input.change(update_deploy_button_text, inputs=[space_name_input], outputs=[deploy_btn])
|
| 5692 |
clear_btn.click(clear_history, outputs=[history, history_output, file_input, website_url_input])
|
|
@@ -5911,8 +5987,14 @@ with gr.Blocks(
|
|
| 5911 |
return gr.update(value=f"Error: Could not access space {repo_id} for update.", visible=True)
|
| 5912 |
except Exception as e:
|
| 5913 |
return gr.update(value=f"Error: Cannot update space {repo_id}. {str(e)}", visible=True)
|
| 5914 |
-
#
|
| 5915 |
-
files =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5916 |
|
| 5917 |
if not files['index.html'] or not files['index.js'] or not files['style.css']:
|
| 5918 |
return gr.update(value="Error: Could not parse transformers.js output. Please regenerate the code.", visible=True)
|
|
@@ -6205,7 +6287,25 @@ with gr.Blocks(
|
|
| 6205 |
os.unlink(temp_path)
|
| 6206 |
|
| 6207 |
# Connect the deploy button to the new function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6208 |
deploy_btn.click(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6209 |
deploy_to_user_space,
|
| 6210 |
inputs=[code_output, space_name_input, sdk_dropdown],
|
| 6211 |
outputs=deploy_status
|
|
|
|
| 5144 |
interactive=True,
|
| 5145 |
label="Generated code"
|
| 5146 |
)
|
| 5147 |
+
# Transformers.js multi-file editors (hidden by default)
|
| 5148 |
+
with gr.Group(visible=False) as tjs_group:
|
| 5149 |
+
with gr.Tabs():
|
| 5150 |
+
with gr.Tab("index.html"):
|
| 5151 |
+
tjs_html_code = gr.Code(language="html", lines=20, interactive=True, label="index.html")
|
| 5152 |
+
with gr.Tab("index.js"):
|
| 5153 |
+
tjs_js_code = gr.Code(language="javascript", lines=20, interactive=True, label="index.js")
|
| 5154 |
+
with gr.Tab("style.css"):
|
| 5155 |
+
tjs_css_code = gr.Code(language="css", lines=20, interactive=True, label="style.css")
|
| 5156 |
with gr.Tab("Preview"):
|
| 5157 |
sandbox = gr.HTML(label="Live preview")
|
| 5158 |
# Removed Import Logs tab for cleaner UI
|
|
|
|
| 5270 |
language_dropdown.change(update_code_language, inputs=language_dropdown, outputs=code_output)
|
| 5271 |
language_dropdown.change(update_sdk_based_on_language, inputs=language_dropdown, outputs=sdk_dropdown)
|
| 5272 |
|
| 5273 |
+
# Toggle single vs multi-file editors for transformers.js and populate when switching
|
| 5274 |
+
def toggle_editors(language, code_text):
|
| 5275 |
+
if language == "transformers.js":
|
| 5276 |
+
files = parse_transformers_js_output(code_text or "")
|
| 5277 |
+
return [
|
| 5278 |
+
gr.update(visible=False), # code_output hidden
|
| 5279 |
+
gr.update(visible=True), # tjs_group shown
|
| 5280 |
+
gr.update(value=files.get('index.html', '')),
|
| 5281 |
+
gr.update(value=files.get('index.js', '')),
|
| 5282 |
+
gr.update(value=files.get('style.css', '')),
|
| 5283 |
+
]
|
| 5284 |
+
else:
|
| 5285 |
+
return [
|
| 5286 |
+
gr.update(visible=True), # code_output shown
|
| 5287 |
+
gr.update(visible=False), # tjs_group hidden
|
| 5288 |
+
gr.update(),
|
| 5289 |
+
gr.update(),
|
| 5290 |
+
gr.update(),
|
| 5291 |
+
]
|
| 5292 |
+
|
| 5293 |
+
language_dropdown.change(
|
| 5294 |
+
toggle_editors,
|
| 5295 |
+
inputs=[language_dropdown, code_output],
|
| 5296 |
+
outputs=[code_output, tjs_group, tjs_html_code, tjs_js_code, tjs_css_code],
|
| 5297 |
+
)
|
| 5298 |
+
|
| 5299 |
+
def sync_tjs_from_code(code_text, language):
|
| 5300 |
+
if language != "transformers.js":
|
| 5301 |
+
return [gr.update(), gr.update(), gr.update(), gr.update()]
|
| 5302 |
+
files = parse_transformers_js_output(code_text or "")
|
| 5303 |
+
return [
|
| 5304 |
+
gr.update(value=files.get('index.html', '')),
|
| 5305 |
+
gr.update(value=files.get('index.js', '')),
|
| 5306 |
+
gr.update(value=files.get('style.css', '')),
|
| 5307 |
+
gr.update(visible=True),
|
| 5308 |
+
]
|
| 5309 |
+
|
| 5310 |
+
# Keep multi-file editors in sync when code_output changes and language is transformers.js
|
| 5311 |
+
code_output.change(
|
| 5312 |
+
sync_tjs_from_code,
|
| 5313 |
+
inputs=[code_output, language_dropdown],
|
| 5314 |
+
outputs=[tjs_html_code, tjs_js_code, tjs_css_code, tjs_group],
|
| 5315 |
+
)
|
| 5316 |
+
|
| 5317 |
+
def preview_logic(code, language, html_part=None, js_part=None, css_part=None):
|
| 5318 |
if language == "html":
|
| 5319 |
return send_to_sandbox(code)
|
| 5320 |
if language == "streamlit":
|
|
|
|
| 5326 |
return send_streamlit_to_stlite(code)
|
| 5327 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview available only for Streamlit apps in Python. Add `import streamlit as st`.</div>"
|
| 5328 |
if language == "transformers.js":
|
| 5329 |
+
# Prefer values passed from multi-file editors if present; fallback to parsing single editor content
|
| 5330 |
+
files = {'index.html': html_part or '', 'index.js': js_part or '', 'style.css': css_part or ''}
|
| 5331 |
+
if not (files['index.html'] or files['index.js'] or files['style.css']):
|
| 5332 |
+
files = parse_transformers_js_output(code)
|
| 5333 |
if files['index.html']:
|
| 5334 |
return send_transformers_to_sandbox(files)
|
| 5335 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML. Please download your code using the download button above.</div>"
|
|
|
|
| 5337 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML. Please download your Svelte code and deploy it to see the result.</div>"
|
| 5338 |
return "<div style='padding:1em;color:#888;text-align:center;'>Preview is only available for HTML.</div>"
|
| 5339 |
|
| 5340 |
+
# Direct preview updates from multi-file editor changes
|
| 5341 |
+
def preview_from_tjs_editors(html_code, js_code, css_code):
|
| 5342 |
+
files = {'index.html': html_code or '', 'index.js': js_code or '', 'style.css': css_code or ''}
|
| 5343 |
+
if files['index.html']:
|
| 5344 |
+
return send_transformers_to_sandbox(files)
|
| 5345 |
+
return gr.update()
|
| 5346 |
+
|
| 5347 |
+
tjs_html_code.change(preview_from_tjs_editors, inputs=[tjs_html_code, tjs_js_code, tjs_css_code], outputs=sandbox)
|
| 5348 |
+
tjs_js_code.change(preview_from_tjs_editors, inputs=[tjs_html_code, tjs_js_code, tjs_css_code], outputs=sandbox)
|
| 5349 |
+
tjs_css_code.change(preview_from_tjs_editors, inputs=[tjs_html_code, tjs_js_code, tjs_css_code], outputs=sandbox)
|
| 5350 |
+
|
| 5351 |
def show_deploy_components(*args):
|
| 5352 |
return [gr.Textbox(visible=True), gr.Dropdown(visible=True), gr.Button(visible=True)]
|
| 5353 |
|
|
|
|
| 5421 |
end_generation_ui,
|
| 5422 |
inputs=None,
|
| 5423 |
outputs=[sidebar, generating_status]
|
| 5424 |
+
).then(
|
| 5425 |
+
# After generation, toggle editors for transformers.js and populate
|
| 5426 |
+
toggle_editors,
|
| 5427 |
+
inputs=[language_dropdown, code_output],
|
| 5428 |
+
outputs=[code_output, tjs_group, tjs_html_code, tjs_js_code, tjs_css_code]
|
| 5429 |
).then(
|
| 5430 |
show_deploy_components,
|
| 5431 |
None,
|
|
|
|
| 5678 |
end_generation_ui,
|
| 5679 |
inputs=None,
|
| 5680 |
outputs=[sidebar, generating_status]
|
| 5681 |
+
).then(
|
| 5682 |
+
toggle_editors,
|
| 5683 |
+
inputs=[language_dropdown, code_output],
|
| 5684 |
+
outputs=[code_output, tjs_group, tjs_html_code, tjs_js_code, tjs_css_code]
|
| 5685 |
).then(
|
| 5686 |
show_deploy_components,
|
| 5687 |
None,
|
|
|
|
| 5760 |
quick_examples_col,
|
| 5761 |
],
|
| 5762 |
)
|
| 5763 |
+
# Update preview when code or language changes (supports multi-file path via optional args)
|
| 5764 |
+
code_output.change(preview_logic, inputs=[code_output, language_dropdown, tjs_html_code, tjs_js_code, tjs_css_code], outputs=sandbox)
|
| 5765 |
+
language_dropdown.change(preview_logic, inputs=[code_output, language_dropdown, tjs_html_code, tjs_js_code, tjs_css_code], outputs=sandbox)
|
| 5766 |
# Update deploy button text when space name changes
|
| 5767 |
space_name_input.change(update_deploy_button_text, inputs=[space_name_input], outputs=[deploy_btn])
|
| 5768 |
clear_btn.click(clear_history, outputs=[history, history_output, file_input, website_url_input])
|
|
|
|
| 5987 |
return gr.update(value=f"Error: Could not access space {repo_id} for update.", visible=True)
|
| 5988 |
except Exception as e:
|
| 5989 |
return gr.update(value=f"Error: Cannot update space {repo_id}. {str(e)}", visible=True)
|
| 5990 |
+
# Build files from multi-file editors if available; fallback to parsing single editor value
|
| 5991 |
+
files = {
|
| 5992 |
+
'index.html': tjs_html_code.value if 'tjs_html_code' in locals() else '',
|
| 5993 |
+
'index.js': tjs_js_code.value if 'tjs_js_code' in locals() else '',
|
| 5994 |
+
'style.css': tjs_css_code.value if 'tjs_css_code' in locals() else '',
|
| 5995 |
+
}
|
| 5996 |
+
if not (files['index.html'] and files['index.js'] and files['style.css']):
|
| 5997 |
+
files = parse_transformers_js_output(code)
|
| 5998 |
|
| 5999 |
if not files['index.html'] or not files['index.js'] or not files['style.css']:
|
| 6000 |
return gr.update(value="Error: Could not parse transformers.js output. Please regenerate the code.", visible=True)
|
|
|
|
| 6287 |
os.unlink(temp_path)
|
| 6288 |
|
| 6289 |
# Connect the deploy button to the new function
|
| 6290 |
+
def gather_code_for_deploy(code_text, language, html_part, js_part, css_part):
|
| 6291 |
+
# When transformers.js is selected, ensure multi-file editors are used; otherwise, return single code
|
| 6292 |
+
if language == "transformers.js":
|
| 6293 |
+
# Join into a combined display string for auditing; actual deploy reads editor values directly
|
| 6294 |
+
files = {
|
| 6295 |
+
'index.html': html_part or '',
|
| 6296 |
+
'index.js': js_part or '',
|
| 6297 |
+
'style.css': css_part or '',
|
| 6298 |
+
}
|
| 6299 |
+
if files['index.html'] and files['index.js'] and files['style.css']:
|
| 6300 |
+
return format_transformers_js_output(files)
|
| 6301 |
+
return code_text
|
| 6302 |
+
|
| 6303 |
deploy_btn.click(
|
| 6304 |
+
gather_code_for_deploy,
|
| 6305 |
+
inputs=[code_output, language_dropdown, tjs_html_code, tjs_js_code, tjs_css_code],
|
| 6306 |
+
outputs=[code_output],
|
| 6307 |
+
queue=False,
|
| 6308 |
+
).then(
|
| 6309 |
deploy_to_user_space,
|
| 6310 |
inputs=[code_output, space_name_input, sdk_dropdown],
|
| 6311 |
outputs=deploy_status
|