Hub Python 庫文件
Webhooks
並獲得增強的文件體驗
開始使用
Webhooks
Webhooks 是 MLOps 相關功能的基石。它們允許你監聽特定倉庫的新變化,或者你關注的特定使用者/組織的所有倉庫。本指南將首先解釋如何以程式設計方式管理 webhooks。然後,我們將學習如何利用 huggingface_hub 建立一個監聽 webhooks 的伺服器,並將其部署到 Space。
本指南假設你已熟悉 Huggingface Hub 上的 webhooks 概念。要了解 webhooks 本身,你應該先閱讀此 指南。
管理 Webhooks
huggingface_hub 允許你以程式設計方式管理你的 webhooks。你可以列出已有的 webhooks,建立新的 webhooks,以及更新、啟用、停用或刪除它們。本節將指導你完成使用 Hugging Face Hub 的 API 函式進行操作的步驟。
建立 Webhook
要建立一個新的 webhook,請使用 create_webhook() 並指定 payload 應傳送的 URL、應監視的事件,以及可選的域名和用於安全的 secret。
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 也可以觸發 Hugging Face 基礎設施上的任務(Job)執行,而不是將 payload 傳送到 URL。在這種情況下,你需要傳入一個源 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_PAYLOAD 來觸發 Job。有關 Hugging Face Jobs、可用硬體(CPU、GPU)和 UV 指令碼的更多資訊,請參閱 Jobs 文件。
列出 Webhooks
要檢視你配置的所有 webhooks,你可以使用 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"]
)啟用和停用 Webhooks
你可能想暫時停用一個 webhook 而不刪除它。這可以透過 disable_webhook() 來完成,之後可以使用 enable_webhook() 重新啟用該 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")Webhooks 伺服器
在本指南的這一部分,我們將使用的基類是 WebhooksServer()。它是一個類,可以輕鬆地配置一個可以接收 Hugging Face Hub 的 webhooks 的伺服器。該伺服器基於 Gradio 應用。它有一個 UI 來顯示說明,供你或你的使用者使用,還有一個 API 來監聽 webhooks。
要檢視執行中的 webhook 伺服器示例,請檢視 Spaces CI Bot。這是一個在 PR 開啟到 Space 時啟動臨時環境的 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 伺服器!讓我們分解一下究竟發生了什麼
- 透過使用 webhook_endpoint() 裝飾函式,在後臺建立了一個 WebhooksServer() 物件。正如您所見,這個伺服器是一個執行在 http://127.0.0.1:7860 上的 Gradio 應用。如果您在瀏覽器中開啟此 URL,您將看到一個包含已註冊 webhooks 說明的著陸頁。
- Gradio 應用底層是一個 FastAPI 伺服器。它已添加了一個新的 POST 路由
/webhooks/trigger_training。這是將監聽 webhooks 並在觸發時執行trigger_training函式的路由。FastAPI 將自動解析 payload 並將其作為 WebhookPayload 物件傳遞給函式。這是一個pydantic物件,包含有關觸發 webhook 的事件的所有資訊。 - Gradio 應用還打開了一個隧道來接收來自網際網路的請求。這是有趣的部分:您可以在 https://huggingface.co/settings/webhooks 上配置一個指向您本地機器的 Webhook。這對於除錯您的 webhook 伺服器和在將其部署到 Space 之前快速迭代非常有用。
- 最後,日誌也表明您的伺服器當前未受 secret 保護。這對於本地除錯來說不是問題,但以後需要牢記。
預設情況下,伺服器在指令碼末尾啟動。如果您在 notebook 中執行它,可以透過呼叫
decorated_function.run()來手動啟動伺服器。由於使用的是唯一伺服器,即使有多個端點,您也只需啟動一次伺服器。
配置 Webhook
現在你有一個執行中的 webhook 伺服器,你需要配置一個 Webhook 來開始接收訊息。轉到 https://huggingface.co/settings/webhooks,點選“新增新的 webhook”並配置你的 Webhook。設定你想要監視的目標倉庫和 Webhook URL,這裡是 https://1fadb0f52d8bf825fc.gradio.live/webhooks/trigger_training。

就這樣!你現在可以觸發該 webhook,方法是更新目標倉庫(例如,推送一個 commit)。檢視你的 Webhook 的 Activity 標籤頁,檢視已觸發的事件。現在你已經有了一個可用的設定,你可以對其進行測試並快速迭代。如果你修改了程式碼並重新啟動伺服器,你的公共 URL 可能會改變。如果需要,請確保在 Hub 上更新 webhook 配置。
部署到 Space
現在你有一個可用的 webhook 伺服器,目標是將其部署到 Space。前往 https://huggingface.co/new-space 建立一個 Space。給它起個名字,選擇 Gradio SDK,然後點選“建立 Space”。將你的程式碼上傳到 Space,檔名為 app.py。你的 Space 將自動啟動!有關 Spaces 的更多詳細資訊,請參考此 指南。
你的 webhook 伺服器現在正在一個公共 Space 上執行。在大多數情況下,你會想用 secret 來保護它。轉到你的 Space 設定 > “倉庫 secrets” 部分 > “新增 secret”。將 WEBHOOK_SECRET 環境變數設定為你選擇的值。回到 Webhooks 設定,並在 webhook 配置中設定 secret。現在,只有帶有正確 secret 的請求才會被你的伺服器接受。
搞定!你的 Space 現在已準備好接收來自 Hub 的 webhooks。請記住,如果你在免費的 'cpu-basic' 硬體上執行 Space,它將在 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
...這將建立兩個終端
(...) 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。例如,你可以新增使用者說明,或者新增一個手動觸發 webhooks 的表單。在建立 WebhooksServer() 時,你可以使用 add_webhook() 裝飾器註冊新的 webhooks。
這是一個完整的示例
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.run()- 我們使用 Gradio blocks 定義了一個自定義 UI。這個 UI 將顯示在伺服器的著陸頁上。
- 我們用一個 secret 建立了一個帶自定義 UI 的 WebhooksServer() 物件。secret 是可選的,可以用
WEBHOOK_SECRET環境變數設定。 - 我們用一個顯式的名稱註冊了一個 webhook。這將在
/webhooks/say_hello建立一個終端。 - 我們用一個隱式的名稱註冊了一個 webhook。這將在
/webhooks/goodbye建立一個終端。 - 我們啟動了伺服器。這是可選的,因為你的伺服器將在指令碼末尾自動啟動。