
    i              	       \   d Z ddlmZmZmZ ddlmZmZmZ ddl	m
Z
mZmZmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZmZ  ed      Zd	d
dedee
   ded	z  dd	fdZdedee
   fdZdeeee
   f   fdZdeeeeef   f   fdZ e G d de
             Z! eded        eded       y	)zGDynamic edge configuration for edge-level Map and Tree execution modes.    )	dataclassfieldreplace)AnyDictMapping)
BaseConfigConfigErrorConfigFieldSpecChildKeyextend_pathrequire_mappingrequire_str)SplitConfigMapDynamicConfigTreeDynamicConfig)enum_options_from_values)RegistryRegistryErrordynamic_edge_typeN)descriptionname
config_clsr   returnc                D    |rd|ind }t         j                  | ||       y )Nsummary)targetmetadata)dynamic_edge_type_registryregister)r   r   r   r   s       T/Users/bowang/.openclaw/workspace/ChatDev/entity/configs/edge/dynamic_edge_config.pyregister_dynamic_edge_typer"      s'     ,7	;'DH''Z('S    c                     t         j                  |       }|j                         }t        |t              rt        |t              st        d|  d      |S )NzEntry 'z' is not a BaseConfig subclass)r   getload
isinstancetype
issubclassr	   r   )r   entryr   s      r!   get_dynamic_edge_type_configr+   &   sK    &**40EJj$'z*j/QgdV+IJKKr#   c                  z    t         j                         D  ci c]  \  } }| |j                          c}} S c c}} w N)r   itemsr&   r   r*   s     r!   $iter_dynamic_edge_type_registrationsr0   .   s4    2L2R2R2TU2T;4D%**,2TUUUs   7c            	          t         j                         D  ci c]  \  } }| t        |j                  xs i       ! c}} S c c}} w r-   )r   r.   dictr   r/   s     r!   iter_dynamic_edge_type_metadatar3   2   s<    @Z@`@`@bc@buD$u~~+,,@bcccs   $A c            	           e Zd ZU dZeed<    ed       Zeed<   dZ	e
dz  ed<    eddd	d
d       eddddde       eddddd      dZedeeee
   f   fd       Zedeeef   f fd       Zedeeef   dz  deddfd       ZdefdZdefdZdedz  fdZdedz  fd Zedefd!       Zedefd"       Z  xZ!S )#DynamicEdgeConfiga  Dynamic configuration for edge-level Map and Tree execution modes.
    
    When configured on an edge, the target node will be dynamically expanded
    based on the split results. The split logic is applied to messages
    passing through this edge.
    
    Attributes:
        type: Dynamic mode type (map or tree)
        split: How to split the payload passing through this edge
        config: Mode-specific configuration (MapDynamicConfig or TreeDynamicConfig)
    r(   c                      t               S r-   )r    r#   r!   <lambda>zDynamicEdgeConfig.<lambda>D   s    {}r#   )default_factorysplitNconfigzDynamic TypestrTz$Dynamic execution mode (map or tree))r   display_name	type_hintrequiredr   zSplit Strategyr   Fz;How to split the edge payload into parallel execution units)r   r=   r>   r?   r   childzDynamic ConfigobjectzMode-specific configuration)r(   r:   r;   r   c                 |    t               j                         D ci c]  \  }}t        d|      | c}}S c c}}w )Nr;   )r   value)r0   r.   r   )clsr   r   s      r!   child_routeszDynamicEdgeConfig.child_routes`   sG     %I$J$P$P$R
$R j 840*<$R
 	
 
s   8c                 H   t         |          }|j                  d      }|rzt               }t	               }t        |j                               }|D ci c]'  }||j                  |      xs i j                  d      ) }}t        ||t        ||            |d<   |S c c}w )Nr(   r   )enumenum_options)	superfield_specsr%   r0   r3   listkeysr   r   )	rD   specs	type_specregistrationsr   
type_namesr   descriptions	__class__s	           r!   rJ   zDynamicEdgeConfig.field_specsg   s    #%IIf%	@BM68Hm0023JXbcXbPTD8<<#5#;"@"@"KKXbLc#5j,OE&M
  ds   ,BdatapathzDynamicEdgeConfig | Nonec                   |y t        ||      }t        |d|      }	 t        |      }|j                  d      }t        j                  |t        |d            }|j                  d      }	t        |d      }
|j                  |	|
      } | ||||      S # t        $ r>}t	        dt        t               j                                t        |d            |d }~ww xY w)Nr(   zdynamic type must be one of r:   )rT   r;   )r(   r:   r;   rT   )r   r   r+   r   r
   rK   r0   rL   r   r%   r   	from_dict)rD   rS   rT   mappingdynamic_typer   exc
split_datar:   config_dataconfig_pathr;   s               r!   rV   zDynamicEdgeConfig.from_dictw   s    <!$-"7FD9	5lCJ [[)
%%j{47QR kk(+!$1%%k%DE&tLL!  	.t4X4Z4_4_4a/b.cdD&) 	s   B 	C 9CCc                      | j                   dk(  S )Nmapr(   selfs    r!   is_mapzDynamicEdgeConfig.is_map   s    yyE!!r#   c                      | j                   dk(  S )Ntreer_   r`   s    r!   is_treezDynamicEdgeConfig.is_tree   s    yyF""r#   c                 r    | j                         r&t        | j                  t              r| j                  S d S r-   )rb   r'   r;   r   r`   s    r!   as_map_configzDynamicEdgeConfig.as_map_config   s(    "kkm
4;;HX0Yt{{c_ccr#   c                 r    | j                         r&t        | j                  t              r| j                  S d S r-   )re   r'   r;   r   r`   s    r!   as_tree_configz DynamicEdgeConfig.as_tree_config   s(    "llnDKKIZ1[t{{eaeer#   c                 \    t        | j                  d      rt        | j                  d      S y)zGet max_parallel from config.max_parallel
   )hasattrr;   getattrr`   s    r!   rk   zDynamicEdgeConfig.max_parallel   s&     4;;/4;;77r#   c                 d    t        | j                  t              r| j                  j                  S y)z/Get group_size (tree mode only, defaults to 3).   )r'   r;   r   
group_sizer`   s    r!   rq   zDynamicEdgeConfig.group_size   s&     dkk#45;;)))r#   )"__name__
__module____qualname____doc__r<   __annotations__r   r:   r   r;   r	   r   FIELD_SPECSclassmethodr   r   r(   rE   rJ   r   r   rV   boolrb   re   r   rg   r   ri   propertyintrk   rq   __classcell__)rR   s   @r!   r5   r5   6   s   
 I/DEE;E $FJ$  '>
 !)#U
 ")5
!K2 
T(D,<"<= 
 
 Do!56   MWS#X.5 M MHb M M4" "# #d/$6 df 1D 8 f c   C  r#   r5   r^   z;Fan-out only: split into parallel units and collect results)r   r   rd   zEFan-out and reduce: split into units, then iteratively reduce results)"ru   dataclassesr   r   r   typingr   r   r   entity.configs.baser	   r
   r   r   r   r   r   entity.configs.dynamic_baser   r   r   entity.enum_optionsr   utils.registryr   r   r   r<   r(   r"   r+   r0   r3   r5   r7   r#   r!   <module>r      s   M 1 1 % %   
 9 2 &&9:  #	T
T Z T t	T
 
Ts tJ/? Vd3Z8H3H.I Vdc4S>.A)B d s
 s sn 	M
 
 Wr#   