Hub Python Library documentation

Webhooks

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Webhooks

WebhooksはMLOps関連の機能の基盤です。特定のリポジトリ、またはフォローしたい特定のユーザー/組織に属するすべてのリポジトリでの変更を監視できます。本ガイドでは、まずWebhookをプログラムで管理する方法を説明します。その後、huggingface_hubを活用してWebhookを監視するサーバーを作成し、Spaceにデプロイする方法を確認します。

このガイドでは、Huggingface Hub の Webhook の概念に精通していることを前提としています。Webhook 自体について詳しく知るには、まずこの ガイド をお読みください。

Webhookの管理

huggingface_hub を使用すると、Webhook をプログラムで管理できます。既存の Webhook を一覧表示し、新しい Webhook を作成し、更新、有効化、無効化、削除を行うことができます。このセクションでは、Hugging Face Hub の API 関数を用いた手順について説明します。

Webhookの作成

新しいWebhookを作成するには、create_webhook()を使用し、ペイロードを送信するURL、監視するイベント、およびセキュリティのためにオプションでドメインとシークレットを指定します。

from huggingface_hub import create_webhook

# Example: Creating a webhook
webhook = create_webhook(
    url="https://webhook.site/your-custom-url",
    watched=[{"type": "user", "name": "your-username"}, {"type": "org", "name": "your-org-name"}],
    domains=["repo", "discussion"],
    secret="your-secret"
)

Webhookは、ペイロードをURLに送信する代わりに、Hugging faceのインフラストラクチャ上でJobを実行するトリガーとしても機能します。 この場合、ソースとなるJobのIDを渡す必要があります。

from huggingface_hub import create_webhook

# Example: Creating a webhook that triggers a Job
webhook = create_webhook(
    job_id=job_id,
    watched=[{"type": "user", "name": "your-username"}, {"type": "org", "name": "your-org-name"}],
    domains=["repo", "discussion"],
    secret="your-secret"
)

Webhookは、環境変数WEBHOOK_PAYLOADにWebhookペイロードを設定してJobをトリガーします。 ソースJobのシークレットはWebhookにコピーされません。トリガーされたJobがシークレット(例: HF_TOKEN)を必要とする場合は、secrets={"HF_TOKEN": "hf_***"}で渡してください。update_webhook()を使用する場合は、secretsとともにjob_idを渡す必要があります。リストされたシークレットは保存された値を置き換え、空の文字列はシークレットを削除し、その他のすべてのシークレットは保持されます。 Hugging Face Jobs、利用可能なハードウェア(CPU、GPU)、およびUVスクリプトの詳細については、Jobsのドキュメントを参照してください。

Webhookのリスト表示

設定済みのすべてのWebhookを確認するには、list_webhooks()で一覧表示できます。これにより、ID、URL、ステータスをレビューするのに役立ちます。

from huggingface_hub import list_webhooks

# Example: Listing all webhooks
webhooks = list_webhooks()
for webhook in webhooks:
    print(webhook)

Webhookの更新

既存のWebhookのURLや監視対象イベントなどの設定を変更する必要がある場合は、update_webhook()を使用して更新できます。

from huggingface_hub import update_webhook

# Example: Updating a webhook
updated_webhook = update_webhook(
    webhook_id="your-webhook-id",
    url="https://new.webhook.site/url",
    watched=[{"type": "user", "name": "new-username"}],
    domains=["repo"]
)

Webhookの有効化と無効化

Webhookを削除せずに一時的に無効にしたい場合があります。これはdisable_webhook()を使用して行い、後でenable_webhook()によって再度有効にできます。

from huggingface_hub import enable_webhook, disable_webhook

# Example: Enabling a webhook
enabled_webhook = enable_webhook("your-webhook-id")
print("Enabled:", enabled_webhook)

# Example: Disabling a webhook
disabled_webhook = disable_webhook("your-webhook-id")
print("Disabled:", disabled_webhook)

Webhookの削除

Webhookが不要になった場合、delete_webhook()を使用して恒久的に削除できます。

from huggingface_hub import delete_webhook

# Example: Deleting a webhook
delete_webhook("your-webhook-id")

CLIからのWebhookの管理

上記のすべての操作は、hf コマンドラインインターフェースからも利用できます。スクリプトやエージェント型ワークフローにおいて特に便利です。

# List all webhooks
>>> hf webhooks ls

# Get details about a specific webhook
>>> hf webhooks info <webhook_id>

# Create a webhook that pings a URL
>>> hf webhooks create --url https://example.com/hook --watch model:bert-base-uncased --domain repo

# Create a webhook that triggers a Job
>>> hf webhooks create --job-id <job_id> --watch user:julien-c

