
    iF                        d 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 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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& ddl'm(Z( ddl)m*Z* eZ+e G d d             Z,e G d de             Z-y)zNode configuration dataclasses.    )	dataclassfieldreplace)AnyDictIterableListMappingOptionalTuple)MessageMessageRole)SchemaLookupErrorget_node_schemaiter_node_schemas)

BaseConfigConfigErrorConfigFieldSpec
EnumOptionChildKeyensure_listoptional_strrequire_mappingrequire_strextend_path)EdgeConditionConfig)EdgeProcessorConfig)DynamicEdgeConfig)AgentConfig)HumanConfig)FunctionToolConfigc                   t   e Zd ZU ded<    ee      Zeee	f   ed<   dZ
eed<   dZeed<   d	Zed	z  ed
<   d	Zed	z  ed<    ee      Zeee	f   ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   d	Ze	ed<   d	Zed	z  ed<   d	Zed	z  ed<    ee      Zeee	f   ed<   d	Ze	ed<   d	Zed	z  ed<   ddZy	)EdgeLinkNodetargetdefault_factoryconfigTtriggertrue	conditionNcondition_configcondition_typecondition_metadataF	triggered
carry_datakeep_messageclear_contextclear_kept_contextcondition_managerprocess_configprocess_typeprocess_metadatapayload_processordynamic_configc                 @    t        | j                  xs i       | _        y N)dictr(   selfs    E/Users/bowang/.openclaw/workspace/ChatDev/entity/configs/node/node.py__post_init__zEdgeLink.__post_init__:   s    4;;,"-    returnN)__name__
__module____qualname____annotations__r   r<   r(   r   strr   r)   boolr+   r,   r   r-   r.   r/   r0   r1   r2   r3   r4   r5   r   r6   r7   r8   r9   r   r@    rA   r?   r#   r#   %   s    N"48FDcN8GTIs37)D07!%NC$J%).t)DS#XDItJL$M4$$!s!15N'$.5#L#*#',T'Bd38nB!s!/3N%,3.rA   r#   c                       e Zd ZU eed<   eed<   dZedz  ed<   dZeed<   dZe	ed<    e
e	      Zeeef   ed
<   dZedz  ed<    e
e	      Zee   ed<    e
e	      Zee   ed<   dZeed<    e
ed      Zed    ed<    e
ed      Zed    ed<    e
ed      Zee   ed<    eddddd       eddddd       edddddd       edddddd        edd!d"dddd#$       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-ed)d fd.       Z$d/ed)dfd0Z%d1ed)dfd2Z&ddd3d4ede	d)e	fd5Z'd6ed7ed)e(e	e	f   fd8Z)dLd9Z*e+d)efd:       Z,e+d)e-e   fd;       Z.e+d)e-e   fd<       Z/e+d)ee   fd=       Z0e+d)ee   fd>       Z1e+d)eeef   fd?       Z2e+d)e-e   fd@       Z3dMdAd dBe-eeef      d)dfdCZ4dNdDZ5d)e6e   fdEZ7dFed)edz  fdGZ8d)efdHZ9dLdIZ:dMdJe-eeef      d)eeef   fdKZ; xZ<S )Or$   idtypeNdescriptionT
log_outputr   context_windowr&   varsr(   inputoutputFstart_triggered)r'   reprpredecessors
successors_outgoing_edgeszNode IDrH   zUnique node identifier)namedisplay_name	type_hintrequiredrN   z	Node TypeztSelect a node type registered in node.registry (agent, human, python_runner, etc.); it determines the config schema.zNode DescriptionzSShort summary shown in consoles/logs to explain this node's role or prompt context.)rY   rZ   r[   r\   advancerN   zContext Window SizeintzNumber of context messages accessible during node execution. 0 means clear all context except messages with keep_message=True, -1 means unlimited, other values represent the number of context messages to keep besides those with keep_message=True.)rY   rZ   r[   r\   defaultrN   z
Log OutputrI   zQWhether to log this node's output content. Set to false to avoid logging outputs.)rY   rZ   r[   r\   r_   r]   rN   zNode Configurationobjectz`Configuration object required by the chosen node type (see Schema API for the supported fields).)rL   rM   rN   rP   rO   r(   rC   c                 ~    i }t               j                         D ]  \  }}|j                  |t        d|      <   ! |S )Nr(   )r   value)r   items
config_clsr   )clsroutesrY   schemas       r?   child_routeszNode.child_routes   s=    35-/557LD&;A;L;LF8($78 8rA   c                 0   t         |          }|j                  d      }|rmt               }t	        |t        |j                               |j                         D cg c]!  \  }}t        |||j                  xs d      # c}}      |d<   |S c c}}w )NrM   z*No description provided for this node type)rb   labelrN   )enumenum_options)
superfield_specsgetr   r   listkeysrc   r   summary)re   specs	type_specregistrationsrY   rg   	__class__s         r?   rn   zNode.field_specs   s    #%IIf%	-/M#-,,./ )6(;(;(= )>f ""$*NN$b6b
 )>E&M s   &Bdatapathc                   t        ||      }t        |d|      }t        |d|      }	 t        |      }t        |d|      }t        |j                  dd            }	t        |j                  dd	            }
