+
    &j=                       a  R t"0 t R t^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
HtHt ^RIHtHtHt ]
'       d   ^ RIt^ RIHt ]! 4       '       d   ^ RIHtHt ^ RIHt MR;t;ttRs] ^ k ]P2                  P5                  R	4      RJ t] ! R
 R4      4       t]RR R ll4       tR R ltR R ltR R lt R R lt!R# )zSContains `WebhooksServer` and `webhook_endpoint` to create a webhook server easily.NCallable)wraps)TYPE_CHECKINGAnyOptional)experimentalis_fastapi_availableis_gradio_availableRequest)FastAPIr   )JSONResponseSPACE_IDc                      a a ] tR t^*t oRtV3R lV 3R lltRV3R lR lltRV3R lR lltRV3R lR	 lltV3R
 lR lt	Rt
VtV ;t# )WebhooksServera  
The [`WebhooksServer`] class lets you create an instance of a Gradio app that can receive Huggingface webhooks.
These webhooks can be registered using the [`~WebhooksServer.add_webhook`] decorator. Webhook endpoints are added to
the app as a POST endpoint to the FastAPI router. Once all the webhooks are registered, the `launch` method has to be
called to start the app.

It is recommended to accept [`WebhookPayload`] as the first argument of the webhook function. It is a Pydantic
model that contains all the information about the webhook event. The data will be parsed automatically for you.

Check out the [webhooks guide](../guides/webhooks_server) for a step-by-step tutorial on how to set up your
WebhooksServer and deploy it on a Space.

> [!WARNING]
> `WebhooksServer` is experimental. Its API is subject to change in the future.

> [!WARNING]
> You must have `gradio` installed to use `WebhooksServer` (`pip install --upgrade gradio`).

