ó
    |¤j¾  ã                  ój   • S r SSKJ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
   " S S5      rS
S	 jrg)zl
Trace logging for agent execution.
Records LLM calls, tool executions, and decision points to JSONL files.
é    )ÚannotationsN)Údatetime)ÚPath)ÚAnyÚIteratorc                  ó¼   • \ rS rSrSrSS jrSS jr  S           SS jjr            SS jrSS jr	SS jr
SSS	 jjr S     SS
 jjrSS jrSrg)ÚTraceLoggeré   z>Logs agent execution traces to .acli/traces/<session_id>.jsonlc                ó  • US-  U l         U R                   R                  SSS9  [        R                  " 5       R	                  S5      U l        U R                   U R
                   S3-  U l        [        R                  " 5       U l        g )NÚtracesT)ÚparentsÚexist_okz%Y%m%d_%H%M%Sz.jsonl)	Ú
traces_dirÚmkdirr   ÚnowÚstrftimeÚ
session_idÚ
trace_fileÚtimeÚ_session_start)ÚselfÚworkspace_dirs     Ú©C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\dashscope/acli/memory/trace.pyÚ__init__ÚTraceLogger.__init__   sg   € Ø'¨(Ñ2ˆŒØ�‰×Ñ d°TÐÑ:Ü"Ÿ,š,›.×1Ñ1°/ÓBˆŒØŸ/™/¨t¯©Ð.?¸vÐ,FÑFˆŒÜ"Ÿiši›kˆÕó    c                ó”  • SSK Jn  [        R                  " 5       R	                  5       [        [        R                  " 5       U R                  -
  S-  5      US.U" U5      En [        U R                  SSS9 nUR                  [        R                  " USS	9S
-   5        SSS5        g! , (       d  f       g= f! [         a     gf = f)z&Write a trace event to the JSONL file.r   )Úsanitizeéè  )Ú	timestampÚ
elapsed_msÚeventÚaúutf-8©ÚencodingF)Úensure_asciiÚ
N)Údashscope.acli.utilsr   r   r   Ú	isoformatÚintr   r   Úopenr   ÚwriteÚjsonÚdumpsÚ	Exception)r   Ú
event_typeÚdatar   ÚentryÚfs         r   ÚlogÚTraceLogger.log   sŸ   € å1ô "Ÿš›×1Ñ1Ó3ÜœtŸyšy›{¨T×-@Ñ-@Ñ@ÀDÑHÓIØñ
ñ �t‹nð	
ˆð	Ü�d—o‘o s°WÒ=ÀØ—‘œŸ
š
 5°uÑ=ÀÑDÔE÷ >×=Ö=ûäó 	áð	ús0   Á#B: Á8(B)Â B: Â)
