import gradio as gr from huggingface_hub import create_repo, list_models def show_profile(profile: gr.OAuthProfile | None) -> str: """Update login status.""" if profile is None: return "*Not logged in.*" return f"✅ Logged in as **{profile.username}**" def list_private_models( profile: gr.OAuthProfile | None, oauth_token: gr.OAuthToken | None ) -> str: """Demo: list user’s private/public models.""" if profile is None or oauth_token is None: return "Please log in to see your models." models = [ f"{model.id} ({'private' if model.private else 'public'})" for model in list_models(author=profile.username, token=oauth_token.token) ] return "No models found." if not models \ else "Models:\n\n" + "\n - ".join(models) def create_space( repo_name: str, sdk: str, profile: gr.OAuthProfile | None, oauth_token: gr.OAuthToken | None ) -> tuple[str, str, str]: """ Create (or get) a Hugging Face Space with the chosen SDK template, returning (repo_id, logs, iframe). """ if profile is None or oauth_token is None: return "", "⚠️ Please log in first.", "
No Space created yet.
" repo_id = f"{profile.username}/{repo_name}" create_repo( repo_id=repo_id, token=oauth_token.token, exist_ok=True, repo_type="space", space_sdk=sdk ) url = f"https://huggingface.co/spaces/{repo_id}" logmsg = f"✅ Space ready: {url} (SDK: {sdk})" iframe = f'' return repo_id, logmsg, iframe with gr.Blocks(title="HF OAuth + Space Creator") as demo: gr.Markdown( "## Sign in with Hugging Face + Create a Space\n\n" "1. Click **Sign in**.\n" "2. Pick a template, enter a name, and **Create Space**.\n\n" "---" ) # — Login UI — login_btn = gr.LoginButton(variant="huggingface", size="lg") status_md = gr.Markdown("*Not logged in.*") models_md = gr.Markdown() demo.load(show_profile, inputs=None, outputs=status_md) login_btn.click(show_profile, inputs=None, outputs=status_md) demo.load(list_private_models, inputs=None, outputs=models_md) login_btn.click(list_private_models,inputs=None, outputs=models_md) # — Create Space UI — repo_name = gr.Textbox(label="New Space name", placeholder="my-space-name") sdk_selector = gr.Radio( choices=["gradio", "streamlit"], value="gradio", label="Space template (SDK)" ) create_btn = gr.Button("Create Space", interactive=False) session_id = gr.Textbox(visible=False) logs = gr.Textbox(label="Logs", interactive=False, lines=3) preview_iframe = gr.HTML("No Space created yet.
") def enable_create(profile: gr.OAuthProfile | None): return gr.update(interactive=profile is not None) demo.load(enable_create, inputs=None, outputs=create_btn) login_btn.click(enable_create, inputs=None, outputs=create_btn) create_btn.click( fn=create_space, inputs=[repo_name, sdk_selector], outputs=[session_id, logs, preview_iframe] ) if __name__ == "__main__": demo.launch()