
    iI                         d dl Z d dlZd dlmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ d dlZd dlZd dlZd dlmZmZmZ d d	lmZmZmZ d d
lmZ dedefdZe G d d             Z G d d      Z y)    N)contextmanager)	dataclassfield)datetime)Enum)Path)AnyDictListOptional)	CallStage	EventTypeLogLevel)StructuredLoggerLogTypeget_workflow_logger)MACExceptionvaluereturnc                 N   |  t        | t        t        t        t        f      r| S t        | t
              r6| j                         D ci c]  \  }}t        |      t        |       c}}S t        | t        t        t        f      r| D cg c]  }t        |       c}S t        | dd      }t        |      r	 t         |             S t        | d      r	 t        t        |             S t        |       S c c}}w c c}w # t        $ r Y Bw xY w# t        $ r Y t        |       S w xY w)z;Recursively convert objects into JSON-encodable primitives.Nto_dict__dict__)
isinstancestrintfloatbooldictitems
_json_safelisttuplesetgetattrcallable	Exceptionhasattrvars)r   keyvalitemr   s        9/Users/bowang/.openclaw/workspace/ChatDev/utils/logger.pyr    r       s   }
53UD*AB%:?++-H-hc3C*S/)-HH%$s+,-23UT
4 U33eY-G	gi(( uj!	d5k** u: I3
  		
  	u:	s0   C4
C:8C? D ?	D
D	D$#D$c                       e Zd ZU dZeed<   eed<   dZee   ed<   dZ	ee
   ed<   dZee   ed<    ee      Zeeef   ed	<    ee      Zee   ed
<   dZee   ed<   deeef   fdZy)LogEntryz1Single log entry that captures execution details.	timestamplevelNnode_id
event_typemessage)default_factorydetailsexecution_pathdurationr   c           	          | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  dS )Nr/   r0   r1   r2   r3   r5   r6   r7   r9   selfs    r,   r   zLogEntry.to_dict4   sF    ZZ||//||||"11	
 		
    )__name__
__module____qualname____doc__r   __annotations__r   r1   r   r2   r   r3   r   r   r5   r
   r	   r!   r6   r   r7   r   r    r<   r,   r.   r.   (   s    ;NO!GXc]!&*J#*!GXc]!#D9GT#s(^9 %d ;NDI; $Hhuo$

c3h 

r<   r.   c                      e Zd ZdZdej
                  ddfdedededefdZ	 	 	 dCd	ed
edede	de
eef   dededz  fdZ	 	 dDd
edede	de
eef   dedz  ddfdZ	 	 dDd
edede	de
eef   dedz  ddfdZ	 	 dDd
edede	de
eef   dedz  ddfdZ	 	 dDd
edede	de
eef   dedz  ddfdZ	 	 dEd
edede	de
eef   ddf
dZ	 	 dFdedee
eef      dede
eef   ddf
dZ	 	 dEdedededede
eef   ddfdZ	 dGdedede
eef   ddfdZ	 	 dDdedededede
eef   ddfd Z	 	 	 dCded!edededede
eef   d"eez  dz  ddfd#Z	 	 	 dHded$ed%eded&edz  de
eef   d"eez  dz  ddfd'Z	 dFded(ed)ed"edede
eef   ddfd*Z	 dFded+ed,ed"edede
eef   ddfd-ZdGd.e
eef   ddfd/Z	 	 dId&edede
eef   ddfd0Z dee
eef      fd1Z!d	edee
eef      fd2Z"dedee
eef      fd3Z#de
eef   fd4Z$de
eef   fd5Z%defd6Z&d7eddfd8Z'd9 Z(e)defd:       Z*e)defd;       Z+e)defd<       Z,e)defd=       Z-e)ded$efd>       Z.e)ded"efd?       Z/e)ded,ed"efd@       Z0dAede1e   fdBZ2y)JWorkflowLoggerz;Workflow logger that tracks the entire execution lifecycle.NTworkflow_id	log_leveluse_structured_logginglog_to_consolec                 "   |xs& dt        j                         j                  d       | _        g | _        t        j                         | _        g | _        || _        || _        || _	        d | _
        |rt        | j                        | _
        y y )N	workflow_z%Y%m%d_%H%M%S)r   nowstrftimerE   logs
