+
    iHàj±ž  ã            
       óV  € R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHtHtH	t	H
t
 ^ RIHtHt ^ RIHtHt ]P"                  ! ]4      t]! Rx4      t]! Ry4      tR	tR
RR/ /tRzt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 lt"R R  lt#R!R"/R# R$ llt$R% R& lt%R' R( lt&R{R) R* llt'R+ R, lt(R- R. lt)R/ R0 lt*R1 R2 lt+R3 R4 lt,R5 R6 lt-R7^ R8R/R9 R: llt.R; R< lt/R= R> lt0R? R@ lt1RA RB lt2RC RD lt3RE RF lt4RG RH lt5RI RJ lt6RK RL lt7R]3R]4R]5R]6RM]7/t8RN RO lt9RP RQ lt:RR RS lt;RT RU lt<RV RW lt=RX RY lt>RZ R[ lt?R\ R] lt@R^ R_ ltAR` Ra ltBRb Rc ltCRd Re ltDRf Rg ltERh Ri ltFRj Rk ltGRl Rm ltHRn Ro ltIRp Rq ltJRr Rs ltKRt Ru ltLR|Rv Rw lltMR# )}a„  OpenAI-style -> Anthropic Messages API request conversion: model-id normalization, tool
schemas, and the message list (content blocks, thinking blocks and their signatures,
tool_use/tool_result pairing, cache_control placement, screenshot eviction, blank-block
scrubbing). Endpoint predicates come from ``agent/anthropic_endpoints.py`` so this module never
imports the adapter (no cycle).N)ÚAnyÚDictÚListÚOptionalÚTuple)Ú"images_all_within_many_image_limitÚoutbound_image_retire_count)Úanthropic_thinking_routeÚroute_replays_prior_thinkingÚthinkingÚredacted_thinkingÚtextÚtool_useú(empty)ÚtypeÚobjectÚ
propertiesc                ó0   € V ^8„  d   QhR\         R\         /# ©é   ÚbÚreturn©r   )Úformats   "ÚD/home/ubuntu/.hermes/hermes-agent/agent/anthropic_message_convert.pyÚ__annotate__r      s   € ÷ :ñ :”3ð :œ3ñ :ó    c                óT   € \        V \        4      '       d   V P                  R4      # R# )z-``type`` of a dict block, None for non-dicts.r   N©Ú
isinstanceÚdictÚget©r   s   &r   Ú_block_typer#      s!   € ä& q¬$×/Ò/ˆ1�5‰5�‹=Ð9°TÐ9r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# ©r   Úblocksr   ©Úlistr   Úbool)r   s   "r   r   r      s   € ÷ 8ñ 8œD¤�Ið 8´ñ 8r   c                 óx   a€ \         ;QJ d    V3R  lV  4       F  '       g   K   R# 	  R# ! V3R  lV  4       4      # )c              3   ó@   <"  € T F  p\        V4      S9   x € K  	  R # 5i©N©r#   )Ú.0r   Útypess   & €r   Ú	<genexpr>Ú"_has_block_type.<locals>.<genexpr>   s   øé € Ð7±¨1Œ{˜1‹~ Ö&³ùs   ƒTF)Úany)r&   r/   s   &fr   Ú_has_block_typer3      s,   ø€ ß‹3Ô7±Ó7�3Œ3Ð7Š3Ð7ˆ3Ô7±Ó7Ó7Ð7r   c                ó0   € V ^8„  d   QhR\         R\        /# r   )r   r)   )r   s   "r   r   r   "   s   € ÷ cñ cœCð c¤Dñ cr   c                ó´   € \        V 4      R8H  ;'       dD    \        V P                  R4      \        4      ;'       d    V R,          P	                  4       '       * # )uª   A text block whose ``text`` is not a non-whitespace string (None/int/blank all count) â€”
Anthropic 400s on them ("text content blocks must contain non-whitespace text").r   )r#   r   r!   ÚstrÚstripr"   s   &r   Ú_is_blank_text_blockr8   "   sE   € ô �q‹>˜VÑ#×bÐb¬Z¸¿¹¸f»ÄsÓ-K×-aÐ-aÐPQÐRXÕPY×P_ÑP_ÓPaÔ(bÐbr   c                óh   € V ^8„  d   QhR\         R\        \        \        \         3,          ,          /# r   ©r   r   r    r6   )r   s   "r   r   r   (   s'   € ÷ 0ñ 0œð 0¤¬$¬s´C¨x­.Õ!9ñ 0r   c                 óˆ   € \        V \        4      '       d   V P                  R 4      MRp\        V\        4      '       d   V# R# ©Úcache_controlNr   )r   Úccs   & r   Ú_cache_control_ofr?   (   s5   € Ü#-¨a´×#6Ò#6ˆ�‰ˆÔ	¸D€BÜ˜B¤×%Ò%ˆ2Ð/¨4Ð/r   c                óR   € V ^8„  d   QhR\         R\        \         \         3,          /# ©r   r   r   )r6   r    )r   s   "r   r   r   -   s"   € ÷ *ñ *”cð *œd¤3¬ 8�nñ *r   c                 ó   € R RRV /# )r   r   © ©r   s   &r   Ú_text_blockrE   -   s   € Ø�F˜F DÐ)Ð)r   c                ó^   € V ^8„  d   QhR\         R\         R\        \        \         3,          /# )r   r   Úcitsr   ©r   r    r6   )r   s   "r   r   r   1   s)   € ÷ ñ ¤Sð ´ð ¼¼SÄ#¸X½ñ r   c                ó`   € \        V 4      p\        V\        4      '       d   V'       d   WR&   V# )z`Text block carrying ``citations`` only when it is a non-empty list (the only input-valid shape).Ú	citations)rE   r   r(   )r   rG   Úblocks   && r   Ú_text_block_with_citationsrL   1   s(   € ä'¨Ó-€EÜ�$œ×Ò§$Ø!ˆkÑØ€Lr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úrawr   r   )r   s   "r   r   r   9   s   € ÷ ñ œ#ð ¤#ñ r   c                ó¦   €  \        V \        4      '       d   \        P                  ! V 4      # T #   \        P                  \
        3 d    / u # i ; i)zWJSON-decode a tool_call ``arguments`` string; non-strings pass through, bad JSON -> {}.)r   r6   ÚjsonÚloadsÚJSONDecodeErrorÚ
ValueError)rN   s   &r   Ú_parse_tool_argsrT   9   sE   € ðÜ",¨S´#×"6Ò"6Œt�zŠz˜#‹Ð?¸CÐ?øÜ× Ñ ¤*Ð-ô ØŠ	ðús   ‚+0 ®0 °AÁAc                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# r%   )r(   r   )r   s   "r   r   r   A   s&   € ÷ Hñ HœD¤�Ið H¬$¬s­)ñ Hr   c                 ó\   € V  Uu. uF  p\        V4      \        9  g   K  VNK  	  up# u upi r,   )r#   Ú_THINKING_TYPES)r&   r   s   & r   Ú_strip_thinkingrX   A   s'   € ÙÓG‘v�!¤¨Q£´Ñ!F�AˆA‘vÑGÐGùÒGs   …) )c                ó^   € V ^8„  d   QhR\         \        ,          R\        R\        R\        /# )r   r&   ÚbtypeÚkeyr   )r(   r   r6   Úset)r   s   "r   r   r   E   s2   € ÷ Cñ C”tœC•yð C¬ð C´3ð C¼3ñ Cr   c                 ór   € V  Uu0 uF&  p\        V4      V8X  g   K  VP                  V4      kK(  	  up# u upi r,   )r#   r!   )r&   rZ   r[   r   s   &&& r   Ú
_block_idsr^   E   s/   € Ù &ÓB¡˜1¬+°a«.¸EÑ*AŒJˆA�E‰E�#ŽJ¡ÑBÐBùÒBs   …4œ4c                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# )r   Úresult©r(   r    r6   r   )r   s   "r   r   r   I   s#   € ÷ yñ y¤4¬¬S´#¨X­Õ#7ñ yr   c                ó&   € R \        V 4       4       # )zO``(index, message)`` for every assistant message whose content is a block list.c              3   óª   "  € T FI  w  rVP                  R 4      R8X  g   K  \        VP                  R4      \        4      '       g   KD  W3x € KK  	  R# 5i)ÚroleÚ	assistantÚcontentN)r!   r   r(   )r.   ÚiÚms   &  r   r0   Ú)_assistant_block_lists.<locals>.<genexpr>K   sA   é € ÐxÑ0‘t�q°A·E±E¸&³MÀ[Ñ4PŒFÔU_Ð`a×`eÑ`eÐfoÓ`pÔrv×UwŒFˆQ�FÓ0ùs   ‚A¡"AÁA)Ú	enumerate©r`   s   &r   Ú_assistant_block_listsrl   I   s   € áxœy¨Ô0ÓxÐxr   ÚcopyFc          
      óŒ   € V ^8„  d   QhR\         \        \        3,          R\        R\        R\         \        \        3,          /# )r   Úoutr   rm   r   )r    r6   r   r)   )r   s   "r   r   r   N   s=   € ÷ ñ œd¤3¬ 8�nð ´ð ¼tð ÔPTÔUXÔZ]ÐU]ÕP^ñ r   c               óT   € \        V4      pVe   V'       d   \        V4      MTV R&   V # )z§Carry a dict-valued ``cache_control`` marker from ``b`` onto ``out`` (returned); ``copy``
