Ë
    áß²j   ã                   ó„   — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ h d£Zde	d	e	fd
„Z G d„ d«      Zy)zõLifecycle-hook payloads for ``AIAgent`` API requests.

JSON-safe coercion, secret-key redaction, size caps, and the ``api_request_error`` hook dispatch.
Extracted from ``run_agent.py``; every method resolves through ``AIAgent``'s MRO unchanged.
é    N)Úsuppress)ÚSimpleNamespace)ÚAnyÚDictÚOptional)Únormalize_usage>   ÚcookieÚapi_keyÚ
set_cookieÚauthorizationÚproxy_authorizationÚvalueÚreturnc                 ó°   — 	 | j                  dd¬«      S # t        $ r7 	 | j                  d¬«      cY S # t        $ r | j                  «       cY cY S w xY ww xY w)zÂ``value.model_dump(mode="json")`` with graceful degradation for older pydantic signatures.

    warnings=False: pydantic UserWarnings on generic-union SDK models would leak to the terminal.
    ÚjsonF)ÚmodeÚwarnings)r   )Ú
model_dumpÚ	TypeError)r   s    ú</home/ubuntu/.hermes/hermes-agent/agent/api_request_hooks.pyÚ_model_dumpr      sc   € ð
&Ø×Ñ V°eÐÓ<Ð<øÜò &ð	&Ø×#Ñ#¨Ð#Ó0Ò0øÜò 	&Ø×#Ñ#Ó%Ô%ð	&úð&ús)   ‚ •	AŸ3°A³AÁAÁAÁAc                   ó~  — e Zd ZdZdedeeeef      fd„Ze	de
fd„«       Ze	dedefd„«       Zedd	d
ddœdede
de
de
de
defd„«       Zededefd„«       Zdeeeef      deeef   fd„Zdededee   deeef   fd„Zddddddœdededede
dedeeeef      d ed!ed"ee
   d#ee
   d$ee
   d%ee   d&ee   ddfd'„Zy)(ÚApiRequestHooksMixinzPHook payload sanitising + ``api_request_error`` dispatch (see module docstring).Úresponser   c                 óì   — |€yt        |dd«      }|syddlm} t        || j                  | j
                  ¬«      } ||«      }|j                  dd«       |j                  |d<   |j                  |d<   |S )	zLToken buckets for ``post_api_request`` plugins (no raw ``response`` object).NÚusager   )Úasdict)ÚproviderÚapi_modeÚ	raw_usageÚprompt_tokensÚtotal_tokens)	ÚgetattrÚdataclassesr   r   r   r   Úpopr!   r"   )Úselfr   r    r   ÚcuÚsummarys         r   Ú#_usage_summary_for_api_request_hookz8ApiRequestHooksMixin._usage_summary_for_api_request_hook#   sr   € àÐØÜ˜H g¨tÓ4ˆ	ÙØÝ&ä˜Y°·±ÈÏÉÔWˆÙ˜“*ˆØ�‰�K Ô&Ø#%×#3Ñ#3ˆ�Ñ Ø"$§/¡/ˆ�ÑØˆó    c                  ó„   — t        j                  dd«      } 	 t        dt        | «      «      S # t        t
        f$ r Y yw xY w)NÚHERMES_PLUGIN_PAYLOAD_MAX_CHARSÚ50000éè  iPÃ  )ÚosÚgetenvÚmaxÚintr   Ú
