Webhooks 서버
Webhooks는 MLOps 관련 기능의 기반입니다. 특정 저장소 또는 관심 있는 사용자/조직에 속한 모든 저장소에서 새로운 변경 사항을 수신할 수 있습니다. Huggingface Hub의 Webhooks에 대해 자세히 알아보려면 Webhooks 가이드를 읽어보십시오.
웹훅 서버를 설정하고 Space로 배포하는 단계별 튜토리얼을 위한 가이드를 확인해 보세요.
이것은 실험적 기능입니다. 이는 API를 개선하기 위해 작업이 진행 중임을 의미합니다. 사전 통보 없이 향후 호환성이 깨지는 변경 사항이 도입될 수 있습니다.
huggingface_hub의 버전을 요구 사항에 고정하도록 하십시오. 실험적 기능을 사용할 때 경고가 발생합니다. 환경 변수로HF_HUB_DISABLE_EXPERIMENTAL_WARNING=1을 설정하여 이를 비활성화할 수 있습니다.
서버
서버는 Gradio 앱입니다. 사용자에게 지침을 표시하는 UI와 웹훅을 수신하는 API를 제공합니다. 웹훅 엔드포인트 구현은 함수를 데코레이터로 장식하는 것만큼 간단합니다. Space에 배포하기 전에 Gradio 터널을 사용하여 웹훅을 로컬 머신으로 리디렉션하여 디버깅할 수 있습니다.
WebhooksServer
huggingface_hub.WebhooksServer
< source >( *args**kwargs )
매개변수
- ui (
gradio.Blocks, 선택 사항) — Space 랜딩 페이지로 사용할 Gradio UI 인스턴스입니다.None인 경우, 구성된 웹훅에 대한 지침을 표시하는 UI가 생성됩니다. - webhook_secret (
str, 선택 사항) — 수신된 webhook 요청을 검증하는 비밀 키입니다. webhooks 설정 패널에도 동일한 값을 구성하는 한, 원하는 어떤 비밀 값으로도 이 값을 설정할 수 있습니다. 또한 이 값을WEBHOOK_SECRET환경 변수로 설정할 수도 있습니다. 비밀 값이 제공되지 않으면 보안 없이 webhook 엔드포인트가 열립니다.
WebhooksServer() 클래스를 사용하면 Huggingface 웹훅을 수신할 수 있는 Gradio 앱 인스턴스를 생성할 수 있습니다.
이 웹훅은 add_webhook() 데코레이터를 사용하여 등록할 수 있습니다. 웹훅 엔드포인트는 FastAPI 라우터에 POST 엔드포인트로 추가됩니다. 모든 웹훅이 등록되면 앱을 시작하려면 launch 메서드를 호출해야 합니다.
Webhook 함수의 첫 번째 인수로 WebhookPayload를 받는 것을 권장합니다. 이는 Webhook 이벤트에 대한 모든 정보를 포함하는 Pydantic 모델입니다. 데이터는 자동으로 파싱됩니다.
WebhooksServer를 설정하고 Space에 배포하는 단계별 튜토리얼은 webhooks 가이드를 참고하세요.
WebhooksServer는 실험적 기능입니다. 향후 API가 변경될 수 있습니다.
WebhooksServer를 사용하려면gradio가 설치되어 있어야 합니다(pip install --upgrade gradio).
@webhook_endpoint
huggingface_hub.webhook_endpoint
< source >( path: str | None = None )
WebhooksServer()를 시작하고 장식된 함수를 웹훅 엔드포인트로 등록하는 데코레이터입니다.
빠른 시작을 위한 헬퍼입니다. 더 많은 유연성(커스텀 랜딩 페이지 또는 웹훅 시크릿)이 필요하면 WebhooksServer()를 직접 사용할 수 있습니다. 이 데코레이터를 여러 번 사용하여 여러 웹훅 엔드포인트(같은 서버에)를 등록할 수 있습니다.
서버를 설정하고 Space에 배포하는 단계별 튜토리얼은 webhooks 가이드를 참고하세요.
webhook_endpoint는 실험적 기능입니다. 향후 API가 변경될 수 있습니다.
webhook_endpoint를 사용하려면gradio가 설치되어 있어야 합니다(pip install --upgrade gradio).
예: 기본 사용법은 함수를 웹훅 엔드포인트로 등록하는 것입니다. 함수 이름이 경로로 사용됩니다. 서버는 종료 시(즉, 스크립트의 끝에서) 자동으로 시작됩니다.
from huggingface_hub import webhook_endpoint, WebhookPayload
@webhook_endpoint
async def trigger_training(payload: WebhookPayload):
if payload.repo.type == "dataset" and payload.event.action == "update":
# Trigger a training job if a dataset is updated
...
# Server is automatically started at the end of the script.고급 사용법: 함수를 웹훅 엔드포인트로 등록하고 서버를 수동으로 시작합니다. 이는 노트북에서 실행하는 경우에 유용합니다.
from huggingface_hub import webhook_endpoint, WebhookPayload
@webhook_endpoint
async def trigger_training(payload: WebhookPayload):
if payload.repo.type == "dataset" and payload.event.action == "update":
# Trigger a training job if a dataset is updated
...
# Start the server manually
trigger_training.launch()Payload
WebhookPayload는 Webhooks에서 전달되는 페이로드를 포함하는 주요 데이터 구조입니다. 이는 pydantic 클래스로, FastAPI와 함께 사용하기 매우 쉽습니다. 웹훅 엔드포인트의 매개변수로 전달하면 자동으로 검증되고 Python 객체로 파싱됩니다.
webhooks payload에 대한 자세한 내용은 Webhooks Payload 가이드를 참고하세요.
class huggingface_hub.WebhookPayload
< source >( event: WebhookPayloadEventrepo: WebhookPayloadRepodiscussion: huggingface_hub._webhooks_payload.WebhookPayloadDiscussion | None = Nonecomment: huggingface_hub._webhooks_payload.WebhookPayloadComment | None = Nonewebhook: WebhookPayloadWebhookmovedTo: huggingface_hub._webhooks_payload.WebhookPayloadMovedTo | None = NoneupdatedRefs: list[huggingface_hub._webhooks_payload.WebhookPayloadUpdatedRef] | None = None )
WebhookPayload
class huggingface_hub.WebhookPayload
< source >( event: WebhookPayloadEventrepo: WebhookPayloadRepodiscussion: huggingface_hub._webhooks_payload.WebhookPayloadDiscussion | None = Nonecomment: huggingface_hub._webhooks_payload.WebhookPayloadComment | None = Nonewebhook: WebhookPayloadWebhookmovedTo: huggingface_hub._webhooks_payload.WebhookPayloadMovedTo | None = NoneupdatedRefs: list[huggingface_hub._webhooks_payload.WebhookPayloadUpdatedRef] | None = None )
WebhookPayloadComment
class huggingface_hub.WebhookPayloadComment
< source >( id: strauthor: ObjectIdhidden: boolcontent: str | None = Noneurl: WebhookPayloadUrl )
WebhookPayloadDiscussion
class huggingface_hub.WebhookPayloadDiscussion
< source >( id: strnum: intauthor: ObjectIdurl: WebhookPayloadUrltitle: strisPullRequest: boolstatus: typing.Literal['closed', 'draft', 'open', 'merged']changes: huggingface_hub._webhooks_payload.WebhookPayloadDiscussionChanges | None = Nonepinned: bool | None = None )
WebhookPayloadDiscussionChanges
class huggingface_hub.WebhookPayloadDiscussionChanges
< source >( base: strmergeCommitId: str | None = None )
WebhookPayloadEvent
class huggingface_hub.WebhookPayloadEvent
< source >( action: typing.Literal['create', 'delete', 'move', 'update']scope: str )
WebhookPayloadMovedTo
WebhookPayloadRepo
class huggingface_hub.WebhookPayloadRepo
< source >( id: strowner: ObjectIdhead_sha: str | None = Nonename: strprivate: boolsubdomain: str | None = Nonetags: list[str] | None = Nonetype: typing.Literal['dataset', 'model', 'space']url: WebhookPayloadUrl )