# Create a webhook that triggers a Job with your HF token as a secret
>>> hf webhooks create --job-id <job_id> --watch bucket:my-org/my-bucket --secrets HF_TOKEN

# Update an existing webhook
>>> hf webhooks update <webhook_id> --url https://new-url.com/hook

# Enable / disable a webhook
>>> hf webhooks enable <webhook_id>
>>> hf webhooks disable <webhook_id>

# Delete a webhook (with confirmation prompt)
>>> hf webhooks delete <webhook_id>

--watch オプションは type:name という形式を使用します。ここで type は model、dataset、space、org、または user のいずれかです。複数回指定することで、複数のアイテムを監視できます。すべてのオプションの一覧については、hf webhooks <command> --help を実行してください。詳細については、CLI ガイドを参照してください。

Webhooks サーバー

このガイドのセクションで使用するベースクラスはWebhooksServer()です。これは、Huggingface HubからのWebhookを受信できるサーバーを簡単に設定するためのクラスです。サーバーはGradioアプリをベースとしており、あなたやユーザー向けの指示を表示するUIと、WebhookをリッスンするためのAPIを備えています。

Webhookサーバーの動作例を確認するには、Spaces CI Botをご覧ください。これは、Spaceに対してPRが作成された際にエフェメラル環境を起動するSpaceです。

これは実験的な機能です。つまり、APIの改善を継続的に進めている段階です。事前の通知なしに、将来破壊的変更が導入される可能性があります。huggingface_hubのバージョンをrequirementsに固定してください。

エンドポイントを作成する

Webhookエンドポイントの実装は、関数にデコレータを付与するだけで済みます。主要な概念を説明するために、まず最初の例を見てみましょう:

# app.py
from huggingface_hub import webhook_endpoint, WebhookPayload

@webhook_endpoint
async def trigger_training(payload: WebhookPayload) -> None:
    if payload.repo.type == "dataset" and payload.event.action == "update":
        # Trigger a training job if a dataset is updated
        ...

このスニペットを'app.py'という名前のファイルに保存し、'python app.py'で実行してください。次のようなメッセージが表示されるはずです:

Webhook secret is not defined. This means your webhook endpoints will be open to everyone.
To add a secret, set `WEBHOOK_SECRET` as environment variable or pass it at initialization:
        `app = WebhooksServer(webhook_secret='my_secret', ...)`
For more details about webhook secrets, please refer to https://huggingface.co/docs/hub/webhooks#webhook-secret.
Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://1fadb0f52d8bf825fc.gradio.live

This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces

Webhooks are correctly setup and ready to use:
  - POST https://1fadb0f52d8bf825fc.gradio.live/webhooks/trigger_training
Go to https://huggingface.co/settings/webhooks to setup your webhooks.

お見事!Webhookサーバーを起動しました!何が起きたのかを詳しく見ていきましょう:

  1. 関数にwebhook_endpoint()をデコレーターとして適用すると、バックグラウンドでWebhooksServer()オブジェクトが作成されます。 ご覧のとおり、このサーバーはhttp://127.0.0.1:7860で実行されているGradioアプリです。このURLをブラウザで開くと、登録されたWebhookに関する説明が記載されたランディングページが表示されます。
  2. Gradio アプリは、内部では FastAPI サーバーとして動作します。新しい POST ルート /webhooks/trigger_training が追加されました。 このルートは Webhook を監視し、トリガーされた際に trigger_training 関数を実行します。FastAPI は ペイロードを自動的にパースし、WebhookPayload オブジェクトとして関数に渡します。これは、Webhook をトリガーしたイベントに関するすべての情報を含む pydantic オブジェクトです。
  3. Gradio アプリは、インターネットからのリクエストを受信するためのトンネルも開いていました。ここが興味深い点です。https://huggingface.co/settings/webhooks で、ローカルマシンを指す Webhook を設定できます。これにより、Webhook サーバーのデバッグや、Space へのデプロイ前に素早く反復開発を行うことが可能になります。
  4. 最後に、ログにはサーバーが現在シークレットによって保護されていないことも示されています。これはローカルでのデバッグには問題ありませんが、後で考慮する必要がある点です。

デフォルトでは、スクリプトの末尾でサーバーが起動します。ノートブックで実行している場合は、decorated_function.launch()を呼び出すことでサーバーを手動で起動できます。ユニークなサーバーが使用されるため、エンドポイントが複数あっても、サーバーは一度だけ起動すれば十分です。

Webhookを設定する

Webhookサーバーが実行できるようになったので、次はWebhookを設定してメッセージの受信を開始します。 https://huggingface.co/settings/webhooksに移動し、「Add a new webhook」をクリックしてWebhookを設定します。監視対象のリポジトリとWebhook URLを設定します。ここではhttps://1fadb0f52d8bf825fc.gradio.live/webhooks/trigger_trainingです。