ValueError)Úraws    r   Ú_hook_payload_max_charsz,ApiRequestHooksMixin._hook_payload_max_chars3   s@   € ä�i‰iÐ9¸7ÓCˆð	Ü�tœS ›XÓ&Ð&øÜœ:Ð&ò 	Ùð	ús   ˜- ­?¾?Úkeyc                 óš   — t        | t        «      sy| j                  «       j                  dd«      }|t        v xs |j                  d«      S )NFÚ-Ú_Ú_api_key)Ú
isinstanceÚstrÚlowerÚreplaceÚ_SENSITIVE_HOOK_KEYSÚendswith)r6   Úlowereds     r   Ú_is_sensitive_hook_keyz+ApiRequestHooksMixin._is_sensitive_hook_key;   sC   € ä˜#œsÔ#ØØ—)‘)“+×%Ñ% c¨3Ó/ˆØÔ.Ð.ÒN°'×2BÑ2BÀ:Ó2NÐNr*   r   é   i@  éÈ   ©ÚdepthÚ	max_depthÚ
max_stringÚmax_sequencer   rF   rG   rH   rI   c          
      óÀ  ‡ ‡‡‡‡— ‰‰kD  rdt        |«      j                  › d�S |�t        |t        t        t
        f«      r|S t        |t        «      r(t        |«      ‰kD  r|d ‰ dt        |«      ‰z
  › d�z   S |S t        |t        t        f«      rdt        |«      › d�S ˆ ˆˆˆˆfd„}t        |t        «      rji }t        |j                  «       «      D ]J  \  }\  }	}
|‰k\  rt        |«      ‰z
  |d<    |S t        |	«      }‰ j                  |«      rdn ||
«      ||<   ŒL |S t        |t        t        t         f«      rRt        |«      }|d ‰ D �
cg c]
  }
 ||
«      ‘Œ }}
t        |«      ‰kD  r|j#                  dt        |«      ‰z
  i«       |S t%        t&        «      5  t)        |d	«      r |t+        |«      «      cd d d «       S 	 d d d «       t%        t&        «      5  d
dlm}m}  ||«      r | ||«      «      cd d d «       S 	 d d d «       t        |t2        «      r |t5        |«      «      S t)        |d«      rgt%        t&        «      5   |t5        |«      j                  «       D ��ci c]#  \  }}t        |«      j7                  d«      rŒ!||“Œ% c}}«      cd d d «       S t        |«      d ‰ S c c}
w # 1 sw Y   ŒðxY w# 1 sw Y   Œ¼xY wc c}}w # 1 sw Y   Œ:xY w)NÚ<z depth limit>z...[truncated z chars]z bytes>c                 ó6   •— ‰j                  | ‰dz   ‰‰‰¬«      S )Né   rE   )Ú_hook_jsonable)ÚitemÚclsrF   rG   rI   rH   s    €€€€€r   Úrecursez4ApiRequestHooksMixin._hook_jsonable.<locals>.recurseR   s+   ø€ Ø×%Ñ%Ø˜E A™I°ÀzØ)ð &ó ð r*   Ú_truncated_itemsz
<redacted>r   r   )r   Úis_dataclassÚ__dict__r9   )ÚtypeÚ__name__r;   Úboolr2   Úfloatr<   ÚlenÚbytesÚ	bytearrayÚdictÚ	enumerateÚitemsrB   ÚlistÚtupleÚsetÚappendr   Ú	ExceptionÚhasattrr   r$   r   rS   r   ÚvarsÚ
startswith)rP   r   rF   rG   rH   rI   rQ   ÚoutÚidxr6   rO   Ústr_keyÚseqr   rS   ÚkÚvs   ` ````           r   rN   z#ApiRequestHooksMixin._hook_jsonableB   sÆ  ü€ ð
 �9ÒØ”t˜E“{×+Ñ+Ð,¨MÐ:Ð:Øˆ=œJ u¬t´S¼%Ð.@ÔAØˆLÜ�eœSÔ!Ü�5‹z˜JÒ&Ø˜[˜jÐ)¨n¼SÀ»ZÈ*Ñ=TÐ<UÐU\Ð,]Ñ]Ð]ØˆLÜ�eœe¤YÐ/Ô0Ø”s˜5“z�l 'Ð*Ð*÷	ð 	ô �eœTÔ"Ø"$ˆCÜ$-¨e¯k©k«mÓ$<ò fÑ �‘[�c˜4Ø˜,Ò&Ü.1°%«j¸<Ñ.G�CÐ*Ñ+Øð ˆJô ˜c›(�Ø/2×/IÑ/IÈ'Ô/R™|ÑX_Ð`dÓXe��G’ðfð ˆJÜ�eœd¤E¬3Ð/Ô0Ü�u“+ˆCØ-0°°,Ð-?Ö@ T‘7˜4•=Ð@ˆCÐ@Ü�3‹x˜,Ò&Ø—