B7Â3B: Â7B: Â:
CÃCc           
     ót  • U[        U5      [        U5      U[        UR                  SS5      5      UR                  S/ 5      UR                  S5      S.nSSKJn  UR	                  5       (       a2  XS'   U=(       d    /  Vs/ s H  oˆR                  S	S
5      PM     snUS'   U R                  SU5        gs  snf )zœLog an LLM API call.

Lightweight fields (counts, usage, duration) are always recorded;
the full prompt payload is included only in debug mode (/debug on).
ÚcontentÚ Ú
tool_callsÚusage)ÚmodelÚmessage_countÚ
tool_countÚduration_msÚresponse_content_lengthr:   r;   r   )ÚdebuglogÚmessagesÚnameÚ?ÚtoolsÚllm_callN)ÚlenÚgetÚdashscope.aclirA   Údebug_enabledr5   )	r   rB   rE   Úresponser?   r<   r2   rA   Úts	            r   Úlog_llm_callÚTraceLogger.log_llm_call+   s£   € ð Ü  ›]Ü˜e›*Ø&Ü'*¨8¯<©<¸	À2Ó+FÓ'GØ"Ÿ,™, |°RÓ8Ø—\‘\ 'Ó*ñ 
ˆõ 	,à×!Ñ!×#Ñ#Ø'�ÑØ9>¿À"¸ÓEº°AŸU™U 6¨3Ö/¹ÑEˆD�‰MØ�‰�˜TÕ"ùò Fs   ÂB5c           
     ó`   • U R                  SUU[        U5      U(       a  USS OSUUS.5        g)zLog a tool execution.Útool_executionNéÈ   r9   )ÚtoolÚ	argumentsÚresult_lengthÚresult_previewr?   Úsuccess)r5   rG   )r   Ú	tool_namerS   Úresultr?   rV   s         r   Úlog_tool_executionÚTraceLogger.log_tool_executionH   s8   € ð 	�‰Øà!Ø&Ü!$ V£Þ28 &¨¨#¡,¸bØ*Ø"ñõ
	
r   c                ó0   • U R                  SSU0UE5        g)zALog a decision point (e.g., plan created, compression triggered).ÚdecisionÚtypeN)r5   )r   Údecision_typeÚdetailss      r   Úlog_decisionÚTraceLogger.log_decision]   s#   € à�‰Øà˜ðàðõ	
r   c              #  óx  #   • U R                   R                  5       (       d  g [        U R                   SSS9 nU H5  nUR                  5       nU(       d  M   [        R
                  " U5      v •  M7     SSS5        g! [        R                   a     MY  f = f! , (       d  f       g= f! [         a     gf = f7f)z5Yield all trace events of this session, oldest first.NÚrr$   r%   )r   Úexistsr,   Ústripr.   ÚloadsÚJSONDecodeErrorÚOSError)r   r4   Úlines      r   Úiter_eventsÚTraceLogger.iter_eventsg   sž   é € à�‰×%Ñ%×'Ñ'Øð	Ü�d—o‘o s°WÒ=ÀÛ�DØŸ:™:›<�DÞÙ ð!Ü"Ÿjšj¨Ó.Ô.ñ ÷ >Ð=øô  ×/Ñ/ó !Ú ð!ú÷ >Õ=ûô ó 	Ùð	üso   ‚!B:¤B* ¹BÁA>Á1BÁ5B* Á=B:Á>BÂBÂBÂBÂ
B'Â#B* Â&B:Â'B* Â*
B7Â4B:Â6B7Â7B:c                ó<   • [        U R                  5       5      U* S  $ )N)Úlistrj   )r   Úlimits     r   Útail_eventsÚTraceLogger.tail_eventsx   s   € Ü�D×$Ñ$Ó&Ó'¨¨¨Ð0Ð0r   c           
     óÒ   • UR                  5       nU R                  5        Vs/ s H3  nU[        R                  " US[        S9R                  5       ;   d  M1  UPM5     nnXR* S  $ s  snf )NF)r'   Údefault)Úlowerrj   r.   r/   Ústr)r   Úkeywordrn   ÚkwÚeÚmatchess         r   Úsearch_eventsÚTraceLogger.search_events{   sl   € ð
 �]‰]‹_ˆð ×%Ñ%Ô'ó
â'�Ø”T—Z’Z °¼sÑC×IÑIÓKÑK÷ Ù'ð 	ð 
ð
 �v�wÐÐùò
s   £0A$ÁA$c                óX   •  U R                   R                  SS9  g ! [         a     g f = f)NT)Ú
missing_ok)r   Úunlinkr0   )r   s    r   ÚclearÚTraceLogger.clearˆ   s.   € ð	Ø�O‰O×"Ñ"¨dÐ"Ò3øÜó 	Ùð	ús   ‚ œ
)¨))r   r   r   r   N)r   r   )r1   rt   r2   zdict[str, Any]ÚreturnÚNone)r   r9   )rB   ú
list[dict]rE   r‚   rK   Údictr?   r+   r<   rt   r€   r�   )rW   rt   rS   rƒ   rX   rt   r?   r+   rV   Úboolr€   r�   )r^   rt   r_   rƒ   r€   r�   )r€   zIterator[dict[str, Any]])é   )rn   r+   r€   úlist[dict[str, Any]])é   )ru   rt   rn   r+   r€   r†   )r€   r�   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r5   rM   rY   r`   rj   ro   ry   r~   Ú__static_attributes__© r   r   r	   r	      sÏ   † ÙHô*ôð, Øð#àð#ð ð#ð ð	#ð
 ð#ð ð#ð 
