#!/usr/bin/env python from __future__ import annotations import shutil import tempfile import gradio as gr from huggingface_hub import HfApi title = 'Model Demo Creation' description = 'This is a Space that creates demo apps for models in Model Hub.' article = '' examples = [ [ '', 'google/vit-base-patch16-224', '', 'Demo for google/vit-base-patch16-224', '', '', ], [ '', 'google/vit-base-patch16-224, microsoft/resnet-50', '', 'Compare Image Classification Models', '', '', ], [ '', 'EleutherAI/gpt-j-6B, EleutherAI/gpt-neo-1.3B', '', 'Compare Text Generation Models', '', '', ], ] api = HfApi() def check_if_model_exists(model_name: str) -> bool: return any(info.modelId == model_name for info in api.list_models(search=model_name)) def list_missing_models(model_names: list[str]) -> list[str]: missing_models = [] for model_name in model_names: if not check_if_model_exists(model_name): missing_models.append(model_name) return missing_models def save_space_info(dirname: str, filename: str, content: str) -> None: with open(f'{dirname}/{filename}', 'w') as f: f.write(content) def run(space_name: str, model_names_str: str, hf_token: str, title: str, description: str, article: str) -> str: model_names = [name.strip() for name in model_names_str.split(',')] model_names_str = '\n'.join(model_names) if len(model_names) == 0: return 'Model Name cannot be empty.' missing_models = list_missing_models(model_names) if len(missing_models) > 0: message = 'The following model were not found: ' for model_name in missing_models: message += f'\n{model_name}' return message try: space_url = api.create_repo(repo_id=space_name, repo_type='space', private=True, token=hf_token, space_sdk='gradio') except Exception as e: return str(e) with tempfile.TemporaryDirectory() as temp_dir: shutil.copy('assets/template.py', f'{temp_dir}/app.py') save_space_info(temp_dir, 'TITLE', title) save_space_info(temp_dir, 'DESCRIPTION', description) save_space_info(temp_dir, 'ARTICLE', article) save_space_info(temp_dir, 'MODEL_NAMES', model_names_str) api.upload_folder(repo_id=space_name, folder_path=temp_dir, path_in_repo='.', token=hf_token, repo_type='space') return f'Successfully created: {space_url}' gr.Interface( fn=run, inputs=[ gr.Textbox(label='Space Name', placeholder='/'), gr.Textbox(label='Model Names', placeholder='e.g. microsoft/resnet-50'), gr.Textbox( label='Hugging Face Token', placeholder= 'This should be a token with write permission. See: https://huggingface.co/settings/tokens' ), gr.Textbox(label='Title (Optional)'), gr.Textbox(label='Description (Optional)'), gr.Textbox(label='Article (Optional)'), ], outputs=gr.Textbox(label='Output'), title=title, description=description, article=article, examples=examples, cache_examples=False, ).launch(enable_queue=True, share=False)