+
    iHàj‡)  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIHtHtHtH	t	H
t
 ]P                  ! ]4      tRtRtR R ltR R	 ltR
 R ltR R ltR R lt ! R R4      tR R ltR R ltR R ltR R R lltRR/R R lltR R ltR# )!uø  Plugin events for auxiliary LLM calls (#79733).

``pre_auxiliary_call`` / ``post_auxiliary_call`` fire once per physical provider attempt at the
relay boundary of ``agent.auxiliary_client`` â€” the funnel every auxiliary task (titling,
compression, MoA advisors/aggregator, vision, approval, ...) shares, retries and fallbacks
included â€” carrying the ``pre_api_request`` / ``post_api_request`` payload shape plus
``aux_task``. They are deliberately DISTINCT events: the main-loop ``*_api_request`` events stay
turn-scoped, so observability plugins keyed on turn identity never see auxiliary traffic unless
they subscribe to these. Observer-only (returns ignored) and fail-open: a raising or hung
callback is logged and the auxiliary call proceeds untouched.
)ÚannotationsN)ÚAnyÚ	AwaitableÚCallableÚDictÚOptionalÚpre_auxiliary_callÚpost_auxiliary_callc               ó   € V ^8„  d   QhRR/# )é   Úreturnzdict[str, str]© )Úformats   "Ú:/home/ubuntu/.hermes/hermes-agent/agent/auxiliary_hooks.pyÚ__annotate__r      s   € ÷ ñ ˜~ñ ó    c                 óš  € RRRRRRRR/p  ^ RI Hp V! 4       pTf   T # \        TRR4      p\	        \        TRR4      ;'       g    R4      T R&   \	        \        TRR4      ;'       g    R4      T R&   \	        \        TRR4      ;'       g    R4      T R&   \	        \        TRR4      ;'       g    R4      T R&   T #   \         d    T u # i ; i)	z¬``session_id`` / ``task_id`` / ``turn_id`` / ``platform`` of the main turn this auxiliary
call runs under, or empty strings for turn-less callers (cron, gateway idle work).Ú
session_idÚ Útask_idÚturn_idÚplatform)Úcurrent_turnNÚlease)Úagent.relay_runtimer   Ú	ExceptionÚgetattrÚstr)Úidentr   Úturnr   s       r   Ú_parent_turn_identityr       sÞ   € ð ˜2˜y¨"¨i¸¸ZÈÐL€EðÝ4á‹~ˆð ‚|ØˆÜ�D˜' 4Ó(€EÜœg e¨\¸2Ó>×DÐDÀ"ÓE€Eˆ,ÑÜœG E¨:°rÓ:×@Ð@¸bÓA€Eˆ*ÑÜœ7 4¨°BÓ7×=Ð=¸2Ó>€Eˆ)ÑÜœ7 4¨°BÓ7×=Ð=¸2Ó>€Eˆ)ÑØ€Løô ô ØŠðús   ŒB: Â:C
Ã	C
c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úmessagesr   Úkwargsúdict[str, Any]r   r   r   )r   s   "r   r   r   -   s!   € ÷ 	ñ 	˜Sð 	¨.ð 	¸Sñ 	r   c                óÎ  € \        VP                  R 4      \        4      '       d
   VR ,          # \        VP                  R4      \        4      '       d
   VR,          # \        V \        4      '       ds   V '       dk   \        V ^ ,          \        4      '       dN   V ^ ,          pVP                  R4      R 8X  d/   \        VP                  R4      \        4      '       d
   VR,          # R# )ÚsystemÚinstructionsÚroleÚcontentr   )Ú
