Spaces:
Sleeping
Sleeping
import gradio as gr | |
import requests | |
from huggingface_hub import create_repo, list_models, upload_file | |
# β USER INFO & MODEL LISTING β | |
def show_profile(profile: gr.OAuthProfile | None) -> str: | |
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: | |
if profile is None or oauth_token is None: | |
return "Please log in to see your models." | |
models = [ | |
f"{m.id} ({'private' if m.private else 'public'})" | |
for m in list_models(author=profile.username, token=oauth_token.token) | |
] | |
return "No models found." if not models else "Models:\n\n" + "\n - ".join(models) | |
# β BUTTONβENABLING HELPERS β | |
def enable_create( | |
profile: gr.OAuthProfile | None, | |
oauth_token: gr.OAuthToken | None | |
): | |
"""Enable Create Space once logged in.""" | |
return gr.update(interactive=profile is not None) | |
def enable_repo_actions( | |
repo_id: str, | |
profile: gr.OAuthProfile | None, | |
oauth_token: gr.OAuthToken | None | |
): | |
"""Enable Upload & Get Logs once space exists and logged in.""" | |
return gr.update(interactive=bool(repo_id and profile and oauth_token)) | |
# β CORE ACTIONS β | |
def create_space( | |
repo_name: str, | |
sdk: str, | |
profile: gr.OAuthProfile | None, | |
oauth_token: gr.OAuthToken | None | |
) -> tuple[str, str, str]: | |
if profile is None or oauth_token is None: | |
return "", "β οΈ Please log in first.", "<p>No Space created yet.</p>" | |
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'<iframe src="{url}" width="100%" height="500px"></iframe>' | |
return repo_id, logmsg, iframe | |
def upload_file_to_space( | |
file, # Gradio passes a Python tempfile-like object | |
path_in_repo: str, | |
repo_id: str, | |
profile: gr.OAuthProfile | None, | |
oauth_token: gr.OAuthToken | None | |
) -> str: | |
if profile is None or oauth_token is None: | |
return "β οΈ Please log in first." | |
if not repo_id: | |
return "β οΈ Please create a Space first." | |
if file is None: | |
return "β οΈ No file selected." | |
upload_file( | |
path_or_fileobj=file.name, | |
path_in_repo=path_in_repo, | |
repo_id=repo_id, | |
token=oauth_token.token, | |
repo_type="space" | |
) | |
return f"β Uploaded `{path_in_repo}` to `{repo_id}`" | |
def get_space_logs( | |
repo_id: str, | |
profile: gr.OAuthProfile | None, | |
oauth_token: gr.OAuthToken | None | |
) -> str: | |
if profile is None or oauth_token is None or not repo_id: | |
return "β οΈ Please log in and create a Space first." | |
endpoint = f"https://huggingface.co/api/spaces/{repo_id}/logs" | |
headers = {"Authorization": f"Bearer {oauth_token.token}"} | |
resp = requests.get(endpoint, headers=headers) | |
if resp.status_code != 200: | |
return f"β Failed to fetch logs ({resp.status_code})" | |
entries = resp.json() | |
return "\n".join(e.get("text","") for e in entries) | |
# β BUILD THE UI β | |
with gr.Blocks(title="HF OAuth + Space Manager") as demo: | |
gr.Markdown( | |
"## Sign in with Hugging Face + Manage Your Space\n\n" | |
"1. Sign in\n" | |
"2. Create a Space (Gradio/Streamlit)\n" | |
"3. Upload files to it\n" | |
"4. Fetch its logs\n\n" | |
"---" | |
) | |
# β LOGIN & MODEL LIST β | |
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 β | |
repo_name = gr.Textbox(label="New Space name", placeholder="my-space") | |
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) | |
create_logs = gr.Textbox(label="Create Logs", interactive=False, lines=3) | |
preview = gr.HTML("<p>No Space created yet.</p>") | |
# enable create_btn after login | |
demo.load(enable_create, inputs=[login_btn], outputs=[create_btn]) | |
login_btn.click(enable_create, inputs=[login_btn], outputs=[create_btn]) | |
create_btn.click( | |
fn=create_space, | |
inputs=[repo_name, sdk_selector, login_btn], | |
outputs=[session_id, create_logs, preview] | |
) | |
# β UPLOAD FILES β | |
path_in_repo = gr.Textbox(label="Path in Space", value="app.py") | |
file_uploader = gr.File(label="Select file") | |
upload_btn = gr.Button("Upload File", interactive=False) | |
upload_logs = gr.Textbox(label="Upload Logs", interactive=False, lines=2) | |
# enable upload_btn after space exists & login | |
demo.load(enable_repo_actions, | |
inputs=[session_id, login_btn], | |
outputs=[upload_btn]) | |
login_btn.click(enable_repo_actions, | |
inputs=[session_id, login_btn], | |
outputs=[upload_btn]) | |
session_id.change(enable_repo_actions, | |
inputs=[session_id, login_btn], | |
outputs=[upload_btn]) | |
upload_btn.click( | |
fn=upload_file_to_space, | |
inputs=[file_uploader, path_in_repo, session_id, login_btn], | |
outputs=[upload_logs] | |
) | |
# β FETCH SPACE LOGS β | |
logs_btn = gr.Button("Get Space Logs", interactive=False) | |
space_logs_md = gr.Textbox(label="Space Logs", interactive=False, lines=10) | |
demo.load(enable_repo_actions, | |
inputs=[session_id, login_btn], | |
outputs=[logs_btn]) | |
login_btn.click(enable_repo_actions, | |
inputs=[session_id, login_btn], | |
outputs=[logs_btn]) | |
session_id.change(enable_repo_actions, | |
inputs=[session_id, login_btn], | |
outputs=[logs_btn]) | |
logs_btn.click( | |
fn=get_space_logs, | |
inputs=[session_id, login_btn], | |
outputs=[space_logs_md] | |
) | |
if __name__ == "__main__": | |
demo.launch() | |