+
    „WÝjû=  ã                  óZ  € R t ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHtH	t	 ^ RI
HtHt ^RIHt ^RIHtHt ]P$                  ! ]4      tRCtRDtREtRFtR	R
RR/tRt^@tRtRt]P<                  ! R4      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 lt&R R lt'R R  lt(] ! R! R"4      4       t)] ! R# R$4      4       t*R% R& lt+] ! R' R(4      4       t,] ! R) R*4      4       t-R+ R, lt.R- R. lt/R/ R0 lt0R1 R2 lt1R3 R4 lt2R5 R6 lt3R7 R8 lt4R9 R: lt5R; R< lt6R= R> lt7R? R@ lt8RA RB lt9R# )GaÏ  Efficiency shared metrics: what one user turn costs, what users throw away, and where Hermes
spends tokens it did not have to (spilled tool output, idle tool schemas, prompt-cache breaks).

Per-turn state lives on the relay runtime's task/session objects (see ``TurnCost`` and
``SessionEfficiency``); the agent-side entry points below run on the agent thread and are no-ops
unless shared metrics are enabled. Provider/model always go through the catalog helpers.
)ÚannotationsN)Údeque)Ú	dataclassÚfield)ÚAnyÚIterable)Úshared_metrics_contract)Ú_bucketÚ_non_negative_numberéè  ÚsuccessÚ	completedÚ	cancelledÚinterruptedg     Àr@Ú_shared_metrics_tool_outputsé   zR\[[A-Z_ ]{1,32} TRUNCATED - [\d,]{1,20} chars omitted out of ([\d,]{1,20}) total\]c               ó    € V ^8„  d   QhRRRR/# )é   Útokensú
int | NoneÚreturnÚstr© )Úformats   "ÚfC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\observability\shared_metrics_efficiency.pyÚ__annotate__r   3   s   € ÷ añ a˜*ð a¨ñ aó    c                óD   € V f   R# \        \        ^ V 4      \        R4      # )NÚunknownÚgte_1m)r	   ÚmaxÚ_TOKEN_THRESHOLDS©r   s   &r   Útokens_bucketr#   3   s"   € Øšˆ9Ð`¬G´C¸¸6³NÔDUÐW_Ó,`Ð`r   c               ó    € V ^8„  d   QhRRRR/# )r   ÚcountÚintr   r   r   )r   s   "r   r   r   7   s   € ÷ Hñ H˜3ð H 3ñ Hr   c                óJ   € \        \        ^ \        V 4      4      \        R4      # )é    Úgte_101)r	   r    r&   Ú_ACTIVITY_THRESHOLDS)r%   s   &r   Úactivity_bucketr+   7   s   € Ü”3�qœ#˜e›*Ó%Ô';¸YÓGÐGr   c               ó    € V ^8„  d   QhRRRR/# )r   Úsizer   r   r   r   )r   s   "r   r   r   ;   s   € ÷ eñ e˜Zð e¨Cñ er   c                óD   € V f   R# \        \        ^ V 4      \        R4      # )Nr   Úgte_500k)r	   r    Ú_OUTPUT_SIZE_THRESHOLDS)r-   s   &r   Úoutput_size_bucketr1   ;   s"   € Øšˆ9Ðd¬'´#°a¸³,Ô@WÐYcÓ*dÐdr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r&   r   r   r   )r   s   "r   r   r   ?   s   € ÷ Mñ M ð M¨ñ Mr   c                óJ   € \        \        ^ \        V 4      4      \        R4      # )r(   Úgte_40k)r	   r    r&   Ú_SCHEMA_TOKEN_THRESHOLDSr"   s   &r   Úschema_tokens_bucketr6   ?   s   € Ü”3�qœ#˜f›+Ó&Ô(@À)ÓLÐLr   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer   r   r   r   )r   s   "r   r   r   C   s   € ÷ 3ñ 3�ð 3˜
ñ 3r   c                ó:   € \        V 4      pVf   R # \        V4      # ©N)r
   r&   )r8   Únumbers   & r   Ú_intr<   C   s   € Ü! %Ó(€FØ’>ˆ4Ð2¤s¨6£{Ð2r   c               ó    € V ^8„  d   QhRRRR/# )r   Úusager   r   r   r   )r   s   "r   r   r   H   s   € ÷ 	añ 	a�sð 	a˜zñ 	ar   c                ój  € \        V \        4      '       g   R# \        V P                  R4      4      pVe   V# R Uu. uF  p\        V P                  V4      4      NK  	  pp\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   \        R V 4       4      # R# u upi )z\Prompt (cache reads/writes included) plus completion tokens of one call; None without usage.NÚtotal_tokensc              3  ó(   "  € T F  qR Jx € K
  	  R # 5ir:   r   ©Ú.0Úps   & r   Ú	<genexpr>Úcall_tokens.<locals>.<genexpr>Q   s   é € Ð8VÑPUÈ1À$½ÓPUùs   ‚TFc              3  ó0   "  € T F  qf   K  Vx € K  	  R # 5ir:   r   rB   s   & r   rE   rF   Q   s   é € Ð1™%�Q�qŠq›%ùs   ‚Œ
)Úinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokens)Ú
isinstanceÚdictr<   ÚgetÚanyÚsum)r>   ÚtotalÚkeyÚpartss   &   r   Úcall_tokensrT   H   s¡   € ä�eœT×"Ò"ÙÜ�—‘˜>Ó*Ó+€EØÒØˆñ.Tó Uñ .T cŒT�%—)‘)˜C“.Ö!ñ .T€Eð Uç58³SÑ8VÑPUÓ8V·S·S²SÑ8VÑPUÓ8V×5VÒ5VŒ3Ñ1™%Ó1Ó1Ð`Ð\`Ð`ùòUs   ½#B0c               ó    € V ^8„  d   QhRRRR/# )r   Útoolsetr   r   r   r   )r   s   "r   r   r   T   s   € ÷ kñ k ð k¨ñ kr   c                ó`   € \        V \        4      '       d   V \        P                  9   d   V # R# )zUA shipped toolset's own name; MCP servers, plugins and user toolsets read ``custom``.Úcustom)rL   r   ÚcontractÚBUILTIN_TOOLSET_NAMES)rV   s   &r   Útoolset_metric_namer[   T   s'   € ä  ¬#×.Ò.°7¼h×>\Ñ>\Ô3\ˆ7ÐjÐbjÐjr   c               ó    € V ^8„  d   QhRRRR/# )r   Úrouteúdict[str, str] | Noner   údict[str, str]r   )r   s   "r   r   r   Y   s   € ÷ =ñ =Ð'ð =¨Nñ =r   c                óF   € ^RI Hp V '       d   \        V 4      # V! RR4      # )é   ©Úmodel_routeN)Úshared_metrics_modelrc   rM   )r]   rc   s   & r   Ú_routere   Y   s   € Ý1çŒ4�‹;Ð<¡[°°tÓ%<Ð<r   c                  ól   € ] tR t^at$ RtRtR]R&   ^ tR]R&   RtR]R&   Rt	R	]R
&   R R lt
R R ltRtR# )ÚTurnCostz–Token spend of one task; ``user_turn`` marks a turn a user message started (pre_llm_call),
which Hermes-owned forks sharing the session id never fire.FÚboolÚ	user_turnr&   r   ÚknownNr^   r]   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r]   r_   r>   r   r   ÚNoner   )r   s   "r   r   ÚTurnCost.__annotate__k   s!   € ÷ ñ ˜nð °Sð ¸Tñ r   c                	ót   € Wn         \        V4      pVe#   V ;P                  V,          un        RV n        R # R # ©NT)r]   rT   r   rj   )Úselfr]   r>   r   s   &&& r   Úadd_callÚTurnCost.add_callk   s1   € ØŒ
Ü˜UÓ#ˆØÒØ�KŠK˜6Õ!�KØˆDŽJñ r   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   rm   r   s   € ÷ Bñ B˜ñ Br   c                	ó\   € \        V P                  '       d   V P                  4      # R 4      # r:   )r#   rj   r   )rp   s   &r   ÚbucketÚTurnCost.bucketr   s!   € Ü¨D¯J¯J¨J˜TŸ[™[ÓAÐA¸DÓAÐAr   )rj   r]   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ri   Ú__annotations__r   rj   r]   rq   ru   Ú__static_attributes__r   r   r   rg   rg   a   sC   ‡ ñCð €IˆtÓØ€FˆCƒOØ€Eˆ4ÓØ#'€EÐ Ó'õ÷Bñ Br   rg   c                  ó:   € ] tR t^vt$ R]R&   R]R&   RtR]R&   RtR	# )
Ú
_SpentTurnr_   r]   r   r#   Frh   Úwastedr   N)rw   rx   ry   rz   r|   r€   r}   r   r   r   r   r   v   s   ‡ àÓØÓØ€FˆD×r   r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úreasonr   Úturnr   r   útuple[str, dict[str, str]]r   )r   s   "r   r   r   }   s'   € ÷ nñ n˜ð n :ð nÐ2Lñ nr   c                ó^   € \         P                  / VP                  CR V RVP                  /C3# )r‚   r#   )rY   ÚWASTED_TOKENS_MARKr]   r#   )r‚   rƒ   s   &&r   Ú_wasted_rowr‡   }   s/   € Ü×&Ñ&Ð(m¨4¯:©:Ð(m°xÀÈÐZ^×ZlÑZlÑ(mÐmÐmr   c                  óº   € ] tR t^�t$ RtRtR]R&   RtR]R&   ]! 4       t	R]R	&   ^ t
R
]R&   ^ tR
]R&   RtR]R&   ]! ]R7      tR]R&   R R ltR R ltR R ltRtR# )Ú	ToolUsagezWWhat the session paid to carry tool definitions, and which shipped toolsets it touched.Frh   Úobservedr   r   Úsurfaceúfrozenset[str]Úenabled_toolsetsr&   Úenabled_countÚschema_tokensNztuple[str, ...] | NoneÚnames©Údefault_factoryzset[str]Úusedc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r�   ztuple[str, ...]ÚtoolsetsrŒ   rŽ   r&   r�   r   rh   r   )r   s   "r   r   ÚToolUsage.__annotate__�   s2   € ÷ ñ ˜_ð ¸ð ÐWZð Ðknð Ðswñ r   c                óâ   € V P                   RJ;'       d    WP                   8g  pRVuV n        V n         V P                  V,          V n        \        V P                  V4      VuV n        V n        V# )zORecord the tools one request sent; True when a later request changed the array.NT)r�   rŠ   r�   r    rŽ   r�   )rp   r�   r•   rŽ   r�   Úchangeds   &&&&& r   ÚobserveÚToolUsage.observe�   sg   € à—*‘* DÐ(×@Ð@¨U·j±jÑ-@ˆØ$(¨%Ð!ˆŒ�t”zØ $× 5Ñ 5¸Õ @ˆÔÜ14°T×5GÑ5GÈÓ1WÐYfÐ.ˆÔ˜DÔ.Øˆr   c               ó    € V ^8„  d   QhRRRR/# )r   Úotherr‰   r   rl   r   )r   s   "r   r   r–   •   s   € ÷  ñ  ˜Ið  ¨$ñ  r   c                	ó~  € VP                   '       g   R # RVP                  uV n         V n        V P                  VP                  ,          V n        \        V P                  VP                  4      V n        \        V P
                  VP
                  4      V n        V ;P                  VP                  ,          un        R # ro   )rŠ   r‹   r�   r    rŽ   r�   r“   )rp   rœ   s   &&r   ÚabsorbÚToolUsage.absorb•   sƒ   € Ø�~�~ˆ~ÙØ&*¨E¯M©MÐ#ˆŒ�t”|Ø $× 5Ñ 5¸×8NÑ8NÕ NˆÔÜ  ×!3Ñ!3°U×5HÑ5HÓIˆÔÜ  ×!3Ñ!3°U×5HÑ5HÓIˆÔØ�	Š	�U—Z‘ZÕ�	r   c               ó   € V ^8„  d   QhRR/# )r   r   ú list[tuple[str, dict[str, str]]]r   )r   s   "r   r   r–   ž   s   € ÷ ñ Ð6ñ r   c           	     	ó4  a € S P                   '       g   . # \        P                  R \        P                  ! S P                  4      RS P
                  R\        S P                  4      /3.pVP                  V 3R l\        S P                  4       4       4       V# )Úenabled_tool_count_bucketÚexecution_surfaceÚtool_schema_tokens_bucketc              3  óv   <"  € T F.  p\         P                  R TRVSP                  9   d   RMR/3x € K0  	  R# 5i)rV   r“   ÚyesÚnoN)rY   ÚTOOL_ENABLED_UNUSED_MARKr“   )rC   Únamerp   s   & €r   rE   Ú!ToolUsage.rows.<locals>.<genexpr>¦   s>   øé € ð 