shallow-copies it so the caller's dict is never shared with the wire payload.r=   )r?   r    )ro   r   rm   r>   s   &&$ r   Ú_carry_cache_controlrq   N   s*   € ô 
˜1Ó	€BØ	‚~ß+/œt Bœx°RˆˆOÑØ€Jr   c                óž   € V ^8„  d   QhR\         \        ,          R\        \         \        ,          \        \         \        ,          3,          /# r%   )r(   r   ÚtupleÚint)r   s   "r   r   r   W   s2   € ÷ ?ñ ?¤T¬#¥Yð ?´5¼¼c½ÄCÌÌcÍÐ9RÕ3Sñ ?r   c                óP  € \        V 4       UUu. uF  w  r\        V4      '       g   K  VNK  	  ppp\        V 4       UUu. uF  w  rW9  g   K  VNK  	  pppV Uu. uF  p\        W,          4      ;pf   K  VNK  	  ppYF'       d   VR,          V3# RV3# u uppi u uppi u upi )z®``(kept, relocated_cache_control, dropped_indexes)``: drop blank text blocks, remembering
the cache_control of the last one dropped so the caller can relocate the breakpoint.Néÿÿÿÿ)rj   r8   r?   )r&   rg   ÚblkÚdroppedÚkeptr>   Ú	relocateds   &      r   Ú_split_blank_text_blocksr{   W   s�   € ô  )¨Ô0ÔNÑ0‘V�QÔ4HÈ×4M�qˆqÑ0€GÑNÜ'¨Ô/ÔDÑ/‘F�A°1Ñ3C�CˆCÑ/€DÑDÙ$ÓY™W˜Ô/@ÀÅÓ/KÐ)K¨—�™W€IÐYØ¦)�˜2•°wÐ>Ð>°°wÐ>Ð>ùó OùÛDùÚYs"   �B©BÁ 
BÁBÁB#Á8B#c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úmodelr   ©r6   r)   )r   s   "r   r   r   `   s   € ÷ Pñ P¤ð P¬ñ Pr   c                óV   € V P                  4       P                  \        R,           4      # )zˆBedrock ids (``anthropic.claude-opus-4-7``, ``us.anthropic.claude-*``) use dots as namespace
separators that must be preserved verbatim.)z
anthropic.)ÚlowerÚ
startswithÚ_BEDROCK_REGION_PREFIXES)r}   s   &r   Ú_is_bedrock_model_idrƒ   `   s!   € ð �;‰;‹=×#Ñ#Ô$<¸Õ$NÓOÐOr   c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   r}   Úpreserve_dotsr   r~   )r   s   "r   r   r   f   s!   € ÷ 
ñ 
¤ð 
´Dð 
ÄSñ 
r   c                ó  € V P                  4       P                  R4      '       d   V \        R4      R p V'       gI   \        V 4      '       g8   V P                  4       P                  R4      '       d   V P	                  RR4      p V # )aH  Strip the ``anthropic/`` prefix (case-insensitive) and, unless ``preserve_dots`` (DashScope:
``qwen3.5-plus``), convert version dots to hyphens for Claude models only (``claude-opus-4.6``
-> ``claude-opus-4-6``). Bedrock ids keep their namespace dots; non-Anthropic names
(``gpt-5.4``) keep dots as part of their canonical form.ú
anthropic/NÚ.Ú-)zclaude-r‡   )r€   r�   Úlenrƒ   Úreplace)r}   r…   s   &&r   Únormalize_model_namerŒ   f   sg   € ð
 ‡{�{ƒ}×Ñ ×-Ò-Ø”c˜,Ó'Ð(Ð)ˆßÔ!5°e×!<Ò!<ÀÇÁÃ×AYÑAYÐZs×AtÒAtà—‘˜c 3Ó'ˆØ€Lr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Útool_idr   )r6   )r   s   "r   r   r   s   s   € ÷ Tñ Tœsð T¤sñ Tr   c                óZ   € V '       d   \         P                  ! RRV 4      MR;'       g    R# )zMAnthropic requires ids matching [a-zA-Z0-9_-]; replace the rest, never empty.z[^a-zA-Z0-9_-]Ú_Ú Útool_0)ÚreÚsub)rŽ   s   &r   Ú_sanitize_tool_idr•   s   s"   € ç7>ŒB�FŠFÐ$ c¨7Ô3ÀB×SÐSÈ8ÐSr   c          
      ój   € V ^8„  d   QhR\         R\         R\         R\        \        \         3,          /# )r   rŽ   ÚnameÚ
tool_inputr   rH   )r   s   "r   r   r   x   s6   € ÷ eñ eœSð e¬ð e¼ð eÄÄcÌ3ÀhÅñ er   c                 ó(   € R RR\        V 4      RVRV/# )r   r   Úidr—   Úinput)r•   )rŽ   r—   r˜   s   &&&r   Ú_tool_use_blockrœ   x   s!   € Ø�J Ô&7¸Ó&@À&È$ÐPWÐYcÐdÐdr   c                óR   € V ^8„  d   QhR\         R\        \        \         3,          /# )r   Úschemar   rH   )r   s   "r   r   r   |   s"   € ÷ ñ ¬ð ´´c¼3°hµñ r   c                óÐ  € ^ RI Hp V '       d   V! V RR7      MRp\        V\        4      '       g   \        \        4      # 0 RmpW2P                  4       ,          '       d>   VP                  4        UUu/ uF  w  rEWC9  g   K  WEbK  	  pppVP                  RR4       VP                  R4      R8X  d.   \        VP                  R4      \        4      '       g	   / VCR/ /CpV# u uppi )	u­  Normalize a tool schema for Anthropic's validator: collapse nullable unions (``anyOf:
[{type: string}, {type: null}]`` from Pydantic/MCP optional fields) to the non-null branch â€”
optionality is already expressed by ``required``; ``keep_nullable_hint=False`` because the
OpenAPI ``nullable`` keyword is not recognized. Top-level oneOf/allOf/anyOf are rejected with a
generic 400, so they are dropped in favour of a plain object.)Ústrip_nullable_unionsF)Úkeep_nullable_hintNr   r   r   >   ÚallOfÚanyOfÚoneOf)	Útools.schema_sanitizerr    r   r    Ú_EMPTY_SCHEMAÚkeysÚitemsÚ
setdefaultr!   )rž   r    Ú
normalizedÚbannedÚkÚvs   &     r   Ú_normalize_tool_input_schemar®   |   sÃ   € õ =çLRÑ& vÀ%ÕHÐX\€JÜ�j¤$×'Ò'Ü”MÓ"Ð"Ú(€FØ—‘Ó!×!Ô!Ø'1×'7Ñ'7Ô'9ÔMÑ'9™t˜q¸Q¹_”d�a’dÑ'9ˆ
ÑMØ×Ñ˜f hÔ/Ø‡~�~�fÓ Ô)´*¸Z¿^¹^ÈLÓ=YÔ[_×2`Ò2`Ø5˜
Ð5 L°"Ñ5ˆ
ØÐùó	 Ns   Á3
C"ÂC"c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r   Útoolsr   )r(   r    )r   s   "r   r   r   �   s"   € ÷ ñ ¤d¬4¥jð ´T¼$µZñ r   c                ó¶  € . p\        4       pT ;'       g    .  F¼  pVP                  R/ 4      pVP                  RR4      pV'       d   WR9   d   \        P                  RV4       KM  V'       d   VP	                  V4       RTRVP                  RR4      R\        VP                  R4      ;'       g    / 4      /pVP                  \        WcRR	7      4       K¾  	  V# )
z¶Convert OpenAI tool definitions to Anthropic format. Duplicate names are dropped with a
warning (Anthropic hard-400s on them); ``cache_control`` on the OpenAI tool dict is forwarded.Úfunctionr—   r‘   uS   convert_tools_to_anthropic: duplicate tool name '%s' â€” dropping second occurrenceÚdescriptionÚinput_schemaÚ
parametersT©rm   )r\   r!   ÚloggerÚwarningÚaddr®   Úappendrq   )r°   r`   Ú
seen_namesÚtÚfnr—   Úanthropic_tools   &      r   Úconvert_tools_to_anthropicr¿   �   sÃ   € ð €FÜ“e€JØ�[ˆ[�bŠ[ˆØ�U‰U�:˜rÓ"ˆØ�v‰v�f˜bÓ!ˆ÷ �DÔ&Ü�N‰NÐpÐrvÔwÙßØ�N‰N˜4Ô à�D˜-¨¯©°¸rÓ)BØÔ8¸¿¹ÀÓ9M×9SÐ9SÐQSÓTð*
ˆð 	�‰Ô*¨>À4ÔHÖIñ ð €Mr   c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# )r   Úurlr   )r6   r    r   )r   s   "r   r   r   §   s&   € ÷ cñ c¤cð c¬d´3¼°8­nñ cr   c           	     ó
  € ^ RI HpHp \        T ;'       g    R4      P	                  4       p V P                  R4      '       g   RRRRRRV //# V! V 4      pVR8X  d   V! V 4      ;pe   TR	r0Ve   \        R
V R24      # V P                  R4      w  rVpV\        R4      R	 P                  R^4      ^ ,          P	                  4       pVP                  R4      '       d   TMRp	V	P                  4       R8X  d   RMT	p	RRRRRRV	RV//# )a  OpenAI image URL / data URL -> Anthropic ``image`` block. An inline subtype the API rejects
(svg+xml, bmp, tiff) 400s every replay once in history: an SVG is rasterized to PNG when a
rasterizer is installed, anything else unsupported becomes a text placeholder.)Úrasterize_svg_data_urlÚ#unsupported_inline_image_media_typer‘   zdata:r   ÚimageÚsourcerÁ   zimage/svg+xmlNz[image omitted: z! is not a supported image format]Ú,Ú;zimage/z
image/jpegz	image/jpgÚbase64Ú
media_typeÚdata)Útools.vision_tools_image_preprÃ   rÄ   r6   r7   r�   rE   Ú	partitionrŠ   Úsplitr€   )
rÁ   rÃ   rÄ   ÚunsupportedÚpng_urlÚheaderr�   rË   Ú	mime_partrÊ   s
   &         r   Ú_image_block_from_openai_urlrÓ   §   s  € ÷ jÜ