start_timecurrent_pathrF   rH   rG   structured_loggerr   )r;   rE   rF   rG   rH   s        r,   __init__zWorkflowLogger.__init__D   s~    &`Ihlln6M6Mo6^5_*`$&	",,.')#,$2&<#=A!%89I9I%JD" "r<   r0   r3   r1   r2   r5   r7   r   c                 .   || j                   k  ryt        j                         j                         }t	        j
                  | j                        }t        |xs i       }	t        ||||||	||      }
| j                  j                  |
       | j                  rFt        d| d|j                   d|rd| dnd |rd	| dnd | d
|rd| d
nd |rd| nd        | j                  r'| j                  r| j                   ||r|j                  nd||d|	}|t"        j$                  k(  r | j                  j&                  |fi | |
S |t"        j(                  k(  r | j                  j*                  |fi | |
S |t"        j,                  k(  r | j                  j.                  |fi | |
S |t"        j0                  k(  r | j                  j2                  |fi | |
S |t"        j4                  k(  r | j                  j6                  |fi | |
S )zAdd a log entry.Nr9   [z] [z] zNode z -  zEvent  z	Details: z
Duration: )rE   r1   r2   r6   r7   )rF   r   rK   	isoformatcopydeepcopyrO   r    r.   rM   appendrH   printr   rG   rP   rE   r   DEBUGdebugINFOinfoWARNINGwarningERRORerrorCRITICALcritical)r;   r0   r3   r1   r2   r5   r7   r/   r6   safe_details	log_entrystructured_detailss               r,   add_logzWorkflowLogger.add_logQ   s<    4>>!LLN,,.	t'8'89!'-R0! )	
	 			# Ai[EKK=-4uWIS)"=1;vj\-DIQ/6y	+B?08z(,bAC D &&4+A+A#//"2<j..$"0$" " &,&&,,WK8JK  (--'+&&++GJ7IJ  (***.&&..wM:LM  (..(,&&,,WK8JK  (+++/&&//N;MNr<   c                 L    | j                  t        j                  |||||       y N)rh   r   r[   r;   r3   r1   r2   r5   r7   s         r,   r\   zWorkflowLogger.debug       X^^Wgz7HUr<   c                 L    | j                  t        j                  |||||       y rj   )rh   r   r]   rk   s         r,   r^   zWorkflowLogger.info   s    X]]GWj'8Tr<   c                 L    | j                  t        j                  |||||       y rj   )rh   r   r_   rk   s         r,   r`   zWorkflowLogger.warning   s    X%%wWhWr<   c                 L    | j                  t        j                  |||||       y rj   )rh   r   ra   rk   s         r,   rb   zWorkflowLogger.error   rl   r<   c                 J    | j                  t        j                  ||||       y rj   )rh   r   rc   )r;   r3   r1   r2   r5   s        r,   rd   zWorkflowLogger.critical   s    X&&*gNr<   inputs	node_typec                     | j                   j                  |       | j                  d| |t        j                  ||d|xs i        y)z!Record data when entering a node.zEntering node )rq   rr   r1   r2   r5   N)rO   rY   r^   r   
NODE_START)r;   r1   rq   rr   r5   s        r,   
enter_nodezWorkflowLogger.enter_node   sX     	  )		WI& ++ & =b		 	 
	
r<   outputoutput_sizec                     | j                   r,| j                   d   |k(  r| j                   j                          ||d|xs i }| j                  d| |t        j                  ||       y)z Record data when exiting a node.)rw   rx   zExiting node r1   r2   r5   r7   N)rO   popr^   r   NODE_END)r;   r1   rw   r7   rx   r5   exit_detailss          r,   	exit_nodezWorkflowLogger.exit_node   s}     !2!22!6'!A!!# &
 }"
 			G9% ))  	 	
