
    iX0                         d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlm Z  e G d de             Z!e G d de             Z"y)z&Graph-level configuration dataclasses.    )	dataclassfield)Counter)AnyDictListMapping)LogLevel)enum_options_for   )	
BaseConfigConfigErrorConfigFieldSpecensure_listoptional_booloptional_dictoptional_strrequire_mappingextend_path)
EdgeConfig)MemoryStoreConfig)AgentConfig)Nodec                      e Zd ZU edz  ed<   edz  ed<   eed<   eed<    ee      Z	e
e   ed<    ee      Ze
e   ed<   dZe
e   dz  ed	<   dZedz  ed
<   dZedz  ed<    ee      Ze
e   ed<   dZe
e   dz  ed<    eddddd       eddddd       eddddej*                  j,                  eD  cg c]  }|j,                   c}} dd ee      	       eddddddd       eddd dd!e"       edd#d$dd%e"       ed	d&d'dd(e"       edd)ddd*       ed+d,d-dd.d/       ed0d1d-dd2d/      d3
Zed4eeef   d5ed6d fd7       Zd9d8Zyc c}} w ):GraphDefinitionNiddescription	log_levelis_majority_voting)default_factorynodesedgesmemoryorganizationinitial_instructionstart_nodes	end_nodeszGraph IDstrTzmGraph identifier for referencing. Can only contain alphanumeric characters, underscores or hyphens, no spaces)namedisplay_name	type_hintrequiredr   zGraph DescriptiontextFznHuman-readable narrative shown in UI/templates that explains the workflow goal, scope, and manual touchpoints.z	Log Levelzenum:LogLevelzRuntime log level)	r)   r*   r+   r,   defaultenumr   advanceenum_optionszMajority Voting Modeboolz'Whether this is a majority voting graphr)   r*   r+   r,   r.   r   r0   z	Node Listz
list[Node]z)Node list, must contain at least one noder)   r*   r+   r,   r   childz	Edge Listzlist[EdgeConfig]zDirected edges between nodeszMemory Storeszlist[MemoryStoreConfig]zaOptional list of memory stores that nodes can reference through their model.memories attachments.zInitial Instructionz*Graph level initial instruction (for user)startz
Start Nodez	list[str]z\Start node ID list (entry list executed at workflow start; not recommended to edit manually))r)   r*   r+   r,   r   r0   endzEnd NodezEnd node ID list (used to collect final graph output, not part of execution logic). Commonly needed in subgraphs. This is an ordered list: earlier nodes are checked first; the first with output becomes the graph output, otherwise continue down the list.)
r   r   r   r   r!   r"   r#   r%   r6   r7   datapathreturnc                n   t        ||      }t        |d|      }t        |d|      }d|v r|d   rt        dt        |d            |j	                  dt
        j                  j                        }	 t        |      }t        |d|d	      }
t        |d
|      }t        |d|      }t        |j	                  d            }g }t        |      D ]9  \  }}|j                  t        j                  |t        |d| d                   ; t        |j	                  d            }g }t        |      D ]9  \  }}|j                  t        j                  |t        |d| d                   ; d }d|v r|d   t        |j	                  d            }g }t!               }t        |      D ]  \  }}t#        j                  |t        |d| d            }|j$                  |v r(t        d|j$                   dt        |d| d            |j'                  |j$                         |j                  |        |}g }d|v r|d   |d   }t)        |t*              r|g}nst)        |t,              rMt/        d |D              r;t!               }g }|D ])  }||vs|j'                  |       |j                  |       + nt        dt        |d            d }d|v rb|d   ]|d   }t)        |t*              r|g}nDt)        |t,              rt/        d |D              rt-        |      }nt        dt        |d             | ||||
t1        |
      nd||||||||      }|j3                          |S # t        $ rA}t        dt
        D 	cg c]  }	|	j                   nc c}	w c}	 t        |d            |d }~ww xY w)Nr   r   varsz,vars are only supported at DesignConfig rootr   zlog_level must be one of r   F)r.   r$   r%   r!   znodes[]r9   r"   zedges[r#   zmemory[zduplicated memory store name ''z].namer6   c              3   <   K   | ]  }t        |t                y wN
isinstancer(   .0items     A/Users/bowang/.openclaw/workspace/ChatDev/entity/configs/graph.py	<genexpr>z,GraphDefinition.from_dict.<locals>.<genexpr>   s     6eYdQUz$7LYd   z5start must be a string or list of strings if providedr7   c              3   <   K   | ]  }t        |t                y wrA   rB   rD   s     rG   rH   z,GraphDefinition.from_dict.<locals>.<genexpr>   s     4aW`tZc5JW`rI   z'end must be a string or list of strings)r   r   r   r   r!   r"   r#   r$   r%   r&   r'   r9   )r   r   r   r   getr
   DEBUGvalue