ˆc�iˆi�R‹.×
Ñ
Ó
 €CØ�>‰>˜'×"Ò"Ø˜ ¨F°E¸5À#Ð+FÐGÐGÙ5°cÓ:€KØ�oÔ%Ñ6LÈSÓ6QÐ+Q¨7Ò*^Ø" Dˆ[ØÒÜÐ-¨k¨]Ð:[Ð\Ó]Ð]Ø—m‘m CÓ(�O€FˆtØ”s˜7“|�}Ð%×+Ñ+¨C°Ó3°AÕ6×<Ñ<Ó>€IØ'×2Ñ2°8×<Ò<‘À,€JØ!+×!1Ñ!1Ó!3°{Ô!B‘È
€JØ�G˜X¨°¸,È
ÐTZÐ\`Ð'aÐbÐbr   c                óh   € V ^8„  d   QhR\         R\        \        \        \         3,          ,          /# )r   Úpartr   r:   )r   s   "r   r   r   »   s'   € ÷ ñ ¬Sð ´X¼dÄ3ÌÀ8½nÕ5Mñ r   c                óf  € V f   R# \        V \        4      '       g1   \        \        V \        4      '       d   V 4      # \        V 4      4      # V P	                  R4      pVR	9   d6   \        V P	                  RR4      VR8X  d   V P	                  R4      MR4      pMmVR
9   d\   V P	                  R/ 4      p\        V\        4      '       d   VP	                  RR4      M\        T;'       g    R4      p\        V4      pM\        V 4      p\        V 4      ;pe   VP                  R\        V4      4       V# )zNConvert one OpenAI-style content part to an Anthropic block (None -> dropped).Nr   r   r‘   rJ   Ú	image_urlrÁ   r=   )Ú
input_textr   >   r×   Úinput_image)	r   r    rE   r6   r!   rL   rÓ   r?   r©   )rÕ   ÚptyperK   Úimage_valuerÁ   r=   s   &     r   Ú"_convert_content_part_to_anthropicrÜ   »   s  € à‚|ÙÜ�dœD×!Ò!Ü¤:¨d´C×#8Ò#8˜4ÓHÐH¼cÀ$»iÓHÐHØ�H‰H�VÓ€EØÐ&Ô&ô +¨4¯8©8°F¸BÓ+?ÐZ_ÐciÔZiÀÇÁÈ+ÔAVÐosÓt‰Ø	Ð.Ô	.Ø—h‘h˜{¨BÓ/ˆÜ,6°{ÄD×,IÒ,Iˆk�o‰o˜e RÔ(ÌsÐS^×SdÐSdÐbdÓOeˆÜ,¨SÓ1‰ä�T“
ˆÜ*¨4Ó0Ð0ˆÒ=Ø×Ñ˜¬$¨}Ó*=Ô>Ø€Lr   Ú_depthÚ_pathc                ó^   € V ^8„  d   QhR\         R\        R\        \        ,          R\         /# )r   ÚvaluerÝ   rÞ   r   )r   rt   r   r\   )r   s   "r   r   r   Ñ   s-   € ÷ ñ œ#ð ¬#ð ¼(Ä3½-ð ÔSVñ r   c               ó,  aa€ Sf   \        4       MSo\        V 4      pS^8”  g   VS9   d   \        V 4      # VV3R lpSP                  V4       \	        V R4      '       d    V P                  RR7      pV! V4      pMÓ\        V \        4      '       d+   V P                  4        UUu/ uF  w  rxWt! V4      bK  	  pppM“\        V \        \        34      '       d   V  Uu. uF
  q„! V4      NK  	  ppM`\	        V R4      '       dM   \        V 4      P                  4        UUu/ uF&  w  rxVP                  R4      '       d   K  Wt! V4      bK(  	  pppMT pSP                  V4       V#   \         d    T P                  4       p ELi ; iu uppi u upi u uppi )zÏRecursively convert SDK objects to plain Python data. ``_path`` tracks ids on the *current*
recursion path (shared but non-cyclic objects convert normally while true cycles stringify);
depth is capped at 20.c                 ó.   <€ \        V S^,           SR7      # )é   )rÝ   rÞ   )Ú_to_plain_data)r­   rÝ   rÞ   s   &€€r   ÚrecÚ_to_plain_data.<locals>.recÚ   s   ø€ Ü˜a¨°­
¸%Ô@Ð@r   Ú
model_dumpF)ÚwarningsÚ__dict__r�   )r\   rš   r6   r¹   Úhasattrrç   Ú	TypeErrorr   r    r¨   r(   rs   Úvarsr�   Údiscard)	rà   rÝ   rÞ   Úobj_idrå   Údumpedr`   r¬   r­   s	   &dd      r   rä   rä   Ñ   s_  ù€ ð ’]ŒCŒE¨€EÜ�‹Y€FØ�„{�f ”oÜ�5‹zÐöAð 
‡I�IˆfÔÜˆu�l×#Ò#ð	(ð ×%Ñ%¨uÐ%Ó5ˆFñ �V“‰Ü	�Eœ4×	 Ò	 Ø(-¯©¬Ô6©¡ �!�S˜“V’)©ˆÑ6ˆÜ	�EœD¤%˜=×	)Ò	)Ù"'Ó(¡%˜Q�#�a–&¡%ˆÐ(ˆÜ	�˜
×	#Ò	#Ü(,¨U«×(9Ñ(9Ô(;ÔUÑ(;¡ À1Ç<Á<ÐPS×CT”)�!�S˜“V’)Ñ(;ˆÑUˆàˆØ	‡M�M�&ÔØ€Møô ô 	(Ø×%Ñ%Ó'‹Fð	(üó 7ùâ(ùãUs*   Á"E# Â&FÃFÄFÄ>FÅ#FÆFc                óŠ   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          /# )r   Úmessager   )r    r6   r   r(   )r   s   "r   r   r   ò   s0   € ÷ 	ñ 	´´S¼#°Xµð 	Ä4ÌÌSÔRUÈXÍÕCWñ 	r   c           	     ór  € V P                  R4      p\        V\        4      '       g   . # V Uu. uF}  p\        V\        4      '       g   K  \	        VP                  RR4      ;'       g    R4      P                  4       P                  4       \        9   g   Kg  \        P                  ! V4      NK  	  up# u upi )zIDeep-copied thinking/redacted_thinking blocks from ``reasoning_details``.Úreasoning_detailsr   r‘   )
r!   r   r(   r    r6   r7   r€   rW   rm   Údeepcopy)rñ   Úraw_detailsÚds   &  r   Ú"_extract_preserved_thinking_blocksr÷   ò   s—   € à—+‘+Ð1Ó2€KÜ�k¤4×(Ò(Øˆ	ñ óáˆAÜ�aœ×ô 	ä#& q§u¡u¨V°RÓ'8×'>Ð'>¸BÓ#?×#EÑ#EÓ#G×#MÑ#MÓ#OÔSbÑ#bô 	Œ�Š�aÖÙñð ùò s   ®B4ÁB4Á))B4ÂB4c                ó0   € V ^8„  d   QhR\         R\         /# ©r   rf   r   r   )r   s   "r   r   r   þ   s   € ÷ Zñ Z¬3ð Z´3ñ Zr   c                ó†   € \        V \        4      '       g   V # \        \        V 4       Uu. uF
  qf   K  VNK  	  up# u upi )zWConvert an OpenAI multimodal content list to Anthropic blocks (non-lists pass through).)r   r(   ÚmaprÜ   )rf   r   s   & r   Ú_convert_content_to_anthropicrü   þ   s8   € ä�gœt×$Ò$ØˆÜÔ=¸wÔGÓYÑG�!�AˆAÑGÑYÐYùÒYs   «>µ>c                óh   € V ^8„  d   QhR\         R\        \        \        \         3,          ,          /# )r   Úpartsr   )r   r(   r    r6   )r   s   "r   r   r     s'   € ÷ ñ ¬cð ´d¼4ÄÄSÀ½>Õ6Jñ r   c                óâ  € . p\        \        \        V \        4      '       d   T M. 4       FÀ  pV'       g   K  VP	                  R4      VP	                  R4      VP	                  R4      rTpVR8X  d;   \        V\
        4      '       d%   V'       d   VP                  \        V4      4       K€  VR8X  g   K‰  \        V\        4      '       g   K¡  V'       g   K«  VP                  RRRV/4       KÂ  	  V# )z�Tool-message content parts -> tool_result inner blocks (text + image only, the types
Anthropic accepts there). Used for multimodal tool results.r   r   rÆ   rÅ   )	rû   rÜ   r   r(   r!   r6   rº   rE   r    )rþ   ro   rK   rZ   Útext_valÚsrcs   &     r   Ú"_content_parts_to_anthropic_blocksr    s²   € ð !#€CÜÔ7Ä*ÈUÔTX×BYÒBY¹Ð_aÖbˆßÙØ$Ÿy™y¨Ó0°%·)±)¸FÓ2CÀUÇYÁYÈxÓEX˜ˆØ�FŒ?œz¨(´C×8Ò8¿XØ�J‰J”{ 8Ó,Ö-Ø�gÖ¤*¨S´$×"7Ô"7¿C¹CØ�J‰J˜ ¨°3Ð7Ö8ñ cð €Jr   c                ó0   € V ^8„  d   QhR\         R\        /# rA   )r   r6   )r   s   "r   r   r     s   € ÷ =ñ =”Sð =œSñ =r   c                ó`   € V f   RM
\        V 4      p V P                  4       '       d   V # \        # )a  ``text`` if non-whitespace, else the placeholder. A blank text block stored in history (e.g.
by compression) is replayed on every turn and wedges the session with HTTP 400; the placeholder
is self-healing. Mirrors ``bedrock_adapter._safe_text`` (kept separate on purpose).r‘   )r6   r7   Ú_EMPTY_TEXT_PLACEHOLDERrD   s   &r   Ú
_safe_textr    s)   € ð ’‰2¤3 t£9€DØ—:‘:—<’<ˆ4Ð<Ô%<Ð<r   c                óŠ   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          /# r   ©r    r6   r   r   )r   s   "r   r   r     s3   € ÷ ^ñ ^”Dœœc˜•Nð ^¤x´´S¼#°XµÕ'?ñ ^r   c                 ó€   € \        V 4      '       d   R # \        \        V R,          V P                  R4      4      V 4      # )Nr   rJ   )r8   rq   rL   r!   r"   s   &r   Ú_replay_textr
    s5   € ô ˜A×ÒÙÜÔ :¸1¸V½9ÀaÇeÁeÈKÓFXÓ YÐ[\Ó]Ð]r   c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# r   ©r    r6   r   )r   s   "r   r   r   %  s.   € ÷ Oñ OœœS¤#˜X�ð O¬4´´S°­>ñ Or   c                 ó~   € R RRV P                  RR4      /pV P                  R4      '       d   / VCRV R,          /C# T# )r   r   r‘   Ú	signature©r!   )r   ro   s   & r   Ú_replay_thinkingr  %  sE   € Ø�:˜z¨1¯5©5°¸RÓ+@Ð
