Spaces:
Running
Running
transformers js errors
Browse files
app.py
CHANGED
|
@@ -711,32 +711,52 @@ def parse_transformers_js_output(text):
|
|
| 711 |
'style.css': ''
|
| 712 |
}
|
| 713 |
|
| 714 |
-
#
|
| 715 |
-
|
| 716 |
-
|
| 717 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 718 |
|
| 719 |
# Extract HTML content
|
| 720 |
-
|
| 721 |
-
|
| 722 |
-
|
|
|
|
|
|
|
| 723 |
|
| 724 |
# Extract JavaScript content
|
| 725 |
-
|
| 726 |
-
|
| 727 |
-
|
|
|
|
|
|
|
| 728 |
|
| 729 |
# Extract CSS content
|
| 730 |
-
|
| 731 |
-
|
| 732 |
-
|
|
|
|
|
|
|
| 733 |
|
| 734 |
# Fallback: support === index.html === format if any file is missing
|
| 735 |
if not (files['index.html'] and files['index.js'] and files['style.css']):
|
| 736 |
# Use regex to extract sections
|
| 737 |
-
html_fallback = re.search(r'===\s*index\.html\s*===\n([\s\S]+?)(?=\n===|$)', text, re.IGNORECASE)
|
| 738 |
-
js_fallback = re.search(r'===\s*index\.js\s*===\n([\s\S]+?)(?=\n===|$)', text, re.IGNORECASE)
|
| 739 |
-
css_fallback = re.search(r'===\s*style\.css\s*===\n([\s\S]+?)(?=\n===|$)', text, re.IGNORECASE)
|
|
|
|
| 740 |
if html_fallback:
|
| 741 |
files['index.html'] = html_fallback.group(1).strip()
|
| 742 |
if js_fallback:
|
|
@@ -744,6 +764,25 @@ def parse_transformers_js_output(text):
|
|
| 744 |
if css_fallback:
|
| 745 |
files['style.css'] = css_fallback.group(1).strip()
|
| 746 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 747 |
return files
|
| 748 |
|
| 749 |
def format_transformers_js_output(files):
|
|
@@ -2810,6 +2849,13 @@ with gr.Blocks(
|
|
| 2810 |
|
| 2811 |
def hide_deploy_components(*args):
|
| 2812 |
return [gr.Textbox(visible=False), gr.Dropdown(visible=False), gr.Button(visible=False)]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2813 |
|
| 2814 |
# Load project button event
|
| 2815 |
load_project_btn.click(
|
|
@@ -2830,6 +2876,8 @@ with gr.Blocks(
|
|
| 2830 |
# Update preview when code or language changes
|
| 2831 |
code_output.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
| 2832 |
language_dropdown.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
|
|
|
|
|
|
| 2833 |
clear_btn.click(clear_history, outputs=[history, history_output, file_input, website_url_input])
|
| 2834 |
clear_btn.click(hide_deploy_components, None, [space_name_input, sdk_dropdown, deploy_btn])
|
| 2835 |
# Reset space name and button text when clearing
|
|
@@ -2980,19 +3028,21 @@ with gr.Blocks(
|
|
| 2980 |
error_prefix = "Error duplicating Streamlit space" if not is_update else "Error updating Streamlit space"
|
| 2981 |
return gr.update(value=f"{error_prefix}: {e}", visible=True)
|
| 2982 |
# Transformers.js logic
|
| 2983 |
-
elif sdk_name == "Transformers.js"
|
| 2984 |
try:
|
| 2985 |
-
#
|
| 2986 |
-
|
| 2987 |
-
|
| 2988 |
-
|
| 2989 |
-
|
| 2990 |
-
|
| 2991 |
-
|
| 2992 |
-
|
| 2993 |
-
|
| 2994 |
-
|
| 2995 |
-
|
|
|
|
|
|
|
| 2996 |
# Parse the transformers.js output to get the three files
|
| 2997 |
files = parse_transformers_js_output(code)
|
| 2998 |
|
|
@@ -3078,9 +3128,22 @@ with gr.Blocks(
|
|
| 3078 |
except Exception as e:
|
| 3079 |
# Handle potential RepoUrl object errors
|
| 3080 |
error_msg = str(e)
|
| 3081 |
-
if "'url'" in error_msg or "RepoUrl" in error_msg:
|
| 3082 |
-
|
| 3083 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3084 |
# Svelte logic
|
| 3085 |
elif sdk_name == "Svelte" and not is_update:
|
| 3086 |
try:
|
|
|
|
| 711 |
'style.css': ''
|
| 712 |
}
|
| 713 |
|
| 714 |
+
# Multiple patterns to match the three code blocks with different variations
|
| 715 |
+
html_patterns = [
|
| 716 |
+
r'```html\s*\n([\s\S]+?)\n```',
|
| 717 |
+
r'```htm\s*\n([\s\S]+?)\n```',
|
| 718 |
+
r'```\s*(?:index\.html|html)\s*\n([\s\S]+?)\n```'
|
| 719 |
+
]
|
| 720 |
+
|
| 721 |
+
js_patterns = [
|
| 722 |
+
r'```javascript\s*\n([\s\S]+?)\n```',
|
| 723 |
+
r'```js\s*\n([\s\S]+?)\n```',
|
| 724 |
+
r'```\s*(?:index\.js|javascript)\s*\n([\s\S]+?)\n```'
|
| 725 |
+
]
|
| 726 |
+
|
| 727 |
+
css_patterns = [
|
| 728 |
+
r'```css\s*\n([\s\S]+?)\n```',
|
| 729 |
+
r'```\s*(?:style\.css|css)\s*\n([\s\S]+?)\n```'
|
| 730 |
+
]
|
| 731 |
|
| 732 |
# Extract HTML content
|
| 733 |
+
for pattern in html_patterns:
|
| 734 |
+
html_match = re.search(pattern, text, re.IGNORECASE)
|
| 735 |
+
if html_match:
|
| 736 |
+
files['index.html'] = html_match.group(1).strip()
|
| 737 |
+
break
|
| 738 |
|
| 739 |
# Extract JavaScript content
|
| 740 |
+
for pattern in js_patterns:
|
| 741 |
+
js_match = re.search(pattern, text, re.IGNORECASE)
|
| 742 |
+
if js_match:
|
| 743 |
+
files['index.js'] = js_match.group(1).strip()
|
| 744 |
+
break
|
| 745 |
|
| 746 |
# Extract CSS content
|
| 747 |
+
for pattern in css_patterns:
|
| 748 |
+
css_match = re.search(pattern, text, re.IGNORECASE)
|
| 749 |
+
if css_match:
|
| 750 |
+
files['style.css'] = css_match.group(1).strip()
|
| 751 |
+
break
|
| 752 |
|
| 753 |
# Fallback: support === index.html === format if any file is missing
|
| 754 |
if not (files['index.html'] and files['index.js'] and files['style.css']):
|
| 755 |
# Use regex to extract sections
|
| 756 |
+
html_fallback = re.search(r'===\s*index\.html\s*===\s*\n([\s\S]+?)(?=\n===|$)', text, re.IGNORECASE)
|
| 757 |
+
js_fallback = re.search(r'===\s*index\.js\s*===\s*\n([\s\S]+?)(?=\n===|$)', text, re.IGNORECASE)
|
| 758 |
+
css_fallback = re.search(r'===\s*style\.css\s*===\s*\n([\s\S]+?)(?=\n===|$)', text, re.IGNORECASE)
|
| 759 |
+
|
| 760 |
if html_fallback:
|
| 761 |
files['index.html'] = html_fallback.group(1).strip()
|
| 762 |
if js_fallback:
|
|
|
|
| 764 |
if css_fallback:
|
| 765 |
files['style.css'] = css_fallback.group(1).strip()
|
| 766 |
|
| 767 |
+
# Additional fallback: extract from numbered sections or file headers
|
| 768 |
+
if not (files['index.html'] and files['index.js'] and files['style.css']):
|
| 769 |
+
# Try patterns like "1. index.html:" or "**index.html**"
|
| 770 |
+
patterns = [
|
| 771 |
+
(r'(?:^\d+\.\s*|^##\s*|^\*\*\s*)index\.html(?:\s*:|\*\*:?)\s*\n([\s\S]+?)(?=\n(?:\d+\.|##|\*\*|===)|$)', 'index.html'),
|
| 772 |
+
(r'(?:^\d+\.\s*|^##\s*|^\*\*\s*)index\.js(?:\s*:|\*\*:?)\s*\n([\s\S]+?)(?=\n(?:\d+\.|##|\*\*|===)|$)', 'index.js'),
|
| 773 |
+
(r'(?:^\d+\.\s*|^##\s*|^\*\*\s*)style\.css(?:\s*:|\*\*:?)\s*\n([\s\S]+?)(?=\n(?:\d+\.|##|\*\*|===)|$)', 'style.css')
|
| 774 |
+
]
|
| 775 |
+
|
| 776 |
+
for pattern, file_key in patterns:
|
| 777 |
+
if not files[file_key]:
|
| 778 |
+
match = re.search(pattern, text, re.IGNORECASE | re.MULTILINE)
|
| 779 |
+
if match:
|
| 780 |
+
# Clean up the content by removing any code block markers
|
| 781 |
+
content = match.group(1).strip()
|
| 782 |
+
content = re.sub(r'^```\w*\s*\n', '', content)
|
| 783 |
+
content = re.sub(r'\n```\s*$', '', content)
|
| 784 |
+
files[file_key] = content.strip()
|
| 785 |
+
|
| 786 |
return files
|
| 787 |
|
| 788 |
def format_transformers_js_output(files):
|
|
|
|
| 2849 |
|
| 2850 |
def hide_deploy_components(*args):
|
| 2851 |
return [gr.Textbox(visible=False), gr.Dropdown(visible=False), gr.Button(visible=False)]
|
| 2852 |
+
|
| 2853 |
+
def update_deploy_button_text(space_name):
|
| 2854 |
+
"""Update deploy button text based on whether it's a new space or update"""
|
| 2855 |
+
if "/" in space_name.strip():
|
| 2856 |
+
return gr.update(value="π Update Space")
|
| 2857 |
+
else:
|
| 2858 |
+
return gr.update(value="π Deploy App")
|
| 2859 |
|
| 2860 |
# Load project button event
|
| 2861 |
load_project_btn.click(
|
|
|
|
| 2876 |
# Update preview when code or language changes
|
| 2877 |
code_output.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
| 2878 |
language_dropdown.change(preview_logic, inputs=[code_output, language_dropdown], outputs=sandbox)
|
| 2879 |
+
# Update deploy button text when space name changes
|
| 2880 |
+
space_name_input.change(update_deploy_button_text, inputs=[space_name_input], outputs=[deploy_btn])
|
| 2881 |
clear_btn.click(clear_history, outputs=[history, history_output, file_input, website_url_input])
|
| 2882 |
clear_btn.click(hide_deploy_components, None, [space_name_input, sdk_dropdown, deploy_btn])
|
| 2883 |
# Reset space name and button text when clearing
|
|
|
|
| 3028 |
error_prefix = "Error duplicating Streamlit space" if not is_update else "Error updating Streamlit space"
|
| 3029 |
return gr.update(value=f"{error_prefix}: {e}", visible=True)
|
| 3030 |
# Transformers.js logic
|
| 3031 |
+
elif sdk_name == "Transformers.js":
|
| 3032 |
try:
|
| 3033 |
+
# Only duplicate template space for new spaces, not updates
|
| 3034 |
+
if not is_update:
|
| 3035 |
+
# Use duplicate_space to create a transformers.js template space
|
| 3036 |
+
from huggingface_hub import duplicate_space
|
| 3037 |
+
|
| 3038 |
+
# Duplicate the transformers.js template space
|
| 3039 |
+
duplicated_repo = duplicate_space(
|
| 3040 |
+
from_id="static-templates/transformers.js",
|
| 3041 |
+
to_id=space_name.strip(),
|
| 3042 |
+
token=token.token,
|
| 3043 |
+
exist_ok=True
|
| 3044 |
+
)
|
| 3045 |
+
print("Duplicated repo result:", duplicated_repo, type(duplicated_repo))
|
| 3046 |
# Parse the transformers.js output to get the three files
|
| 3047 |
files = parse_transformers_js_output(code)
|
| 3048 |
|
|
|
|
| 3128 |
except Exception as e:
|
| 3129 |
# Handle potential RepoUrl object errors
|
| 3130 |
error_msg = str(e)
|
| 3131 |
+
if "'url'" in error_msg or "RepoUrl" in error_msg and not is_update:
|
| 3132 |
+
# Extract the URL from RepoUrl object if possible
|
| 3133 |
+
try:
|
| 3134 |
+
if 'duplicated_repo' in locals() and hasattr(duplicated_repo, 'url'):
|
| 3135 |
+
repo_url = duplicated_repo.url
|
| 3136 |
+
elif 'duplicated_repo' in locals() and hasattr(duplicated_repo, '_url'):
|
| 3137 |
+
repo_url = duplicated_repo._url
|
| 3138 |
+
else:
|
| 3139 |
+
repo_url = f"https://huggingface.co/spaces/{repo_id}"
|
| 3140 |
+
return gr.update(value=f"Error: Could not properly handle space creation response. Space may have been created successfully. Check: {repo_url}", visible=True)
|
| 3141 |
+
except:
|
| 3142 |
+
return gr.update(value=f"Error duplicating Transformers.js space: RepoUrl handling error. Please try again manually at https://huggingface.co/new-space", visible=True)
|
| 3143 |
+
|
| 3144 |
+
# General error handling for both creation and updates
|
| 3145 |
+
action_verb = "updating" if is_update else "duplicating"
|
| 3146 |
+
return gr.update(value=f"Error {action_verb} Transformers.js space: {error_msg}", visible=True)
|
| 3147 |
# Svelte logic
|
| 3148 |
elif sdk_name == "Svelte" and not is_update:
|
| 3149 |
try:
|