ó
    ‚¤j<Ž  ã                  ó   • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
Jr  SSKJrJr  \R                  " \5      r\R$                  S 5       r1 Skr " S	 S
5      rS*S jrS+S jrS,S jrS-S jrS.S jrS/S jrS0S jrS1S jr          S2S jrS3S jr " S S\ 5      r! " S S5      r"S4S jr#SSSSSSSSSSSS SS!.r$S5S" jr%S6S# jr&S7S$ jr'S8S% jr(        S9S& jr) " S' S(5      r*      S:S) jr+g);uß  Server-side execution of `gr.Workflow` graphs, for exposing each workflow
subject (output node) as a regular Gradio API endpoint.

The canvas executes a workflow client-side (see
`js/workflowcanvas/workflow/workflow-executor.ts`). This module ports that
orchestration to Python so a workflow can be run headlessly â€” once per subject's
upstream sub-DAG â€” and wired into Gradio's normal `/info` + `/call` machinery.

Pure graph helpers (parsing, topo-sort, subgraph extraction, free-input
detection) have no Gradio/network dependencies and are unit-tested directly. The
executor calls back into the workflow server-functions (`call_space`,
`call_model`, `call_fn`, `fetch_dataset`) which are injected so they can be
mocked in tests.
é    )ÚannotationsN)Údeque)ÚCallable)ÚAnyÚOptionalc              #  ó¢   #   • SSK Jn  UR                  UR                  p2Xl        Xl         Sv •  X!l        X1l        g! X!l        X1l        f = f7f)u3  Make `blocks` the active render target so components/events register into
it, without entering `Blocks.__exit__` â€” which would re-run
`attach_load_events` (duplicating the canvas's callable-`value` load event)
and recreate the running `App`. We only need the render-context primitives,
restored afterward.r   )ÚContextN)Úgradio.contextr	   Ú
root_blockÚblock)Úblocksr	   Ú	prev_rootÚ
prev_blocks       Ú¡C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\gradio/workflow_api.pyÚ_active_blocksr      sG   é € õ 'à#×.Ñ.°·±ˆzØÔØ„Mð#Ûà&ÔØ"�øð 'ÔØ"�üs   ‚*A­> ±A¾AÁA>   ÚfileÚaudioÚimageÚvideoÚgalleryÚmodel3dc                  ó^   • \ rS rSrSrS
S jr\SS j5       r\SS j5       r	SS jr
SS jrSrg	)ÚWorkflowGraphé<   zìParsed, indexed view of a schema-v2 workflow dict.