A€CØ34·5±5¸×3EÒ3EÐ/ˆcÐ/�;  +¥Ñ/ÐNÈ3ÐNr   c                óŠ   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          /# r   r  )r   s   "r   r   r   *  s3   € ÷ Wñ W¤¤c¬3 h¥ð W´H¼TÄ#ÄsÀ(½^Õ4Lñ Wr   c                 óN   € V P                  R 4      '       d   RRR V R ,          /# R# )rË   r   r   Nr  r"   s   &r   Ú_replay_redacted_thinkingr  *  s(   € Ø?@¿u¹uÀV¿}º}ˆFÐ'¨°°6µÐ;ÐVÐRVÐVr   c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# r   r  )r   s   "r   r   r   .  s.   € ÷ lñ lœœS¤#˜X�ð l¬4´´S°­>ñ lr   c           
      ó�   € \        \        V P                  R R4      V P                  RR4      V P                  R/ 4      4      V 4      # )rš   r‘   r—   r›   )rq   rœ   r!   r"   s   &r   Ú_replay_tool_user  .  s>   € Ü¤°·±°d¸B³ÀÇÁÀvÈrÓARÐTU×TYÑTYÐZaÐceÓTfÓ gÐijÓkÐkr   c                óŠ   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          /# r   r  )r   s   "r   r   r   2  s3   € ÷ Oñ O”Tœ#œs˜(•^ð O¬´´c¼3°hµÕ(@ñ Or   c                 ó`   € V P                  R 4      p\        V\        4      '       d   RRR V/# R# )rÆ   r   rÅ   N)r!   r   r    )r   r  s   & r   Ú_replay_imager  2  s/   € Ø
�%‰%�‹/€CÜ/9¸#¼t×/DÒ/DˆF�G˜X sÐ+ÐNÈ$ÐNr   rÅ   c                óŠ   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          /# r   r  )r   s   "r   r   r   =  s/   € ÷ 	/ñ 	/œd¤3¬ 8�nð 	/´¼$¼sÄC¸x½.Õ1Iñ 	/r   c                óž   € \        V \        4      '       g   R# \        P                  V P                  R4      4      pV'       d	   V! V 4      # R# )aœ  Whitelist a stored Anthropic block so it is valid as REQUEST input. SDK response blocks carry
output-only fields the INPUT schema forbids ("Extra inputs are not permitted": ``parsed_output``,
``caller``, ``citations=None``), and ``_to_plain_data`` captured them verbatim. Whitelist per
type (not blacklist) so future SDK fields can't reintroduce the bug; unknown types are dropped.
Returns a clean block or None.Nr   )r   r    Ú_REPLAY_SANITIZERSr!   )r   Ú	sanitizers   & r   Ú_sanitize_replay_blockr  =  s=   € ô �aœ×ÒÙÜ"×&Ñ& q§u¡u¨V£}Ó5€Iß$‰9�Q‹<Ð.¨$Ð.r   c                ól   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        RR/# )r   r&   r=   r   Nra   )r   s   "r   r   r   I  s1   € ÷ ñ Ä4ÌÌSÔRUÈXÍÕCWð Ôhkð Ðptñ r   c                 ó¾   € \        V\        4      '       g   R # \        V 4       F5  p\        V4      \        9   g   K  VP                  R\        V4      4        R # 	  R # )Nr=   )r   r    Úreversedr#   Ú_CACHEABLE_TYPESr©   )r&   r=   rK   s   && r   Ú6_apply_assistant_cache_control_to_last_cacheable_blockr#  I  sG   € Ü�m¤T×*Ò*ÙÜ˜&Ö!ˆÜ�uÓÔ!1Ö1Ø×Ñ˜_¬d°=Ó.AÔBÚó "r   c          
      óÂ   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          R\        \        \         \        \        3,          ,          ,          /# )r   rh   Úordered_blocksr   )r    r6   r   r(   r   )r   s   "r   r   r   R  sE   € ÷ 'ñ 'œd¤3¬ 8�nð '¼dÄ3½ið 'ÌHÔUYÔZ^Ô_bÔdgÐ_gÕZhÕUiÕLjñ 'r   c           
     óæ  € V P                  R. 4      ;'       g    .  Uu/ uFj  p\        V\        4      '       g   K  \        VP                  RR4      4      \	        VP                  R/ 4      ;'       g    / P                  RR4      4      bKl  	  pp. pRpRpV F�  p\        V4      pVf,   T;'       g    \        V4      R	8H  p\        V4      ;p	e   T	pK=  VP                  R
4      R8X  d*   VP                  VP                  RR4      4      ;p
e   W¨R&   VP                  V4       K�  	  \        V\        4      '       g+   V'       g   Ve   VP                  \        \        4      4       V'       g   R# \        WE4       \        W@P                  R4      4       V P                  R4      p\        V\        4      '       d-   \        R \!        \        V4       4       R4      p\        WL4       V# u upi )aÁ  Interleaved-thinking replay: rebuild the assistant turn from the verbatim block list
normalize_response stored (only for turns interleaving SIGNED thinking with tool_use).
Preserves block ORDER; returns None if nothing survives. tool_use ``input`` is re-sourced from
``tool_calls`` (redacted at storage time) rather than the captured block (raw API response, NOT
redacted), so a secret the model inlined into a tool call never goes back on the wire.Ú
tool_callsrš   r‘   r²   Ú	argumentsú{}NFr   r   r   r›   r=   rf   c              3   ó0   "  € T F  qf   K  Vx € K  	  R # 5ir,   rC   )r.   r>   s   & r   r0   Ú)_replay_ordered_blocks.<locals>.<genexpr>w  s   é € Ð]Ñ'J Ÿ"š"Ó'Jùs   ‚Œ
)r!   r   r    r•   rT   r  r#   r?   rº   r3   r"  rE   r  r#  r(   Únextrû   )rh   r%  ÚtcÚredacted_input_by_idÚreplayedÚrelocated_ccÚdropped_blank_textr   Úcleanr>   ÚredactedÚmsg_contentÚ	inline_ccs   &&           r   Ú_replay_ordered_blocksr6  R  sÀ  € ð —%‘%˜ bÓ)×/Ð/¨RÐ/óá/ˆBÜ�bœ$×ô 	uÔ˜"Ÿ&™&  rÓ*Ó+Ô-=¸r¿v¹vÀjÐRTÓ?U×?[Ð?[ÐY[×>`Ñ>`ÐalÐnrÓ>sÓ-tÒtÙ/ð ð ð
 &(€HØ€LØÐÛˆÜ& qÓ)ˆØŠ=Ø!3×!OÐ!O´{À1³~ÈÑ7OÐÜ'¨Ó*Ð*�Ò7Ø!�ÙØ�9‰9�VÓ 
Ô*Ð<P×<TÑ<TÐUZ×U^ÑU^Ð_cÐegÓUhÓ<iÐ0i°Ò/vØ%�'‰NØ�‰˜Öñ ô ˜8Ô%5×6Ò6×<NÐR^ÒRjØ�‰œÔ$;Ó<Ô=ßÙÜ:¸8ÔRÜ:¸8ÇUÁUÈ?ÓE[Ô\ð —%‘%˜	Ó"€KÜ�+œt×$Ò$ÜÑ]¤sÔ+<¸kÔ'JÓ]Ð_cÓdˆ	Ü>¸xÔSØ€OùòCs   ŸG.¼7G.Á4G.c          	      ó¬   € V ^8„  d   QhR\         \        \        3,          R\        \        \
        \         \        \        3,          ,          3,          /# ©r   rh   r   )r    r6   r   rs   r)   r(   )r   s   "r   r   r   |  s9   € ÷ 	8ñ 	8¤¤S¬# X¥ð 	8´5¼¼tÄDÌÌcÈÅNÕ?SÐ9SÕ3Tñ 	8r   c                ó¨   € V P                  R4      p\        V\        4      '       d    V'       d   \        W4      pV'       d   RV3# R\	        V 4      3# )a  ``(ordered, blocks)``: the sanitized ordered sidecar when any block survives it (the whole turn