t        |j                  d
            }t        |j                  d            }g }|D ]  }t        |t              r)d|v r%|j                  t        j                  |             <t        |t              r|j                  |       ^|j                  t        t         j"                  t%        |                    d|vs|d   t	        dt        |d            |j&                  j                  |d   t        |d            }g }|D ]  }t        |t              r)d|v r%|j                  t        j                  |             <t        |t              r|j                  |       ^|j                  t        t         j(                  t%        |                     | ||||	|||
i ||
      }|j+                          |S # t        $ r }t	        d| dt        |d            |d }~ww xY w)NrL   rM   zunsupported node type ''rN   rO   TrP   r   rR   rS   role)r{   contentr(   znode config block requiredrx   )
rL   rM   rN   rO   rR   rS   rP   rQ   r(   rx   )r   r   r   r   r   r   r   rI   ro   r^   r   
isinstancer<   appendr   	from_dictr   USERrH   rd   	ASSISTANTvalidate)re   rw   rx   mappingnode_id	node_typerg   excrN   rO   rP   input_valueoutput_valueinput_messagesrb   
config_objformatted_outputnodes                     r?   r   zNode.from_dict   sI   !$-gtT26		$Y/F #7M4@'++lD9:
W[[)91=>!'++g"67"7;;x#89(* E%&6U?%%g&7&7&>?E7+%%e,%%g;3C3CSQVZ&XY ! 7"gh&7&?:Kh<WXX&&00HKh$? 1 

 /1!E%&6U? ''(9(9%(@AE7+ ''. ''!6!6E
K " #! #)
 	o ! 	))A6D&) 	s   I 	I.I))I.messagec                 :    | j                   j                  |       y r;   )rR   r   )r>   r   s     r?   append_inputzNode.append_input   s    

'"rA   payloadc                 :    | j                   j                  |       y r;   )rS   r   )r>   r   s     r?   append_outputzNode.append_output   s    7#rA   )preserve_keptrP   r   c                   |sg | _         t        | j                         S |dk  rt        | j                         S |dk(  rB| j                   D cg c]  }t        |dd      s| c}| _         t        | j                         S t        d | j                   D              }t	        d||z
        }t        d | j                   D              }t	        d||z
        }g }| j                   D ]=  }t        |dd      r|j                  |       "|dkD  r|dz  }-|j                  |       ? || _         t        | j                         S c c}w )zEClear queued inputs according to the node's context window semantics.r   keepFc              3   <   K   | ]  }t        |d d      sd  ywr   F   Ngetattr.0r   s     r?   	<genexpr>z#Node.clear_input.<locals>.<genexpr>   s     X*wQV8W*   c              3   <   K   | ]  }t        |d d      rd  ywr   r   r   s     r?   r   z#Node.clear_input.<locals>.<genexpr>  s     `j7QWY^@_Qjr   r   )rR   lenr   summaxr   )	r>   r   rP   r   