Holds the three role collections (references / operators / subjects) plus a
flat id index and edge adjacency, so the executor and endpoint registration
don't re-scan lists repeatedly.
c           	     óX  • [        U[        5      (       d  [        S5      eXl        UR	                  S5      =(       d    SU l        U R                  US5      U l        U R                  US5      U l        U R                  US5      U l	        U R                  US5      U l
        0 U l        0 U l        SU R                  4S	U R                  4S
U R                  44 H¸  u  p#[        U5       H¤  u  pE[        U[        5      (       d  [        SU SU S35      eUR	                  S5      n[        U[        5      (       a  U(       d  [        SU SU S35      eX`R                  ;   a  [        SU 35      eXPR                  U'   X R                  U'   M¦     Mº     [        U R                  5       H}  u  pG[        U[        5      (       d  [        SU S35      eS HN  n[        UR	                  U5      [        5      (       a  UR	                  U5      (       a  M?  [        SU SU 35      e   M     g )Nz$Workflow graph must be a JSON objectÚnameÚWorkflowÚ
referencesÚ	operatorsÚsubjectsÚedgesÚ	referenceÚoperatorÚsubjectz	Workflow z
 at index z must be an objectÚidz is missing an idz%Workflow contains duplicate node id: zWorkflow edge at index )Úfrom_node_idÚfrom_port_idÚ
to_node_idÚ
to_port_idz is missing )Ú
isinstanceÚdictÚ
ValueErrorÚrawÚgetr   Ú_list_fieldr   r   r    r!   Ú
node_by_idÚ
role_by_idÚ	enumerateÚstr)	ÚselfÚdataÚroleÚnodesÚiÚnÚnode_idÚeÚkeys	            r   Ú__init__ÚWorkflowGraph.__init__D   së  € Ü˜$¤×%Ñ%ÜÐCÓDÐDØŒØŸ™ &Ó)×7¨ZˆŒ	Ø&*×&6Ñ&6°t¸\Ó&JˆŒØ%)×%5Ñ%5°d¸KÓ%HˆŒØ$(×$4Ñ$4°T¸:Ó$FˆŒØ!%×!1Ñ!1°$¸Ó!@ˆŒ
à+-ˆŒØ*,ˆŒà˜$Ÿ/™/Ð*Ø˜Ÿ™Ð(Ø˜Ÿ™Ð&ó
‰KˆDô
 " %Ö(‘�Ü! !¤T×*Ñ*Ü$ y°°°jÀÀÐCUÐ%VÓWÐWØŸ%™% ›+�Ü! '¬3×/Ñ/¶wÜ$ y°°°jÀÀÐCTÐ%UÓVÐVØŸo™oÓ-Ü$Ð'LÈWÈIÐ%VÓWÐWØ+,—‘ Ñ(Ø+/—‘ Ó(ó )ñ
ô  ˜dŸj™jÖ)‰DˆAÜ˜a¤×&Ñ&Ü Ð#:¸1¸#Ð=OÐ!PÓQÐQÛS�Ü! !§%¡%¨£*¬c×2Ñ2¸!¿%¹%À¿*»*Ü$Ð'>¸q¸cÀÈcÈUÐ%SÓTÐTó Tò *ó    c                ó”   • U R                  U5      =(       d    / n[        U[        5      (       d  [        SU S35      e[        U5      $ )NzWorkflow field 'z' must be a list)r.   r*   Úlistr,   )r5   r<   Úvalues      r   r/   ÚWorkflowGraph._list_fieldg   sA   € à—‘˜“×# ˆÜ˜%¤×&Ñ&ÜÐ/°¨uÐ4DÐEÓFÐFÜ�E‹{Ðr?   c                ó
  • U(       d  g  [         R                  " U5      n[	        U[
        5      (       d  g UR                  S5      S:w  a  g  U " U5      $ ! [         R                  [        4 a     g f = f! [         a     g f = f)NÚschema_versionÚ2)ÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorr*   r+   r.   r,   )ÚclsÚtextr5   s      r   Ú	from_jsonÚWorkflowGraph.from_jsonn   s…   € æØð	Ü—:’:˜dÓ#ˆDô ˜$¤×%Ñ%ØØ�8‰8Ð$Ó%¨Ó,ð ð	Ù�t“9Ðøô ×$Ñ$¤iÐ0ó 	Ùð	ûô ó 	Ùð	ús#   ŠA ÁA5 ÁA2Á1A2Á5
BÂBc                óB   ^• [        U4S jU R                   5       5      $ )Nc              3  óJ   >#   • U  H  oR                  S 5      T:H  v •  M     g7f)r(   N©r.   )Ú.0r;   r:   s     €r   Ú	<genexpr>Ú-WorkflowGraph.has_incoming.<locals>.<genexpr>‚   s   øé € ÐFº:°a—5‘5˜Ó&¨'Ö1º:ùs   ƒ #)Úanyr!   )r4   r:   s    `r   Úhas_incomingÚWorkflowGraph.has_incoming�   s   ø€ ÜÔF¸4¿:º:ÓFÓFÐFr?   c                óŠ   • U R                    H3  nUR                  S5      U:X  d  M  UR                  S5      U:X  d  M1  Us  $    g )Nr(   r)   )r!   r.   )r4   r:   Úport_idr;   s       r   Úincoming_edgeÚWorkflowGraph.incoming_edge„   s;   € Ø—”ˆAØ�u‰u�\Ó" gÕ-°!·%±%¸Ó2EÈÕ2PØ’ñ ð r?   )r!   r   r0   r   r-   r   r1   r    N)r5   údict[str, Any])r5   r\   r<   r3   Úreturnú
list[dict])rL   ú
str | Noner]   zWorkflowGraph | None)r:   r3   r]   Úbool)r:   r3   rY   r3   r]   zdict | None)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r=   Ústaticmethodr/   ÚclassmethodrM   rV   rZ   Ú__static_attributes__© r?   r   r   r   <   sA   † ñô!UðF óó ðð óó ðô$G÷r?   r   c                óŠ  • [        U 5      n[        R                  U S5      nU  Vs0 s H  oD/ _M     nnU HQ  nUR                  S5      UR                  S5      p‡Xr;   d  M+  X‚;   d  M2  X8==   S-  ss'   XW   R	                  U5        MS     [        U  Vs/ s H  oCU   S:X  d  M  UPM     sn5      n	/ n
U	(       a\  U	R                  5       nU
R	                  U5        X[    H*  nX<==   S-  ss'   X<   S:X  d  M  U	R	                  U5        M,     U	(       a  M\  [        U
5      [        U 5      :w  a  [        S5      eU
$ s  snf s  snf )zˆKahn's algorithm over the given node ids (edges referencing nodes outside
the set are ignored). Mirrors `topoSort` in workflow-graph.ts.r   r&   r(   é   z0Workflow contains a cycle and cannot be executed)	Úsetr+   Úfromkeysr.   Úappendr   ÚpopleftÚlenr,   )Únode_idsr!   ÚidsÚindegÚnidÚadjr;   ÚaÚbÚqueueÚoutr9   Úms                r   Ú	topo_sortr{   ‹   s  € ô ˆh‹-€CÜ�M‰M˜( AÓ&€EÙ4<Ó =²H¨S b¢±H€CÐ =ÛˆØ�u‰u�^Ó$ a§e¡e¨LÓ&9ˆ1Ø�8˜�Ø‹H˜‰M‹HØ‰F�M‰M˜!Öñ	 ô
 ¡(Ó>¢(˜3°C©j¸A©o—3¡(Ñ>Ó?€EØ€CÞ
Ø�M‰M‹OˆØ�
‰
�1ŒØ”ˆAØ‹H˜‰M‹HØ‰x˜1�}Ø—‘˜Q–ñ ÷ ˆ%ô ˆ3ƒx”3�x“=Ó ô ÐKÓLÐLØ€Jùò) !>ùò ?s   ¦D;ÂE Â$E r3   c                óN  • U1n[        U/5      nU(       aŽ  UR                  5       nU R                   He  nUR                  S5      nUR                  S5      U:X  d  M+  X`R                  ;   d  M<  Xb;  d  MC  UR                  U5        UR                  U5        Mg     U(       a  MŽ  U$ )zmAll nodes transitively feeding `target_id` (inclusive). Mirrors
`buildUpstreamSubgraph` in workflow-graph.ts.r&   r(   )r   ro   r!   r.   r0   Úaddrn   )ÚgraphÚ	target_idÚincluderx   Úcurr;   Úsrcs          r   Úupstream_node_idsrƒ   §   sŒ   € ð ˆk€GÜ�9�+Ó€EÞ
Ø�m‰m‹oˆØ—”ˆAØ—%‘%˜Ó'ˆCð —‘�lÓ# sÕ*Ø×+Ñ+Õ+ØÕ&à—‘˜CÔ Ø—‘˜SÖ!ñ ÷ ˆ%ð  €Nr?   c           
     óŽ  • / nU R                    H²  nUS   U;  a  M  U R                  US   5      (       a  M)  UR                  S5      =(       d    / nU(       a  US   OSnU=(       d    0 R                  S5      =(       d    UR                  S5      =(       d    SnUR                  UUUUR                  SS	5      S
.5        M´     U$ )u>  The reference nodes in the subgraph that the caller must supply (no
incoming edge â†’ user-provided input). Returned in a stable order (graph
declaration order) so endpoint parameters are deterministic.

Each entry: `{"node": <reference dict>, "port": <output port dict>,
"type": <port type>, "label": <node label>}`.
r%   Úoutputsr   NÚtypeÚ
asset_typerL   ÚlabelÚ )ÚnodeÚportr†   rˆ   )r   rV   r.   rn   )r~   Úsubgraph_idsÚresultÚrefr…   r‹   Ú	port_types          r   Úfree_inputsr�   ¿   s¶   € ð €FØ×ÔˆØˆt‰9˜LÓ(ÙØ×Ñ˜c $™i×(Ñ(ÙØ—'‘'˜)Ó$×*¨ˆÞ$ˆw�qŠz¨$ˆØ—Z˜R×$Ñ$ VÓ,×O°·±¸Ó0E×OÈˆ	Ø�‰àØØ!ØŸ™ ¨"Ó-ñ	ö	
ñ  ð  €Mr?   r+   c                óâ   • U R                  S5      =(       d    / nU(       a5  US   R                  S5      =(       d    U R                  S5      =(       d    S$ U R                  S5      =(       d    S$ )NÚinputsr   r†   r‡   rL   rQ   )r$   r’   s     r   Úsubject_output_typer“   Û   sR   € Ø�[‰[˜Ó"×( b€FÞØ�a‰y�}‰}˜VÓ$×K¨¯©°LÓ(A×KÀVÐKØ�;‰;�|Ó$×.¨Ð.r?   c                óÔ  ^
• U R                    Vs0 s H  oU_M     snm
SU
4S jjnU R                   HE  nUR                  S5      UR                  S5      pTUT
;   d  M,  UT
;   d  M4  U" U5      T
U" U5      '   MG     0 n/ nU R                   H;  nU" US   5      n	X–;  a  / Xi'   UR	                  U	5        Xi   R	                  U5        M=     U V	s/ s H  o–U	   PM	     sn	$ s  snf s  sn	f )uà  Group subjects by weakly-connected component (edges undirected), mirroring
`countSubgraphs` in workflow-graph.ts. Each component is one independent
pipeline, so all of its outputs become a *single* API endpoint that returns
a tuple â€” matching how a Gradio Space with multiple outputs exposes one
endpoint, not one per output.

Groups are ordered by the declaration order of their first subject; subjects
within a group keep declaration order (this fixes the output tuple order).c                ó|   >• U nTU   U:w  a  TU   nTU   U:w  a  M  TU    U:w  a  UTU    sTU '   n TU    U:w  a  M  U$ ©Nri   )ÚxÚrootÚparents     €r   ÚfindÚsubject_groups.<locals>.findí   s]   ø€ ØˆØ�T‰l˜dÓ"Ø˜$‘<ˆDð �T‰l˜dÕ"à�Q‰i˜4ÓØ ¨¡ˆLˆF�1‰I�qð �Q‰i˜4Õàˆr?   r&   r(   r%   )r—   r3   r]   r3   )r0   r!   r.   r    rn   )r~   rt   rš   r;   rv   rw   ÚgroupsÚorderr$   r˜   r™   s             @r   Úsubject_groupsrž   â   sä   ø€ ð 38×2BÒ2BÓCÒ2B¨3 3šhÑ2BÑC€F÷ð �[Œ[ˆØ�u‰u�^Ó$ a§e¡e¨LÓ&9ˆ1Ø��;˜1 �;Ù" 1›gˆF‘4˜“7‹Oñ ð
 %'€FØ€EØ—>”>ˆÙ�G˜D‘MÓ"ˆØÓØˆF‰LØ�L‰L˜ÔØ‰×Ñ˜GÖ$ñ "ñ &+Ó+¢U˜T�4ŒL¡UÑ+Ð+ùò/ Dùò. ,s   �C ÃC%c                ó`   • [        5       nU H  nU[        XS   5      -  nM     [        X5      $ )z×The free inputs feeding a subject group: the union of each subject's
upstream subgraph, deduped and returned in graph declaration order (so a
reference shared by two outputs in the group becomes a single parameter).r%   )rl   rƒ   r�   )r~   ÚgroupÚsub_idsr$   s       r   Úgroup_free_inputsr¢     s4   € ô ›€GÛˆØÔ$ U°D©MÓ:Ñ:Šñ ä�uÓ&Ð&r?   c                ó†   • U c  gU[         ;   a2  [        U [        5      (       a  U $ [        U [        5      (       a  SU 0$ U $ U $ )a  Convert an endpoint input value into the shape the workflow server
functions expect. Media ports arrive as a local filepath (from the output
component) or a FileData-like dict; wrap a bare path as `{"path": ...}` so
`call_space` runs it through `handle_file`. Scalars pass through.NÚpath)ÚMEDIA_PORT_TYPESr*   r+   r3   )rB   r�   s     r   Ú_to_argr¦     sH   € ð
 �}ØØÔ$Ó$Ü�eœT×"Ñ"ØˆLÜ�eœS×!Ñ!Ø˜E�?Ð"ØˆØ€Lr?   r`   c                ó¼  • U c  gU[         ;   aN  [        U [        5      (       a  U R                  S5      $ [        U [        5      =(       a    SU ;   =(       d    SU ;   $ US;   a  [        U [        5      $ US:X  a2  [        U [
        [        45      =(       a    [        U [        5      (       + $ US:X  a  [        U [        5      $ US:X  a  [        U [        [        45      $ g	)
NF)zhttp://zhttps://zblob:zdata:Ú/r¤   Úurl)rL   ÚmarkdownÚnumberÚbooleanrG   T)	r¥   r*   r3   Ú
startswithr+   ÚintÚfloatr`   rA   )Úitemr�   s     r   Ú_output_matches_port_typer±   $  s¾   € Ø�|ØØÔ$Ó$Ü�dœC× Ñ Ø—?‘?Ð#QÓRÐRÜ˜$¤Ó%×K¨6°T©>×+J¸UÀd¹]ÐKØÐ(Ó(Ü˜$¤Ó$Ð$Ø�HÓÜ˜$¤¤e Ó-×L´jÀÄtÓ6LÔ2LÐLØ�IÓÜ˜$¤Ó%Ð%Ø�FÓÜ˜$¤¤t Ó-Ð-Ør?   c                óž  • U R                  S5      n[        U[        5      (       a  U[        U5      :  a  X$   OSnO-US:X  a  [        U5      S:”  a  SnOU[        U5      :  a  X!   OSnUb"  [	        XPR                  SS5      5      (       a  U$ U H'  n[	        X`R                  SS5      5      (       d  M%  Us  $    Ub  U$ U(       a  US   $ S$ )zÐSelect which element of a multi-output response feeds a given output
port. Mirrors `pick_response_item` in workflow-executor.ts: honor an
explicit `output_index`, else position, else shape-match by port type.Úoutput_indexNrk   r†   r‰   r   )r.   r*   r®   rp   r±   )r‹   Ú
port_indexÚoutput_dataÚtotal_portsr³   Úprimaryr°   s          r   Ú_pick_response_itemr¸   6  sË   € ð —8‘8˜NÓ+€LÜ�,¤×$Ñ$Ø/;¼cÀ+Ó>NÓ/N�+Ò+ÐTX‰Ø	˜Ó	œc +Ó.°Ó2Ø‰à-7¼#¸kÓ:JÓ-J�+Ò)ÐPTˆàÑÔ8¸Ç(Á(È6ÐSUÓBV×WÑWØˆãˆÜ$ T¯8©8°F¸BÓ+?×@Ó@ØŠKñ ð ÑØˆÞ(ˆ;�q‰>Ð2¨dÐ2r?   c                ó”   • [        U [        5      (       a2  U R                  S5      =(       d    U R                  S5      =(       d    U $ U $ )uL  Normalize a value coming out of the executor for the endpoint's output
component. File dicts â†’ local path (preferred) or url; scalars pass
through. The internal `{path,url,is_file}` shape (from `call_space`) is
consumable by downstream operators as-is, so this only runs for the final
subject value handed to the output component.r¤   r©   )r*   r+   r.   )rB   s    r   Ú_from_outputrº   P  s8   € ô �%œ×ÑØ�y‰y˜Ó ×= E§I¡I¨eÓ$4×=¸Ð=Ø€Lr?   c                  ó   • \ rS rSrSrSrg)ÚWorkflowExecutionErrori`  zaRaised when a node in the workflow fails; the message is suitable for
surfacing to an API caller.ri   N)ra   rb   rc   rd   re   rh   ri   r?   r   r¼   r¼   `  s   † ô#r?   r¼   c                  ó  • \ rS rSrSrSS jr  S         SS jjr  S         SS jjr      SS jr        SS jr	        SS	 jr
SS
 jrSS jrSS jr        SS jrSS jrSS jrSS jrSS jrSrg)ÚWorkflowExecutorie  uH  Runs a subject's upstream sub-DAG server-side.

`callers` maps operator kinds to the workflow server-functions, each with
the signature `(data: list, request, token) -> str` (a JSON string, either
a list of outputs or an `{"error": ...}` dict) â€” exactly the existing
`call_space` / `call_model` / `call_fn` / `fetch_dataset`.
c                ó   • Xl         X l        g r–   )r~   Úcallers)r4   r~   rÀ   s      r   r=   ÚWorkflowExecutor.__init__n  s   € ØŒ
Ø�r?   Nc                ó0   • U R                  U/X#U5      S   $ )u„   Execute the subgraph feeding `subject_id`. `inputs` maps free-input
reference node id â†’ value. Returns the subject's output value.r   )Úrun_many)r4   Ú
subject_idr’   ÚrequestÚtokens        r   ÚrunÚWorkflowExecutor.runr  s   € ð �}‰}˜j˜\¨6¸EÓBÀ1ÑEÐEr?   c                óv  • U R                   nU H0  nUR                  R                  U5      S:w  d  M$  [        SU 35      e   [	        5       nU H  nU[        XV5      -  nM     [        [        U5      UR                  5      n0 n	X0l	        X@l
        U H  n
U R                  X©U5        M     / nU H…  nUR                  U   R                  S5      =(       d    / nU(       d  UR                  S5        MD  U	R                  U0 5      R                  US   S   5      nUR                  [        U5      5        M‡     U$ )a  Execute the combined subgraph feeding all `subject_ids` in a single
pass and return one output value per subject, in order. Nodes shared
between outputs (e.g. an operator with two outputs wired to two subjects)
run exactly once rather than once per subject.r$   zNo such workflow output: r’   Nr   r%   )r~   r1   r.   r¼   rl   rƒ   r{   rA   r!   Ú_requestÚ_tokenÚ_execute_noder0   rn   rº   )r4   Úsubject_idsr’   rÅ   rÆ   r~   Úsidr¡   r�   Údata_mapr:   r…   Úin_portsrB   s                 r   rÃ   ÚWorkflowExecutor.run_many}  s"  € ð —
‘
ˆÛˆCØ×Ñ×#Ñ# CÓ(¨IÕ5Ü,Ð/HÈÈÐ-NÓOÐOñ ô  ›EˆÛˆCØÔ(¨Ó4Ñ4ŠGñ äœ$˜w›-¨¯©Ó5ˆØ.0ˆàŒØŒãˆGØ×Ñ˜w°&Ö9ñ ð  ˆÛˆCØ×'Ñ'¨Ñ,×0Ñ0°Ó:×@¸bˆHÞØ—‘˜tÔ$ÙØ—L‘L  bÓ)×-Ñ-¨h°q©k¸$Ñ.?Ó@ˆEØ�N‰Nœ<¨Ó.Ö/ñ ð ˆr?   c                ó„  • U R                   n0 nUR                  S5      =(       d    /  H“  nUR                  US   US   5      nU(       a.  UR                  US   0 5      R                  US   5      XES   '   MP  UR                  S5      =(       d    0 nUR                  US   UR                  S5      5      XES   '   M•     U$ )Nr’   r%   r&   r'   r5   Údefault_value)r~   r.   rZ   )r4   rŠ   rÏ   r~   Úresolvedr‹   Úedger5   s           r   Ú_resolve_inputsÚ WorkflowExecutor._resolve_inputs¥  s¹   € ð —
‘
ˆØ#%ˆØ—H‘H˜XÓ&×,¨"Ò,ˆDØ×&Ñ& t¨D¡z°4¸±:Ó>ˆDÞØ'/§|¡|°D¸Ñ4HÈ"Ó'M×'QÑ'QØ˜Ñ(ó(�˜d™Ó$ð —x‘x Ó'×-¨2�Ø'+§x¡x°°T±
¸D¿H¹HÀ_Ó<UÓ'V�˜d™Ó$ñ -ð ˆr?   c                óÞ  • U R                   nUR                  U   nUR                  U   nUS:X  a;  UR                  U5      (       a  U R	                  XR5        g U R                  XRU5        g US:X  a  U R	                  XR5        g UR                  S5      nUS:X  a  U R                  XR5        g US:X  a  U R                  XR5        g US:X  a  U R                  XR5        g U R                  XR5        g )Nr"   r$   ÚkindÚfnÚmodelÚdataset)r~   r0   r1   rV   Ú_relayÚ_seed_inputr.   Ú_run_fnÚ
_run_modelÚ_run_datasetÚ
_run_space)r4   r:   rÏ   r’   r~   rŠ   r6   rÙ   s           r   rÌ   ÚWorkflowExecutor._execute_nodeµ  sÛ   € ð —
‘
ˆØ×Ñ Ñ(ˆØ×Ñ Ñ(ˆà�;ÓØ×!Ñ! '×*Ñ*Ø—‘˜DÔ+ð ð × Ñ  °Ô8Øà�9ÓØ�K‰K˜Ô'Øð �x‰x˜ÓˆØ�4‹<Ø�L‰L˜Õ(Ø�W‹_Ø�O‰O˜DÕ+Ø�YÓØ×Ñ˜dÕ-à�O‰O˜DÕ+r?   c                óÀ   • UR                  US   5      n0 nUR                  S5      =(       d    /  H#  n[        XFR                  SS5      5      XVS   '   M%     XRUS   '   g )Nr%   r…   r†   rL   )r.   r¦   )r4   rŠ   rÏ   r’   rB   Úbucketr‹   s          r   rÞ   ÚWorkflowExecutor._seed_inputÕ  s^   € ð —
‘
˜4 ™:Ó&ˆØ!#ˆØ—H‘H˜YÓ'×-¨2Ò-ˆDÜ!(¨·±¸ÀÓ0HÓ!IˆF˜‘:Óñ .à%��d‘Òr?   c                óò   • U R                  X5      nUR                  S5      =(       d    / n0 nU(       a<  X4S   S      nXeUS   S   '   UR                  S5      =(       d    /  H
  nXeUS   '   M     XRUS   '   g )Nr’   r   r%   r…   )rÖ   r.   )r4   rŠ   rÏ   rÔ   rÐ   rå   rB   r‹   s           r   rÝ   ÚWorkflowExecutor._relayÞ  s‚   € Ø×'Ñ'¨Ó7ˆØ—8‘8˜HÓ%×+¨ˆØ!#ˆÞØ a™[¨Ñ.Ñ/ˆEØ(-�8˜A‘;˜tÑ$Ñ%ØŸ™ Ó+×1¨rÒ1�Ø%*�t˜D‘zÓ"ñ 2à%��d‘Òr?   c                ó  • UR                  S5      =(       d    /  Hh  nUR                  S5      (       d  M  UR                  US   5      b  M2  [        SUR                  SUS   5       SUR                  SUS   5       S35      e   g )Nr’   Úrequiredr%   Ú"rˆ   z" is required by "z" but was not provided)r.   r¼   )r4   rŠ   rÔ   r‹   s       r   Ú_requireÚWorkflowExecutor._requireé  s…   € Ø—H‘H˜XÓ&×,¨"Ò,ˆDØ�x‰x˜
×#Ó#¨¯©°T¸$±ZÓ(@Ó(HÜ,Ø˜Ÿ™ ¨$¨t©*Ó5Ð6ð 7ØŸ™ ¨$¨t©*Ó5Ð6Ð6LðNóð ò -r?   c                ó¦  • U R                   R                  U5      nUc  [        SU S35      eU" X R                  U R                  5      n[
        R                  " U5      n[        U[        5      (       aC  SU;   a=  UR                  S5      =(       d    UR                  S5      =(       d    Sn[        U5      e[        U[        5      (       a  U$ U/$ )NzNo executor available for 'z' nodesÚerrorÚ
suggestionzWorkflow node failed)
rÀ   r.   r¼   rÊ   rË   rG   rH   r*   r+   rA   )r4   rÙ   r5   ÚcallerÚresult_jsonÚparsedÚmsgs          r   Ú_callÚWorkflowExecutor._callñ  s¶   € Ø—‘×!Ñ! $Ó'ˆØ‰>Ü(Ð+FÀtÀfÈGÐ)TÓUÐUÙ˜T§=¡=°$·+±+Ó>ˆÜ—’˜KÓ(ˆÜ�fœd×#Ñ#¨°6Ó(9à—
‘
˜<Ó(÷ *Ø—:‘:˜gÓ&÷*à)ð ô
 )¨Ó-Ð-Ü# F¬D×1Ñ1ˆvÐ?¸°xÐ?r?   c           	     ó¨   • 0 nUR                  S5      =(       d    / n[        U5       H   u  pg[        XvU[        U5      5      XGS   '   M"     XCUS   '   g )Nr…   r%   )r.   r2   r¸   rp   )r4   rŠ   rµ   rÏ   rå   Ú	out_portsr8   r‹   s           r   Ú_map_outputsÚWorkflowExecutor._map_outputs   sW   € ð "$ˆØ—H‘H˜YÓ'×-¨2ˆ	Ü  Ö+‰GˆAÜ!4Ø˜¤c¨)£nó"ˆF˜‘:Óñ ,ð  &��d‘Òr?   c                óx  • U R                  X5      nU R                  X5        UR                  S5      =(       d    /  Vs/ s H
  oCUS      PM     nnUR                  S5      =(       d    SnU R                  SUR                  S5      U[        R
                  " U5      /5      nU R                  XU5        g s  snf )Nr’   r%   Úendpointz/predictÚspaceÚspace_id©rÖ   rì   r.   rõ   rG   Údumpsrù   )r4   rŠ   rÏ   rÔ   ÚpÚargsrü   rµ   s           r   râ   ÚWorkflowExecutor._run_space  s£   € Ø×'Ñ'¨Ó7ˆØ�‰�dÔ%Ø+/¯8©8°HÓ+=×+CÀÐ+CÓDÒ+C a˜˜4™Ô!Ñ+CˆÐDØ—8‘8˜JÓ'×5¨:ˆØ—j‘jØ�d—h‘h˜zÓ*¨H´d·j²jÀÓ6FÐGó
ˆð 	×Ñ˜$¨XÕ6ùò Es   ¿B7c                óÀ  • U R                  X5      nU R                  X5        UR                  S5      =(       d    SnUR                  S5      nU(       ai  UR                  S5      =(       d    /  Vs0 s H  nUS   U;   d  M  US   X6S      _M     nnUR                  S5      U[        R                  " U5      S U/nOsUR                  S5      =(       d    /  Vs/ s H
  ocUS      PM     n	nUR                  S5      =(       d    Sn
UR                  S5      U
[        R                  " U	5      S U/nU R                  S	U5      nU R                  XU5        g s  snf s  snf )
NÚproviderÚautorü   r’   r%   Úmodel_idÚpipeline_tagztext-generationrÛ   )rÖ   rì   r.   rG   r   rõ   rù   )r4   rŠ   rÏ   rÔ   r  rü   r  ÚkwargsÚ	call_datar  Útagrµ   s               r   rà   ÚWorkflowExecutor._run_model  sN  € Ø×'Ñ'¨Ó7ˆØ�‰�dÔ%Ø—8‘8˜JÓ'×1¨6ˆØ—8‘8˜JÓ'ˆÞð Ÿ™ (Ó+×1¨rÐ1óâ1�AØ�T‘7˜hÑ&ó +��$‘˜ D¡'Ñ*Ò*Ù1ð ð ð —‘˜Ó$ØÜ—
’
˜6Ó"ØØð‰Ið 04¯x©x¸Ó/A×/GÀRÐ/GÓHÒ/G¨!˜Q˜t™WÔ%Ñ/GˆDÐHØ—(‘(˜>Ó*×?Ð.?ˆCØŸ™ *Ó-¨s´D·J²J¸tÓ4DÀdÈHÐUˆIØ—j‘j ¨)Ó4ˆØ×Ñ˜$¨XÕ6ùò#ùò Is   Á1EÂEÃEc                óB  • U R                  X5      nU R                  X5        UR                  S5      =(       d    /  Vs/ s H
  oCUS      PM     nnU R                  SUR                  S5      [        R
                  " U5      /5      nU R                  XU5        g s  snf )Nr’   r%   rÚ   rÿ   )r4   rŠ   rÏ   rÔ   r  r  rµ   s          r   rß   ÚWorkflowExecutor._run_fn.  sˆ   € Ø×'Ñ'¨Ó7ˆØ�‰�dÔ%Ø+/¯8©8°HÓ+=×+CÀÐ+CÓDÒ+C a˜˜4™Ô!Ñ+CˆÐDØ—j‘j ¨¯©°«¼¿
º
À4Ó8HÐ'IÓJˆØ×Ñ˜$¨XÕ6ùò Es   ¿Bc           	     ó  • U R                  X5      nUR                  S5      =(       d    Sn [        S[        U5      5      nU R                  SUR                  S5      UR                  S5      =(       d    SUR                  S5      =(       d    S[        U5      S	/5      nU(       a  US   O0 n[        U[        5      (       a  UR                  S
5      OS n[        U[        5      (       a  U(       a  US   O0 O0 n	0 n
UR                  S5      =(       d    /  HL  nU	R                  UR                  S5      5      n[        U[        5      (       a  SU;   a  SUS   0nXÊUS   '   MN     X¢US   '   g ! [        [
        4 a    Sn GNCf = f)NÚ	row_indexr   rÜ   Ú
dataset_idÚdataset_configÚdefaultÚdataset_splitÚtrainÚ1Úrowsr…   rˆ   r‚   r©   r%   )rÖ   r.   Úmaxr®   rJ   r,   rõ   r3   r*   r+   rA   )r4   rŠ   rÏ   rÔ   r-   Úoffsetrµ   r�   r  Úrowrå   r‹   rB   s                r   rá   ÚWorkflowExecutor._run_dataset5  s^  € Ø×'Ñ'¨Ó7ˆØ�l‰l˜;Ó'×,¨1ˆð	Ü˜œC ›HÓ%ˆFð —j‘jØà—‘˜Ó&Ø—‘Ð)Ó*×7¨iØ—‘˜Ó)×4¨WÜ�F“Øðó	
ˆö $/�˜Q’°BˆÜ%/°¼×%=Ñ%=ˆv�z‰z˜&Ô!À4ˆÜ+5°d¼D×+AÑ+Až$ˆt�AŠw¡BÀrˆØ!#ˆØ—H‘H˜YÓ'×-¨2Ò-ˆDØ—G‘G˜DŸH™H WÓ-Ó.ˆEÜ˜%¤×&Ñ&¨5°E«>Ø  e¡Ð-�Ø!&�4˜‘:Óñ	 .ð
  &��d‘Òøô3 œ:Ð&ó 	Ø‹Fð	ús   ­E0 Å0FÆF)rÊ   rË   rÀ   r~   )r~   r   rÀ   údict[str, Callable])NN)
rÄ   r3   r’   r\   rÅ   r   rÆ   r   r]   r   )
rÍ   ú	list[str]r’   r\   rÅ   r   rÆ   r   r]   z	list[Any])rŠ   r+   rÏ   údict[str, dict[str, Any]]r]   r\   )r:   r3   rÏ   r  r’   r\   r]   ÚNone)rŠ   r+   rÏ   r  r’   r\   r]   r  )rŠ   r+   rÏ   r  r]   r  )rŠ   r+   rÔ   r\   r]   r  )rÙ   r3   r5   rA   r]   rA   )rŠ   r+   rµ   rA   rÏ   r  r]   r  )ra   rb   rc   rd   re   r=   rÇ   rÃ   rÖ   rÌ   rÞ   rÝ   rì   rõ   rù   râ   rà   rß   rá   rh   ri   r?   r   r¾   r¾   e  sD  † ñôð Øð	Fàð	Fð ð	Fð ð		Fð
 ð	Fð 
õ	Fð Øð$àð$ð ð$ð ð	$ð
 ð$ð 
õ$ðPØðØ$=ðà	ôð ,àð,ð ,ð,ð ð	,ð
 
ô,ð@&Øð&Ø$=ð&ØGUð&à	ô&ô	&ôô@ð	&Øð	&Ø'+ð	&Ø7Pð	&à	ô	&ô7ô7ô27÷&r?   r¾   c                ó°   • [         R                  " SSU =(       d    SR                  5       R                  5       5      R                  S5      nU=(       d    S$ )Nz
[^a-z0-9]+Ú_r‰   rü   )ÚreÚsubÚstripÚlower)rˆ   Úslugs     r   Ú_slugifyr'  [  s@   € Ü�6Š6�-  u§{°×&9Ñ&9Ó&;×&AÑ&AÓ&CÓD×JÑJÈ3ÓO€DØ×�:Ðr?   r¯   Úfilepathzlist[filepath]z
list[list])rL   rª   r«   r¬   r   r   r   r   Ú3dr   r   Ú	dataframerG   c              #  ó¼   #   • [        5       nU  HH  n[        US   R                  SS5      5      nX1;   a  U S3nX1;   a  M  UR                  U5        X#4v •  MJ     g7f)z¼Yield (group, api_name) with the dedup used at registration, so the
described endpoints line up with the ones actually registered. The slug is
derived from the group's first subject label.r   rˆ   Úoutputr!  N)rl   r'  r.   r}   )rœ   Úusedr    Úapi_names       r   Ú_group_slug_iterr/  s  s^   é € ô “U€DÛˆÜ˜E !™HŸL™L¨°(Ó;Ó<ˆØÓØ"˜ 1�~ˆHð Õà�‰�ÔØˆoÔò ùs   ‚=AÁAc                 ó8   • SSK Jn   U " [        S / / 0 5      5      $ )z‰Whether a subgraph endpoint takes a `gr.OAuthToken`, asked of the same
builder that registers them so the panel can't drift from `/info`.r   ©Úoauth_token_requirementc                 ó   • g r–   ri   ri   r?   r   Ú<lambda>Ú3_endpoint_oauth_token_requirement.<locals>.<lambda>…  s   € ¸dr?   )Úgradio.utilsr2  Ú_build_endpoint_fnr1  s    r   Ú!_endpoint_oauth_token_requirementr8  €  s   € õ 5á"Ô#5±lÀBÈÈBÓ#OÓPÐPr?   c                ó  • / n[        5       n[        [        U 5      5       HÚ  u  p4[        X5      nUR	                  SU-   US   R                  SS5      S.U(       a  SU0O0 E[        U5       VVs/ s H,  u  pgUS   SU 3US   [        R                  US   S	5      S
.PM.     snnU Vs/ s H?  nUR                  SS5      [        U5      [        R                  [        U5      S	5      S.PMA     snS.E5        MÜ     U$ s  snnf s  snf )zÎDescribe each subject endpoint for the frontend "View API" panel:
`api_name`, label, parameters (free inputs), and the return type. Mirrors
the schema that `register_workflow_endpoints` exposes via `/info`.r¨   r   rˆ   r,  )r.  rˆ   Úoauth_tokenÚin_r†   r3   )rˆ   Úparameter_namer†   Úpython_type)rˆ   r†   r=  )Ú
parametersÚreturns)	r8  r/  rž   r¢   rn   r.   r2   Ú_PY_TYPEr“   )	r~   Ú	endpointsr:  r    r.  Úfreesr8   Úfr$   s	            r   Údescribe_workflow_apirD  ˆ  s*  € ð €IÜ3Ó5€KÜ+¬N¸5Ó,AÖB‰ˆÜ! %Ó/ˆØ×Ñà (™NØ˜q™Ÿ™ g¨xÓ8ñö 4?�M ;Ñ/ÀBðô !*¨%Ô 0ôò !1™˜ð "# 7¡Ø,/°¨s¨)Ø ! &¡	Ü'/§|¡|°A°f±I¸uÓ'Eô	ñ !1òñ" $)ó	ò $)˜ð ")§¡¨W°hÓ!?Ü 3°GÓ <Ü'/§|¡|Ü/°Ó8¸%ó(ôñ $)ñ	òö	
ñ Cð8 Ðùó+ùò	s   Á13DÂ+ADc                óþ  • SSK nU=(       d    U nU S:X  a  UR                  USSS9$ U S:X  a  UR                  USSS9$ U S:X  a  UR                  USS	9$ U S
;   a  UR	                  USS	9$ U S:X  a  UR                  USSS9$ U S:X  a  UR                  USS	9$ U S:X  a  UR                  USS	9$ U S:X  a  UR                  USS	9$ U S:X  a  UR                  USS	9$ U S:X  a  UR                  USS	9$ UR                  USS	9$ )a#  Map a workflow port type to a Gradio component for the API schema. Real
components are used (not `gr.api` type hints) so multimodal I/O round-trips
via their proven `api_info` / `FileData` handling. Created unrendered; the
caller renders them inside a hidden container so they reach `/info`.r   Nr   r(  F)rˆ   r†   Úrenderr   r   )rˆ   rF  )r   r)  r   r«   r¬   r*  r   rG   )ÚgradioÚImageÚAudioÚVideoÚModel3DÚFileÚNumberÚCheckboxÚ	DataframeÚGalleryÚJSONÚTextbox)r�   rˆ   Úgrs      r   Úport_to_componentrT  ­  s9  € ó
 à×�Y€EØ�GÓØ�x‰x˜e¨*¸UˆxÐCÐCØ�GÓØ�x‰x˜e¨*¸UˆxÐCÐCØ�GÓØ�x‰x˜e¨EˆxÐ2Ð2ØÐ%Ó%Ø�z‰z ¨eˆzÐ4Ð4Ø�FÓØ�w‰w˜U¨¸EˆwÐBÐBØ�HÓØ�y‰y˜u¨UˆyÐ3Ð3Ø�IÓØ�{‰{ ¨uˆ{Ð5Ð5Ø�KÓØ�|‰| %°ˆ|Ð6Ð6Ø�IÓØ�z‰z ¨eˆzÐ4Ð4Ø�FÓØ�w‰w˜U¨5ˆwÐ1Ð1Ø�:‰:˜E¨%ˆ:Ð0Ð0r?   c           	     ód  ^ ^^^• SSK Jn  SSKJn  UUU U4S jn[	        [        T5      5       Vs/ s H5  n[        R                  " SU 3[        R                  R                  5      PM7     nnUR                  [        R                  " S[        R                  R                  S[        U   S95        UR                  [        R                  " S	[        R                  R                  S[        U   S95        [        R                  " U5      Ul        [        U   [        U   S
.Ul        U$ s  snf )aG  Build the callable backing one subgraph endpoint. `subject_ids` are all
the outputs of the subgraph; with more than one the endpoint returns a tuple
(matching its multiple output components), otherwise a single value.

Execution re-reads the *current* graph via `get_graph()` so operator and
wiring edits take effect without a restart. The advertised signature
(positional input per free reference, plus `request`/`token`) is synthesized
so Gradio's `special_args` injects the request and OAuth token, letting the
executor reuse the workflow's token resolution for downstream calls.
r   )Ú
OAuthToken)ÚRequestc                 óÚ   >• U Gt pnT	" 5       nUc  [        S5      e[        [        TU5      5      n[        UT5      R	                  T
XRU5      n[        U5      S:X  a  US   $ [        U5      $ )NzWorkflow graph is unavailablerk   r   )r¼   r+   Úzipr¾   rÃ   rp   Útuple)r  Úinput_valuesrÅ   rÆ   r~   r’   ÚresultsrÀ   Úfree_idsÚ	get_graphrÍ   s          €€€€r   rü   Ú$_build_endpoint_fn.<locals>.endpointß  st   ø€ Ø(,Ñ%ˆ Ù“ˆØ‰=Ü(Ð)HÓIÐIÜ”c˜( LÓ1Ó2ˆÜ" 5¨'Ó2×;Ñ;Ø˜¨%ó
ˆô ! ›\¨QÓ.ˆw�q‰zÐB´E¸'³NÐBr?   r;  rÅ   N)r  Ú
annotationrÆ   )rÅ   rÆ   )Úgradio.oauthrV  Úgradio.route_utilsrW  Úrangerp   ÚinspectÚ	ParameterÚPOSITIONAL_OR_KEYWORDrn   r   Ú	SignatureÚ__signature__Ú__annotations__)	r^  rÍ   r]  rÀ   rV  rW  rü   r8   Úparamss	   ````     r   r7  r7  Ì  s  û€ õ  (Ý*÷	Cð 	Cô ”s˜8“}Ô%óâ%ˆAô 	×Ò˜C ˜s˜)¤W×%6Ñ%6×%LÑ%LÖMÙ%ð ð ð ‡M�MÜ×ÒØÜ×Ñ×3Ñ3ØÜ Ñ(ñ		
ôð ‡M�MÜ×ÒØÜ×Ñ×3Ñ3ØÜ 
Ñ+ñ		
ôô %×.Ò.¨vÓ6€HÔä˜GÑ$Ü˜*Ñ%ñ €HÔð €Oùò3s   °<D-c                  óR   • \ rS rSrSr    S
S jrSS jrSS jrSS jrSS jr	Sr
g	)ÚWorkflowEndpointManageri  a  Owns the lifecycle of the per-subject API endpoints and keeps them in
sync with the workflow graph.

Each `sync()` tears down the previously-registered endpoints (their
components via `unrender()` and their event triggers from `blocks.fns`) and
rebuilds from the current graph, then refreshes the cached `/config` and
invalidates the `/info` cache so a running server reflects the change. This
lets the API track live edits: adding, removing, renaming, or retyping a
subject all re-derive the endpoint set on the next save.
c                óR   • Xl         X l        X0l        / U l        / U l        / U l        g r–   )r   r^  rÀ   Ú_blocks_createdÚ_fn_idsÚ	api_names)r4   r   r^  rÀ   s       r   r=   Ú WorkflowEndpointManager.__init__  s)   € ð ŒØ"ŒØŒØ%'ˆÔØ"$ˆŒØ$&ˆ�r?   c                óÖ   • U R                  5         U R                  5       nUb"  UR                  (       a  U R                  U5        U R	                  5         [        U R                  5      $ )zuRe-derive endpoints from the current graph. Safe to call repeatedly;
the first call registers, later calls reconcile.)Ú	_teardownr^  r    Ú	_registerÚ_refresh_apprA   rp  )r4   r~   s     r   ÚsyncÚWorkflowEndpointManager.sync  sM   € ð 	�‰ÔØ—‘Ó ˆØÑ §§Ø�N‰N˜5Ô!Ø×ÑÔÜ�D—N‘NÓ#Ð#r?   c                óf  • U R                   (       aA  [        U R                  5         U R                    H  nUR                  5         M     S S S 5        U R                   H)  nU R                  R
                  R                  US 5        M+     / U l         / U l        / U l        g ! , (       d  f       N]= fr–   )rn  r   r   Úunrenderro  ÚfnsÚpoprp  )r4   r   Úfn_ids      r   rs  Ú!WorkflowEndpointManager._teardown+  s   € Ø××ô   §¡Õ,Ø!×1Ô1�EØ—N‘NÖ$ñ 2÷ -ð —\”\ˆEØ�K‰K�O‰O×Ñ  tÖ,ñ "à!ˆÔØˆŒØˆ�÷ -Õ,ús   §$B"Â"