then replays from it), else the ``reasoning_details`` thinking blocks. Single owner of carrier
precedence for conversion, accounting and rejected-signature mirrors.Úanthropic_content_blocksTF)r!   r   r(   r6  r÷   )rh   r%  r/  s   &  r   Úassistant_replay_carrierr;  |  sJ   € ð —U‘UÐ5Ó6€NÜ�.¤$×'Ò'¯NÜ)¨!Ó<ˆßØ˜�>Ð!ØÔ4°QÓ7Ð7Ð7r   c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# r8  r  )r   s   "r   r   r   ˆ  s*   € ÷ *7ñ *7¤$¤s¬C x¥.ð *7´T¼#¼s¸(µ^ñ *7r   c                óâ  € V P                  RR4      p\        V 4      w  r#V'       d   RRRV/# Rp\        V\        4      '       d*   \	        \        V4      4      w  rTpVP                  V4       MJV'       dC   \        V4      P                  4       '       d$   VP                  \        \        V4      4      4       V P                  R. 4       FŠ  pV'       d   \        V\        4      '       g   K#  VP                  R/ 4      pVP                  \        VP                  RR4      VP                  R	R4      \        VP                  R
R4      4      4      4       KŒ  	  V P                  R4      p	\        V	\        4      '       d-   \        V\        4      '       g   VP!                  ^ RRRV	/4       T;'       g    \        \"        4      .p
\%        W¤4       \%        W P                  R4      4       RRRV
/# )ztAssistant message -> Anthropic content blocks (thinking, text, tool_use, Kimi/DeepSeek
reasoning_content injection).rf   r‘   rd   re   Nr'  r²   rš   r—   r(  r)  Úreasoning_contentr   r   r=   )r!   r;  r   r(   r{   rü   Úextendr6   r7   rº   rE   r    rœ   rT   r3   rW   Úinsertr  r#  )rh   rf   Úorderedr&   r0  ry   r�   r-  r½   r>  Ú	effectives   &          r   Ú_convert_assistant_messagerC  ˆ  sŽ  € ð �e‰e�I˜rÓ"€GÜ.¨qÓ1�O€GßØ˜ Y°Ð7Ð7ð €LÜ�'œ4× Ò Ü 8Ô9VÐW^Ó9_Ó `Ñˆ˜AØ�‰�dÕß	”S˜“\×'Ñ'×)Ò)Ø�‰”k¤# g£,Ó/Ô0Ø�e‰e�L "Ö%ˆßœ B¬×-Ò-ÙØ�V‰V�J Ó#ˆØ�‰”o b§f¡f¨T°2Ó&6¸¿¹¸vÀrÓ8JÔL\Ð]_×]cÑ]cÐdoÐquÓ]vÓLwÓxÖyñ	 &ð Ÿ™Ð1Ó2ÐÜÐ#¤S×)Ò)´/À&Ì/×2ZÒ2ZØ�‰�a˜& *¨jÐ:KÐLÔMð ×@Ð@œ;Ô'>Ó?Ð@€IÜ:¸9ÔSÜ:¸9ÇeÁeÈOÓF\Ô]Ø�K ¨IÐ6Ð6r   c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# r8  r  )r   s   "r   r   r   µ  s&   € ÷ nñ nœD¤¤c �Nð n¬sñ nr   c                óZ  € V P                  RR4      pRp\        V\        4      '       dx   VP                  R4      '       da   \        VP                  R4      ;'       g    . 4      pV'       g4   VP                  R4      '       d   \	        \        VR,          4      4      .pM6\        V\        4      '       d!   \        V4      p\        VR04      '       d   TpVf†   V P                  R4      p\        V\        4      '       d_   V'       dW   \        V\
        4      '       d   VP                  4       '       d   TMRpV'       d   \	        V4      .V,           M
\        V4      pV'       d   V# \        V\
        4      '       d   TMV'       d   \        P                  ! V4      MR;'       g    R# )	zMResolve a tool message's content into tool_result content (blocks or string).rf   r‘   NÚ_multimodalÚtext_summaryrÅ   Ú_anthropic_content_blocksú(no output))r!   r   r    r  rE   r6   r(   r3   r7   rP   Údumps)rh   rf   Úmultimodal_blocksÚ	convertedÚstashedÚtext_contents   &     r   Ú_tool_result_contentrO  µ  s:  € à�e‰e�I˜rÓ"€GØ8<ÐÜ�'œ4× Ò  W§[¡[°×%?Ò%?Ü>¸w¿{¹{È9Ó?U×?[Ð?[ÐY[Ó\Ðß  W§[¡[°×%@Ò%@Ü!,¬S°¸Õ1HÓ-IÓ!JÐ KÐøÜ	�GœT×	"Ò	"Ü6°wÓ?ˆ	Ü˜9 w i×0Ò0Ø )ÐØÒ Ø—%‘%Ð3Ó4ˆÜ�gœt×$Ò$¯Ü&0°¼#×&>Ò&>À7Ç=Á=Ç?Â?™7ÐX\ˆLßIU¤¨\Ó!:Ð ;¸gÖ EÔ[_Ð`gÓ[hÐßØ Ð Ü! '¬3×/Ò/‰GÏG´T·Z²ZÀÔ5HÐY[×mÐmÐ`mÐmr   c                óŽ   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        \        \        3,          RR/# )r   r`   rh   r   Nra   )r   s   "r   r   r   Ë  s<   € ÷ Bñ B¬D´´c¼3°hµÕ,@ð BÄTÌ#ÌsÈ(Å^ð BÐX\ñ Br   c           	     ó´  € RRR\        VP                  RR4      4      R\        V4      /p\        W!RR7       V '       d
   V R,          M/ pVP                  R	4      R
8X  d   VP                  R4      MRp\	        V\
        4      '       d9   V'       d1   V^ ,          P                  R4      R8X  d   VP                  V4       R# V P                  R	R
RV./4       R# )z„Append a tool_result to ``result``, merging into a trailing tool_result user message when
there is one. Mutates ``result`` in place.r   Útool_resultÚtool_use_idÚtool_call_idr‘   rf   Tr¶   rd   ÚuserNrv   )r•   r!   rO  rq   r   r(   rº   )r`   rh   rR  ÚlastÚlast_contents   &&   r   Ú_convert_tool_message_to_resultrX  Ë  sµ   € ð 	�˜}Ô.?ÀÇÁÀnÐVXÓ@YÓ.ZØÔ'¨Ó*ð€Kô ˜¨dÕ3ßˆ6�"Ž: R€DØ*.¯(©(°6Ó*:¸fÔ*D�4—8‘8˜IÔ&È$€LÜ�,¤×%Ò%¯,¸<È½?×;NÑ;NÈvÓ;VÐZgÔ;gØ×Ñ˜KÖ(à�‰�v˜v y°;°-Ð@ÖAr   c                óR   € V ^8„  d   QhR\         R\        \        \         3,          /# rù   rH   )r   s   "r   r   r   Û  s"   € ÷ 	0ñ 	0¤3ð 	0¬4´´S°­>ñ 	0r   c                óÚ   € \        V \        4      '       d   \        \        V 4      RRRRR7      p M6V '       d-   \        V \        4      '       d   V P                  4       '       g   Rp RRRV /# )z8Validate and convert a user message to Anthropic format.ú(empty message)rU  Ú_convert_user_message©Úplaceholder_textÚ	msg_indexrd   Úlocationrd   rf   rv   )r   r(   Ú_fix_blank_text_blocks_in_listrü   r6   r7   )rf   s   &r   r\  r\  Û  s[   € ä�'œ4× Ò Ü0Ü)¨'Ó2ÐEVØ˜vÐ0Gô
‰÷ œ G¬S×1Ò1¸'¿-¹-¿/º/Ø#ˆØ�F˜I wÐ/Ð/r   c                ó`   € V ^8„  d   QhR\         \        \        \        3,          ,          RR/# ©r   r`   r   Nra   )r   s   "r   r   r   ç  s+   € ÷ $bñ $b¬¬T´#´s°(­^Õ(<ð $bÀñ $br   c                óÎ  € \        V 4       EFP  w  r\        VR,          RR4      pV'       g   K$  \        4       pV^,           \        V 4      8  d_   W^,           ,          pVP	                  R4      R8X  d:   \        VP	                  R4      \        4      '       d   \        VR,          RR4      pW4,
          pV'       g   Kµ  VR,           Uu. uF-  p\        V4      R8X  d   VP	                  R4      V9   d   K+  VNK/  	  pp\        V4      \        VR,          4      8w  d#   \        VR,          \        4      '       d   RVR	&   V'       d   TM\        R