r<   	from_nodeto_nodec                 f    | j                  d| d| |t        j                  d|i|xs i        y)z Record an edge-processing event.zProcessing edge from z to r   rt   N)r\   r   EDGE_PROCESS)r;   r   r   r5   s       r,   record_edge_processz"WorkflowLogger.record_edge_process   sG     	

#I;d7)< --7=b	 	 	
r<   
input_datac                 h    ||d|xs i }| j                  d| |t        j                  ||       y)zRecord a human interaction.)r   rw   zHuman interaction for node r{   N)r^   r   HUMAN_INTERACTION)r;   r1   r   rw   r7   r5   call_detailss          r,   record_human_interactionz'WorkflowLogger.record_human_interaction   sN     %
 }"
 			)'3 22  	 	
r<   
model_namestagec                     t        |t              r|j                  n|}|||d|xs i }	|r||	d<   | j                  d| |t        j
                  |	|       y)zRecord a model invocation.)r   r   rw   r   zModel call for node r{   N)r   r   r   r^   r   
MODEL_CALL)
r;   r1   r   r   rw   r7   r5   r   stage_valuer   s
             r,   record_model_callz WorkflowLogger.record_model_call   sr    
 &0y%Aekku$$
 }"	
 $/L!		"7), ++  	 	
r<   	tool_nametool_resultsuccessc                    t        |t              r|j                  n|}|||d|xs i }	|r||	d<   |durt        j                  nt        j
                  }
| j                  |
d| d| |t        j                  |	|       y)zRecord a tool invocation.)r   r   r   r   Fz
Tool call z
 for node r{   N)	r   r   r   r   r]   ra   rh   r   	TOOL_CALL)r;   r1   r   r   r7   r   r5   r   r   tool_detailsr0   s              r,   record_tool_callzWorkflowLogger.record_tool_call   s    
 &0y%Aekku&"
 }"	
 $/L!!(!58>>:gY7 **  	 	
r<   thinking_modethinking_resultc           	      x    |||d|xs i }| j                  d| d| d| d|t        j                  ||       y)zRecord a thinking-stage entry.)r   r   r   zThinking process for node z ( at )r{   N)r^   r   THINKING_PROCESS)r;   r1   r   r   r   r7   r5   thinking_detailss           r,   record_thinking_processz&WorkflowLogger.record_thinking_process  s`      /*
 }"	
 			(	M?$ugQO 11$ 	 	
r<   retrieved_memoryoperation_typec                 v    |||d|xs i }| j                  d| d| d| |t        j                  ||       y)z,Record a memory operation (retrieve/update).)r   r   r   zMemory z operation for node r   r{   N)r^   r   MEMORY_OPERATION)r;   r1   r   r   r   r7   r5   memory_detailss           r,   record_memory_operationz&WorkflowLogger.record_memory_operation#  s_     !1,
 }"	
 			n%%9'$ugN 11" 	 	
r<   workflow_configc           	          | j                  dt        j                  | j                  |r|j	                  d      nd|r|j	                  d      ndd       y)z Record the workflow start event.zWorkflow execution started
node_countN
edge_count)rE   r   r   )r2   r5   )r^   r   WORKFLOW_STARTrE   get)r;   r   s     r,   record_workflow_startz$WorkflowLogger.record_workflow_start5  sS    		( //#//CRo11,?X\CRo11,?X\ 	 	
r<   c                     |t        | j                        d|xs i }|rt        j                  nt        j                  }| j                  |dt        j                  ||       y)zRecord the workflow end event.)r   
total_logszWorkflow execution completed)r2   r5   r7   N)lenrM   r   r]   ra   rh   r   WORKFLOW_END)r;   r   r7   r5   end_detailsr0   s         r,   record_workflow_endz"WorkflowLogger.record_workflow_endA  s`     dii.
 }"
 ")hnn* -- 	 	
