Hub Python 库文档
Webhooks 服务器
并获得增强的文档体验
开始使用
Webhooks 服务器
Webhooks 是 MLOps 相关功能的基础。它们允许您监听特定仓库或您感兴趣关注的特定用户/组织的所有仓库的新更改。要了解有关 Huggingface Hub 上的 Webhooks 的更多信息,您可以阅读 Webhooks 指南。
查看此指南,获取关于如何设置您的 webhooks 服务器并将其部署为 Space 的分步教程。
这是一个实验性功能。这意味着我们仍在努力改进 API。未来可能会在没有事先通知的情况下引入重大更改。请确保在您的 requirements 中固定 huggingface_hub
的版本。当您使用实验性功能时,会触发警告。您可以通过设置 HF_HUB_DISABLE_EXPERIMENTAL_WARNING=1
作为环境变量来禁用它。
服务器
该服务器是一个 Gradio 应用程序。它具有一个 UI,用于显示给您或您的用户的说明,以及一个 API 用于监听 webhooks。实现 webhook 端点就像装饰一个函数一样简单。然后,您可以通过将 Webhooks 重定向到您的机器(使用 Gradio 隧道)来调试它,然后再将其部署到 Space。
WebhooksServer
huggingface_hub.WebhooksServer
< source >( *args **kwargs )
参数
- ui (
gradio.Blocks
, 可选) — 用作 Space 登录页面的 Gradio UI 实例。如果为None
,则会创建一个 UI,显示有关已配置 webhooks 的说明。 - webhook_secret (
str
, 可选) — 用于验证传入 webhook 请求的密钥。您可以将此值设置为您想要的任何密钥,只要您也在您的 webhooks 设置面板中配置它。您也可以将此值设置为WEBHOOK_SECRET
环境变量。如果未提供密钥,则 webhook 端点将在没有任何安全措施的情况下打开。
WebhooksServer() 类允许您创建 Gradio 应用程序的实例,该实例可以接收 Huggingface webhooks。这些 webhooks 可以使用 add_webhook()
装饰器注册。Webhook 端点作为 POST 端点添加到应用程序的 FastAPI 路由器中。注册所有 webhooks 后,必须调用 launch
方法才能启动应用程序。
建议接受 WebhookPayload 作为 webhook 函数的第一个参数。它是一个 Pydantic 模型,其中包含有关 webhook 事件的所有信息。数据将自动为您解析。
查看 webhooks 指南,获取关于如何设置您的 WebhooksServer 并将其部署到 Space 的分步教程。
WebhooksServer
是实验性的。其 API 未来可能会发生变化。
您必须安装 gradio
才能使用 WebhooksServer
(pip install --upgrade gradio
)。
@webhook_endpoint
huggingface_hub.webhook_endpoint
< source >( path: typing.Optional[str] = None )
装饰器,用于启动 WebhooksServer() 并将装饰的函数注册为 webhook 端点。
这是一个帮助您快速入门的助手。如果您需要更高的灵活性(自定义登录页面或 webhook 密钥),您可以直接使用 WebhooksServer()。您可以通过多次使用此装饰器来注册多个 webhook 端点(到同一服务器)。
查看 webhooks 指南,获取关于如何设置您的服务器并将其部署到 Space 的分步教程。
webhook_endpoint
是实验性的。其 API 未来可能会发生变化。
您必须安装 gradio
才能使用 webhook_endpoint
(pip install --upgrade gradio
)。
示例:默认用法是将函数注册为 webhook 端点。函数名称将用作路径。服务器将在退出时自动启动(即在脚本结束时)。
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.
高级用法:将函数注册为 webhook 端点并手动启动服务器。如果您在笔记本中运行它,这将非常有用。
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 一起使用。如果您将其作为参数传递给 webhook 端点,它将自动验证并解析为 Python 对象。
有关 webhooks 有效负载的更多信息,您可以参考 Webhooks Payload 指南。
class huggingface_hub.WebhookPayload
< source >( event: WebhookPayloadEvent repo: WebhookPayloadRepo discussion: typing.Optional[huggingface_hub._webhooks_payload.WebhookPayloadDiscussion] = None comment: typing.Optional[huggingface_hub._webhooks_payload.WebhookPayloadComment] = None webhook: WebhookPayloadWebhook movedTo: typing.Optional[huggingface_hub._webhooks_payload.WebhookPayloadMovedTo] = None updatedRefs: typing.Optional[typing.List[huggingface_hub._webhooks_payload.WebhookPayloadUpdatedRef]] = None )
WebhookPayload
class huggingface_hub.WebhookPayload
< source >( event: WebhookPayloadEvent repo: WebhookPayloadRepo discussion: typing.Optional[huggingface_hub._webhooks_payload.WebhookPayloadDiscussion] = None comment: typing.Optional[huggingface_hub._webhooks_payload.WebhookPayloadComment] = None webhook: WebhookPayloadWebhook movedTo: typing.Optional[huggingface_hub._webhooks_payload.WebhookPayloadMovedTo] = None updatedRefs: typing.Optional[typing.List[huggingface_hub._webhooks_payload.WebhookPayloadUpdatedRef]] = None )
WebhookPayloadComment
class huggingface_hub.WebhookPayloadComment
< source >( id: str author: ObjectId hidden: bool content: typing.Optional[str] = None url: WebhookPayloadUrl )
WebhookPayloadDiscussion
class huggingface_hub.WebhookPayloadDiscussion
< source >( id: str num: int author: ObjectId url: WebhookPayloadUrl title: str isPullRequest: bool status: typing.Literal['closed', 'draft', 'open', 'merged'] changes: typing.Optional[huggingface_hub._webhooks_payload.WebhookPayloadDiscussionChanges] = None pinned: typing.Optional[bool] = None )
WebhookPayloadDiscussionChanges
class huggingface_hub.WebhookPayloadDiscussionChanges
< source >( base: str mergeCommitId: typing.Optional[str] = None )
WebhookPayloadEvent
class huggingface_hub.WebhookPayloadEvent
< source >( action: typing.Literal['create', 'delete', 'move', 'update'] scope: str )
WebhookPayloadMovedTo
WebhookPayloadRepo
class huggingface_hub.WebhookPayloadRepo
< source >( id: str owner: ObjectId head_sha: typing.Optional[str] = None name: str private: bool subdomain: typing.Optional[str] = None tags: typing.Optional[typing.List[str]] = None type: typing.Literal['dataset', 'model', 'space'] url: WebhookPayloadUrl )