# Servidor de Webhooks

Los webhooks son la base de las funciones relacionadas con MLOps. Permiten escuchar nuevos cambios en repositorios específicos o en todos los repositorios de usuarios u organizaciones particulares que desees seguir. Para obtener más información sobre los webhooks en Huggingface Hub, puedes leer la [guía](https://huggingface.co/docs/hub/webhooks) de webhooks.

> [!TIP]
> Consulta esta [guía](../guides/webhooks_server) para un tutorial paso a paso sobre cómo configurar tu servidor de webhooks y desplegarlo como un Space.

> [!WARNING]
> Esta es una función experimental. Esto significa que seguimos trabajando en la mejora de la API. Es posible que se introduzcan cambios que rompan la compatibilidad en el futuro sin previo aviso. Asegúrate de fijar la versión de `huggingface_hub` en tus requisitos. Se emite una advertencia cuando usas una función experimental. Puedes desactivarla estableciendo `HF_HUB_DISABLE_EXPERIMENTAL_WARNING=1` como variable de entorno.

## Servidor

El servidor es una aplicación de [Gradio](https://gradio.app/). Incluye una interfaz de usuario para mostrar instrucciones para ti o para tus usuarios, y una API para escuchar webhooks. Implementar un punto de finalización de webhook es tan sencillo como decorar una función. Luego, puedes depurarlo redirigiendo los Webhooks a tu máquina (usando un túnel de Gradio) antes de desplegarlo en un Space.

### WebhooksServer[[huggingface_hub.WebhooksServer]]

#### huggingface_hub.WebhooksServer[[huggingface_hub.WebhooksServer]]

```python
huggingface_hub.WebhooksServer(*args, **kwargs)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_server.py#L37)

**Parámetros:**

ui (`gradio.Blocks`, opcional) : Una instancia de interfaz de Gradio que se usará como página de inicio del Space. Si es `None`, se crea una interfaz que muestra instrucciones sobre los webhooks configurados.

webhook_secret (`str`, opcional) : Una clave secreta para verificar las solicitudes entrantes de webhook. Puedes establecer este valor como cualquier secreto que desees, siempre que también lo configures en tu [panel de configuración de webhooks](https://huggingface.co/settings/webhooks). También puedes establecer este valor como la variable de entorno `WEBHOOK_SECRET`. Si no se proporciona ningún secreto, los puntos de acceso de webhook se abren sin ninguna seguridad.

La clase [WebhooksServer()](/docs/huggingface_hub/main/es/package_reference/webhooks_server#huggingface_hub.WebhooksServer) permite crear una instancia de una aplicación de Gradio que puede recibir webhooks de Huggingface. Estos webhooks se pueden registrar mediante el decorador `add_webhook()`. Los puntos de acceso de webhook se añaden a la aplicación como un punto de acceso POST en el enrutador de FastAPI. Una vez que todos los webhooks están registrados, se debe llamar al método `launch` para iniciar la aplicación.

Se recomienda aceptar [WebhookPayload](/docs/huggingface_hub/main/es/package_reference/webhooks_server#huggingface_hub.WebhookPayload) como primer argumento de la función webhook. Es un modelo de Pydantic que contiene toda la información sobre el evento del webhook. Los datos se analizarán automáticamente para usted.

Consulta la [guía de webhooks](../guides/webhooks_server) para un tutorial paso a paso sobre cómo configurar tu WebhooksServer y desplegarlo en un Space.

> [!WARNING]
> `WebhooksServer` es experimental. Su API está sujeta a cambios en el futuro.

> [!WARNING]
> Debes tener `gradio` instalado para usar `WebhooksServer` (`pip install --upgrade gradio`).

Ejemplo:

```python
import gradio as gr
from huggingface_hub import WebhooksServer, WebhookPayload

with gr.Blocks() as ui:
    ...

app = WebhooksServer(ui=ui, webhook_secret="my_secret_key")

@app.add_webhook("/say_hello")
async def hello(payload: WebhookPayload):
    return {"message": "hello"}

app.launch()
```

### @webhook_endpoint[[huggingface_hub.webhook_endpoint]]

#### huggingface_hub.webhook_endpoint[[huggingface_hub.webhook_endpoint]]

```python
huggingface_hub.webhook_endpoint(path: str | None = None)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_server.py#L221)

**Parámetros:**

path (`str`, opcional) : La ruta de URL para registrar la función de webhook. Si no se proporciona, se usará el nombre de la función como ruta. En cualquier caso, todos los webhooks se registran bajo `/webhooks`.

Decorador para iniciar un [WebhooksServer()](/docs/huggingface_hub/main/es/package_reference/webhooks_server#huggingface_hub.WebhooksServer) y registrar la función decorada como un punto de extremo de webhook.

Este es un asistente para empezar rápidamente. Si necesitas más flexibilidad (página de inicio personalizada o secreto de webhook), puedes usar [WebhooksServer()](/docs/huggingface_hub/main/es/package_reference/webhooks_server#huggingface_hub.WebhooksServer) directamente. Puedes registrar múltiples puntos finales de webhook (en el mismo servidor) usando este decorador varias veces.

Consulta la [guía de webhooks](../guides/webhooks_server) para un tutorial paso a paso sobre cómo configurar tu servidor y desplegarlo en un Space.

> [!WARNING]
> `webhook_endpoint` es experimental. Su API está sujeta a cambios en el futuro.

> [!WARNING]
> Debes tener `gradio` instalado para usar `webhook_endpoint` (`pip install --upgrade gradio`).

Ejemplos: El uso predeterminado es registrar una función como punto de entrada de webhook. El nombre de la función se usará como ruta. El servidor se iniciará automáticamente al salir (es decir, al final del script).

```python
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.
```

Uso avanzado: registra una función como punto de extremo de webhook e inicia el servidor manualmente. Esto es útil si lo estás ejecutando en un cuaderno.

```python
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[[huggingface_hub.WebhookPayload]]

[WebhookPayload](/docs/huggingface_hub/main/es/package_reference/webhooks_server#huggingface_hub.WebhookPayload) es la estructura de datos principal que contiene el payload de los Webhooks. Es una clase de `pydantic`, lo que facilita mucho su uso con FastAPI. Si la pasas como parámetro a un endpoint de webhook, se validará y analizará automáticamente como un objeto de Python.

Para obtener más información sobre el payload de los webhooks, puede consultar la [guía](https://huggingface.co/docs/hub/webhooks#webhook-payloads) de Webhooks Payload.

#### huggingface_hub.WebhookPayload[[huggingface_hub.WebhookPayload]]

```python
huggingface_hub.WebhookPayload(event: WebhookPayloadEvent, repo: WebhookPayloadRepo, discussion: huggingface_hub._webhooks_payload.WebhookPayloadDiscussion | None = None, comment: huggingface_hub._webhooks_payload.WebhookPayloadComment | None = None, webhook: WebhookPayloadWebhook, movedTo: huggingface_hub._webhooks_payload.WebhookPayloadMovedTo | None = None, updatedRefs: list[huggingface_hub._webhooks_payload.WebhookPayloadUpdatedRef] | None = None)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L129)

### WebhookPayload[[huggingface_hub.WebhookPayload]]

#### huggingface_hub.WebhookPayload[[huggingface_hub.WebhookPayload]]

```python
huggingface_hub.WebhookPayload(event: WebhookPayloadEvent, repo: WebhookPayloadRepo, discussion: huggingface_hub._webhooks_payload.WebhookPayloadDiscussion | None = None, comment: huggingface_hub._webhooks_payload.WebhookPayloadComment | None = None, webhook: WebhookPayloadWebhook, movedTo: huggingface_hub._webhooks_payload.WebhookPayloadMovedTo | None = None, updatedRefs: list[huggingface_hub._webhooks_payload.WebhookPayloadUpdatedRef] | None = None)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L129)

### WebhookPayloadComment[[huggingface_hub.WebhookPayloadComment]]

#### huggingface_hub.WebhookPayloadComment[[huggingface_hub.WebhookPayloadComment]]

```python
huggingface_hub.WebhookPayloadComment(id: str, author: ObjectId, hidden: bool, content: str | None = None, url: WebhookPayloadUrl)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L94)

### WebhookPayloadDiscussion[[huggingface_hub.WebhookPayloadDiscussion]]

#### huggingface_hub.WebhookPayloadDiscussion[[huggingface_hub.WebhookPayloadDiscussion]]

```python
huggingface_hub.WebhookPayloadDiscussion(id: str, num: int, author: ObjectId, url: WebhookPayloadUrl, title: str, isPullRequest: bool, status: typing.Literal['closed', 'draft', 'open', 'merged'], changes: huggingface_hub._webhooks_payload.WebhookPayloadDiscussionChanges | None = None, pinned: bool | None = None)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L101)

### WebhookPayloadDiscussionChanges[[huggingface_hub.WebhookPayloadDiscussionChanges]]

#### huggingface_hub.WebhookPayloadDiscussionChanges[[huggingface_hub.WebhookPayloadDiscussionChanges]]

```python
huggingface_hub.WebhookPayloadDiscussionChanges(base: str, mergeCommitId: str | None = None)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L89)

### WebhookPayloadEvent[[huggingface_hub.WebhookPayloadEvent]]

#### huggingface_hub.WebhookPayloadEvent[[huggingface_hub.WebhookPayloadEvent]]

```python
huggingface_hub.WebhookPayloadEvent(action: typing.Literal['create', 'delete', 'move', 'update'], scope: str)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L84)

### WebhookPayloadMovedTo[[huggingface_hub.WebhookPayloadMovedTo]]

#### huggingface_hub.WebhookPayloadMovedTo[[huggingface_hub.WebhookPayloadMovedTo]]

```python
huggingface_hub.WebhookPayloadMovedTo(name: str, owner: ObjectId)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L75)

### WebhookPayloadRepo[[huggingface_hub.WebhookPayloadRepo]]

#### huggingface_hub.WebhookPayloadRepo[[huggingface_hub.WebhookPayloadRepo]]

```python
huggingface_hub.WebhookPayloadRepo(id: str, owner: ObjectId, head_sha: str | None = None, name: str, private: bool, subdomain: str | None = None, tags: list[str] | None = None, type: typing.Literal['dataset', 'model', 'space'], url: WebhookPayloadUrl)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L112)

### WebhookPayloadUrl[[huggingface_hub.WebhookPayloadUrl]]

#### huggingface_hub.WebhookPayloadUrl[[huggingface_hub.WebhookPayloadUrl]]

```python
huggingface_hub.WebhookPayloadUrl(web: str, api: str | None = None)
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L70)

### WebhookPayloadWebhook[[huggingface_hub.WebhookPayloadWebhook]]

#### huggingface_hub.WebhookPayloadWebhook[[huggingface_hub.WebhookPayloadWebhook]]

```python
huggingface_hub.WebhookPayloadWebhook(id: str, version: typing.Literal[3])
```

[Fuente](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py#L80)

