Gradio 영상 생성 앱: Sume API 키는 Space 시크릿에

Sume API로 Gradio 영상 생성 앱을 만드세요. 키는 Hugging Face Space 시크릿에 두고, 제너레이터가 Job을 폴링하고, gr.Video가 영상을 재생합니다.

읽는 시간 5분Sume
전체 글

Sume API로 Gradio 영상 생성 앱을 만들려면 키를 환경 변수(호스팅한 뒤에는 Hugging Face Space 시크릿)에서 읽고, 프롬프트를 https://api.sume.com/v1/videos로 POST한 뒤 폴링하는 동안 Job 상태를 yield하는 제너레이터를 작성하세요. 그다음 MP4를 임시 파일로 내려받아 그 경로를 gr.Video 출력으로 반환하세요.

Sume에는 Gradio용 패키지나 플러그인이 없습니다. 앱이 Requests로 일반 HTTPS 호출을 보냅니다. Sume 관련 내용은 영상 생성 (영문), Job과 결과 (영문), 인증에서, Gradio와 Hugging Face 관련 내용은 Gradio의 빠른 시작, 큐잉, 출력 스트리밍, 공유, 파일 접근 가이드와 Hugging Face의 Spaces 개요에서 가져왔으며, 모두 2026-09-27에 확인했습니다. 제출, 폴링, 다운로드 루프는 Python Text-to-Video API에서 단계별로 설명합니다.

Gradio 앱은 어떻게 생겼나요?

제너레이터 함수 하나와 Blocks 레이아웃으로 이루어지며, Python 3.10 이상에서 pip install --upgrade gradio로 설치해 씁니다. Gradio는 제너레이터를 일반 함수와 똑같이 받아들이고, 제너레이터가 yield하는 값을 차례로 보여 주므로, Job이 실행되는 동안 상태 상자가 바뀝니다.

함수가 MP4를 내려받는 이유는 gr.Video가 파일 경로를 표시하고, unsigned_urls의 항목은 문서가 키와 함께 호출하는 API 경로이기 때문입니다.

import os, tempfile, time, requests
import gradio as gr

AUTH = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}

def make_video(prompt):
    r = requests.post("https://api.sume.com/v1/videos", headers=AUTH, timeout=30,
                      json={"model": "sume/auto", "prompt": prompt})
    r.raise_for_status()
    job, deadline = r.json(), time.monotonic() + 20 * 60
    while job["status"] not in ("completed", "failed", "cancelled") and time.monotonic() < deadline:
        yield f"{job['id']}: {job['status']}", None
        time.sleep(30)
        job = requests.get(job["polling_url"], headers=AUTH, timeout=30).json()
    if job["status"] != "completed":
        yield f"{job['id']}: {job['status']} {job.get('error', '')}", None
        return
    path = os.path.join(tempfile.mkdtemp(), "video.mp4")
    with open(path, "wb") as f:
        f.write(requests.get(job["unsigned_urls"][0], headers=AUTH, timeout=300).content)
    yield f"{job['id']}: completed", path
with gr.Blocks() as demo:
    prompt, status, video = gr.Textbox(label="Prompt"), gr.Textbox(label="Status"), gr.Video()
    gr.Button("Generate").click(make_video, prompt, [status, video], concurrency_limit=4)
demo.launch()

Sume API 키는 어디에 두나요?

서버 환경에 두고, 페이지에는 절대 두지 않습니다. Gradio 문서는 공유 링크를 쓰면 사람들이 브라우저에서 앱을 쓰는 동안에도 모든 연산이 여러분의 컴퓨터에서 계속 실행된다고 짚으며, Sume 문서는 API 키를 신뢰할 수 있는 서버에 두고 프론트엔드 JavaScript에는 넣지 말라고 합니다.

  • Hugging Face Spaces에서는 Space 설정에 SUME_API_KEY를 시크릿으로 추가하세요. 시크릿은 비공개이고, 한 번 설정하면 설정 페이지에서 다시 읽을 수 없으며, 여러분의 Space를 복제한 Space에는 추가되지 않습니다. 반면 Variables는 공개되며 복제할 때 함께 복사됩니다.
  • 둘 다 환경 변수로 Gradio 앱에 전달되므로, 같은 os.environ 조회가 Space에서도, 키를 export한 로컬 머신에서도 동작합니다.
  • 키를 하드코딩하지 마세요. Hugging Face는 Secrets Scanner가 하드코딩된 시크릿을 찾으면 Space 소유자에게 경고하며, 로그나 채팅 기록에 노출된 키는 교체해야 합니다.

앱을 통해 누가 Sume 크레딧을 쓸 수 있나요?

앱에 접근할 수 있는 사람이라면 누구나 쓸 수 있습니다. 클릭할 때마다 여러분의 키로 유료 Job이 제출됩니다. Sume 문서는 요청을 전달하기 전에 사용자 입력을 검증하고 자체 인가를 적용하라고 합니다.

  • 공개(public) Space는 누구나 소스를 보고 실행 중인 앱을 쓸 수 있습니다. 보호(protected) Space는 코드를 숨기지만 앱은 여전히 공개되며, 비공개(private) Space는 소유자와 협업자에게만 열립니다.
  • 공유 링크는 누구나 접근할 수 있으며 1주 후에 만료됩니다.
  • demo.launch(auth=(username, password))는 앱 앞에 로그인을 둡니다. Gradio는 이를 요청 한도 제한이 없는 기본 수준의 접근 제어라고 설명하며, gr.LoginButton만으로는 아무도 제한하지 못합니다.
  • 각 이벤트는 기본적으로 함수 이름을 딴 API 엔드포인트이기도 하므로, 버튼이 유일한 진입로가 아닙니다. Gradio는 공개 앱에 IP 주소나 Hugging Face 사용자 이름별 요청 한도를 두라고 제안합니다.
  • 완성된 MP4는 Gradio 캐시에 들어가며, 캐시의 모든 파일은 실행 중인 앱의 모든 사용자가 URL로 접근할 수 있습니다.

긴 영상 Job에는 어떤 Gradio 설정이 중요한가요?

영상 생성은 보통 30초에서 몇 분이 걸리며, 문서는 약 30초마다 폴링하라고 제안합니다. 코드의 20분 마감은 대기를 끝낼 뿐 Job을 끝내지 않습니다. 클라이언트 쪽 마감은 Job을 취소하지 않으며, Job은 계속 실행되고 계속 청구됩니다. 그래서 나중에 이어서 확인할 수 있도록 상태 줄에 Job id를 보여 줍니다. Sume Job이 한 번에 몇 개까지 실행되는지는 Sume 영상 Job 동시성과 큐에서 다룹니다.

사용자가 느끼는 대기는 Gradio 설정 세 가지가 좌우합니다.

Gradio Button, Video, 파일 접근 문서와 Sume 영상 생성 (영문) 기준, 2026-09-27 확인.
설정Gradio 문서Sume 앱에서는
.click()의 concurrency_limit기본값: 이벤트당 한 번에 1개값을 올려 한 사용자의 긴 Job 때문에 다른 모든 사용자가 줄 서지 않게 하세요. Sume는 워크스페이스별 Job 한도를 따로 적용합니다.
gr.Video 출력str 또는 Path 파일 경로를 받음임시 디렉터리에 내려받은 MP4의 경로를 반환하세요. Gradio가 이 파일을 캐시로 옮깁니다.
launch()의 share기본값: False돈이 드는 앱이라면 꺼 두고, 대신 시크릿을 둔 Space에서 호스팅하세요.

출처

관련 글

연동 카테고리의 다른 글

연동 글 전체 보기

작성자 Sume