keep_countallowed_non_keepnon_keep_totalnon_keep_to_droptrimmed_inputss	            r?   clear_inputzNode.clear_input   s-   DJtzz?"Atzz?"Q15_gwwPVX]?^'_DJtzz?" X$**XX
q.:"=>`djj``q.3C"CD(*zzGw.%%g.!# A% !!'* " $
4::/ `s   E E drop_non_keep	drop_keepc                    |s|syg }d}d}| j                   D ]3  }|j                  }|r|r|dz  }|s|r|dz  }#|j                  |       5 |s|r|| _         ||fS )z.Clear queued inputs according to keep markers.)r   r   r   r   )rR   r   r   )r>   r   r   	remainingremoved_non_keepremoved_keepr   is_keeps           r?   clear_inputs_by_flagzNode.clear_inputs_by_flag  s}    Y#%	zzGllG9!} A% W% " |"DJ--rA   c                     | j                   s t        dt        | j                  d            t	        | j                   d      r| j                   j                          y y )Nznode configuration missingr(   r   )r(   r   r   rx   hasattrr   r=   s    r?   r   zNode.validate(  sF    {{:K		S[<\]]4;;
+KK  " ,rA   c                     | j                   S r;   )rM   r=   s    r?   r   zNode.node_type.  s    yyrA   c                 J    | j                  t              }|sy |j                  S r;   )	as_configr   rY   r>   agents     r?   
model_namezNode.model_name2  s     {+zzrA   c                     | j                  t              }|r|j                  S | j                  t              }|r|j                  S y r;   )r   r   r{   r    rN   )r>   r   humans      r?   r{   z	Node.role9  s=    {+::{+$$$rA   c                     | j                  t              }|rT|j                  rHg }|j                  D ]5  }|j                  t              }|s|j	                  |j
                         7 |S g S r;   )r   r   toolingr!   extendtools)r>   r   	all_toolstool_configfunc_cfgs        r?   r   z
Node.toolsC  s_    {+U]]#%I$}}&001CD$$X^^4  - 	rA   c                 ^    | j                  t              }|rt        |j                        S g S r;   )r   r   rp   memoriesr   s     r?   r   zNode.memoriesO  s'    {+''	rA   c                 ^    | j                  t              }|rt        |j                        S i S r;   )r   r   r<   paramsr   s     r?   r   zNode.paramsV  s'    {+%%	rA   c                 J    | j                  t              }|r|j                  S y r;   )r   r   base_urlr   s     r?   r   zNode.base_url]  s     {+>>!rA   r   edge_configc                    | j                   vr| j                   j                         t        |xs i       }t        fd| j                  D        d       }|rt        |j                  dd            nd}|rt        |j                  dd            nd}|rt        |j                  dd            nd}|rt        |j                  dd            nd}|rt        |j                  dd            nd}	|j                  d	d       }
t        |
t              sX|j                  d
d      }t        j                  |t        | j                  d| j                   dj                   d            }
|
j                         }|
j                  }|
j!                         }|j                  dd       }|f|j                  d      Ut#        j                  |j                  d      t        | j                  d| j                   dj                   d            }t        |t"              r|j!                         nd }t        |t"              r|j                  nd }t        |t"              r|j                         nd }|j                  dd       }|f|j                  d      Ut%        j                  |j                  d      t        | j                  d| j                   dj                   d            }||d
<   ||d<   ||d<   |||d<   ||d<   ||d<   |r|j&                  j)                  |       ||_        ||_        |
|_        ||_        ||_        ||_        ||_        |	|_        t        |t"              r||_        ||_        ||_        y d |_        d |_        ||_        y | j                  j                  tA        ||||
|||||	t        |t"              r|nd ||             y )Nc              3   @   K   | ]  }|j                   u s|  y wr;   )r%   )r   linkr   s     r?   r   z%Node.add_successor.<locals>.<genexpr>h  s      V*>$$++QUBU*>s   r)   Tr0   r1   Fr2   r3   r,   r+   r*   zedge[z->z].conditionr}   r5   processz	].processr9   dynamicz	].dynamiccondition_labelr-   process_labelr6   )r%   r(   r)   r+   r,   r-   r0   r1   r2   r3   r5   r6   r9   )!rW   r   r<   nextrX   rI   ro   popr~   r   r   r   rx   rL   display_labelrM   to_external_valuer   r   r(   updater)   r+   r,   r-   r0   r1   r2   r3   r5   r6   r9   r#   )r>   r   r   r   existingr)   r0   r1   r2   r3   r,   	raw_valuer   r-   condition_serializabler5   process_serializabler6   r   r9   s    `                  r?   add_successorzNode.add_successord  s   t&OO""4({(b)V$*>*>VX\]8?$w{{9d34T>ET'++lD9:4
CJtGKK>?PUELW[[%@ARWOVT'++.BE"JK\a";;'94@*,?@K8I2<< eDGG9Btwwi{,ST  +88:)..!1!C!C!E %5t<!gkk)&<&H0::I& eDGG9Btwwiy,QRN FPP^`sEt~??Az~.8I\.]~**cg:D^Uh:i446os !%5t<!gkk)&<&H.88I& eDGG9Btwwiy,QRN
  6%4!"$2 !+!5GI'4GO$&2GN#OO""7+&H!0H(8H%&4H#",H$0H!%2H"*<H'.*=>*8'(4% '5H# +/'(,%&4H#  ''"#-%5#1)!-"/'95?Pc5d>jn!-#1rA   c                 X    || j                   vr| j                   j                  |       y y r;   )rV   r   )r>   r   s     r?   add_predecessorzNode.add_predecessor  s)    t((($$T* )rA   c                 ,    t        | j                        S r;   )tuplerX   r=   s    r?   iter_outgoing_edgeszNode.iter_outgoing_edges  s    T))**rA   r   c                 `    | j                   D ]  }|j                  j                  |k(  s|c S  y r;   )rX   r%   rL   )r>   r   r   s      r?   find_outgoing_edgezNode.find_outgoing_edge  s,    ((D{{~~( ) rA   c                     | j                   ry| j                  D ]B  }|j                         D ]-  }|j                  | u s|j                  s|j
                  s,  y D y)NTF)rT   rV   r   r%   r)   r/   r>   predecessor	edge_links      r?   is_triggeredzNode.is_triggered  sW    ,,K(<<>	##t+	0A0AiFYFY ? - rA   c                     d| _         | j                  D ]-  }|j                         D ]  }|j                  | u sd|_         / y )NF)rT   rV   r   r%   r/   r   s      r?   reset_triggerszNode.reset_triggers  sC    $,,K(<<>	##t+*/I' ? -rA   parent_varsc                 Z    t        |xs i       }|j                  | j                         |S r;   )r<   r   rQ   )r>   r   mergeds      r?   
merge_varszNode.merge_vars  s&    k'R(dii rA   rB   r;   )r   r$   rC   N)=rD   rE   rF   rH   rG   rN   rO   rI   rP   r^   r   r<   rQ   r   r   r(   r   rp   rR   r	   r   rS   NodePayloadrT   rV   rW   rX   r#   r   FIELD_SPECSclassmethodr   rM   rh   rn   r
   r   r   r   r   r   r   r   propertyr   r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)rv   s   @r?   r$   r$   >   s   G
I"Kt"JNC 6D$sCx.6 $FJ$ !6E4=6 %d ;FD;!OT!!&t%!HL$v,H$TFJVF&+Du&MOT(^M "0
  $ O
 '+m
  *!. Q
 &%k
 "-z
c9Kv T(D,<"<=   Do!56  & =WS#X. = = = =~#G # #$[ $T $ 49PQ !D !# !VY !F.T .d .uUXZ]U] ..# 3   HSM   hsm   	tCy 	 	 $s)   S#X   (3-  Q& QxS#X7O Q[_ Qf++Xh%7 +# (T/ d 0htCH~&> $sTWx. rA   r$   N).__doc__dataclassesr   r   r   typingr   r   r   r	   r
   r   r   entity.messagesr   r   schema_registryr   r   r   entity.configs.baser   r   r   r   r   r   r   r   r   r   "entity.configs.edge.edge_conditionr   "entity.configs.edge.edge_processorr   'entity.configs.edge.dynamic_edge_configr   entity.configs.node.agentr   entity.configs.node.humanr    entity.configs.node.toolingr!   r   r#   r$   rJ   rA   r?   <module>r      s    % 1 1 F F F 0    C B E 1 1 :
 . . .0 X: X XrA   