これで完了です! 対象リポジトリを更新する(例: コミットをプッシュする)ことで、その Webhook をトリガーできます。Webhook の Activity タブを確認して、トリガーされたイベントを表示してください。動作するセットアップが整ったので、テストと迅速な反復開発を行えます。コードを変更してサーバーを再起動すると、パブリック URL が変更される場合があります。必要に応じて、Hub 上の Webhook 設定を更新してください。

スペースにデプロイ

動作する Webhook サーバーが用意できたので、次は Space にデプロイします。https://huggingface.co/new-space にアクセスして Space を作成してください。名前を付け、Gradio SDK を選択し、「Create Space」をクリックします。コードを app.py というファイル名で Space にアップロードしてください。Space は自動的に起動します。Spaces に関する詳細については、このガイドを参照してください。

Webhookサーバーは現在、パブリックなSpaceで実行されています。ほとんどの場合、シークレットで保護することをお勧めします。Spaceの設定 > “Repository secrets”セクション > “Add a secret”に移動します。WEBHOOK_SECRET環境変数を、任意の値に設定してください。Webhooks settingsに戻り、Webhookの設定でシークレットを設定します。これにより、サーバーは正しいシークレットを持つリクエストのみを受け付けるようになります。

これで完了です! Space は Hub からの Webhook を受け取る準備が整いました。なお、Space を無料の ‘cpu-basic’ ハードウェアで実行する場合、48 時間アクティビティがないとシャットダウンされます。永続的な Space が必要な場合は、アップグレードされたハードウェアに設定することを検討してください。

高度な使用方法

上記のガイドでは、WebhooksServer()をセットアップする最も簡単な方法について説明しました。このセクションでは、さらにカスタマイズする方法を見ていきます。

複数のエンドポイント

同じサーバーに複数のエンドポイントを登録できます。例えば、トレーニングジョブをトリガーするエンドポイントと、モデル評価をトリガーするエンドポイントをそれぞれ用意したい場合があります。これは、複数の@webhook_endpointデコレーターを追加することで実現できます。

# app.py
from huggingface_hub import webhook_endpoint, WebhookPayload

@webhook_endpoint
async def trigger_training(payload: WebhookPayload) -> None:
    if payload.repo.type == "dataset" and payload.event.action == "update":
        # Trigger a training job if a dataset is updated
        ...

@webhook_endpoint
async def trigger_evaluation(payload: WebhookPayload) -> None:
    if payload.repo.type == "model" and payload.event.action == "update":
        # Trigger an evaluation job if a model is updated
        ...

これにより、2つのエンドポイントが作成されます:

(...)
Webhooks are correctly setup and ready to use:
  - POST https://1fadb0f52d8bf825fc.gradio.live/webhooks/trigger_training
  - POST https://1fadb0f52d8bf825fc.gradio.live/webhooks/trigger_evaluation

カスタムサーバー

より柔軟性を高めるには、WebhooksServer()オブジェクトを直接作成することもできます。これは、サーバーのランディングページをカスタマイズしたい場合に便利です。Gradio UIを渡すことで、デフォルトのUIを上書きできます。例えば、ユーザー向けの説明を追加したり、Webhookを手動でトリガーするためのフォームを追加したりできます。WebhooksServer()を作成する際、add_webhook()デコレーターを使用して新しいWebhookを登録できます。

以下は完全な例です:

import gradio as gr
from fastapi import Request
from huggingface_hub import WebhooksServer, WebhookPayload

# 1. Define  UI
with gr.Blocks() as ui:
    ...

# 2. Create WebhooksServer with custom UI and secret
app = WebhooksServer(ui=ui, webhook_secret="my_secret_key")

# 3. Register webhook with explicit name
@app.add_webhook("/say_hello")
async def hello(payload: WebhookPayload):
    return {"message": "hello"}

# 4. Register webhook with implicit name
@app.add_webhook
async def goodbye(payload: WebhookPayload):
    return {"message": "goodbye"}

# 5. Start server (optional)
app.launch()
  1. Gradio blocksを使用してカスタムUIを定義します。このUIは、サーバーのランディングページに表示されます。
  2. カスタム UI とシークレットを指定してWebhooksServer()オブジェクトを作成します。シークレットは任意であり、WEBHOOK_SECRET環境変数で設定できます。
  3. 明示的な名前を指定してWebhookを登録します。これにより、/webhooks/say_helloにエンドポイントが作成されます。
  4. 暗黙的な名前でWebhookを登録します。これにより、/webhooks/goodbyeにエンドポイントが作成されます。
  5. サーバーを起動します。これはオプションです。スクリプトの末尾でサーバーが自動的に起動されるためです。
Update on GitHub