á5�ô ×.Ñ.°¸DÀ&ÐSWÐ[_×[dÑ[dÔSdÉ%ÐjnÐ0oÕpÛ5ùs   ƒ69)rŠ   rY   ÚTOOL_OVERHEAD_MARKÚsize_bucketrŽ   r‹   r6   r�   ÚextendÚsortedr�   )rp   Úrowss   f r   r°   ÚToolUsage.rowsž   sˆ   ø€ Ø�}�}ˆ}ØˆIÜ×,Ñ,Ø'¬×)=Ò)=¸d×>PÑ>PÓ)QØ §¡Ø'Ô)=¸d×>PÑ>PÓ)Qð/
ð ð ˆð
 	�‰ô 
ä˜t×4Ñ4Ô5ó
ô 	
ð ˆr   )rŽ   r�   r�   rŠ   r�   r‹   )rw   rx   ry   rz   r{   rŠ   r|   r‹   Ú	frozensetr�   rŽ   r�   r�   r   Úsetr“   r™   rž   r°   r}   r   r   r   r‰   r‰   �   sh   ‡ áaà€HˆdÓØ€GˆSÓÙ'0£{Ð�nÓ2Ø€M�3ÓØ€M�3ÓØ$(€EÐ!Ó(Ù¨3Ô/€Dˆ(Ó/õõ ÷ñ r   r‰   c                  ó®   € ] tR t^­t$ ]! R R7      tR]R&   ]! ]R7      tR]R&   Rt	R]R	&   ^ t
R
]R&   RtR]R&   ^ tR
]R&   R R ltR R ltR R ltRtR# )ÚSessionEfficiencyc                 	ó"   € \        \        R 7      # ))Úmaxlen)r   Ú_SPENT_TURNS_KEPTr   r   r   Ú<lambda>ÚSessionEfficiency.<lambda>¯   s
   € ¼UÔJ[Õ=\r   r‘   zdeque[_SpentTurn]Úspentr‰   ÚtoolsNztuple[int, int, int] | NoneÚ	tools_keyr&   Ú
cache_readr^   Úcache_routeÚcache_ended_nsc               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )r   Úcostrg   Úterminalr_   r]   r^   Úmodel_callsr&   Ú
tool_callsr   r¡   r   )r   s   "r   r   ÚSessionEfficiency.__annotate__¶   s>   € ÷ ñ ØðØ(6ðØBWðàðà&)ðð 
*ñr   c               óì  € \        \        VP                  ;'       g    T4      VP                  4       4      p\        P
                  / VP                  CR\        V4      R\        P                  VP                  RR4      R4      RVP                  R\        V4      /C3.pVP                  R4      R8X  d#   R	Vn
        VP                  \        R