ValueErrorr   r   	enumerateappendr   	from_dictr   setr   r)   addrC   r(   listallr2   validate)clsr8   r9   mappinggraph_idr   log_level_rawr   exclvlis_majorityr$   r%   	nodes_rawr!   idx	node_dict	edges_rawr"   	edge_dict
memory_cfg
raw_storesstoresseenrF   storer&   start_valuer'   	end_value
definitions                                  rG   rQ   zGraphDefinition.from_dict   s   !$-t4"7M4@WLkZ^`fNghhK1E1EF	 /I $G-A4QVW#G^TB*74I4PG 45	 '	2NCLL	DFSVRWWX/8Z[\ 3  G 45	"$'	2NCLL--ik$RXY\X]]^P_>`ab 3 6:
w78#4#@$W[[%:;J.0F UD&z2	T)33D{4SZ[^Z__`Qa?bc::%%8AF#DGC5*?@  $e$ 3  J!#g''"2">!'*K+s+*mK.36eYd6e3eu 'D4'#**40 (
 ""Y[fgkmt[uvv	G :I)S)&K	It,4aW`4a1a O	!"K[Y]_dMeff#4?4KtK0QV% 3#

 	[  	+(,K(3SYY(,K+LM{[_alOm	s$   1M* *	N43N/NN//N4c                    | j                   D cg c]  }|j                   }}t        |      }|j                         D cg c]  \  }}|dkD  s| }}}|r=dj	                  t        |            }t        d| t        | j                  d            t        |      }| j                  D ]*  }	|	|vst        d|	 dt        | j                  d             | j                  D ]  }
|
j                  |vrHt        d|
j                   d	t        | j                  d
|
j                   d|
j                               |
j                  |vsht        d|
j                   d	t        | j                  d
|
j                   d|
j                                | j                  r$| j                  D ch c]  }|j                   c}n	t               }| j                   D ]u  }|j!                  t"              }|s|j$                  D ]L  }|j                  |vst        d|j                   d|j                  xs t        |j                  d             w y c c}w c c}}w c c}w )Nr   z, zduplicate node ids detected: r!   zstart node 'z' not defined in nodesr6   z%edge references unknown source node 'r?   zedges->z->z%edge references unknown target node 'zmemory reference 'z' not defined in graph.memoryzconfig.memories)r!   r   r   itemsjoinsortedr   r   r9   rR   r&   r"   sourcetargetr#   r)   	as_configr   memories)selfnodenode_idscountsnidcount
duplicatesdup_listnode_set
start_nodeedgerg   store_namesmodel
attachments                  rG   rV   zGraphDefinition.validate   s"   (,

3
DGG
3",2LLNHNjc5eaicN
Hyy
!34H =hZH+VZV_V_ahJijjx=**J)!":,.DE		73  + JJD{{(*!;DKK=J		WT[[MDKK=+QR  {{(*!;DKK=J		WT[[MDKK=+QR   @D{{t{{;{euzz{;PSPUJJDNN;/E"'..J)kA&1&88IIf$g$.OO$`{499N_7`'" !" #1 9 4H0 <s   III1I!)r:   N)__name__
__module____qualname__r(   __annotations__r
   r2   r   rT   r!   r   r   r"   r   r#   r   r$   r%   r&   r'   r   rL   rM   r   FIELD_SPECSclassmethodr	   r   rQ   rV   )rE   r\   s   00rG   r   r      s4   d
Ntd3E4:3#D9E4
9-1FD"#d*1#L#*#&*t*"48Kc8"&ItCy4& # H
 ', I
 %$%NN(('/0x#))x0+)(3

 .%/A
 !$"C
 !$(6
 "(/{#
  /&.D 
 !%!v
 #! X
cYKF XWS#X. X XAR X Xt%"S 1s   9Er   c            
           e Zd ZU eed<   eeef   ed<   eed<    eddddddd	
       eddddi d       edddd	de      dZ	e
dddeeef   dedd fd       Zy)DesignConfigversionr<   graphzConfiguration Versionr(   F0.0.0zConfiguration version numberTr3   zGlobal Variableszdict[str, Any]z2Global variables that can be referenced via ${VAR})r)   r*   r+   r,   r.   r   zGraph Definitionr   zCore graph definitionr4   )r   r<   r   rootr>   r8   r9   r:   c                    t        ||      }t        |d|      xs d}t        |d|      xs i }d|vs|d   t        dt	        |d            t
        j                  |d   t	        |d            } | ||||      S )Nr   r   r<   r   zgraph section is requiredr>   )r   r<   r   r9   )r   r   r   r   r   r   rQ   )rW   r8   r9   rX   r   
vars_blockr   s          rG   rQ   zDesignConfig.from_dict1  s    !$-w	48CG"7FD9?R
'!WW%5%=9;tW;UVV))''*:TSZA[)\75tLL    N)r   r   r   r(   r   r   r   r   r   r   r   r	   rQ    r   rG   r   r     s    L
sCx. #06
  +&L
 !+'/!
%K8 ?E MWS#X. M M. M Mr   r   N)#__doc__dataclassesr   r   collectionsr   typingr   r   r   r	   entity.enumsr
   entity.enum_optionsr   baser   r   r   r   r   r   r   r   r   r}   r   entity.configs.node.memoryr   entity.configs.node.agentr   entity.configs.node.noder   r   r   r   r   rG   <module>r      st    , (  + + ! 0
 
 
  8 1 ) p"j p" p"f )M: )M )Mr   