Args:
    ui (`gradio.Blocks`, optional):
        A Gradio UI instance to be used as the Space landing page. If `None`, a UI displaying instructions
        about the configured webhooks is created.
    webhook_secret (`str`, optional):
        A secret key to verify incoming webhook requests. You can set this value to any secret you want as long as
        you also configure it in your [webhooks settings panel](https://huggingface.co/settings/webhooks). You
        can also set this value as the `WEBHOOK_SECRET` environment variable. If no secret is provided, the
        webhook endpoints are opened without any security.

Example:

    ```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()
    ```
c                   < V ^8  d   QhRR/# )   returnr    )format__classdict__s   "x/Users/jameslopez/projects/CWCArchive/cwc-podcast/.venv/lib/python3.14/site-packages/huggingface_hub/_webhooks_server.py__annotate__WebhooksServer.__annotate__[   s     $ $)9 $    c                   < \        4       '       g   \        R 4      h\        4       '       g   \        R4      h\        SV `  V 4      # )zjYou must have `gradio` installed to use `WebhooksServer`. Please run `pip install --upgrade gradio` first.zlYou must have `fastapi` installed to use `WebhooksServer`. Please run `pip install --upgrade fastapi` first.)r
   ImportErrorr	   super__new__)clsargskwargs	__class__s   &*,r   r   WebhooksServer.__new__[   sL    "$$  $%%  ws##r   c                F   < V ^8  d   QhRS[ R,          RS[R,          RR/# )r   ui	gr.Blockswebhook_secretNr   )r   str)r   r   s   "r   r   r   h   s2     	3 	3[!	3 d
	3 
		3r   c                    Wn         T;'       g    \        P                  ! R 4      V n        / V n        \        V P                  4       R# )WEBHOOK_SECRETN)_uiosgetenvr(   registered_webhooks_warn_on_empty_secret)selfr&   r(   s   &&&r   __init__WebhooksServer.__init__h   s9    
 ,KK		:J0K8: d112r   c                4   < V ^8  d   QhRS[ R,          RS[/# r   pathNr   r)   r   )r   r   s   "r   r   r   s   s     ) )d
 )h )r   c                   a a \        S4      '       d   S P                  4       ! S4      # \        \        P                  4      VV 3R l4       pV# )a  
Decorator to add a webhook to the [`WebhooksServer`] server.

Args:
    path (`str`, optional):
        The URL path to register the webhook function. If not provided, the function name will be used as the
        path. In any case, all webhooks are registered under `/webhooks`.

Raises:
    ValueError: If the provided path is already registered as a webhook.

Example:
    ```python
    from huggingface_hub import WebhooksServer, WebhookPayload

    app = WebhooksServer()

    @app.add_webhook
    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
            ...

    app.launch()
```
c                     < V ^ ,          pRS;'       g    VP                   P                  R4       2pVSP                  9   d   \        RV R24      hVSP                  V&   R# )    z
/webhooks//zWebhook z already exists.N)__name__stripr/   
ValueError)r!   r"   funcabs_pathr6   r1   s   *,  r   _inner_post/WebhooksServer.add_webhook.<locals>._inner_post   sc    7D#T%:%:T]]$A$A#$F#GHH4333 8H:5E!FGG15D$$X.r   )callableadd_webhookr   r   post)r1   r6   rA   s   ff r   rD   WebhooksServer.add_webhooks   sG    8 D>>##%d++ 
w||		6 
	6 r   c                *   < V ^8  d   QhRS[ RS[RR/# )r   prevent_thread_locklaunch_kwargsr   N)boolr   )r   r   s   "r   r   r      s#     " "$ " "QU "r   c                $  a	 V P                   ;'       g    V P                  4       pVP                  R\        4       VP                  ! RRR/VB w  V n         pV P                  P                  4        FJ  w  rVV P                  e   \        W`P                  R7      pV P
                  P                  V4      ! V4       KL  	  \        P                  P                  R4      pVe
   RV,           MVP                  ;'       g    VP                  o	S	f   \!        R4      hS	P#                  R	4      o	R
pVRRP%                  V	3R lV P                   4       4      ,           ,          pVR,          p\'        V4       V'       g   VP)                  4        R# R# )zLaunch the Gradio app and register webhooks to the underlying FastAPI server.

Input parameters are forwarded to Gradio when launching the app.
sharerH   TNr(   
SPACE_HOSTzhttps://zWCannot find the URL of the app. Please provide a valid `ui` or update `gradio` version.r;   z/
Webhooks are correctly setup and ready to use:
c              3   2   <"   T F  pR S V 2x  K  	  R# 5i)z	  - POST Nr   ).0webhookurls   & r   	<genexpr>(WebhooksServer.launch.<locals>.<genexpr>   s     #gNf7iuWI$>Nfs   zG
Go to https://huggingface.co/settings/webhooks to setup your webhooks.r   )r,   _get_default_ui
setdefault	_is_locallaunchfastapi_appr/   itemsr(   _wrap_webhook_to_check_secretrE   r-   environget	share_url	local_urlr>   r=   joinprintblock_thread)
r1   rH   rI   r&   _r6   r?   
space_hostmessagerS   s
   &&,      @r   rY   WebhooksServer.launch   sH   
 XX//--/
 	  )4!#!Ut!U}!U!Q 2288:JD"".4TJ]J]^ !!$'- ; ZZ^^L1
)3)?j:%bllFbFbVXVbVb;vwwiinD4$))#gdNfNf#gggg]]g"OO #r   c                   < V ^8  d   QhRR/# )r   r   r'   r   )r   r   s   "r   r   r      s       r   c           
        ^ RI pVP                  ! 4       ;_uu_ 4       pVP                  ! R4       VP                  ! R4       VP                  ! \        V P                  4       R2R,           RP                  R V P                  P                  4        4       4      ,           4       VP                  ! \        '       d   R	MR4       RRR4       V#   + '       g   i     X# ; i)
zLDefault UI if not provided (lists webhooks and provides basic instructions).Nu)   # This is an app to process 🤗 WebhooksaT  Webhooks are a foundation for MLOps-related features. They allow you to listen for new changes on specific repos or to all repos belonging to particular set of users/organizations (not just your repos, but any repo). Check out this [guide](https://huggingface.co/docs/hub/webhooks) to get to know more about webhooks on the Huggingface Hub.z webhook(s) are registered:z