r<   c                 \    | j                   D cg c]  }|j                          c}S c c}w )z'Return all log entries as dictionaries.)rM   r   )r;   logs     r,   get_logszWorkflowLogger.get_logsS  s$    )-3#333s   )c                 |    | j                   D cg c]"  }|j                  |k(  s|j                         $ c}S c c}w )zReturn logs filtered by level.)rM   r0   r   )r;   r0   r   s      r,   get_logs_by_levelz WorkflowLogger.get_logs_by_levelW  s/    )-I#cii56HIII   99c                 |    | j                   D cg c]"  }|j                  |k(  s|j                         $ c}S c c}w )z Return logs filtered by node id.)rM   r1   r   )r;   r1   r   s      r,   get_logs_by_nodezWorkflowLogger.get_logs_by_node[  s/    )-M#ckkW6LMMMr   c           	         t        j                         | j                  z
  j                         dz  }i }| j                  D ]Z  }|j
                  s|j                  s|j
                  |vrd||j
                  <   ||j
                  xx   |j                  z  cc<   \ t        | j                  D cg c]  }|j                  dv s| c}      }t        | j                  D cg c]  }|j                  dk(  s| c}      }| j                  | j                  j                         |t        | j                        |||| j                  dS c c}w c c}w )zReturn an execution summary.i  r   )ra   rc   r_   )rE   rN   total_durationr   error_countwarning_countnode_durationsr6   )r   rK   rN   total_secondsrM   r1   r7   r   r0   rE   rV   rO   )r;   r   r   r   r   r   s         r,   get_execution_summaryz$WorkflowLogger.get_execution_summary_  s   ",,.4??:IIKdR99C{{s||;;n423N3;;/s{{+s||;+	  $))Z)3syyDY7Y3)Z[DIIPISi9OSIPQ  ++//335,dii.&*,"//	
 		
 [Ps   1EE#E8Ec                     | j                   | j                  j                         | j                         | j	                         d}|S )N)rE   rN   rM   summary)rE   rN   rV   r   r   )r;   log_datas     r,   r   zWorkflowLogger.to_dictx  s>    ++//335MMO113	
 r<   c                 N    t        j                  | j                         dd      S )z$Serialize all logs to a JSON string.F   )ensure_asciiindent)jsondumpsr   r:   s    r,   to_jsonzWorkflowLogger.to_json  s    zz$,,.uQGGr<   filepathc                     t        |      }|j                  j                  dd       |j                  | j	                         d       y)zPersist logs to a file on disk.T)parentsexist_okzutf-8)encodingN)r   parentmkdir
write_textr   )r;   r   paths      r,   save_to_filezWorkflowLogger.save_to_file  s:     H~$69r<   c                 ,    t        | d      si | _        yy)z'Initialize timer storage if not exists._timersN)r'   r   r:   s    r,   __init_timers__zWorkflowLogger.__init_timers__  s    tY'-/DL (r<   c              #     K   | j                          t        j                         }	 d t        j                         }||z
  }|| j                  |<   y# t        j                         }||z
  }|| j                  |<   w xY ww)z*Context manager that times node execution.Nr   timer   r;   r1   rN   end_timer7   s        r,   
node_timerzWorkflowLogger.node_timer  sp      	YY[
	-yy{H :-H$,DLL! yy{H :-H$,DLL!s   %BA )B*A??Bc              #     K   | j                          t        j                         }	 d t        j                         }||z
  }|| j                  d| <   y# t        j                         }||z
  }|| j                  d| <   w xY ww)z-Context manager that times model invocations.Nmodel_r   r   s        r,   model_timerzWorkflowLogger.model_timer  ~      	YY[
	8yy{H :-H/7DLL6'+, yy{H :-H/7DLL6'+,   %BA ,B-BBc              #     K   | j                          t        j                         }	 d t        j                         }||z
  }|| j                  d| <   y# t        j                         }||z
  }|| j                  d| <   w xY ww)z-Context manager that times agent invocations.Nagent_r   r   s        r,   agent_timerzWorkflowLogger.agent_timer  r   r   c              #     K   | j                          t        j                         }	 d t        j                         }||z
  }|| j                  d| <   y# t        j                         }||z
  }|| j                  d| <   w xY ww)z.Context manager that times human interactions.Nhuman_r   r   s        r,   human_timerzWorkflowLogger.human_timer  r   r   c              #      K   | j                          t        j                         }	 d t        j                         }||z
  }|| j                  d| d| <   y# t        j                         }||z
  }|| j                  d| d| <   w xY ww)z,Context manager that times tool invocations.Ntool__r   )r;   r1   r   rN   r   r7   s         r,   
