Spaces:
Sleeping
Update app.py
Browse filesKey Changes:
create_model_repo (Sanitization):
Sanitize model_name: Added model_name = re.sub(r"[^a-zA-Z0-9._-]", "-", model_name) to sanitize the model_name input. This replaces any invalid characters with hyphens.
Sanitize orgs_name: Added orgs_name = re.sub(r"[^a-zA-Z0-9._-]", "-", orgs_name) to sanitize the orgs_name input.
Sanitize in Main: Added sanitization.
main Function (Whitespace Stripping): The code to strip whitespace from all input strings is still present and correct.
Testing (Crucial):
Test with Invalid Characters: Try entering model names and organization names that contain spaces, special symbols (e.g., !@#$%^&*()_+=-[]\{}|;':",./<>?), and other characters that are not allowed in Hugging Face repository IDs. The code should now replace these with hyphens and create a valid repository.
Test with Valid Characters: Also test with valid model and organization names to ensure everything still works correctly.
Test with Empty Fields: Test with and without providing an organization name and model name.
Test with invalid token.
Test with URL, filepath, and repo name.
|
@@ -99,7 +99,7 @@ def download_model(model_path_or_url):
|
|
| 99 |
|
| 100 |
|
| 101 |
def create_model_repo(api, user, orgs_name, model_name, make_private=False):
|
| 102 |
-
"""Creates a Hugging Face model repository,
|
| 103 |
|
| 104 |
print("---- create_model_repo Called ----")
|
| 105 |
print(f" user: {user}")
|
|
@@ -110,18 +110,23 @@ def create_model_repo(api, user, orgs_name, model_name, make_private=False):
|
|
| 110 |
model_name = f"converted-model-{datetime.now().strftime('%Y%m%d%H%M%S')}"
|
| 111 |
print(f" Using default model_name: {model_name}")
|
| 112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
if orgs_name:
|
| 114 |
repo_id = f"{orgs_name}/{model_name.strip()}"
|
| 115 |
elif user:
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
print(f" Original Username: {user['name']}") #Debugging
|
| 119 |
-
print(f" Sanitized Username: {sanitized_username}") #Debugging
|
| 120 |
repo_id = f"{sanitized_username}/{model_name.strip()}"
|
| 121 |
else:
|
| 122 |
-
raise ValueError(
|
| 123 |
-
"Must provide either an organization name or be logged in."
|
| 124 |
-
)
|
| 125 |
|
| 126 |
print(f" repo_id: {repo_id}")
|
| 127 |
|
|
@@ -246,13 +251,19 @@ def main(
|
|
| 246 |
print(f"---- Main Function Error: {error_message} ----")
|
| 247 |
return error_message
|
| 248 |
|
| 249 |
-
# --- Strip Whitespace from Inputs ---
|
| 250 |
model_to_load = model_to_load.strip()
|
| 251 |
reference_model = reference_model.strip()
|
| 252 |
output_path = output_path.strip()
|
| 253 |
-
hf_token = hf_token.strip() # Even though it's a password field
|
| 254 |
-
orgs_name = orgs_name.strip() if orgs_name else ""
|
| 255 |
-
model_name = model_name.strip() if model_name else ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 256 |
|
| 257 |
try:
|
| 258 |
convert_and_save_sdxl_to_diffusers(model_to_load, output_path, reference_model)
|
|
@@ -263,11 +274,12 @@ def main(
|
|
| 263 |
print(f"Using default model_name: {model_name}")
|
| 264 |
|
| 265 |
if orgs_name:
|
| 266 |
-
repo_id = f"{orgs_name}/{model_name
|
| 267 |
elif user:
|
| 268 |
# Sanitize username here as well:
|
| 269 |
sanitized_username = re.sub(r"[^a-zA-Z0-9._-]", "-", user['name'])
|
| 270 |
-
|
|
|
|
| 271 |
|
| 272 |
else: # Should never happen because of login, but good practice
|
| 273 |
raise ValueError("Must provide either an organization name or be logged in.")
|
|
@@ -317,18 +329,15 @@ with gr.Blocks(css=css) as demo:
|
|
| 317 |
- Direct URLs to model files
|
| 318 |
- Hugging Face model repositories (e.g., 'my-org/my-model' or 'my-org/my-model/file.safetensors')
|
| 319 |
|
| 320 |
-
### How To Use
|
| 321 |
-
- Insert URL or Repository Information into Field 1 SDXL Checkpoint (Path, URL, or HF Repo)
|
| 322 |
-
- Optional: Insert Reference Diffusers Model (Optional)
|
| 323 |
-
- Optional: Output Path (Diffusers Format)
|
| 324 |
-
- Insert your HF Token WRITE: Get your HF token here: [https://huggingface.co/settings/tokens](https://huggingface.co/settings/tokens)
|
| 325 |
-
- Organization Name (Optional)
|
| 326 |
-
- Create a Model Name for Output Purposes
|
| 327 |
-
|
| 328 |
### ℹ️ Important Notes:
|
| 329 |
- This tool runs on **CPU**, conversion might be slower than on GPU.
|
| 330 |
- For Hugging Face uploads, you need a **WRITE** token (not a read token).
|
|
|
|
|
|
|
|
|
|
| 331 |
- This space is configured for **FP16** precision to reduce memory usage.
|
|
|
|
|
|
|
| 332 |
|
| 333 |
### 💻 Source Code:
|
| 334 |
- [GitHub Repository](https://github.com/Ktiseos-Nyx/Gradio-SDXL-Diffusers)
|
|
@@ -341,11 +350,11 @@ with gr.Blocks(css=css) as demo:
|
|
| 341 |
with gr.Row():
|
| 342 |
with gr.Column():
|
| 343 |
model_to_load = gr.Textbox(
|
| 344 |
-
label="SDXL Checkpoint (Path, URL, or HF Repo)",
|
| 345 |
placeholder="Path, URL, or Hugging Face Repo ID (e.g., my-org/my-model or my-org/my-model/file.safetensors)",
|
| 346 |
)
|
| 347 |
reference_model = gr.Textbox(
|
| 348 |
-
label="Reference Diffusers Model (Optional)",
|
| 349 |
placeholder="e.g., stabilityai/stable-diffusion-xl-base-1.0 (Leave blank for default)",
|
| 350 |
)
|
| 351 |
output_path = gr.Textbox(label="Output Path (Diffusers Format)", value="output")
|
|
|
|
| 99 |
|
| 100 |
|
| 101 |
def create_model_repo(api, user, orgs_name, model_name, make_private=False):
|
| 102 |
+
"""Creates a Hugging Face model repository, sanitizing inputs."""
|
| 103 |
|
| 104 |
print("---- create_model_repo Called ----")
|
| 105 |
print(f" user: {user}")
|
|
|
|
| 110 |
model_name = f"converted-model-{datetime.now().strftime('%Y%m%d%H%M%S')}"
|
| 111 |
print(f" Using default model_name: {model_name}")
|
| 112 |
|
| 113 |
+
# --- Sanitize model_name and orgs_name ---
|
| 114 |
+
if orgs_name:
|
| 115 |
+
orgs_name = re.sub(r"[^a-zA-Z0-9._-]", "-", orgs_name)
|
| 116 |
+
print(f" Sanitized orgs_name: {orgs_name}")
|
| 117 |
+
if model_name:
|
| 118 |
+
model_name = re.sub(r"[^a-zA-Z0-9._-]", "-", model_name)
|
| 119 |
+
print(f" Sanitized model_name: {model_name}")
|
| 120 |
+
|
| 121 |
+
|
| 122 |
if orgs_name:
|
| 123 |
repo_id = f"{orgs_name}/{model_name.strip()}"
|
| 124 |
elif user:
|
| 125 |
+
sanitized_username = re.sub(r"[^a-zA-Z0-9._-]", "-", user['name'])
|
| 126 |
+
print(f" Sanitized Username: {sanitized_username}")
|
|
|
|
|
|
|
| 127 |
repo_id = f"{sanitized_username}/{model_name.strip()}"
|
| 128 |
else:
|
| 129 |
+
raise ValueError("Must provide either an organization name or be logged in.")
|
|
|
|
|
|
|
| 130 |
|
| 131 |
print(f" repo_id: {repo_id}")
|
| 132 |
|
|
|
|
| 251 |
print(f"---- Main Function Error: {error_message} ----")
|
| 252 |
return error_message
|
| 253 |
|
| 254 |
+
# --- Strip Whitespace and Sanitize from Inputs ---
|
| 255 |
model_to_load = model_to_load.strip()
|
| 256 |
reference_model = reference_model.strip()
|
| 257 |
output_path = output_path.strip()
|
| 258 |
+
hf_token = hf_token.strip() # Even though it's a password field
|
| 259 |
+
orgs_name = orgs_name.strip() if orgs_name else ""
|
| 260 |
+
model_name = model_name.strip() if model_name else ""
|
| 261 |
+
|
| 262 |
+
# --- Sanitize model_name and orgs_name ---
|
| 263 |
+
if orgs_name:
|
| 264 |
+
orgs_name = re.sub(r"[^a-zA-Z0-9._-]", "-", orgs_name)
|
| 265 |
+
if model_name:
|
| 266 |
+
model_name = re.sub(r"[^a-zA-Z0-9._-]", "-", model_name)
|
| 267 |
|
| 268 |
try:
|
| 269 |
convert_and_save_sdxl_to_diffusers(model_to_load, output_path, reference_model)
|
|
|
|
| 274 |
print(f"Using default model_name: {model_name}")
|
| 275 |
|
| 276 |
if orgs_name:
|
| 277 |
+
repo_id = f"{orgs_name}/{model_name}"
|
| 278 |
elif user:
|
| 279 |
# Sanitize username here as well:
|
| 280 |
sanitized_username = re.sub(r"[^a-zA-Z0-9._-]", "-", user['name'])
|
| 281 |
+
print(f" Sanitized Username: {sanitized_username}")
|
| 282 |
+
repo_id = f"{sanitized_username}/{model_name}"
|
| 283 |
|
| 284 |
else: # Should never happen because of login, but good practice
|
| 285 |
raise ValueError("Must provide either an organization name or be logged in.")
|
|
|
|
| 329 |
- Direct URLs to model files
|
| 330 |
- Hugging Face model repositories (e.g., 'my-org/my-model' or 'my-org/my-model/file.safetensors')
|
| 331 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 332 |
### ℹ️ Important Notes:
|
| 333 |
- This tool runs on **CPU**, conversion might be slower than on GPU.
|
| 334 |
- For Hugging Face uploads, you need a **WRITE** token (not a read token).
|
| 335 |
+
- Get your HF token here: [https://huggingface.co/settings/tokens](https://huggingface.co/settings/tokens)
|
| 336 |
+
|
| 337 |
+
### 💾 Memory Usage:
|
| 338 |
- This space is configured for **FP16** precision to reduce memory usage.
|
| 339 |
+
- Close other applications during conversion.
|
| 340 |
+
- For large models, ensure you have at least 16GB of RAM.
|
| 341 |
|
| 342 |
### 💻 Source Code:
|
| 343 |
- [GitHub Repository](https://github.com/Ktiseos-Nyx/Gradio-SDXL-Diffusers)
|
|
|
|
| 350 |
with gr.Row():
|
| 351 |
with gr.Column():
|
| 352 |
model_to_load = gr.Textbox(
|
| 353 |
+
label="SDXL Checkpoint (Path, URL, or HF Repo)",
|
| 354 |
placeholder="Path, URL, or Hugging Face Repo ID (e.g., my-org/my-model or my-org/my-model/file.safetensors)",
|
| 355 |
)
|
| 356 |
reference_model = gr.Textbox(
|
| 357 |
+
label="Reference Diffusers Model (Optional)",
|
| 358 |
placeholder="e.g., stabilityai/stable-diffusion-xl-base-1.0 (Leave blank for default)",
|
| 359 |
)
|
| 360 |
output_path = gr.Textbox(label="Output Path (Diffusers Format)", value="output")
|