B0c                ó   • SS K n[        U R                  R                  R	                  5       5      n[        U R                  5         UR                  SS9 nU R                  R                  U5        [        [        U5      5       GH‰  u  pV[        X5      nU Vs/ s H  n[        US   US   5      PM     n	nU	 H.  n
U
R                  5         U R                  R                  U
5        M0     / nU Hd  n[        [        U5      UR                  SS5      5      nUR                  5         U R                  R                  U5        UR                  U5        Mf     [!        U R"                  U Vs/ s H  oîS   PM	     snU Vs/ s H
  oˆS   S   PM     snU R$                  5      nUR'                  SS9nU R                  R                  U5        UR)                  UU	[+        U5      S	:”  a  UOUS   US
9  U R,                  R                  U5        GMŒ     S S S 5        S S S 5        U R                  R                   Vs/ s H  nUU;  d  M  UPM     snU l        g s  snf s  snf s  snf ! , (       d  f       NZ= f! , (       d  f       Nc= fs  snf )Nr   F)Úvisibler†   rˆ   r,  r%   rŠ   rk   )r’   r…   r.  )rG  rl   r   rz  Úkeysr   ÚColumnrn  rn   r/  rž   r¢   rT  rF  r“   r.   r7  r^  rÀ   ÚButtonÚclickrp   rp  ro  )r4   r~   rS  ÚbeforeÚcolr    r.  rB  rC  Úinput_componentsÚcÚoutput_componentsr$   ÚocÚsrÚ   ÚtriggerÚfids                     r   rt  Ú!WorkflowEndpointManager._register8  s/  € Ûä�T—[‘[—_‘_×)Ñ)Ó+Ó,ˆÜ˜DŸK™KÕ(¨"¯)©)¸E¨)Ñ*BÀcØ× Ñ ×'Ñ'¨Ô,Ü#3´NÀ5Ó4I×#J‘�Ü)¨%Ó7�áFKó$ÚFKÀÔ% a¨¡i°°7±Ö<Áeð !ð $ó *�AØ—H‘H”JØ×(Ñ(×/Ñ/°Ö2ñ *ð %'Ð!Û$�GÜ*Ü+¨GÓ4°g·k±kÀ'È8Ó6Tó�Bð —I‘I”KØ×(Ñ(×/Ñ/°Ô3Ø%×,Ñ,¨RÖ0ñ  %ô (Ø—N‘NÙ&+Ó,¢e �t”W¡eÑ,Ù.3Ó4ªe¨�v‘Y˜t”_©eÑ4Ø—L‘Ló	�ð Ÿ)™)¨E˜)Ð2�Ø×$Ñ$×+Ñ+¨GÔ4Ø—‘ØØ+äÐ,Ó-°Ó1ñ .à*¨1Ñ-Ø%ð ñ ð —‘×%Ñ% h×/ñC $K÷ +C×(ðL (,§{¡{§¢ÓL¢ ¸#ÀVÑ:KŸ¡ÑLˆ�ùòE$ùò" -ùÚ4÷- +CÕ*Bú×(Õ(üòL Ms]   ÁI:ÁAI)ÂI
Â8B6I)Å.IÅ<I)ÆI$ÆBI)ÈI:È=
JÉJÉI)É)
I7	É3I:É:
Jc                óò   •  U R                   R                  5       U R                   l        [        U R                   SS5      nUb  SUl        SUl        gg! [         a    [        R                  SSS9   NJf = f)u{  After the endpoint set changes, refresh the cached config and (if
running) invalidate the `/info` cache.

`get_api_info` reads `self.config`, and `/config` serves a copy of it to
new page loads / `gradio_client` connections â€” so it must be regenerated
whenever the components or dependencies change. (The normal
`Blocks.__exit__` does this; our manual render context does not.)z"Workflow: failed to refresh configT)Úexc_infoÚ
server_appN)	r   Úget_config_fileÚconfigÚ	ExceptionÚloggerÚdebugÚgetattrÚapi_infoÚall_app_info)r4   Úapps     r   ru  Ú$WorkflowEndpointManager._refresh_appd  sr   € ð	NØ!%§¡×!<Ñ!<Ó!>ˆD�K‰KÔô �d—k‘k <°Ó6ˆØ‰?ØˆCŒLØ#ˆCÕð øô ó 	NÜ�L‰LÐ=ÈˆLÓMð	Nús   ‚)A ÁA6Á5A6)rn  ro  rp  r   rÀ   r^  N)r^  ú%Callable[[], Optional[WorkflowGraph]]rÀ   r  )r]   r  )r]   r  )r~   r   r]   r  )ra   rb   rc   rd   re   r=   rv  rs  rt  ru  rh   ri   r?   r   rl  rl    s6   † ñ	ð'ð 9ð'ð %ô	'ô$ôô*M÷X$r?   rl  c                ó>   • [        XU5      nUR                  5         U$ )z¶Create a `WorkflowEndpointManager` and register the initial endpoint set
from the current graph. Returns the manager so the caller can `.sync()` it
again whenever the graph is saved.)rl  rv  )r   r^  rÀ   Úmanagers       r   Úregister_workflow_endpointsrž  v  s   € ô & f¸ÓA€GØ‡L�L„NØ€Nr?   )rq   r  r!   r^   r]   r  )r~   r   r   r3   r]   úset[str])r~   r   rŒ   rŸ  r]   r^   )r$   r+   r]   r3   )r~   r   r]   úlist[list[dict]])r~   r   r    r^   r]   r^   )rB   r   r�   r3   r]   r   )r°   r   r�   r3   r]   r`   )
r‹   r+   r´   r®   rµ   rA   r¶   r®   r]   r   )rB   r   r]   r   )rˆ   r3   r]   r3   )rœ   r   )r]   r_   )r~   r   r]   r^   )r�   r3   rˆ   r3   )r^  r›  rÍ   r  r]  r  rÀ   r  )r^  r›  rÀ   r  r]   rl  ),re   Ú
__future__r   Ú
contextlibrd  rG   Úloggingr"  Úcollectionsr   Úcollections.abcr   Útypingr   r   Ú	getLoggerra   r”  Úcontextmanagerr   r¥   r   r{   rƒ   r�   r“   rž   r¢   r¦   r±   r¸   rº   r“  r¼   r¾   r'  r@  r/  r8  rD  rT  r7  rl  rž  ri   r?   r   Ú<module>r©     s~  ðñõ #ã Û Û Û Û 	Ý Ý $ß  à	×	Ò	˜8Ó	$€ð ×Ññ#ó ð#ò* MÐ ÷Lñ Lô^ô8ô0ô8/ô ,ôF'ôô ð$3Ø
ð3Øð3Ø.2ð3ØADð3àô3ô4ô #˜Yô #÷
n&ñ n&ôlð ØØØØØØØØ
ØØØØñ€ô"
ôQô"ôJ1ð>7Ø4ð7àð7ð ð7ð !ô	7÷tm$ñ m$ð`
à4ð
ð !ð
ð õ	
r?   