4      .VR&   EKS  	  \        4       p	\        V 4       F   w  r¢V	\        VR,          RR4      ,          p	K"  	  V  F»  pVP	                  R4      R8w  g&   \        VP	                  R4      \        4      '       g   K@  VR,           Uu. uF-  p\        V4      R8w  g   VP	                  R4      V	9   g   K+  VNK/  	  pp\        V4      \        VR,          4      8w  g   K¢  V'       d   TM\        R4      .VR&   K½  	  R# u upi u upi )u+  Strip tool_use blocks with no matching tool_result, and vice versa. Compression/truncation
can remove either side of a pair or insert messages between them. Anthropic requires the
tool_result in the IMMEDIATELY FOLLOWING user message â€” a global id match is not enough.
Mutates ``result`` in place.rf   r   rš   rd   rU  rR  rS  TÚ_thinking_signature_invalidatedz(tool call removed)z(tool result removed)N)rl   r^   r\   rŠ   r!   r   r(   r#   r3   rW   rE   )r`   rg   rh   Útool_use_ids_in_turnÚadjacent_result_idsÚnxtÚorphanedr   ry   Úsurviving_tool_use_idsr�   Únew_contents   &           r   Ú_strip_orphaned_tool_blocksrl  ç  s÷  € ô ' v×.‰ˆÜ)¨!¨I­,¸
ÀDÓIÐß#ÙÜ#&£5ÐØˆq�5”3�v“;ÔØ˜Q�•-ˆCØ�w‰w�v‹ &Ô(¬Z¸¿¹À	Ó8JÌD×-QÒ-QÜ&0°°YµÀÐP]Ó&^Ð#Ø'Õ=ˆßÙØ˜Yž<Ój™<�a´¸A³À*Ô0LÐQR×QVÑQVÐW[ÓQ\Ð`hÑQh—�™<ˆÐjô ˆt‹9œ˜A˜i�LÓ)Ô)¬o¸aÀ	½lÌO×.\Ò.\Ø37ˆAÐ/Ñ0ß#‘t¬+Ð6KÓ*LÐ)Mˆˆ)Œñ% /ô( #&£%ÐÜ& vÖ.‰ˆØ¤*¨Q¨y­\¸:ÀtÓ"LÕLÒñ /ãˆØ�5‰5�‹=˜FÔ"¬*°Q·U±U¸9Ó5EÄt×*LÒ*LÙà˜–|ó
Ù#�!¤{°1£~¸Ô'FÈ!Ï%É%ÐP]ÓJ^ÐbxÑJx�AˆA‘|ð 	ð 
ô ˆ{Óœs 1 Y¥<Ó0Ö0ß*5™;¼KÐH_Ó<`Ð;aˆAˆi‹Ló ùò kùò
s   Ã(IÃ9IÇ'(I"ÈI"c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# )r   ÚprevÚcurrr   )r   r(   )r   s   "r   r   r     s%   € ÷ -ñ -œ#ð -¤Sð -¬T´#­Yñ -r   c                ó2   € R pV! V 4      V! V4      ,           # )u—  Merge two message contents into one block list, each side's blocks kept intact (a string
becomes its own text block). Strings are never joined: the first turn's bytes must equal what a
later request replays as a standalone turn, or the prompt-cache prefix diverges at that block
(MoA appends per-turn guidance after ``user(task)`` on iteration 1 and replays ``user(task)``
alone on iteration 2 â€” #112358).c                 ó\   € \        V \        4      '       d   \        V 4      .# \        V 4      # r,   )r   r6   rE   r(   )Úcs   &r   Ú<lambda>Ú!_concat_content.<locals>.<lambda>  s#   € ¬j¸¼C×.@Ò.@œ; q›>Ð*ÐMÄdÈ1ÃgÐMr   rC   )rn  ro  Ú	as_blockss   && r   Ú_concat_contentrv    s   € ñ N€IÙ�T‹?™Y t›_Õ,Ð,r   c                ó    € V ^8„  d   QhR\         \        \        \        3,          ,          R\         \        \        \        3,          ,          /# ©r   r`   r   ra   )r   s   "r   r   r     s4   € ÷ ñ ¤T¬$¬s´C¨x­.Õ%9ð ¼dÄ4ÌÌSÈÅ>Õ>Rñ r   c                ó¦  € . pV  FÈ  pV'       d   VR,          R,          VR,          8X  g   VP                  V4       K:  VR,          R8w  dV   VP                  R4      '       d   RVR,          R&   \        VR,          \        4      '       d   \	        VR,          4      VR&   \        VR,          R,          VR,          4      VR,          R&   KÊ  	  V# )zPMerge consecutive same-role messages to enforce alternation. Returns a new list.rd   rU  re  Trf   rv   )rº   r!   r   r(   rX   rv  )r`   Úfixedrh   s   &  r   Ú_merge_consecutive_rolesr{    s¯   € à"$€EÛˆß˜% �) FÕ+¨q°­yÔ8Ø�L‰L˜ŒOÙØˆV�9˜Ôà�u‰uÐ6×7Ò7Ø?C��b•	Ð;Ñ<ô ˜!˜I�,¬×-Ò-Ü.¨q°­|Ó<��)‘Ü.¨u°R­y¸Õ/CÀQÀyÅ\ÓRˆˆb�	�)Óñ ð €Lr   c                óh   € V ^8„  d   QhR\         \        ,          R\        R\         \        ,          /# )r   rf   Úsignature_deadr   r'   )r   s   "r   r   r   +  s)   € ÷ ñ ¤$¤s¥)ð ¼Tð ÄdÌ3Åiñ r   c                óÄ  € . pV  F×  p\        V4      \        9  d   VP                  V4       K*  VP                  R4      R8H  pV'       d   VP                  R4      MVP                  R4      pV'       d   V'       g   VP                  V4       K‹  V'       g   V'       d   K�  VP                  R4      '       g   K¶  VP                  \	        VR,          4      4       KÙ  	  V# )zÍKeep valid signed Anthropic thinking, demoting readable unsigned/invalidated thinking.
Preserved-thinking models apply this to historical turns too; older models apply it only
to the latest assistant turn.r   r   rË   r  r   )r#   rW   rº   r!   rE   )rf   r}  rk  r   Úis_redactedÚsigneds   &&    r   Ú_keep_valid_thinkingr�  +  s¤   € ð €KÛˆÜ�q‹>¤Ô0Ø×Ñ˜qÔ!ÙØ—e‘e˜F“mÐ':Ñ:ˆß"-�—‘�v”°1·5±5¸Ó3EˆßŸ.Ø×Ñ˜qÖ!ß§K¡K°Q·U±U¸:×5FÔ5FØ×Ñœ{¨1¨Z­=Ó9Ö:ñ ð Ðr   c                óh   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        /# rx  )r(   r    r6   r   rt   )r   s   "r   r   r   =  s'   € ÷ ñ ¤T¬$¬s´C¨x­.Õ%9ð ¼cñ r   c                óf  € \        \        V 4      ^,
          RR4       F�  pW,          pVP                  R4      R8w  d   K#  VP                  R4      p\        V\        4      '       d=   \
        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   K†  V^,           u # 	  ^ # )zêIndex after the last user message carrying no tool result: every assistant turn from there on belongs