isinstanceÚgetr   ÚlistÚdict)r"   r#   Úfirsts   && r   Ú_system_promptr/   -   s    € Ü�&—*‘*˜XÓ&¬×,Ò,Ø�hÕÐÜ�&—*‘*˜^Ó,¬c×2Ò2Ø�nÕ%Ð%Ü�(œD×!Ò!§h´:¸hÀq½kÌ4×3PÒ3PØ˜•ˆØ�9‰9�VÓ Ô(¬Z¸¿	¹	À)Ó8LÌc×-RÒ-RØ˜Õ#Ð#Ùr   c               ó    € V ^8„  d   QhRRRR/# )r   Úresponser   r   zOptional[dict[str, Any]]r   )r   s   "r   r   r   9   s   € ÷ ñ ˜Sð Ð%=ñ r   c                óØ   € \        V R R4      pV e	   V'       g   R# ^ RIHp ^ RIHp V! VRR7      pV! V4      pVP                  RR4       VP                  VR&   VP                  VR&   V# )	ÚusageN)Úasdict)Únormalize_usageÚchat_completions)Úapi_modeÚ	raw_usageÚprompt_tokensÚtotal_tokens)r   Údataclassesr4   Úagent.usage_pricingr5   Úpopr9   r:   )r1   r8   r4   r5   ÚcuÚsummarys   &     r   Ú_usage_summaryr@   9   sj   € Ü˜ '¨4Ó0€IØÒŸyÙÝ"å3ñ
 
˜Ð-?Ô	@€BÙ�R‹j€GØ‡K�K�˜TÔ"Ø!×/Ñ/€GˆOÑØ Ÿo™o€GˆNÑØ€Nr   c               ó    € V ^8„  d   QhRRRR/# )r   r1   r   r   r   )r   s   "r   r   r   L   s   € ÷ 	Tñ 	T Cð 	T¨Cñ 	Tr   c                ó4  € \        V R R4      p\        V \        4      '       d   V P                  R 4      pV'       g   R# V^ ,          p\        V\        4      '       d#   VP                  R4      VP                  R4      3# \        VRR4      \        VRR4      3# )ÚchoicesNÚmessageÚfinish_reason©NN)r   r*   r-   r+   )r1   rC   Úchoices   &  r   Ú_first_choice_messagerH   L   s„   € Ü�h 	¨4Ó0€GÜ�(œD×!Ò!Ø—,‘,˜yÓ)ˆßØÐØ�Q�Z€FÜ�&œ$×ÒØ�z‰z˜)Ó$ f§j¡j°Ó&AÐAÐAÜ�6˜9 dÓ+¬W°V¸_ÈdÓ-SÐSÐSr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úobjr   Únamer   r   r   )r   s   "r   r   r   X   s&   € ÷ Pñ P�ð P˜3ð P 3ñ Pr   c                óh   € \        V \        4      '       d   V P                  V4      # \        WR 4      # )N)r*   r-   r+   r   )rJ   rK   s   &&r   Ú_fieldrM   X   s(   € Ü& s¬D×1Ò1ˆ3�7‰7�4‹=ÐO´w¸sÈ$Ó7OÐOr   c                  óB   € ] tR t^\tRtR R ltR R ltR
R R lltR	tR# )Ú_AuxCallHookszQFires the pre/post pair for one provider attempt; the base payload is built once.c               ó<   € V ^8„  d   QhRRRRRRRRRRR	RR
RRRRR/	# )r   Úaux_taskr   Úmetadatar$   Úclientr   r#   ÚproviderÚmodelr7   Ú	streamingÚboolr   ÚNoner   )r   s   "r   r   Ú_AuxCallHooks.__annotate___   sV   € ÷ 
ñ 
Øð
Ø*8ð
ØBEð
ØO]ð
àð
à!ð
à-0ð
à=Að
ð 
ñ
r   c               	ón  € W€n         W@n        \        P                  ! 4       V n        \	        \        4       4      V n        V P                  P                  T\        VP                  R 4      ;'       g    R4      \        VP                  R4      ;'       g    ^ 4      \        VP                  R4      ;'       g    ^ 4      ^,           TT\        \        VRR4      ;'       g    R4      TTV P                  \        VP                  R4      ;'       g    VP                  R4      ;'       g    . 4      R7       R# )Úapi_request_idr   Úretry_countÚbase_urlr"   Úinput)rQ   r[   r\   Úapi_call_countrU   rT   r]   r7   rV   Ú
started_atÚmessage_countN)rV   r#   Útimer`   r-   r    ÚbaseÚupdater   r+   Úintr   Úlen)	ÚselfrQ   rR   rS   r#   rT   rU   r7   rV   s	   &$$$$$$$$r   Ú__init__Ú_AuxCallHooks.__init___   sì   € ð #ŒØŒÜŸ)š)›+ˆŒÜ$(Ô)>Ó)@Ó$AˆŒ	Ø�	‰	×ÑØÜ˜xŸ|™|Ð,<Ó=×CÐCÀÓDÜ˜HŸL™L¨Ó7×<Ð<¸1Ó=Ü˜xŸ|™|¨MÓ:×?Ð?¸aÓ@À1ÕDØØÜœ ¨°RÓ8×>Ð>¸BÓ?ØØØ—‘Ü˜fŸj™j¨Ó4×QÐQ¸¿
¹
À7Ó8K×QÐQÈrÓRð 	ö 	
r   c               ó   € V ^8„  d   QhRR/# )r   r   rX   r   )r   s   "r   r   rY   u   s   € ÷ 
ñ 
�Tñ 
r   c                	óÀ  € \        \        4      '       g   R # ^ RIHp V P                  pVP                  R4      p\        V\        4      '       g   VP                  R4      p\        V\        4      '       g   . pVP                  4        UUu/ uF  w  rEVR9  g   K  WEbK  	  ppp\        R V 4       4      p\        \        3/ V P                  BR\        V4      R\        W24      R\        VP                  R4      ;'       g    . 4      R	V^,          R
TRVP                  R4      ;'       g    VP                  R4      RVP                  RRRV/4      /B  R # u uppi )N©ÚApiRequestHooksMixinr"   r^   c           	   3  ór   "  € T F-  p\        \        \        VR 4      ;'       g    R4      4      x € K/  	  R# 5i)r)   r   N)rf   r   rM   )Ú.0Úms   & r   Ú	<genexpr>Ú$_AuxCallHooks.pre.<locals>.<genexpr>�   s,   é € ÐQÉÀ1œ#œc¤&¨¨IÓ"6×"<Ð"<¸"Ó=×>Ð>Ëùs   ‚57Úrequest_messagesÚsystem_promptÚ
tool_countÚtoolsÚapprox_input_tokensÚrequest_char_countÚ
max_tokensÚmax_completion_tokensÚrequestÚmethodÚPOSTÚbody>   ÚtimeoutÚhttp_client)Ú	_has_hookÚPRE_AUXILIARY_CALLÚagent.api_request_hooksrm   r#   r+   r*   r,   ÚitemsÚsumÚ_firerc   r/   rf   Ú_sanitize_hook_payload)rg   Ú	_Sanitizer#   r"   ÚkÚvr~   Útotal_charss   &       r   ÚpreÚ_AuxCallHooks.preu   sE  € ÜÔ+×,Ò,ÙÝMà—‘ˆØ—:‘:˜jÓ)ˆÜ˜(¤D×)Ò)Ø—z‘z 'Ó*ˆHÜ˜(¤D×)Ò)ØˆHØ!'§¡¤ÔW¡™˜°1Ð<VÑ3V”�’¡ˆÑWÜÑQÉÓQÓQˆÜÜñ		
Ø"&§)¡)ñ		
ä! (›^ð		
ô )¨Ó:ð		
ô ˜6Ÿ:™: gÓ.×4Ð4°"Ó5ð			
ð
 !,¨qÕ 0ð		