V4      4       V P                  P                  V4       V# )zYtask_cost for one user turn the user saw end; an interrupt also counts its tokens wasted.Úapi_calls_bucketÚoutcomeÚ Úfailedr#   Útool_calls_bucketÚ
end_reasonÚuser_cancelledTÚ	interrupt)r   re   r]   ru   rY   ÚTASK_COST_MARKr+   Ú_TASK_COST_OUTCOMESrN   r#   r€   Úappendr‡   r»   )rp   rÂ   rÃ   r]   rÄ   rÅ   rƒ   r°   s   &&&$$$  r   Úfinish_turnÚSessionEfficiency.finish_turn¶   sÔ   € ô
 œ& §¡×!4Ð!4¨uÓ5°t·{±{³}ÓEˆÜ×(Ñ(ð +
Ø�j‰jð+
à¤°Ó <ØÔ*×.Ñ.¨x¯|©|¸IÀrÓ/JÈHÓUØ˜T×/Ñ/Ø¤°Ó!<ñ+
ð ð ˆð �<‰<˜Ó%Ð)9Ô9ØˆDŒKØ�K‰Kœ K°Ó6Ô7Ø�
‰
×Ñ˜$ÔØˆr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r‚   r   Úturnsr&   Úfallback_router_   r   r¡   r   )r   s   "r   r   rÆ   É   s)   € ÷ ñ  Cð °ð À^ð ÐXxñ r   c           
     óN  € . p\        \        ^\        \        V4      \        4      4      4       Fr  pV P
                  '       d   V P
                  P                  4       M\        \        V4      R4      pVP                  '       d   KX  VP                  \        W4      4       Kt  	  V# )z¬An /undo or /retry threw away the newest ``turns`` turns: one row per turn not already
counted (an interrupted turn the user then undoes was wasted once, at the interrupt).r   )Úranger    Úminr&   r¸   r»   Úpopr   re   r€   rÒ   r‡   )rp   r‚   rÖ   r×   r°   Ú_rƒ   s   &&&&   r   Údiscard_turnsÚSessionEfficiency.discard_turnsÉ   st   € ð ˆÜ”s˜1œc¤# e£*Ô.?Ó@ÓAÖBˆAØ'+§z§z z�4—:‘:—>‘>Ô#´zÄ&ÈÓBXÐZcÓ7dˆDØ—;—;’;Ø—‘œK¨Ó5Ö6ñ Cð ˆr   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   r]   r_   r>   r   Ú
started_nsr&   Úended_nsÚexpectedrh   r   z
str | Noner   )r   s   "r   r   rÆ   Ó   sD   € ÷ Vñ VØ#ðVØ,/ðVØ=@ðVØLOðVØ^bðVà	ñVr   c               ó^  € \        V\        4      '       d   \        VP                  R4      4      MRpVf   R# V P                  V P
                  V P                  r˜pWaVuV n        V n        V n        V'       g   V'       g   V'       d   W�8w  d   R# W9,
          R,          p