z
 c              3   `   "   T F$  w  rR V R\        VP                  V4       R2x  K&  	  R# 5i)z- [z]()N)_get_webhook_doc_urlr<   )rQ   webhook_pathrR   s   &  r   rT   1WebhooksServer._get_default_ui.<locals>.<genexpr>   s:      1Q- ,r*>w?O?OQ]*^)__`a1Qs   ,.z
This app is running on a Space. You can find the corresponding URL in the options menu (top-right) > 'Embed the Space'. The URL looks like 'https://{username}-{repo_name}.hf.space'.zGo to https://huggingface.co/settings/webhooks to setup your webhooks.
You app is running locally. Please look at the logs to check the full URL you need to set.)gradioBlocksMarkdownlenr/   ra   r[   rX   )r1   grr&   s   &  r   rV   WebhooksServer._get_default_ui   s    YY[[BKKCDKKD KKt//011LM** 151I1I1O1O1Q  KK 9qv! 2 	3 [2 	s   B)CC"	)r,   rZ   r/   r(   )NNN)F)r<   
__module____qualname____firstlineno____doc__r   r2   rD   rY   rV   __static_attributes____classdictcell____classcell__)r#   r   s   @@r   r   r   *   sD     -^$ $	3 	3) )V" "H  r   r   c                >    V ^8  d   QhR\         R,          R\        /# r5   r7   )r   s   "r   r   r      s"     J J3: J Jr   c                   a  \        S 4      '       d   \        4       ! S 4      # \        \        P                  4      R V 3R ll4       pV# )a  Decorator to start a [`WebhooksServer`] and register the decorated function as a webhook endpoint.

This is a helper to get started quickly. If you need more flexibility (custom landing page or webhook secret),
you can use [`WebhooksServer`] directly. You can register multiple webhook endpoints (to the same server) by using
this decorator multiple times.

Check out the [webhooks guide](../guides/webhooks_server) for a step-by-step tutorial on how to set up your
server and deploy it on a Space.

> [!WARNING]
> `webhook_endpoint` is experimental. Its API is subject to change in the future.

> [!WARNING]
> You must have `gradio` installed to use `webhook_endpoint` (`pip install --upgrade gradio`).

Args:
    path (`str`, optional):
        The URL path to register the webhook function. If not provided, the function name will be used as the path.
        In any case, all webhooks are registered under `/webhooks`.

Examples:
    The default usage is to register a function as a webhook endpoint. The function name will be used as the path.
    The server will be started automatically at exit (i.e. at the end of the 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.
    ```

    Advanced usage: register a function as a webhook endpoint and start the server manually. This is useful if you
    are running it in a 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()
    ```
c                0    V ^8  d   QhR\         R\         /# )r   r?   r   r   )r   s   "r   r   &webhook_endpoint.<locals>.__annotate__  s      X ( r   c                   <a \        4       oSP                  S4      ! V 4       \        SP                  4      ^8X  d!   \        P
                  ! SP                  4       \        SP                  4      V3R l4       pWn        V # )   c                  h   < \         P                  ! S P                  4       S P                  4        R # ru   )atexit
unregisterrY   )apps   r   _launch_now5webhook_endpoint.<locals>._inner.<locals>._launch_now$  s      cjj)JJLr   )_get_global_apprD   rr   r/   r   registerrY   r   )r?   r   r   r6   s   & @r   _inner webhook_endpoint.<locals>._inner  sf    d#s&&'1,OOCJJ'	szz		 
	
 "r   )rC   webhook_endpointr   r   rD   )r6   r   s   f r   r   r      sA    l ~~!$''
