Github-Transfer / app.py
openfree's picture
Update app.py
fe395b2 verified
raw
history blame
9.11 kB
import gradio as gr
import os
import sys
from pathlib import Path
# repo_to_space_auto ๋ชจ๋“ˆ ๋™์  ์ž„ํฌํŠธ
sys.path.insert(0, str(Path(__file__).parent))
from repo_to_space_auto import deploy
# OAuth ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
OAUTH_ENABLED = os.getenv("OAUTH_CLIENT_ID") is not None
def launch_deploy_oauth(repo_url, private, profile: gr.OAuthProfile | None):
"""OAuth ์ธ์ฆ ๋ฒ„์ „"""
if not profile:
return """### โŒ ๋กœ๊ทธ์ธ ํ•„์š”
์ƒ๋‹จ์˜ 'Sign in with Hugging Face' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”."""
hf_token = profile.token
# ํ† ํฐ ์ •๋ฆฌ (OAuth์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ)
if hf_token:
hf_token = hf_token.strip()
return _deploy_space(repo_url, hf_token, private)
def launch_deploy_manual(repo_url, hf_token, private):
"""์ˆ˜๋™ ํ† ํฐ ์ž…๋ ฅ ๋ฒ„์ „"""
if not hf_token:
return """### โŒ ํ† ํฐ ํ•„์š”
Hugging Face Write ํ† ํฐ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."""
# ํ† ํฐ ์ •๋ฆฌ (๊ณต๋ฐฑ, ์ค„๋ฐ”๊ฟˆ ์ œ๊ฑฐ)
hf_token = hf_token.strip()
# ํ† ํฐ ํ˜•์‹ ๊ฒ€์ฆ
if not hf_token.startswith("hf_"):
return """### โŒ ์ž˜๋ชป๋œ ํ† ํฐ ํ˜•์‹
ํ† ํฐ์€ 'hf_'๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://huggingface.co/settings/tokens ์—์„œ Write ๊ถŒํ•œ ํ† ํฐ์„ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”."""
return _deploy_space(repo_url, hf_token, private)
def _deploy_space(repo_url, hf_token, private):
"""๊ณตํ†ต ๋ฐฐํฌ ๋กœ์ง"""
# URL ์ •๋ฆฌ
repo_url = repo_url.strip()
# URL ๊ฒ€์ฆ
if not repo_url.startswith(("https://github.com/", "http://github.com/", "git@github.com:")):
return """### โŒ ์ž˜๋ชป๋œ Repository URL
GitHub URL ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ˆ์‹œ: https://github.com/username/repository"""
# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋Œ€์‹  ์ง์ ‘ ํ† ํฐ ์ „๋‹ฌ
try:
link = deploy(repo_url, hf_token, private=private)
return f"""### โœ… Space ์ƒ์„ฑ ์™„๋ฃŒ
๐ŸŽ‰ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
**Space URL:** [{link}]({link})
---
*๋ฐฐํฌ๋œ Space๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”.*"""
except Exception as e:
error_msg = str(e)
# ํŠน์ • ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ƒ์„ธ ์•ˆ๋‚ด
if "BAPI_TOKEN" in error_msg:
return """### โŒ Brave Search API ํ† ํฐ ํ•„์š”
Space Settings > Variables and secrets์—์„œ `BAPI_TOKEN`์„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.
[Brave Search API](https://brave.com/search/api/) ์—์„œ ๋ฌด๋ฃŒ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."""
elif "FRIENDLI_TOKEN" in error_msg:
return """### โŒ Friendli AI ํ† ํฐ ํ•„์š”
Space Settings > Variables and secrets์—์„œ `FRIENDLI_TOKEN`์„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.
[Friendli AI](https://friendli.ai/) ์—์„œ API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."""
elif "Invalid header value" in error_msg:
return """### โŒ ํ† ํฐ ์˜ค๋ฅ˜
ํ† ํฐ์— ์ž˜๋ชป๋œ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ† ํฐ์„ ๋‹ค์‹œ ๋ณต์‚ฌํ•˜์—ฌ ๊ณต๋ฐฑ์ด๋‚˜ ์ค„๋ฐ”๊ฟˆ ์—†์ด ๋ถ™์—ฌ๋„ฃ์–ด์ฃผ์„ธ์š”."""
elif "401" in error_msg or "403" in error_msg:
return """### โŒ ์ธ์ฆ ์‹คํŒจ
ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ Write ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.
https://huggingface.co/settings/tokens ์—์„œ Write ๊ถŒํ•œ์ด ์žˆ๋Š” ํ† ํฐ์ธ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."""
else:
return f"""### โŒ ๋ฐฐํฌ ์˜ค๋ฅ˜
์˜ค๋ฅ˜ ๋‚ด์šฉ: `{error_msg}`
**๊ฐ€๋Šฅํ•œ ์›์ธ:**
- ์ž˜๋ชป๋œ Repository URL
- ๊ถŒํ•œ ๋ถ€์กฑ (write ๊ถŒํ•œ ํ•„์š”)
- ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ"""
# Gradio ์•ฑ ๊ตฌ์„ฑ
with gr.Blocks(
title="HF Space Auto-Deployer",
theme=gr.themes.Soft(),
css="""
.main-container { max-width: 800px; margin: 0 auto; }
.gr-button-primary { background-color: #2563eb !important; }
.status-box { padding: 20px; border-radius: 8px; margin-top: 20px; }
"""
) as demo:
gr.Markdown("""
# ๐Ÿš€ Git Repository โ†’ Hugging Face Space ์ž๋™ ๋ฐฐํฌ
๊ณต๊ฐœ Git ์ €์žฅ์†Œ๋ฅผ Hugging Face Gradio Space๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
## ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
1. **์ธ์ฆ**: OAuth ๋กœ๊ทธ์ธ ๋˜๋Š” ํ† ํฐ ์ž…๋ ฅ
2. **Repository URL ์ž…๋ ฅ**
3. **Deploy ๋ฒ„ํŠผ ํด๋ฆญ**
---
""")
with gr.Column(elem_classes="main-container"):
if OAUTH_ENABLED:
# OAuth ๋ฒ„์ „
gr.LoginButton(
value="Sign in with Hugging Face ๐Ÿค—",
variant="primary",
size="lg"
)
gr.Markdown("### ๐Ÿ“ ๋ฐฐํฌ ์„ค์ •")
repo_input = gr.Textbox(
label="Git Repository URL",
placeholder="https://github.com/username/repository",
info="๊ณต๊ฐœ ์ €์žฅ์†Œ URL์„ ์ž…๋ ฅํ•˜์„ธ์š”"
)
private_checkbox = gr.Checkbox(
label="๐Ÿ”’ Private Space๋กœ ์ƒ์„ฑ",
value=False,
info="์ฒดํฌํ•˜๋ฉด ๋น„๊ณต๊ฐœ Space๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค"
)
deploy_btn = gr.Button(
"๐Ÿš€ Deploy to Space",
variant="primary",
size="lg"
)
output_status = gr.Markdown(
elem_classes="status-box",
visible=False
)
# OAuth ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
deploy_btn.click(
fn=launch_deploy_oauth,
inputs=[repo_input, private_checkbox],
outputs=output_status
).then(
fn=lambda: gr.update(visible=True),
outputs=output_status
)
else:
# ์ˆ˜๋™ ํ† ํฐ ์ž…๋ ฅ ๋ฒ„์ „
gr.Markdown("""
### ๐Ÿ” ์ธ์ฆ ์ •๋ณด
> **์ฐธ๊ณ **: OAuth๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ Space์ž…๋‹ˆ๋‹ค.
> Space ์„ค์ •์—์„œ `hf_oauth: true`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
""")
token_input = gr.Textbox(
label="Hugging Face Write Token",
type="password",
placeholder="hf_xxxxxxxxxxxxxxxxxxxxx",
info="https://huggingface.co/settings/tokens ์—์„œ Write ๊ถŒํ•œ ํ† ํฐ ์ƒ์„ฑ"
)
gr.Markdown("### ๐Ÿ“ ๋ฐฐํฌ ์„ค์ •")
repo_input = gr.Textbox(
label="Git Repository URL",
placeholder="https://github.com/username/repository",
info="๊ณต๊ฐœ ์ €์žฅ์†Œ URL์„ ์ž…๋ ฅํ•˜์„ธ์š”"
)
private_checkbox = gr.Checkbox(
label="๐Ÿ”’ Private Space๋กœ ์ƒ์„ฑ",
value=False,
info="์ฒดํฌํ•˜๋ฉด ๋น„๊ณต๊ฐœ Space๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค"
)
deploy_btn = gr.Button(
"๐Ÿš€ Deploy to Space",
variant="primary",
size="lg"
)
output_status = gr.Markdown(
elem_classes="status-box",
visible=False
)
# ์ˆ˜๋™ ์ž…๋ ฅ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
deploy_btn.click(
fn=launch_deploy_manual,
inputs=[repo_input, token_input, private_checkbox],
outputs=output_status
).then(
fn=lambda: gr.update(visible=True),
outputs=output_status
)
# ๊ณตํ†ต ์˜ˆ์‹œ ๋ฐ ๋„์›€๋ง
gr.Markdown("""
### ๐Ÿ’ก ์˜ˆ์‹œ
- `https://github.com/gradio-app/gradio`
- `https://github.com/huggingface/transformers`
### โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ
- **ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ•„์š”**: `BAPI_TOKEN` (Brave Search API), `FRIENDLI_TOKEN` (Friendli AI)
- Space ์ด๋ฆ„์€ repository ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค
- GPU๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Space ์ƒ์„ฑ ํ›„ ์ˆ˜๋™ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
""")
if __name__ == "__main__":
# ์‹œ์ž‘ ์‹œ ํ™˜๊ฒฝ ์ฒดํฌ
print("\n" + "="*50)
print("๐Ÿš€ HF Space Auto-Deployer ์‹œ์ž‘")
print("="*50)
# ํ•„์ˆ˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฒดํฌ
missing_vars = []
if not os.getenv("BAPI_TOKEN"):
missing_vars.append("BAPI_TOKEN (Brave Search API)")
if not os.getenv("FRIENDLI_TOKEN"):
missing_vars.append("FRIENDLI_TOKEN (Friendli AI)")
if missing_vars:
print("\nโš ๏ธ ๋‹ค์Œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค:")
for var in missing_vars:
print(f" - {var}")
print("\nSpace Settings > Variables and secrets์—์„œ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.")
else:
print("โœ… ๋ชจ๋“  ํ•„์ˆ˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
# OAuth ์ƒํƒœ ํ™•์ธ
if OAUTH_ENABLED:
print("โœ… OAuth๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
else:
print("โ„น๏ธ OAuth๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์ˆ˜๋™ ํ† ํฐ ์ž…๋ ฅ ๋ชจ๋“œ)")
print("="*50 + "\n")
demo.launch(
ssr_mode=False, # SSR ๋น„ํ™œ์„ฑํ™”๋กœ ๊ฒฝ๊ณ  ์ œ๊ฑฐ
show_error=True,
quiet=True # Gradio ๊ธฐ๋ณธ ์ถœ๋ ฅ ์ตœ์†Œํ™”
)