õ#ð:
àð
ð ð
ð ð	
ð
 ð
ð ð
ð 
ô
ô*
ôö"1ð ð àð ð ð ð 
õ	 ÷r   r	   c                ó@  • U b  U R                   R                  5       (       d  gSnSnSnSnSn0 n [        U R                   SSS9 nU HÄ  nUR                  5       nU(       d  M   [        R
                  " U5      n	U	R                  S5      n
U
S:X  a  US-  nMQ  U
S	:X  d  MY  US-  nU	R                  S
5      (       a  US-  nU	R                  SS5      nU(       a	  XK-  nUS-  nU	R                  SS5      nUR                  US5      S-   Xl'   MÆ     SSS5        US:X  a  US:X  a  gU(       a  XE-  S-  OSn[        UR                  5       S SS9nUUU(       a  X2-  OSUUS.$ ! [        R                   a     GM2  f = f! , (       d  f       Nt= f! [         a     gf = f)z.Generate a performance report from trace logs.Nr   rc   r$   r%   r"   rF   é   rP   rV   r?   rR   Úunknownr   g        c                ó   • U S   $ )Nr�   rŽ   )Úxs    r   Ú<lambda>Ú!generate_report.<locals>.<lambda>»   s   € ¸!¸Aº$r   T)ÚkeyÚreverse)Útotal_llm_callsÚtotal_tool_callsÚtool_success_rateÚavg_response_timeÚ	top_tools)r   rd   r,   re   r.   rf   rg   rH   rh   ÚsortedÚitems)Útrace_loggerÚ	llm_callsr:   Útool_successesÚtotal_duration_msÚduration_countÚtool_countsr4   ri   r3   r"   ÚdurrC   r›   rœ   s                  r   Úgenerate_reportr¦   �   sÁ  € àÑ <×#:Ñ#:×#AÑ#A×#CÑ#CØà€IØ€JØ€NØÐØ€NØ"$€KðÜ�,×)Ñ)¨3¸ÒAÀQÛ�Ø—z‘z“|�ÞÙðÜ ŸJšJ tÓ,�Eð Ÿ	™	 'Ó*�Ø˜JÓ&Ø ‘N’IØÐ.Õ.Ø !‘O�JØ—y‘y ×+Ñ+Ø&¨!Ñ+˜ØŸ)™) M°1Ó5�CÞØ)Ñ0Ð)Ø&¨!Ñ+˜Ø Ÿ9™9 V¨YÓ7�DØ(3¯©¸¸aÓ(@À1Ñ(D�KÓ%ñ) ÷ Bð2 �Aƒ~˜*¨›/Øö 8FÐ	Ñ	+¨dÒ	2È3ð ô �{×(Ñ(Ó*±ÈÑM€Ið %Ø&æ-7ˆ^Ò(¸Sà.Øñð øô5 ×+Ñ+ó Ûðú÷ BÕAûô, ó ÙðúsZ   ±F ÁE?Á&E#Á<"E?Â"A/E?ÄF Å#E<Å7E?Å;E<Å<E?Å?
FÆ	F ÆF Æ
FÆF)rŸ   zTraceLogger | Noner€   zdict | None)rŒ   Ú
__future__r   r.   r   r   Úpathlibr   Útypingr   r   r	   r¦   rŽ   r   r   Ú<module>rª      s0   ðñõ
 #ã Û Ý Ý ß  ÷|ñ |õ~6r   