# Server Webhooks

Webhooks merupakan fondasi untuk fitur-fitur yang berkaitan dengan MLOps. Webhooks memungkinkan Anda untuk mendengarkan perubahan baru pada repositori tertentu atau pada semua repositori yang dimiliki oleh pengguna/organisasi tertentu yang ingin Anda ikuti. Untuk mempelajari lebih lanjut tentang webhooks di Huggingface Hub, Anda dapat membaca panduan [Webhooks](https://huggingface.co/docs/hub/webhooks).

> [!TIP]
> Lihat [panduan](../guides/webhooks_server) ini untuk tutorial langkah demi langkah tentang cara mengatur server webhooks Anda dan mendeploynya sebagai Space.

> [!WARNING]
> Ini adalah fitur eksperimental. Artinya, kami masih terus bekerja untuk meningkatkan API. Perubahan yang merusak (breaking changes) mungkin akan diperkenalkan di masa depan tanpa pemberitahuan sebelumnya. Pastikan untuk mengunci (pin) versi `huggingface_hub` di requirements Anda. Peringatan akan dipicu ketika Anda menggunakan fitur eksperimental. Anda dapat menonaktifkannya dengan mengatur `HF_HUB_DISABLE_EXPERIMENTAL_WARNING=1` sebagai variabel lingkungan.

## Server

Server ini adalah aplikasi [Gradio](https://gradio.app/). Ia memiliki UI untuk menampilkan instruksi bagi Anda atau pengguna Anda, serta API untuk mendengarkan webhook. Menerapkan endpoint webhook sesederhana mendekorasi sebuah fungsi. Anda kemudian dapat men-debugnya dengan mengalihkan Webhooks ke mesin Anda (menggunakan terowongan Gradio) sebelum menerbitkannya ke Space.

### WebhooksServer[[huggingface_hub.WebhooksServer]]

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

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

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_webhooks_server.py#L37)

**Parameter:**

ui (`gradio.Blocks`, opsional) : Instans UI Gradio yang akan digunakan sebagai halaman utama Space. Jika `None`, UI yang menampilkan instruksi tentang webhook yang dikonfigurasi akan dibuat.

webhook_secret (`str`, opsional) : Kunci rahasia untuk memverifikasi permintaan webhook yang masuk. Anda dapat mengatur nilai ini menjadi rahasia apa pun, selama Anda juga mengonfigurasikannya di [panel pengaturan webhook](https://huggingface.co/settings/webhooks) Anda. Anda juga dapat mengatur nilai ini sebagai variabel lingkungan `WEBHOOK_SECRET`. Jika tidak ada kunci rahasia yang diberikan, endpoint webhook akan dibuka tanpa keamanan apa pun.

Kelas [WebhooksServer()](/docs/huggingface_hub/v2.4.0/id/package_reference/webhooks_server#huggingface_hub.WebhooksServer) memungkinkan Anda membuat instance aplikasi Gradio yang dapat menerima webhook Huggingface. Webhook ini dapat didaftarkan menggunakan dekorator `add_webhook()`. Endpoint webhook ditambahkan ke aplikasi sebagai endpoint POST ke router FastAPI. Setelah semua webhook terdaftar, metode `launch` harus dipanggil untuk memulai aplikasi.

Disarankan untuk menerima [WebhookPayload](/docs/huggingface_hub/v2.4.0/id/package_reference/webhooks_server#huggingface_hub.WebhookPayload) sebagai argumen pertama dari fungsi webhook. Ini adalah model Pydantic yang berisi semua informasi tentang peristiwa webhook. Data akan diurai secara otomatis untuk Anda.

Lihat [panduan webhooks](../guides/webhooks_server) untuk tutorial langkah demi langkah tentang cara mengatur WebhooksServer Anda dan mendeploynya di Space.

> [!WARNING]
> `WebhooksServer` bersifat eksperimental. API-nya dapat berubah di masa depan.

> [!WARNING]
> Anda harus menginstal `gradio` untuk menggunakan `WebhooksServer` (`pip install --upgrade gradio`).

Contoh:

```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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_webhooks_server.py#L221)

**Parameter:**

path (`str`, opsional) : Jalur URL untuk mendaftarkan fungsi webhook. Jika tidak disediakan, nama fungsi akan digunakan sebagai jalur. Dalam hal apa pun, semua webhook didaftarkan di bawah `/webhooks`.

Decorator untuk memulai [WebhooksServer()](/docs/huggingface_hub/v2.4.0/id/package_reference/webhooks_server#huggingface_hub.WebhooksServer) dan mendaftarkan fungsi yang didekorasi sebagai endpoint webhook.

Ini adalah helper untuk memulai dengan cepat. Jika Anda membutuhkan fleksibilitas lebih (halaman landing kustom atau webhook secret), Anda dapat menggunakan [WebhooksServer()](/docs/huggingface_hub/v2.4.0/id/package_reference/webhooks_server#huggingface_hub.WebhooksServer) secara langsung. Anda dapat mendaftarkan beberapa endpoint webhook (ke server yang sama) dengan menggunakan dekorator ini beberapa kali.

Lihat [panduan webhooks](../guides/webhooks_server) untuk tutorial langkah demi langkah tentang cara mengatur server Anda dan mendeploynya di Space.

> [!WARNING]
> `webhook_endpoint` bersifat eksperimental. API-nya dapat berubah di masa depan.

> [!WARNING]
> Anda harus menginstal `gradio` untuk menggunakan `webhook_endpoint` (`pip install --upgrade gradio`).

Contoh: Penggunaan default adalah mendaftarkan fungsi sebagai endpoint webhook. Nama fungsi akan digunakan sebagai path. Server akan dimulai secara otomatis saat keluar (yaitu di akhir skrip).

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

Penggunaan lanjutan: daftarkan fungsi sebagai endpoint webhook dan mulai server secara manual. Ini berguna jika Anda menjalankannya di notebook.

```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/v2.4.0/id/package_reference/webhooks_server#huggingface_hub.WebhookPayload) adalah struktur data utama yang berisi payload dari Webhooks. Ini adalah kelas `pydantic` yang membuatnya sangat mudah digunakan dengan FastAPI. Jika Anda meneruskannya sebagai parameter ke endpoint webhook, ia akan divalidasi dan diurai secara otomatis sebagai objek Python.

Untuk informasi lebih lanjut tentang payload webhook, Anda dapat merujuk pada [panduan](https://huggingface.co/docs/hub/webhooks#webhook-payloads) 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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_webhooks_payload.py#L94)

### DiskusiWebhookPayload[[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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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)
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/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])
```

[Sumber](https://github.com/huggingface/huggingface_hub/blob/v2.4.0/src/huggingface_hub/_webhooks_payload.py#L80)