to the in-flight tool loop, whose thinking Anthropic requires back. A steer merged into a tool_result
turn still continues the loop.rd   rU  rf   c              3   ó>   "  € T F  p\        V4      R 8H  x € K  	  R# 5i)rR  Nr-   )r.   r   s   & r   r0   Ú+_current_tool_loop_start.<locals>.<genexpr>F  s   é € Ð1cÑ[bÐVW´+¸a³.ÀMÖ2QÓ[bùs   ‚TFrv   )ÚrangerŠ   r!   r   r(   r2   )r`   rg   rh   rf   s   &   r   Ú_current_tool_loop_startr‡  =  s„   € ô ”3�v“; •? B¨Ö+ˆØ�IˆØ�5‰5�‹=˜FÔ"ÙØ—%‘%˜	Ó"ˆÜ˜7¤D×)Ò)¯c«cÑ1cÑ[bÓ1c¯c¯cªcÑ1cÑ[bÓ1c×.cÔ.cØ�q•5ŠLñ ,ñ r   c                ó”   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        R,          R\        R,          RR/# )r   r`   Úbase_urlNr}   r   ra   )r   s   "r   r   r   K  sA   € ÷ #7ñ #7¬¬T´#´s°(­^Õ(<ð #7ÌÈdÍ
ð #7Ô[^ÐaeÕ[eð #7Ðjnñ #7r   c                ó®  a € \        W4      p\        \        S 4      \        V 3R l\	        \        S 4      ^,
          RR4       4       \        S 4      4      4      p\        W24      p\        S 4       EF[  w  rgVR8X  d   EMVR8X  dy   VR,           Uu. uFK  p\        V4      \        9  g3   VP                  R4      '       d   K0  VP                  R4      '       d   KI  VNKM  	  p	pT	;'       g    \        R4      .VR&   MƒVR8X  g   Wd8  d3   V'       g+   \        VR,          4      ;'       g    \        R	4      .VR&   MD\        VR,          \        VP                  R
4      4      4      p	T	;'       g    \        R4      .VR&   VR,           F+  p\        V4      \        9   g   K  VP                  RR4       K-  	  VP                  R
R4       EK^  	  R# u upi )aÐ  Strip or preserve thinking blocks per endpoint. Mutates ``result`` in place.

Anthropic signs thinking blocks against the full turn; any upstream mutation invalidates them
(400 "Invalid signature in thinking block"). Signed routes (Anthropic, Nous Portal, Bedrock,
Vertex, Foundry; MiniMax for its own blocks) keep valid signed blocks on every assistant turn
when the model keeps prior thinking, else on every turn of the in-flight tool loop (the API
requires those back and strips older turns itself; cutting at the latest assistant message
broke the loop's earlier steps). Unknown relays cannot verify signatures and strip all; Kimi
replays as-is; DeepSeek needs unsigned blocks round-tripped but rejects signed ones.
c              3   óf   <"  € T F&  pSV,          P                  R 4      R8X  g   K"  Vx € K(  	  R# 5i)rd   re   Nr  )r.   rg   r`   s   & €r   r0   Ú._manage_thinking_signatures.<locals>.<genexpr>Y  s+   øé € ÐmÑ&D ÈÈqÍ	ÏÉÐV\ÓH]ÐalÑHlŸ1š1Ó&Dùs   ƒ1§
1ÚkimiÚdeepseekrf   r  rË   r   Úthird_partyz(thinking elided)re  r=   Nrv   )r	   Úminr‡  r,  r†  rŠ   r
   rl   r#   rW   r!   rE   rX   r�  r)   Úpop)
r`   r‰  r}   ÚrouteÚ
loop_startÚpreserve_priorÚidxrh   r   rk  s
   f&&       r   Ú_manage_thinking_signaturesr–  K  sŽ  ø€ ô % XÓ5€EäÔ-¨fÓ5ÜÔm¤e¬C°«K¸!­O¸RÀÔ&DÓmÔorÐsyÓozÓ{ó}€Jä1°%Ó?€NÜ(¨×0‰ˆØ�FŒ?ÙØ�jÔ ð ˜Yž<óÙ'�aÜ˜q“>¬Ô8ÀÇÁÀ{×ASô ØWX×W\ÑW\Ð]c×Wd÷ �™<ð ð ð '×BÐB¬;°yÓ+AÐ*BˆAˆiŠLØ�mÔ#¨Ô(8ÇÜ*¨1¨Y­<Ó8×^Ð^¼[ÐI\Ó=]Ð<^ˆAˆiŠLä.¨q°­|¼TÀ!Ç%Á%ÐHiÓBjÓ=kÓlˆKØ&×BÐB¬;°yÓ+AÐ*BˆAˆi‰Là�9—�ˆAÜ˜1‹~¤Ö0Ø—‘�o tÖ,ñ ð 	
�‰Ð/°×6ó' 1ùò
s   Â-GÃGÃGc                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   rK   r   )r   r   r6   )r   s   "r   r   r   q  s   € ÷ 3ñ 3œcð 3¤h¬s¥mñ 3r   c                óÚ   € \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d   V# R# )zYBase64 payload of a wire ``image`` block, or None for a URL/native source (unmeasurable).rÆ   NrË   )r   r    r!   r6   )rK   rÆ   rË   s   &  r   Ú_image_source_datar™  q  sQ   € ä$.¨u´d×$;Ò$;ˆU�Y‰Y�xÔ À€FÜ!+¨F´D×!9Ò!9ˆ6�:‰:�fÔ¸t€DÜ˜d¤C×(Ò(ˆ4Ð2¨dÐ2r   c                ó`   € V ^8„  d   QhR\         \        \        \        3,          ,          RR/# rc  ra   )r   s   "r   r   r   x  s'   € ÷ 0
ñ 0
¤4¬¬S´#¨X­Õ#7ð 0
¸Dñ 0
r   c                óÆ  € V  UUu. uFa  p\        VP                  R4      \        4      '       d   VP                  R4      M.  F"  p\        V4      R8X  g   K  V\	        V4      3NK$  	  Kc  	  ppp\        V 4       UUUu. uF×  p\        \        VP                  R4      \        4      '       d   VP                  R4      M. 4       F�  p\        V4      R8X  g   K  \        VP                  R4      \        4      '       g   K<  \        VR,          R04      '       g   KX  Y"R,           Uu. uF"  p\        V4      R8X  g   K  V\	        V4      3NK$  	  up3NK‘  	  KÙ  	  pppp\        . R V 4       OR V 4       O4      p\        V UUu. uF  w  rx\        V4      NK  	  upp\        V4      V UUu. uF  w  rx\        R V 4       4      NK  	  upp\        R V 4       4      VR7      p	V\        V4      V	,
          R	  F>  w  r'\        R
4      p
VR,           Uu. uF  p\        V4      R8X  d   T
MTNK  	  upVR&   K@  	  R	# u uppi u upi u upppi u uppi u uppi u upi )aí  Retire screenshot payloads once the request would cross the API's per-request image limit.

Mutates ``result`` in place. The block ceiling is conditional on the request's actual image
dimensions (the strict 20 only when some image exceeds the many-image per-side cap), so this
pass reads the headers of the ``source.data`` payloads it already holds. It sizes the block
budget AND the byte budget, the latter because the auxiliary Anthropic client
(``agent.auxiliary_client`` via ``anthropic_adapter.build_anthropic_kwargs``) reaches this pass
without the compressor's send-path pass, so it must hold the invariant alone -- previously with
no request-size guard at all (post-#113953 review). Policy and rationale:
:mod:`agent.image_eviction_policy`.
rf   rÅ   rR  c              3   ó*   "  € T F	  w  rVx € K  	  R # 5ir,   rC   ©r.   r�   rË   s   &  r   r0   Ú)_evict_old_screenshots.<locals>.<genexpr>—  s   é € Ð+¡(‘w�q�d£(ùs   ‚c              3   ó@   "  € T F  w  rV F	  w  rVx € K  	  K  	  R # 5ir,   rC   )r.   r�   ÚimagesrË   s   &   r   r0   rž  ˜  s   é € ÐC¡H‘y�q»F±°�d¹F‰d£Hùs   ‚c              3   óP   "  € T F  w  rV'       g   K  \        V4      x € K  	  R # 5ir,   ©rŠ   r�  s   &  r   r0   rž  Ÿ  s   é € Ð8©™g˜a´4”	”�D—	�	«ùó   ‚&“&c              3   óP   "  € T F  w  rV'       g   K  \        V4      x € K  	  R # 5ir,   r¢  r�  s   &  r   r0   rž  ¡  s   é € ÐE±H©¨Äœ9œ3˜tŸ9˜9³Hùr£  )Úcarrier_bytes_newest_firstÚreserved_bytesÚmany_image_safeNz$[screenshot removed to save context])r   r!   r(   r#   r™  r!  r3   r   r   rŠ   ÚsumrE   )r`   ÚmsgrK   Úreservedr   Úcarriersr§  r�   r   ÚretireÚplaceholders   &          r   Ú_evict_old_screenshotsr®  x  sN  € ñ ôáˆCÜ,6°s·w±w¸yÓ7IÌ4×,PÒ,P�c—g‘g˜iÔ(ÐVXÒXˆEÜ�uÓ Ñ(ô 	+ˆÔ" 5Ó)Ó*áXñ 	+Ùð ñ ô ˜FÔ#õá#ˆCÜ´J¸s¿w¹wÀyÓ?QÔSW×4XÒ4X˜cŸg™g iÔ0Ð^`ÖaˆEÜ�uÓ Ñ.ô 	eô �u—y‘y Ó+¬T×2ô	 	eô
 ˜E )Õ,¨w¨i×8ô 	eˆ¸9Ö5EÓcÑ5E°ÌÐUVËÐ[bÑIbÔ+�!Ô'¨Ó*Ó+Ñ5EÑcÓdáañ 	eÙ#ð ò ô 9ð	
Ù+¡(Ó+ð	
áC¡HÓCð	
ó€Oô )Ù&.Ô/¡h™˜ŒˆVŽ¡hÒ/ÜˆH‹áJRô$
ÙJR¹Y¸QŒCÑ8©Ó8Ö8É(ò$
ô ÑE±HÓEÓEØ'ô€Fð œS ›]¨VÕ3Ð4Ó5‰ˆÜ!Ð"HÓIˆàEJÈ9ÖEUó
ÙEUÀœ; q›>¨WÔ4‰K¸!Ò;ÑEUñ
ˆˆiÓó 6ùóAùò dùôùó 	0ùó$
ùò
sO   †AI ÁI Á?AIÃ"IÄIÄIÄ(IÄ?IÅIÆI
Æ/IÈIÉIc                ó`   € V ^8„  d   QhR\         \        \        \        3,          ,          RR/# rc  ra   )r   s   "r   r   r   «  s+   € ÷ ^ñ ^¤d¬4´´S°­>Õ&:ð ^¸tñ ^r   c           	     ó    € V '       dF   V ^ ,          P                  R4      R8w  d'   V P                  ^ RRR\        \        4      ./4       R# R# R# )a¿  Anthropic requires messages[0].role == user; prepend a placeholder turn otherwise. A second
auto-compaction can leave a role=assistant summary first, which the API rejects (often masked
as a misleading tool_use/tool_result 400). The filler must be non-whitespace text or it trades
that 400 for the blank-block one.

The inserted text block must be non-whitespace: Anthropic separately rejects any text content block
whose text is empty or whitespace-only ("text content blocks must contain non-whitespace text"), so a
single space here traded the "leading assistant turn" 400 for that one (#69512 class). Uses the same
placeholder as every other synthesized filler block in this module for consistency.
rd   rU  rf   N)r!   r@  rE   r  rk   s   &r   Ú_ensure_leading_user_turnr±  «  sB   € ÷ �&˜•)—-‘- Ó'¨6Ô1Ø�‰�a˜& &¨)´kÔBYÓ6ZÐ5[Ð\Ö]ñ 2�vr   c                óŒ   € V ^8„  d   QhR\         \        ,          R\        R\        R\        R\        R\         \        ,          /# )r   r&   r^  r_  rd   r`  r   )r(   r   r6   rt   )r   s   "r   r   r   º  sD   € ÷ ñ Ü”�IðÜ,/ðÜ<?ðÜGJðÜVYðä	Œ#…Yñr   c               ó¤   € \        V 4      w  rVpV F  p\        P                  RW#WH4       K  	  T;'       g    \        V4      .p\	        WV4       V# )a  Drop blank text blocks; relocate any cache_control they carried onto the last surviving
cacheable block; if nothing survives, substitute one placeholder block (carrying the relocated
marker). Non-text blocks and order are untouched. Returns a new list; logs structure only.zzPre-call sanitizer: dropped blank text content block (message_index=%d role=%s location=%s block_index=%d block_type=text))r{   r·   r¸   rE   r#  )	r&   r^  r_  rd   r`  ry   Úrelocated_cache_controlrx   Úblock_indexs	   &$$$$    r   ra  ra  º  sZ   € ô .FÀfÓ-MÑ*€D 7ÛˆÜ�‰ðTà˜Xö	
ñ ð ×2Ð2”KÐ 0Ó1Ð2€DÜ:¸4ÔYØ€Kr   c                ó`   € V ^8„  d   QhR\         \        \        \        3,          ,          RR/# rc  ra   )r   s   "r   r   r   Ì  s'   € ÷ ñ ¤T¬$¬s´C¨x­.Õ%9ð ¸dñ r   c           
     óì  € \        V 4       Fä  w  r\        V\        4      '       g   K  VP                  R4      pVP                  R4      p\        V\        4      '       d	   V'       g   K_  \        YCR8X  d   \        MRWRR7      VR&   VR,           FZ  p\        V4      R8X  d   VP                  R4      MRp\        V\        4      '       g   K>  V'       g   KH  \        VRWRR7      VR&   K\  	  Kæ  	  R# )	a  Final boundary guard against blank text blocks (HTTP 400 "text content blocks must contain
non-whitespace text"), including inside tool_result content. Runs LAST so a blank block from
any current or future producer never reaches the wire. Mutates ``result`` in place.rd   rf   re   r[  r]  rR  NrI  )rj   r   r    r!   r(   ra  r  r#   )r`   r_  r©  rd   rf   rw   Úinners   &      r   Ú_scrub_blank_text_blocksr¹  Ì  sË   € ô $ FÖ+‰ˆ	Ü˜#œt×$Ò$ÙØ�w‰w�v‹ˆØ—'‘'˜)Ó$ˆÜ˜'¤4×(Ò(·ÙÜ7ØÈÔATÕ&=ÐZkØ°Yô
ˆˆI‰ð �y—>�>ˆCÜ*5°cÓ*:¸mÔ*K�C—G‘G˜IÔ&ÐQUˆEÜ˜%¤×&Ô&¯5©5Ü!?Ø¨MÀYÐdqô"��I“ó "ó ,r   c                ó0   € V ^8„  d   QhR\         R\         /# rù   r   )r   s   "r   r   r   ã  s   € ÷ ñ ¤Sð ¬Sñ r   c                ó¸  € \        V \        4      '       g   V # \        ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      '       g   RP                  R V  4       4      # V  Uu. uF_  p\        V\        4      '       g   K  \        V4      '       d2   \        VP                  R4      \        4      '       d   / VCR\        /CMTNKa  	  up# u upi )aP  System message content -> Anthropic ``system`` param (str, or block list when cache_control
is present). With cache markers the blocks are copied (never mutating the caller's dicts) and
blank text is replaced by the placeholder: Anthropic rejects blank system blocks too, and a
blank block carrying a breakpoint can't simply be dropped.c              3   ót   "  € T F.  p\        V\        4      '       g   K  VP                  R 4      x € K0  	  R# 5ir<   r   ©r.   Úps   & r   r0   Ú*_convert_system_content.<locals>.<genexpr>ê  s(   é € ÐN©w¨!¼*ÀQÌ×:MÔ%ˆq�u‰u�_×%Ð%«wùs   ‚8Ÿ8TFÚ
c              3   ób   "  € T F%  qP                  R 4      R8X  g   K  VR,          x € K'  	  R# 5i)r   r   Nr  r½  s   & r   r0   r¿  ë  s%   é € ÐO©G q·u±u¸V³}ÈÑ7Nœ˜˜6Ÿš«Gùs   ‚/ž/r   )	r   r(   r2   Újoinr    r8   r!   r6   r  )rf   r¾  s   & r   Ú_convert_system_contentrÃ  ã  s¹   € ô
 �gœt×$Ò$Øˆß‹3ÑN©wÓN�3�3Š3ÑN©wÓN×NÒNØ�y‰yÑO©GÓOÓOÐOñ óáˆAÜ�aœ×ô 	tÔ2FÀq×2IÒ2IÌjÐYZ×Y^ÑY^Ð_eÓYfÔhk×NlÒNlÐ.ˆ1Ð.ˆfÔ-Ò.ÐrsÒsÙñð ùò s   Á/CÂACc                óÈ   € V ^8„  d   QhR\         \        ,          R\        R,          R\        R,          R\        \        \
        ,          \         \        ,          3,          /# )r   Úmessagesr‰  Nr}   r   )r(   r    r6   rs   r   r   )r   s   "r   r   r   ó  sJ   € ÷ ñ Ü”4�jðÜ$'¨$¥JðÜ>AÀD½jðä
Œ8”C�=œ$œt�*Ð$Õ%ñr   c           	     óÖ  € Rp. pV  Fš  pVP                  RR4      pVR8X  d   \        VP                  RR4      4      pK9  VR8X  d   VP                  \        V4      4       K\  VR8X  d   \	        WE4       Kp  VP                  \        VP                  RR4      4      4       Kœ  	  \        V4       \        V4      p\        V4       \        WAV4       \        V4       \        V4       W43# )	u£  Convert OpenAI-format messages to Anthropic format -> ``(system, messages)``. System is
extracted into its own param (a string, or a block list when cache_control is present).
``base_url``/``model`` drive thinking-signature policy â€” unknown third-party relays strip
signatures (they cannot verify them); Kimi-family endpoints/models keep unsigned
reasoning_content-derived blocks, which Kimi requires even when empty.Nrd   rU  Úsystemrf   r‘   re   Útool)r!   rÃ  rº   rC  rX  r\  rl  r{  r±  r–  r®  r¹  )rÅ  r‰  r}   rÇ  r`   rh   rd   s   &&&    r   Úconvert_messages_to_anthropicrÉ  ó  sÉ   € ð €FØ#%€FÛˆØ�u‰u�V˜VÓ$ˆØ�8ÔÜ,¨Q¯U©U°9¸bÓ-AÓBŠFØ�[Ô Ø�M‰MÔ4°QÓ7Ö8Ø�VŒ^Ü+¨FÖ6à�M‰MÔ/°·±°iÀÓ0DÓEÖFñ ô   Ô'Ü% fÓ-€FÜ˜fÔ%Ü °%Ô8Ü˜6Ô"Ü˜VÔ$Øˆ>Ðr   )r   r   )r   r   )zglobal.zus.zeu.zapac.zap.zau.zjp.zca.zsa.zme.zaf.)F)NN)NÚ__doc__rm   rP   Úloggingr“   Útypingr   r   r   r   r   Úagent.image_eviction_policyr   r   Úagent.anthropic_thinking_policyr	   r
   Ú	getLoggerÚ__name__r·   Ú	frozensetrW   r"  r  r¦   r‚   r#   r3   r8   r?   rE   rL   rT   rX   r^   rl   rq   r{   rƒ   rŒ   r•   rœ   r®   r¿   rÓ   rÜ   rä   r÷   rü   r  r  r
  r  r  r  r  r  r  r#  r6  r;  rC  rO  rX  r\  rl  rv  r{  r�  r‡  r–  r™  r®  r±  ra  r¹  rÃ  rÉ  rC   r   r   Ú<module>rÒ     sº  ðñ#ó Û Û Û 	ß 3Õ 3ç gß bà	×	Ò	˜8Ó	$€áÐ=Ó>€ÙÐ1Ó2Ð Ø#Ð Ø˜ <°Ð4€ØnÐ õ:õ
8õcõ0õ
*õõõHõCõyð
Àe÷ õ?õP÷
õTõ
eõõ(õ.cõ(ð,°ð È$÷ õB	õZõõ=õ^õOõ
WõlõOð ˆL˜*Ð&6Ð8KÐMfØÐ  '¨=ðÐ õ	/õõ'õT	8õ*7õZnõ,Bõ 	0õ$bõN-õõ&õ$õ#7õL3õ0
õf^õõ$õ.÷ ñ r   