‘
Ð.´°C³¸<Ñ0GÐHÔIØˆJÜ”iÓ ñ 	3Ü�u˜lÔ+Ùœ{¨5Ó1Ó2÷	3ñ 	3Ø+÷	3ô ”iÓ ñ 	.ß8Ù˜EÔ"Ù™v e›}Ó-÷	.ñ 	.à"÷	.ô �eœ_Ô-Ùœ4 ›;Ó'Ð'Ü�5˜*Ô%Üœ)Ó$ñ eÙ´°e³×1BÑ1BÓ1D×c©¨¨AÌCÐPQËF×L]ÑL]Ð^aÕLb  1¡ÓcÓd÷eñ eä�5‹z˜+˜:Ð&Ð&ùò! A÷	3ð 	3ú÷	.ð 	.üó  d÷eð eúsB   ÅJ1ÆJ6ÇKÉKÉ*"KÊKÊKÊ6J?ËKËKËKc                 ó8  — | j                  «       }d}i dddœfD ]D  } | j                  |fi |¤Ž}	 t        j                  |dt        ¬«      }t        |«      |k  sŒB|c S  dt        |«      j                  |d| d	œS # t
        $ r t	        |«      d| cY c S w xY w)
uR   JSON-able payload under the size cap: full â†’ reduced caps â†’ truncated preview.Ú r.   é2   )rH   rI   F)Úensure_asciiÚdefaultNT)Ú
_truncatedÚoriginal_typeÚpreview)	r5   rN   r   Údumpsr<   rc   rY   rU   rV   )rP   r   ÚlimitÚencodedÚcapsÚpayloads         r   Ú_sanitize_hook_payloadz+ApiRequestHooksMixin._sanitize_hook_payloadu   sº   € ð ×+Ñ+Ó-ˆØˆØ¨¸bÑAÐBò 	ˆDØ(�c×(Ñ(¨Ñ7°$Ñ7ˆGð,ÜŸ*™* W¸5Ì#ÔN�ô �7‹|˜uÓ$Ø’ð	ð ´°e³×1EÑ1EÐRYÐZ`Ð[`ÐRañ
ð 	
øô	 ò ,Ü˜7“| F UÐ+Ô+ð,ús   ±A=Á=BÂBÚ
api_kwargsc                 óŒ   — |xs i j                  «       D ��ci c]  \  }}|dvr||“Œ }}}| j                  d|dœ«      S c c}}w )N>   ÚtimeoutÚhttp_clientÚPOST)ÚmethodÚbody)r^   rz   )r&   r{   r6   r   r�   s        r   Ú_api_request_payload_for_hookz2ApiRequestHooksMixin._api_request_payload_for_hook†   s]   € ð  *Ò/¨R×6Ñ6Ó8÷
á��UØÐ4Ñ4ð �‰Jð
ˆñ 
ð
 ×*Ñ*°fÀdÑ+KÓLÐLùó
s   ˜A Úassistant_messageÚfinish_reasonc          
      ó¸   — t        |dd «      xs g }| j                  t        |dd «      |t        |dd«      t        |dd «      |dœ| j                  |«      dœ«      S )NÚ
tool_callsÚmodelÚroleÚ	assistantÚcontent)rˆ   rŠ   r†   )r‡   r„   rƒ   r   )r#   rz   r)   )r&   r   rƒ   r„   r†   s        r   Ú_api_response_payload_for_hookz3ApiRequestHooksMixin._api_response_payload_for_hookŽ   sq   € ô
 Ð.°¸dÓCÒIÀrˆ