ð  +ð		
ð —z‘z ,Ó/×VÐV°6·:±:Ð>UÓ3Vð		
ð ×4Ñ4°hÀÈÐPTÐ5UÓVõ		
ùó Xs   ÂEÂENc               ó$   € V ^8„  d   QhRRRRRR/# )r   r1   r   ÚerrorzOptional[BaseException]r   rX   r   )r   s   "r   r   rY   �   s#   € ÷ %.ñ %.˜Sð %.Ð0Gð %.ÐSWñ %.r   c                	óˆ  € \        \        4      '       g   R # ^ RIHp \        P                  ! 4       p\        V P                  T\        RW@P                  ,
          4      Vf   R M \        V4      P                   RV 2R,          Vf   R M\        V4      P                  R7      pVf   V P                  '       d   VP                  R R R R ^ ^ R7       Mß\        V4      w  rgVe   \        VR4      MR pVe   \        VR4      MR ;'       g    . p	TP                  T\        VR	4      \        V4      TP!                  R	\        VR	4      R
TRRVe   \        VR4      MR ;'       g    RRVRV	/RVP#                  R4      /4      \%        V\&        4      '       d   \)        V4      M^ \)        V	4      R7       \+        \        3/ VB  R # )Nrl   g        z: :NiÐ  N)Úended_atÚapi_durationr�   Ú
error_type)rE   Úresponse_modelr3   r1   Úassistant_content_charsÚassistant_tool_call_countr)   Ú
tool_callsrU   rE   Úassistant_messager(   Ú	assistantr3   )r�   ÚPOST_AUXILIARY_CALLrƒ   rm   rb   r-   rc   Úmaxr`   ÚtypeÚ__name__rV   rd   rH   rM   r@   r‡   r+   r*   r   rf   r†   )
rg   r1   r�   rˆ   r‘   ÚpayloadrD   rE   r)   r—   s
   &&&       r   ÚpostÚ_AuxCallHooks.post�   s£  € ÜÔ,×-Ò-ÙÝMä—9’9“;ˆÜ"&Ø�I‰I ´s¸3ÀÏ?É?Õ@ZÓ7[Øš-‘$´°U³×0DÑ0DÐ/EÀRÈÀwÐ-OÐPUÕ-VØ$š}‘t´$°u³+×2FÑ2Fô#
ˆð Ò §§ Ø�N‰N¨¸dÈ$ÐY]Ø34ÐPQð õ Sô &;¸8Ó%DÑ"ˆGØ4;Ò4G”f˜W iÔ0ÈTˆGØ;BÒ;Nœ& ¨,Ô7ÐTX×_Ð_Ð]_ˆJØ�N‰NØ+Ü% h°Ó8Ü$ XÓ.Ø"×9Ñ9ØœV H¨gÓ6Ø# ]Ø'Ø¸GÒ<O¤¨°Ô!8ÐUY× iÐ iÐ^iØ! 7Ø$ jð*ð
 ˜WŸ[™[¨Ó1ð	;ó 	ô 9CÀ7ÌC×8PÒ8P¬¨G¬ÐVWÜ*-¨j«/ð ô ô" 	Ô!Ñ- WÔ-r   )rc   r#   r`   rV   rF   )	r�   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rh   rŒ   rŸ   Ú__static_attributes__r   r   r   rO   rO   \   s   † Ù[õ
õ,
÷0%.ó %.r   rO   c               ó    € V ^8„  d   QhRRRR/# )r   rK   r   r   rW   r   )r   s   "r   r   r   µ   s   € ÷ ñ �Cð ˜Dñ r   c                óD   €  ^ RI Hp V! V 4      #   \         d     R# i ; i)é    )Úhas_hookF)Úhermes_cli.lifecycler©   r   )rK   r©   s   & r   r�   r�   µ   s&   € ðÝ1á˜‹~ÐøÜô Úðús   ‚ �žc               ó$   € V ^8„  d   QhRRRRRR/# )r   rK   r   rž   r   r   rX   r   )r   s   "r   r   r   ¾   s&   € ÷ 	Eñ 	E�ð 	E ð 	E¨ñ 	Er   c                ó˜   €  ^ RI Hp V! V 3/ VB  R#   \         d,    \        P	                  RYP                  R4      RR7        R# i ; i)z|Dispatch one event; a failing subscriber is logged, never propagated (the aux task's
result must not depend on an observer).)Úinvoke_hookz1%s plugin hook failed for aux_task=%s; continuingrQ   T©Úexc_infoN)rª   r­   r   ÚloggerÚwarningr+   )rK   rž   r­   s   &, r   r†   r†   ¾   sL   € ðEÝ4á�DÑ$˜GÔ$øÜô EÜ�‰ÐJØŸ[™[¨Ó4¸tð 	÷ 	EðEús   ‚ “2A	ÁA	c               ó    € V ^8„  d   QhRRRR/# )r   Úkwr   r   úOptional[_AuxCallHooks]r   )r   s   "r   r   r   Ê   s   € ÷ 	ñ 	˜ð 	Ð!8ñ 	r   c                 óè   € \        \        4      '       g   \        \        4      '       g   R #  \        R/ V B pVP	                  4        V#   \
         d    \        P                  RRR7        R # i ; i)Nz3pre_auxiliary_call payload build failed; continuingTr®   r   )r�   r‚   rš   rO   rŒ   r   r°   r±   )r³   Úhookss   , r   Ú_hooks_or_noner·   Ê   sd   € ÜÔ(×)Ò)¬YÔ7J×-KÒ-KÙðÜÑ# Ñ#ˆØ�	‰	Œð €Løô ô Ü�‰ÐLÐW[ˆÔ\Úðús   ®A Á"A1Á0A1c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r¶   r´   r1   r   r�   r   rX   r   )r   s   "r   r   r   Ö   s0   € ÷ ^ñ ^Ð/ð ^¸3ð ^Ècð ^Ð]añ ^r   c                óˆ   € V f   R #  V P                  W4       R #   \         d    \        P                  RRR7        R # i ; i)Nz4post_auxiliary_call payload build failed; continuingTr®   )rŸ   r   r°   r±   )r¶   r1   r�   s   &&&r   Ú_post_safelyrº   Ö   s?   € Ø‚}Ùð^Ø�
‰
�8Ö#øÜô ^Ü�‰ÐMÐX\ˆ×]ð^ús   ˆ ›"AÁ ArV   Fc               ó@   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRR/
# )r   ÚcallzCallable[[], Any]rQ   r   rR   r$   rS   r   r#   rT   rU   r7   rV   rW   r   r   )r   s   "r   r   r   ß   s^   € ÷ ñ Ø
ðØ*-ðØ9GðØQTðàðà&)ðà25ðàADðàQUðð 	ñr   c               óŒ   € \        WW4WVWxR7      p	 V ! 4       p
\        YšR7       T
#   \         d   p\        Y›R7       h Rp?ii ; i)zžRun one synchronous provider attempt between ``pre_auxiliary_call`` and
``post_auxiliary_call``; the exception (if any) is reported in ``post`` and re-raised.©rQ   rR   rS   r#   rT   rU   r7   rV   ©r�   N©r1   ©r·   ÚBaseExceptionrº   )r¼   rQ   rR   rS   r#   rT   rU   r7   rV   r¶   r1   Úexcs   &$$$$$$$$   r   Úrun_with_aux_hooksrÄ   ß   sP   € ô  HÈØ$,ÀHôc€EðÙ“6ˆô �Õ*Ø€Oøô	 ô Ü�UÕ&Øûðús   ‘& ¦A±>¾Ac               ó<   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRR/	# )r   r¼   zCallable[[], Awaitable[Any]]rQ   r   rR   r$   rS   r   r#   rT   rU   r7   r   r   )r   s   "r   r   r   ð   sV   € ÷ ñ Ø
&ðØ58ðØDRðØ\_ðàðà&)ðà25ðàADðð 	ñr   c             ƒ  óª   "  € \        WW4WVVRR7      p V ! 4       G Rj  x€L
 p	\        Y‰R7       T	#  L  \         d   p
\        YŠR7       h Rp
?
ii ; i5i)z)Async twin of :func:`run_with_aux_hooks`.Fr¾   Nr¿   rÀ   rÁ   )r¼   rQ   rR   rS   r#   rT   rU   r7   r¶   r1   rÃ   s   &$$$$$$$   r   Úarun_with_aux_hooksrÇ   ð   sZ   é € ô
  HÈØ$,ÀHÐX]ô_€EðÙ›—<ˆô �Õ*Ø€Oñ  øÜô Ü�UÕ&Øûðüs0   ‚A”
3 ž1Ÿ3 £A±3 ³A¾AÁAÁArF   )r¤   Ú
__future__r   Úloggingrb   Útypingr   r   r   r   r   Ú	getLoggerr�   r°   r‚   rš   r    r/   r@   rH   rM   rO   r�   r†   r·   rº   rÄ   rÇ   r   r   r   Ú<module>rÌ      s‡   ðñ
õ #ã Û ß ;Õ ;à	×	Ò	˜8Ó	$€à)Ð Ø+Ð õõ(	õõ&	TõP÷V.ñ V.õrõ	Eõ	÷^ðàX]÷÷"r   