V
\        8¼  d   R# R# )zµA cold primary read after a warm one on the same route is a break Hermes did not announce
(``expected``: Hermes already counted the cause); a gap past the cache TTL is plain expiry.rJ   Ng    eÍÍAÚcache_expiredÚprovider_reported_miss)rL   rM   r<   rN   r¾   r¿   rÀ   ÚCACHE_TTL_S)rp   r]   r>   rà   rá   râ   ÚreadÚ	prev_readÚ
prev_routeÚ
prev_endedÚidle_ss   &&&&&$     r   Úobserve_cacheÚSessionEfficiency.observe_cacheÓ   s�   € ô
 8BÀ%Ì×7NÒ7NŒt�E—I‘IÐ1Ó2Ô3ÐTXˆØŠ<ÙØ,0¯O©O¸T×=MÑ=MÈt×ObÑOb˜zˆ	ØAEÈhÐ>ˆŒ˜Ô)¨4Ô+>ß—t§9°
Ô0CÙØÕ)¨SÕ0ˆØ"(¬KÔ"7ˆÐUÐ=UÐUr   )rÀ   r¾   r¿   )rw   rx   ry   rz   r   r»   r|   r‰   r¼   r½   r¾   r¿   rÀ   rÓ   rÝ   rì   r}   r   r   r   rµ   rµ   ­   sb   ‡ á$Ñ5\Ô]€EÐÓ]Ù¨YÔ7€Eˆ9Ó7Ø-1€IÐ*Ó1Ø€J�ÓØ)-€KÐ&Ó-Ø€N�CÓõõ&÷Vñ Vr   rµ   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úcauser   r]   r^   r   r„   r   )r   s   "r   r   r   ã   s(   € ÷ Hñ H˜3ð HÐ'<ð HÐA[ñ Hr   c                óD   € \         P                  / \        V4      CR V /C3# )rï   )rY   ÚCACHE_BREAK_MARKre   )rï   r]   s   &&r   Úcache_break_rowrò   ã   s$   € Ü×$Ñ$Ð&G¬°«Ð&G¸ÀÑ&GÐGÐGr   c               ó    € V ^8„  d   QhRRRR/# )r   Úagentr   r   rh   r   )r   s   "r   r   r   é   s   € ÷ Oñ O˜3ð O 4ñ Or   c                ó"   € \        V RR4      R8H  # )zLHermes-owned forks (background review, curator) share the user's session id.Ú_memory_write_originNÚbackground_review)Úgetattr)rô   s   &r   Ú_internal_agentrù   é   s   € ä�5Ð0°$Ó7Ð;NÑNÐNr   c               ó    € V ^8„  d   QhRRRR/# )r   rô   r   r   r_   r   )r   s   "r   r   r   î   s   € ÷ Xñ X˜ð X ñ Xr   c                óL   € ^RI Hp V! \        V RR4      \        V RR4      4      # )ra   rb   ÚproviderNÚmodel)rd   rc   rø   )rô   rc   s   & r   Ú_agent_routerþ   î   s%   € Ý1á”w˜u j°$Ó7¼ÀÈÐQUÓ9VÓWÐWr   c               ó   € V ^8„  d   QhRR/# )r   r   rh   r   )r   s   "r   r   r   ô   s   € ÷ ñ �$ñ r   c                 ó   € ^RI Hp  V ! 4       # )ra   ©Úenabled)Úrelay_shared_metricsr  r  s    r   Ú_enabledr  ô   s   € Ý-á‹9Ðr   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r   rô   r   Ú	tool_nameÚtool_call_idÚrawÚ	persistedr   rl   r   )r   s   "r   r   r   ú   s@   € ÷ Lñ L˜Cð L¨Cð L¸sð LÈð LÐY\ð LÐaeñ Lr   c                ó®  €  \        V 4      '       g   \        4       '       g   R# V P                  P                  \        / 4      p\        V4      \        8¼  d   R# \        V4      w  rg\        P                  ! RV/4      Yg;'       g    WCJ.T\        T;'       g    \        V4      4      &   R#   \         d    \        P                  RRR7        R# i ; i)zIRemember one committed tool result until its batch's turn budget has run.Nr  z$Shared-metrics tool output not notedT©Úexc_info)rù   r  Ú__dict__Ú
setdefaultÚ_PENDING_OUTPUTS_ATTRÚlenÚ_PENDING_OUTPUTS_MAXÚ_result_sizerY   Útool_metric_namer   ÚidÚ	ExceptionÚloggerÚdebug)rô   r  r  r  r	  Úpendingr-   Úcut_in_tools   &&&&&   r   Únote_tool_resultr  ú   s²   € ðLÜ˜5×!Ò!¬¯ªÙØ—.‘.×+Ñ+Ô,AÀ2ÓFˆÜˆw‹<Ô/Ô/ÙÜ(¨Ó-Ñˆä×%Ò% {°IÐ&>Ó?À×GjÐGjÐV_ÐVjð7
ˆ”�L×1Ð1¤B y£MÓ2Ó3øô ô LÜ�‰Ð;Àdˆ×KðLús"   ‚!B. ¥4B. Á?B. ÂB. Â."CÃCc               ó    € V ^8„  d   QhRRRR/# )r   Úresultr   r   ztuple[int | None, bool]r   )r   s   "r   r   r   
  s   € ÷ 
Iñ 
I˜ð 
IÐ!8ñ 
Ir   c           	     ó²  € \        V \        4      '       d0   V P                  R4      ;'       g    . p\        R V 4       4      R3# \        V \        4      '       g   R# \        V 4      \        8¼  d   \        P                  V 4      MRpVf   \        V 4      R3# \        \        V 4      \        VP                  ^4      P                  RR4      4      4      R3# )	zO(characters the tool produced, whether the tool itself already truncated them).Úcontentc              3  óÊ   "  € T FY  p\        V\        4      '       g   K  VP                  R 4      R8X  g   K3  \        VP                  R4      ;'       g    R4      x € K[  	  R# 5i)ÚtypeÚtextrÊ   N)rL   rM   rN   r  rB   s   & r   rE   Ú_result_size.<locals>.<genexpr>  sL   é € Ðn±U°¼jÈÌD×>QÔ+ÐVW×V[ÑV[Ð\bÓVcÐgmÑVmÔ+”3�q—u‘u˜V“}×*Ð*¨×+Ð+³Uùs   ‚A#ŸA#·A#ÁA#FNÚ,rÊ   T)NF)rL   rM   rN   rP   r   r  Ú_NOTICE_MIN_CHARSÚ_TOOL_TRUNCATION_NOTICEÚsearchr    r&   ÚgroupÚreplace)r  rS   Únotices   &  r   r  r  
  s³   € ä�&œ$×ÒØ—
‘
˜9Ó%×+Ð+¨ˆÜÑn±UÓnÓnÐpuÐuÐuÜ�fœc×"Ò"ØÐÜ7:¸6³{ÔFWÔ7WÔ$×+Ñ+¨FÔ3Ð]a€FØ‚~Ü�6‹{˜EÐ!Ð!ÜŒs�6‹{œC §¡¨Q£× 7Ñ 7¸¸RÓ @ÓAÓBÀDÐHÐHr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rô   r   Úbatchz
list[dict]Úcontents_beforez	list[Any]r   rl   r   )r   s   "r   r   r     s/   € ÷ Zñ Z˜Sð Z¨ð ZÀið ZÐTXñ Zr   c           
     ó@  €  V P                   P                  \        R4      pV'       d   \        4       '       g   R# \	        W4       FZ  w  rETP                  \        VP                  R4      ;'       g    R4      4      pVf   K>  VP                  R4      VJg   KU  RV^&   K\  	  ^RIHp VP                  4        F6  w  r‰p
T! \        P                  R\        V	4      RTR	V
'       d   R
MR/4       K8  	  R#   \         d    \        P                  RRR7        R# i ; i)z­One row per tool result of the batch: truncated when the per-result cap or the per-turn
budget replaced it (the budget runs after the cap, so a result is judged once, here).Nr  rÊ   r  T)Úrecord_process_markÚoriginal_size_bucketÚtoolÚ	truncatedr§   r¨   z2Shared-metrics tool output truncation not recordedr  )r  rÛ   r  r  ÚziprN   r   r  r.  ÚvaluesrY   ÚTOOL_OUTPUT_TRUNCATION_MARKr1   r  r  r  )rô   r+  r,  r  ÚmessageÚbeforeÚentryr.  r0  r-   r1  s   &&&        r   Úrecord_tool_batchr8    sð   € ðZØ—.‘.×$Ñ$Ô%:¸DÓAˆßœhŸjšjÙÜ" 5Ö:‰OˆGØ—K‘K¤ G§K¡K°Ó$?×$EÐ$EÀ2Ó FÓGˆEØÔ  W§[¡[°Ó%;À6Õ%IØ��a“ñ  ;õ 	>à%,§^¡^Ö%5Ñ!ˆD˜	Ù¤× DÑ DØ&Ô(:¸4Ó(@À&È$ÐP[×foÑ]bÐuyðGö ó &6øô ô ZÜ�‰ÐIÐTXˆ×YðZús)   ‚'C7 ªC7 ¼AC7 ÂC7 ÂAC7 Ã7"DÄDc               ó$   € V ^8„  d   QhRRRRRR/# )r   rô   r   Útools_for_apir   rl   r   )r   s   "r   r   r   ,  s&   € ÷ 	Qñ 	Q ð 	Q°Sð 	Q¸Tñ 	Qr   c           	     ó4  €  \        V RR4      '       g"   \        V 4      '       g   \        4       '       g   R# ^RIHp T! \        \        V RR4      ;'       g    R4      Y;'       g    . 4       R#   \         d    \        P                  RRR	7        R# i ; i)
zZThe tool definitions one primary request carries (evidence for trimming default toolsets).Ú_persist_disabledFN)Úrecord_session_toolsÚ
session_idrÊ   z)Shared-metrics tool overhead not observedTr  )	rø   rù   r  r  r=  r   r  r  r  )rô   r:  r=  s   && r   Úobserve_request_toolsr?  ,  s|   € ðQÜ�5Ð-¨u×5Ò5¼È×9OÒ9OÔW_×WaÒWaÙÝ>áœS¤¨°¸bÓ!A×!GÐ!GÀRÓHÈ%×QdÐQdÐbdÖeøÜô QÜ�‰Ð@È4ˆ×PðQús"   ‚4A1 ¸ A1 ÁA1 Á(A1 Á1"BÂBc               ó$   € V ^8„  d   QhRRRRRR/# )r   rô   r   r:  Úlistr   z0tuple[tuple[str, ...], frozenset[str], int, int]r   )r   s   "r   r   r   8  s'   € ÷ 
tñ 
t˜ð 
t¨Tð 
tÐ6fñ 
tr   c           	     óª  a	€ ^ RI Hp ^ RIHo	 \	        \        V4      4      p\        \        \        V RR4      ;'       g    T4      4      p\        V RR4      ;'       g    Rp\        V4      V Uu0 uF  p\        V\        4      '       g   K  VkK  	  up,          p\        V	3R lV 4       4      pY8\        V4      V'       d
   V! V4      3# ^ 3# u upi )zY(sent tool names, enabled shipped toolsets, enabled tool count, estimated schema tokens).)Ú_estimate_tools_tokens_rough)Úget_toolset_for_toolr¼   NÚvalid_tool_namesc              3  óF   <"  € T F  p\        S! V4      4      x € K  	  R # 5ir:   )r[   )rC   ÚnrD  s   & €r   rE   Ú tool_snapshot.<locals>.<genexpr>A  s    øé € Ð]É}È!Ô,Ñ-AÀ!Ó-D×EÐEË}ùs   ƒ!r   )Úagent.model_metadatarC  Úmodel_toolsrD  ÚtupleÚ_tool_namesrA  rø   r³   rL   r   r²   r  )