tool_timerzWorkflowLogger.tool_timer  s      	YY[
	Cyy{H :-H:BDLL5	9+67 yy{H :-H:BDLL5	9+67   %BA /B0BBc              #      K   | j                          t        j                         }	 d t        j                         }||z
  }|| j                  d| d| <   y# t        j                         }||z
  }|| j                  d| d| <   w xY ww)z+Context manager that times thinking stages.N	thinking_r   r   )r;   r1   r   rN   r   r7   s         r,   thinking_timerzWorkflowLogger.thinking_timer  s      	YY[
	Cyy{H :-H:BDLL9WIQug67 yy{H :-H:BDLL9WIQug67r   c           
   #   ,  K   | j                          t        j                         }	 d t        j                         }||z
  }|| j                  d| d| d| <   y# t        j                         }||z
  }|| j                  d| d| d| <   w xY ww)z-Context manager that times memory operations.Nmemory_r   r   )r;   r1   r   r   rN   r   r7   s          r,   memory_timerzWorkflowLogger.memory_timer  s      	YY[
	Ryy{H :-HIQDLL77)1^,<AeWEF yy{H :-HIQDLL77)1^,<AeWEFs   %BA 2B3BB	timer_keyc                 X    | j                          | j                  j                  |      S )z2Return the elapsed time recorded by the timer key.)r   r   r   )r;   r   s     r,   	get_timerzWorkflowLogger.get_timer  s#    ||	**r<   )NNNNN)NNNN)NNN)NNrj   )NTNN)TNN)3r=   r>   r?   r@   r   r[   r   r   rQ   r   r
   r	   r   r.   rh   r\   r^   r`   rb   rd   r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rB   r<   r,   rD   rD   A   sw   E*.hnnuy  SW KC K8 Knr K  LP K LPHL"&7X 7 7S 7%77;CH~77+3d?7r PTGKVS V3 V9 VCH~V8=VPTV OSFJUC U# U) U38nU7<t|UOSU RVIMXs XS XY Xc3hX:?$,XRVX PTGKVS V3 V9 VCH~V8=VPTV SW+/O Oc Oi OsCx.O48O W[-1
# 
tDcN/C 
PS 
 cN
6:
  FJEI
 
c 
U 
"
48cN
NR
, 7;
S 
3 
%)#s(^
?C
 \`SW
 
 
UX 
+0
BFsCx.
\`
$ AELP:>
 
# 
&)
:=
$)
;?S>
 "+S4!7
 DH
0 IM379=
 
 
# 
#(
:>+
"&sCx.
 !*C$ 6
 CG
4 SW
s 
3 
Y\ 
eh 
*/
AEc3h
[_
& SW
s 
c 
[^ 
gj 
*/
AEc3h
[_
$

T#s(^ 

t 

 37NR
4 
&+
=A#s(^
W[
$4$tCH~. 4Js JtDcN/C JN NT#s(^0D N
tCH~ 
2c3h H H:S :T :0
 	-# 	- 	- 	83 	8 	8 	83 	8 	8 	83 	8 	8 	C# 	C# 	C 	C 	Cc 	C# 	C 	C 	RC 	R 	RS 	R 	R+3 +8E? +r<   rD   )!osr   
contextlibr   dataclassesr   r   r   enumr   pathlibr   typingr	   r
   r   r   r   rW   	tracebackentity.enumsr   r   r   utils.structured_loggerr   r   r   utils.exceptionsr   r    r.   rD   rB   r<   r,   <module>r     sp    	  % (    , ,    7 7 R R )c c , 
 
 
0l+ l+r<   