>%%& '  Mr   c                $    V ^8  d   QhR\         /# )r   r   )r   )r   s   "r   r   r   0  s       r   c                  2    \         f   \        4       s \         # ru   )_global_appr   r   r   r   r   r   0  s    $&r   c                6    V ^8  d   QhR\         R,          RR/# )r   r(   Nr   r)   )r   s   "r   r   r   7  s     6 6#* 6 6r   c                 j    V f$   \        R4       \        R4       \        R4       R # \        R4       R # )NzZWebhook secret is not defined. This means your webhook endpoints will be open to everyone.zTo add a secret, set `WEBHOOK_SECRET` as environment variable or pass it at initialization: 
	`app = WebhooksServer(webhook_secret='my_secret', ...)`zpFor more details about webhook secrets, please refer to https://huggingface.co/docs/hub/webhooks#webhook-secret.z$Webhook secret is correctly defined.)rb   rM   s   &r   r0   r0   7  s:    jkJ	
 	H	

 	45r   c                <    V ^8  d   QhR\         R\         R\         /# )r   webhook_namerm   r   r   )r   s   "r   r   r   F  s&     W Ws W# W# Wr   c                P    RV ,           VP                  RR4      ,           R,           # )z@Returns the anchor to a given webhook in the docs (experimental)z/docs#/default/r;   rd   _post)replace)r   rm   s   &&r   rl   rl   F  s$    |+l.B.B3.LLwVVr   c                <    V ^8  d   QhR\         R\        R\         /# )r   r?   r(   r   )r   r)   )r   s   "r   r   r   K  s!     - - -# -( -r   c                r  a aa \         P                  ! S 4      o\        S 4      R V VV3R ll4       pRSP                  9  dt   SP	                  \         P
                  ! R\         P
                  P                  \        R7      3\        SP                  P                  4       4      ,           R7      Vn
        V# )a  Wraps a webhook function to check the webhook secret before calling the function.

This is a hacky way to add the `request` parameter to the function signature. Since FastAPI based itself on route
parameters to inject the values to the function, we need to hack the function signature to retrieve the `Request`
object (and hence the headers). A far cleaner solution would be to use a middleware. However, since
`fastapi==0.90.1`, a middleware cannot be added once the app has started. And since the FastAPI app is started by
Gradio internals (and not by us), we cannot add a middleware.

This method is called only when a secret has been defined by the user. If a request is sent without the
"x-webhook-secret", the function will return a 401 error (unauthorized). If the header is sent but is incorrect,
the function will return a 403 error (forbidden).

Inspired by https://stackoverflow.com/a/33112180.
c                $    V ^8  d   QhR\         /# )r   requestr   )r   s   "r   r   3_wrap_webhook_to_check_secret.<locals>.__annotate__]  s     " "w "r   c                 *  <"   V P                   P                  R 4      pVf   \        RR/RR7      # VS8w  d   \        RR/RR7      # RSP                  9   d   WR&   \        P
                  ! S4      '       d   S! R	/ VB G Rj  xL
 # S! R	/ VB #  L5i)
zx-webhook-secretNerrorz x-webhook-secret header not set.i  )status_codezInvalid webhook secret.i  r   r   )headersr^   r   
parametersinspectiscoroutinefunction)r   r"   request_secretr?   initial_sigr(   s   &, r   _protected_func6_wrap_webhook_to_check_secret.<locals>._protected_func\  s      ,,-?@!*L M[^__^+*C DRUVV ... '9 &&t,,''>&>! (s   A5B9BBBr   )namekind
annotation)r   )r   	signaturer   r   r   	ParameterPOSITIONAL_OR_KEYWORDr   tuplevalues__signature__)r?   r(   r   r   s   ff @r   r\   r\   K  s     ##D)K
4[" " "$ ...(3(;(;!!yw7H7H7^7^krs K**11345 )< )
% r   c                N    V ^8  d   Qh/ ^ \         9   d   \        R,          ;R&   # )r   r   r   )__conditional_annotations__r   )r   s   "r   r   r      s!     Y Y0 / .X&' .1 Zr   ru   )#r   ry   r   r   r-   collections.abcr   	functoolsr   typingr   r   r   utilsr   r	   r
   ro   rs   fastapir   r   fastapi.responsesr   r   r]   r^   rX   r   r   r   r0   rl   r\   r   )r   s   @r   <module>r      s    Z   	 $  / / J J (. (,+G+g +/ .JJNN:&$.	 t t tn J JZ6W
-r   