rô   r:  rC  r�   r  ÚextrarG  Úenabled_namesr•   rD  s
   &&       @r   Útool_snapshotrO  8  s±   ø€ åAÝ0ä”+˜mÓ,Ó-€EÜ”;œw u¨g°tÓ<×MÐMÀÓNÓO€GÜ�EÐ-¨tÓ4×:Ð:¸€EÜ˜“L©uÓ#K©u¨!¼
À1Äc×8J§A A©uÑ#KÕK€MÜÔ]É}Ó]Ó]€HØœC Ó.×_lÑ0LÈ]Ó0[ÐsÐsÐrsÐsÐsùò $Ls   Á0CÂCc               ó    € V ^8„  d   QhRRRR/# )r   r¼   zIterable[Any]r   zIterable[str]r   )r   s   "r   r   r   E  s   € ÷ ñ �}ð ¨ñ r   c              #  ó^  "  € T ;'       g    R F˜  p\        V\        4      '       d   VP                  R 4      MRp\        V\        4      '       d   VP                  R4      M(\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       g   K”  Vx € Kš  	  R# 5i)ÚfunctionNrª   r   )rL   rM   rN   r   )r¼   r0  Úfnrª   s   &   r   rL  rL  E  s{   é € Ø—�˜’ˆÜ%/°´d×%;Ò%;ˆT�X‰X�jÔ!ÀˆÜ!+¨B´×!5Ò!5ˆr�v‰v�fŒ~ÔPZÐ[_Ôae×PfÒPf¸D¿H¹HÀVÔ<LÐlpˆÜ�dœC× Ô ØŒJó	 ùs   ‚BB-Â#
B-c               ó$   € V ^8„  d   QhRRRRRR/# )r   rô   r   rï   r   r   rl   r   )r   s   "r   r   r   M  s&   € ÷ Oñ O˜cð O¨#ð O°$ñ Or   c                ób  €  V\         P                  9  g   \        V RR4      '       d   R# \        V 4      '       g   \	        4       '       g   R# ^RIHp T! T\        V 4      \        \        V RR4      ;'       g    R4      4       R#   \         d    \        P                  RRR	7        R# i ; i)
z[Hermes itself invalidated the conversation's cached prefix (compression, a rebuilt prompt).r<  FN)Úrecord_known_cache_breakr>  rÊ   z'Shared-metrics cache break not recordedTr  )rY   ÚCACHE_BREAK_CAUSESrø   rù   r  r  rV  rþ   r   r  r  r  )rô   rï   rV  s   && r   Úrecord_cache_breakrX  M  sŒ   € ð	OØœ×3Ñ3Ô3´w¸uÐFYÐ[`×7aÒ7aÙÜ˜5×!Ò!¬¯ªÙÝBá  ¬°UÓ(;¼SÄÈÐP\Ð^`ÓAa×AgÐAgÐegÓ=hÖiøÜô OÜ�‰Ð>Èˆ×NðOús   ‚(B ¬!B Á7B Â"B.Â-B.c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rô   r   Ústored_promptÚstored_stater   Úrebuiltr   rl   r   )r   s   "r   r   r   [  s8   € ÷ Wñ W ð W°Sð WÈð WÐVYð WÐ^bñ Wr   c                óT  a aaa€ VR	9   d   \        S R4       R# VR8w  g   S'       d   VS8X  d   R#  ^ RIHo \        ;QJ d"    V VVV3R lR
 4       F  '       g   K   RM	  RM! V VVV3R lR
 4       4      p\        S V'       d	   R4       R# R4       R#   \         d    Rp L-i ; i)zZA continuing conversation rebuilt its system prompt instead of replaying the stored bytes.Úsystem_prompt_rebuildNÚstale_runtime)Úidentity_line_valuec           	   3  ó°   <"  € T FK  w  rS! SV4      ;o;'       d2    S\        \        SVR 4      ;'       g    R 4      P                  4       8g  x € KM  	  R# 5i)rÊ   N)r   rø   Ústrip)rC   ÚlabelÚattrrô   r`  ÚstoredrZ  s   &  €€€€r   rE   Ú(record_prompt_rebuild.<locals>.<genexpr>e  s[   øé € ð 
áM‘�ñ +¨=¸%Ó@Ð@ˆV×{Ð{ÀfÔPSÔT[Ð\aÐcgÐikÓTl×TrÐTrÐprÓPs×PyÑPyÓP{ÑF{Ô{ÛMùs   ƒAœA·ATFÚmodel_switch)ÚnullÚempty))ÚModelrý   )ÚProviderrü   )rX  Úagent.surface_switchr`  rO   r  )rô   rZ  r[  r\  Úswitchedr`  re  s   ff&& @@r   Úrecord_prompt_rebuildrn  [  sŒ   û€ àÐ(Ô(Ü˜5Ð"9Ô:ÙØ�Ô&¯m¸wÈ-Ô?WÙðÝ<ç“3÷ 
áMó
—3—3’3÷ 
áMó
ó 
ˆô �u·˜nÖVÐ>UÖVøô ô ØŠðús   ³B ÁB ÁB ÂB'Â&B')©iÐ  Últ_2k)é'  Ú	2k_to_10k©iPÃ  Ú
10k_to_50k)i@ Ú50k_to_200k)i@B Ú
200k_to_1m)©ra   Ú0)r   Ú1)é   Ú2)é   Ú3_to_5)é   Ú6_to_10)é   Ú11_to_25)é3   Ú26_to_50)ée   Ú	51_to_100))r   Últ_1k)rq  Ú	1k_to_10krs  )i † Ú50k_to_100k)i ¡ Ú100k_to_500k)rw  ro  )iˆ  Ú2k_to_5k)rq  Ú	5k_to_10k)i N  Ú
10k_to_20k)i@œ  Ú
20k_to_40k):r{   Ú
__future__r   ÚloggingÚreÚcollectionsr   Údataclassesr   r   Útypingr   r   rÊ   r   rY   r	   r
   Ú	getLoggerrw   r  r!   r*   r0   r5   rÑ   ræ   r¸   r  r  Úcompiler%  r$  r#   r+   r1   r6   r<   rT   r[   re   rg   r   r‡   r‰   rµ   rò   rù   rþ   r  r  r  r8  r?  rO  rL  rX  rn  r   r   r   Ú<module>r–     sz  ðñõ #ã Û 	Ý ß (ß  å 1ß Bà	×	Ò	˜8Ó	$€ðÐ ðÐ ðÐ ðÐ ð ! +¨{¸MÐJÐ à€àÐ Ø6Ð ØÐ ð Ÿ*š*Ð%zÓ{Ð ØÐ õaõHõeõMõ3õ
	aõkõ
=ð ÷Bð Bó ðBð( ÷ð ó ðõnð ÷(ð (ó ð(ðV ÷2Vð 2Vó ð2VõjHõOõ
XõõLõ 
IõZõ*	Qõ
tõõO÷Wr   