Ø×*Ñ*ä  ¨7°DÓ9Ø!.ä#Ð$5°v¸{ÓKÜ&Ð'8¸)ÀTÓJØ",ñ&ð
 ×AÑAÀ(ÓKñ	ó
ð 	
r*   N)Ústatus_codeÚretry_countÚmax_retriesÚ	retryableÚreasonÚtask_idÚturn_idÚapi_request_idÚapi_call_countÚapi_start_timeÚ
error_typeÚerror_messagerŒ   r�   rŽ   r�   r�   c                ó´  — t        t        «      5  ddlm} |j	                  d«      s
	 d d d «       y t        j
                  «       }|j                  d|||| j                  xs d| j                  xs d| j                  | j                  | j                  | j                  |||z
  |||	|
|||||dœ| j                  |«      ¬«       d d d «       y # 1 sw Y   y xY w)Nr   )Ú	lifecycleÚapi_request_errorrn   )rU   Úmessage)r‘   r’   r“   Ú
session_idÚplatformr‡   r   Úbase_urlr   r”   Úapi_durationÚ
started_atÚended_atrŒ   r�   rŽ   r�   r�   ÚerrorÚrequest)r   rc   Ú
hermes_clir™   Úhas_hookÚtimeÚinvoke_hookrœ   r�   r‡   r   rž   r   r‚   )r&   r‘   r’   r“   r”   r•   r{   r–   r—   rŒ   r�   rŽ   r�   r�   Ú
_lifecycler¡   s                   r   Ú_invoke_api_request_error_hookz3ApiRequestHooksMixin._invoke_api_request_error_hook¡   sÖ   € ô ”iÓ ñ 	Ý:Ø×&Ñ&Ð':Ô;Ø÷	ð 	ô —y‘y“{ˆHØ×"Ñ"Ø#ØØØ-ØŸ?™?Ò0¨bØŸ™Ò,¨"Ø—j‘jØŸ™ØŸ™ØŸ™Ø-Ø%¨Ñ6Ø)Ø!Ø'Ø'Ø'Ø#ØØ)°mÑDØ×:Ñ:¸:ÓFð+ #ô ÷	÷ 	ñ 	ús   �C²BCÃC)rV   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r<   r)   Ústaticmethodr2   r5   rW   rB   ÚclassmethodrN   rz   r‚   r‹   rX   r©   © r*   r   r   r       sö  „ ÙZð¸Cð ÀHÈTÐRUÐWZÐRZÉ^ÑD\ó ð  ð Sò ó ðð ðO Cð O¨Dò Oó ðOð à)*¸QÐRVØò0'Øð0'Ø#&ð0'Ø7:ð0'ØLOð0'àð0'ð 
ò0'ó ð0'ðd ð
¨3ð 
°3ò 
ó ð
ð M¸ÀÀcÈ3ÀhÁÑ8Pð MÐUYÐZ]Ð_bÐZbÑUcó Mð
Øð
Ø03ð
ØGOÐPSÁ}ð
à	ˆc�3ˆh‰ó
ð, :>Ð\`Ø%)ÀtØ $ò#Øð#Ø(+ð#Ø=@ð#ØRUð#àð#à+3°D¸¸c¸±NÑ+Cð#àQTð#ð ð#ð *2°#©ð#ð MUÐUXÉMð#ð ˜c‘]ð	#ð 7?¸t±nð	#ð
 ˜‘ð#ð 
ô#r*   r   )r¬   r   r/   r¦   Ú
contextlibr   Útypesr   Útypingr   r   r   Úagent.usage_pricingr   r?   r   r   r¯   r*   r   ú<module>r´      sI   ðñó
 Û 	Û Ý Ý !ß &Ñ &å /âbÐ ð&�sð &˜só &÷dò dr*   