+
    iHàjîC ã                   ó¼	  a € Rí tª0 t R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ RIt^ RIHt ]P6                  ! ]4      t/ t] ^ k / t] ^k / t ] ^k Rît!] ^k R R	 lt"Rït#] ^k ]#Rð,           t$] ^k Rñt%] ^k ]&! R ]% 4       4      t']	PP                  ! R]	PR                  4      t*]	PP                  ! R]	PR                  4      t+Ròt,R t-R R lt.R R lt/R R lt0R t1R R lt2R R lt3R R lt4R R lt5R R lt6R  R! lt7R" R# lt8R$ R% lt9R& R' lt:RóR( R) llt; ! R* R+]Px                  4      t=R,R/R- R. llt>R,R/R/ R0 llt?Rôt@R1 R2 ltAR3 R4 ltBR5 R6 ltCRõtD] ^k R7R8/R9 R: lltERóR7R8/R; R< llltFRóR7R8/R= R> llltGRóR? R@ lltHRóRA RB lltIRC RD ltJRóRE RF lltKRóRG RH lltLRItMRJ RK ltNRL RM ltORN RO ltP. RöOtQRPRQ.tRRR RS ltSRT RU ltTR÷tU/ tV] ^k ]	PP                  ! RV]	PR                  4      tWRWRXRY//tXRZ R[ ltYR\ R] ltZR^ R_ lt[R` Ra lt\Rb Rc lt]Rd Re lt^Rf Rg lt_]	PP                  ! Rh]	PR                  ]	PÀ                  ,          4      taRi tbRj tcRk td]	PP                  ! RlRmPË                  ]#4       Rn2]	PR                  4      tfRo Rp ltgRq Rr lthRstiRt]i/tjRu Rv ltkRw Rx ltlRy Rz ltmR{ R| ltnR} R~ ltoR R€ ltpR� R‚ ltqRƒ R„ ltrR… R† ltsR‡ Rˆ lttR‰RŠ R‹RŒ RtR� RŽR� /tuR� R‘ ltvRøR’ R“ lltwRùR” R• lltxRútyRûtzR–t{R— R˜ lt|R™ Rš lt}R› Rœ lt~R� Rž ltRŸ R  lt€R¡]]3R¢]€]3R£]~]3R¤]€]€3/t�R¥ R¦ lt‚R§ R¨ ltƒRóR© Rª llt„R«R¬R­R¬RŽR®R¯R°R±R²R³R²/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À RÁ lltŒRÂ RÃ lt�RÄRÅRÅRÅRÆRÆ/tŽRÇ RÈ lt�]g]�3RÉ ]�33t�RÊ RË lt‘RýRÌ RÍ llt’RþRÎ RÏ llt“/ t”] ^	k RÐt•RÑ t–RÒ RÓ lt—RÔ RÕ lt˜RÖ R× lt™RóRØ RÙ lltšRÚ RÛ lt›RÜRÝ/]œEP;                  RÿRÞ4      C]œEP;                  ER Rß4      C]œEP;                  ERRà4      CRáRâ/C]œEP;                  ERRâ4      CR
RÞ/C]œEP;                  ERRã4      Ctž] ^
k RâtŸ] ! 4       t¡] ^k ERt¢Rät£Rå Ræ lt¤ERRç Rè llt¥]	PP                  ! Ré4      t¦]	PP                  ! Rê]	PR                  4      t§/ t¨] ^k ERRë Rì llt©R# (  aA  AWS Bedrock Converse API adapter (boto3, optional dependency).

Works without API keys via the AWS credential chain, cross-region inference profiles, guardrails and
control-plane model discovery. OpenAI-format messages/tools are converted to Converse on the way in
and responses normalized back to OpenAI-shaped objects.
)Úinstall_hintN)Úsuppress©ÚSimpleNamespace)ÚAnyÚDictÚListÚOptionalÚTuple)Úurlparse)ÚEmptyStreamErrorc                óF   € V ^8„  d   QhR\         \        \        3,          /# ©é   Úreturn©ÚdictÚstr)Úformats   "Ú:/home/ubuntu/.hermes/hermes-agent/agent/bedrock_adapter.pyÚ__annotate__r   )   s   € ÷  ñ  ¤4¬¬S¨¥>ñ  ó    c                 ó¢  € ^ RI Hp  V ! 4       f   / # ^ RIHpHp V! 4       ;'       g    / p\
         UUu/ uFM  w  rEVP                  V4      ;'       g    RP                  4       '       g   K6  WCV,          P                  4       bKO  	  pppRV9   ;'       d    RV9   ;'       g    RV9   pV'       g   V! 4       '       d   \        R4      hV# u uppi )u×  ``boto3.session.Session`` kwargs from the routed profile's secret scope, ``{}`` when unscoped.

Under a HERMES_HOME override the process env holds the LAUNCH profile's ``AWS_*`` (or nothing), so
every Bedrock client for a served profile must be built from that profile's own ``.env`` values.
Under multiplexing a profile that sets none of its own must NOT get ``{}`` â€” ``boto3.Session()``
would then resolve the ambient default chain (process env, ~/.aws, instance metadata), i.e. the
launch context's identity, exactly the borrow the Entra adapter refuses. ``AWS_PROFILE`` counts as
an explicit per-profile choice (it names an entry in the shared AWS config, like the Entra
``AZURE_CLIENT_ID``-only managed-identity opt-in).©Úget_hermes_home_override)Úcurrent_secret_scopeÚis_multiplex_activeÚ Úaws_access_key_idÚaws_secret_access_keyÚprofile_namea~  Bedrock auth is refused for this profile: it sets no complete AWS credential of its own, and under multiplexed profiles the ambient default chain (process env, ~/.aws, instance metadata) would sign this profile's calls with the LAUNCH context's identity. Set AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY in this profile's own config, or AWS_PROFILE to name a shared AWS config profile.)	Úhermes_constantsr   Úagent.secret_scoper   r   Ú_AWS_SCOPED_CREDENTIAL_VARSÚgetÚstripÚRuntimeError)r   r   r   ÚscopeÚkwÚvarÚkwargsÚcompletes           r   Úscoped_aws_session_kwargsr,   )   sÎ   € õ :ÙÓ!Ò)Øˆ	ßLÙ Ó"×(Ð( b€EÝ4Oô 1Ñ4O©¨Ø—)‘)˜C“.×&Ð& B×-Ñ-×/ô %ˆb˜•*×"Ñ"Ó$Ò$Ñ4O€Fñ 1ð $ vÑ-×SÐSÐ2IÈVÑ2S÷ $ð $Ø˜VÑ#ð çÑ+×-Ò-Üð?ó
ð 	
ð €Mùó#1s   ´CÁCÁ,Cúopenai.gpt-6.1-solc              #   ó@   "  € T F  qP                  4       x € K  	  R # 5i©N©Úlower©Ú.0Úms   & r   Ú	<genexpr>r5   W   s   é € Ð+bÑ?a¸!¯G©G¯I¨IÓ?aùs   ‚z(^bedrock-mantle\.([a-z0-9-]+)\.api\.aws$z^(?:[a-z]+\.)?xai\.grokc                 óX  € Rp   ^ RI Hp V! R4       ^ RIp \        ;QJ d4    . R TP                  P                  R	4      R
,           4       F  NK  	  5M-! R TP                  P                  R	4      R
,           4       4      pT\        8  d   \        RTP                   R24      hT#   \         d#   p\        P	                  RT4       Tp  Rp?L¿Rp?ii ; i  \         d,    T '       d   RT  2MR\        R4       2p\        RT 24      T hi ; i  \        \        3 d    Tu # i ; i)zZImport boto3; converse_stream() needs >= 1.34.59 (a system boto3 can shadow the venv pin).N)Úensure_importÚbedrockz'boto3 lazy install did not complete: %sz: z. Run: z<The 'boto3' package is required for the AWS Bedrock providerc              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir/   )Úint)r3   Úxs   & r   r5   Ú!_require_boto3.<locals>.<genexpr>s   s   é € ÐIÑ(H 1œ˜AŸ˜Ó(Hùs   ‚Ú.:Né   Nzboto3 zS does not support converse_stream (minimum 1.34.59 required). Run: hermes pm repair)Úpmr7   Ú	ExceptionÚloggerÚwarningÚboto3ÚImportErrorr   ÚtupleÚ__version__ÚsplitÚAttributeErrorÚ
ValueErrorÚ_MIN_BOTO3_VERSIONr&   )Úinstall_errorr7   ÚexcrC   ÚreasonÚversions         r   Ú_require_boto3rO   `   s2  € à€Mðvð	 Ý(Ù˜)Ô$ó 	ð
ß”%ÑI¨×(9Ñ(9×(?Ñ(?ÀÓ(DÀRÖ(HÓI—%‘%ÑI¨×(9Ñ(9×(?Ñ(?ÀÓ(DÀRÖ(HÓIÓIˆð Ô#Ô#ÜØ�U×&Ñ&Ð'ð (@ð Aó
ð 	
ð €Løô# ô 	 Ü�N‰NÐDÀcÔJØ�Mûð	 ûô ô vç)6�2�m�_Ñ%¸gÄlÐS\ÓF]ÐE^Ð<_ˆÜÐXÐY_ÐX`ÐaÓbÐhuÐuðvûô œJÐ'ô ØŠðúsK   …B* “C ˜
D £A!D Â*CÂ5CÃC ÃCÃC ÃDÃ-#DÄD)Ä(D)c                ó^   € V ^8„  d   QhR\         \        \        3,          R\        R\        /# )r   ÚcacheÚserviceÚregion©r   r   r   )r   s   "r   r   r   ~   s)   € ÷ ñ œ$œs¤C˜x�.ð ´3ð Äñ r   c                ó:  € ^ RI HpHp V! 4       f+   W 9  d   \        4       P	                  WR7      W&   W,          # V! 4       W3p\
        P                  V4      pVf>   \        4       p\        4       P                  ! R/ VB P	                  WR7      pV\
        V&   V# )a  Get or create a per-region boto3 client. Unscoped: the default credential chain, one client per
region. Routed profile: one client per (home, service, region), built from that profile's scoped
``AWS_*`` (falling back to the default chain only for what the profile does not set).©r   Úhermes_home_key)Úregion_name© )	r!   r   rW   rO   ÚclientÚ_bedrock_clients_by_homer$   r,   ÚSession)rQ   rR   rS   r   rW   ÚkeyrZ   r*   s   &&&     r   Ú_cached_clientr^   ~   s—   € ÷ KÙÓ!Ò)ØÔÜ*Ó,×3Ñ3°GÐ3ÓPˆE‰MØ�}ÐÙÓ˜gÐ
.€CÜ%×)Ñ)¨#Ó.€FØ‚~ô +Ó,ˆÜÓ!×)Ò)Ñ3¨FÑ3×:Ñ:¸7Ð:ÓWˆØ(.Ô  Ñ%Ø€Mr   c                ó$   € V ^8„  d   QhR\         /# ©r   rS   ©r   )r   s   "r   r   r   ’   s   € ÷ Tñ T¬ñ Tr   c                 ó$   € \        \        R V 4      # )úbedrock-runtime)r^   Ú_bedrock_runtime_client_cache©rS   s   &r   Ú_get_bedrock_runtime_clientrf   ’   s   € ÜÔ7Ð9JÈFÓSÐSr   c                ó$   € V ^8„  d   QhR\         /# r`   ra   )r   s   "r   r   r   –   s   € ÷ Lñ L¬ñ Lr   c                 ó$   € \        \        R V 4      # ©r8   )r^   Ú_bedrock_control_client_cachere   s   &r   Ú_get_bedrock_control_clientrk   –   s   € ÜÔ7¸ÀFÓKÐKr   c                 óÎ   € \         P                  4        \        P                  4        \        P                  4        \        P                  4        \
        P                  4        R# )z?Clear cached boto3 clients. Used in tests and profile switches.N)rd   Úclearrj   r[   Ú_inference_profile_model_cacheÚ_DEFAULT_WINDOW_WARNEDrY   r   r   Úreset_client_cacherp   š   s>   € ä!×'Ñ'Ô)Ü!×'Ñ'Ô)Ü×"Ñ"Ô$Ü"×(Ñ(Ô*Ü× Ñ Ö"r   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   rS   r   ©r   Úbool)r   s   "r   r   r   £   s   € ÷ Gñ G¤cð G¬dñ Gr   c                ó”   € ^ RI HpHp V! 4       e!   \        P	                  V! 4       RV 3R4      RJ# \
        P	                  V R4      RJ# )zXEvict one region's cached ``bedrock-runtime`` client (stale HTTP pool); True if evicted.rV   Nrc   )r!   r   rW   r[   Úpoprd   )rS   r   rW   s   &  r   Úinvalidate_runtime_clientrw   £   sL   € çJÙÓ!Ò-Ü'×+Ñ+©_Ó->Ð@QÐSYÐ,ZÐ\`ÓaÐimÐmÐmÜ(×,Ñ,¨V°TÓ:À$ÐFÐFr   c                óh   € V ^8„  d   QhR\         R\        \        \         \         3,          ,          /# ©r   Úmodel_idr   )r   r	   rE   )r   s   "r   r   r   ®   s+   € ÷ 	[ñ 	[¬Cð 	[´H¼UÄ3ÌÀ8½_Õ4Mñ 	[r   c                ó
  € \        T ;'       g    R4      P                  4       P                  4       pVP                  R4      w  r#pV'       d&   V\        9   d   VP                  R4      '       d   TpMRpV\        9   d   W3# R# )z¿``(bare_id, profile_prefix)`` for a Bedrock-hosted OpenAI model, else None. ``profile_prefix``
is ``""`` for the bare in-Region ID and e.g. ``"us"`` / ``"global"`` for a cross-Region profile.r   r=   zopenai.N)r   r%   r1   Ú	partitionÚ _BEDROCK_OPENAI_PROFILE_PREFIXESÚ
startswithÚ_BEDROCK_OPENAI_MODEL_IDS_LOWER)rz   Ú
normalizedÚprefixÚsepÚrests   &    r   Úparse_bedrock_openai_model_idr„   ®   su   € ô �X—^�^ Ó$×*Ñ*Ó,×2Ñ2Ó4€JØ"×,Ñ,¨SÓ1Ñ€F�ß
ˆvÔ9Ô9¸d¿o¹oÈi×>XÒ>XØ‰
àˆØ#-Ô1PÔ#PˆJÐÐZÐVZÐZr   c                ó0   € V ^8„  d   QhR\         R\        /# ry   rs   )r   s   "r   r   r   º   s   € ÷ ?ñ ?¤cð ?¬dñ ?r   c                ó   € \        V 4      RJ# )zRTrue for Bedrock-hosted OpenAI GPT models in any endpoint form (GPT-OSS excluded).N©r„   ©rz   s   &r   Úis_openai_bedrock_modelr‰   º   s   € ä(¨Ó2¸$Ð>Ð>r   c                ó0   € V ^8„  d   QhR\         R\        /# ry   rs   )r   s   "r   r   r   ¿   s   € ÷ 0ñ 0¬ð 0´ñ 0r   c                óL   € \        V 4      pVRJ;'       d    V^,          '       * # )z³True when the model is served by Mantle's OpenAI Responses endpoint: the bare in-Region ID.
A geo/global profile ID is a bedrock-runtime ID (Mantle rejects it) and rides Converse.Nr‡   )rz   Úparseds   & r   Úbedrock_openai_uses_mantler�   ¿   s'   € ô +¨8Ó4€FØ˜Ð×/Ð/ f¨Q¥i¤-Ð/r   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r   Ú	model_idsr   )Úlistr   )r   s   "r   r   r   Æ   s&   € ÷ ]ñ ]¬d´3­ið ]¼DÄ½Iñ ]r   c                óö   € \        T ;'       g    . 4      pV Uu0 uF  p\        V4      P                  4       kK  	  ppT\         Uu. uF  q"P                  4       V9  g   K  VNK  	  up,           # u upi u upi )zLAppend Mantle-only OpenAI models, which control-plane discovery never lists.)r�   r   r1   Ú"BEDROCK_OPENAI_RESPONSES_MODEL_IDS)r�   Úmergedr4   Úseens   &   r   Úmerge_bedrock_openai_model_idsr•   Æ   sc   € ä�)—/�/˜rÓ"€FÙ$*Ó+¡F˜qŒC�‹F�L‰LŽN¡F€DÐ+ØÕ BÓ\Ñ B˜1ÇgÁgÃiÐW[ÑF[—Q�QÑ BÑ\Õ\Ð\ùò ,ùÚ\s   š"A1ÁA6Á"A6c                ó0   € V ^8„  d   QhR\         R\         /# rr   ra   )r   s   "r   r   r   Í   s   € ÷ Bñ B¤Cð B¬Cñ Br   c                óf   € T ;'       g    RP                  4       ;'       g    \        4       pRV R2# )z@Return Bedrock Mantle's OpenAI-compatible base URL for *region*.r   zhttps://bedrock-mantle.z.api.aws/openai/v1)r%   Úresolve_bedrock_runtime_region)rS   Úresolveds   & r   Úbedrock_openai_base_urlrš   Í   s2   € à—�˜"×#Ñ#Ó%×IÐIÔ)GÓ)I€HØ$ X JÐ.@ÐAÐAr   c                óh   € V ^8„  d   QhR\         R\        \        \         ,          \         3,          /# ©r   Úbase_urlr   )r   rE   r	   )r   s   "r   r   r   Ó   s,   € ÷ Xñ X¤ð X¬¬h´s­m¼SÐ.@Õ(Añ Xr   c                ó,  € \        \        T ;'       g    R4      4      p\        P                  VP                  ;'       g    R4      pV'       d   VP                  ^4      MRVP                  ;'       g    RP                  R4      P                  4       3# )zF(region or None if not a Mantle host, normalized path) for a base URL.r   NÚ/)	r   r   Ú_BEDROCK_OPENAI_HOST_REÚmatchÚhostnameÚgroupÚpathÚrstripr1   )r�   rŒ   r¡   s   &  r   Ú_mantle_url_partsr¦   Ó   sj   € ä”c˜(Ÿ.˜. bÓ)Ó*€FÜ#×)Ñ)¨&¯/©/×*?Ð*?¸RÓ@€Eß#ˆE�K‰K˜ŒN¨°·±×1BÐ1BÀ×0JÑ0JÈ3Ó0O×0UÑ0UÓ0WÐWÐWr   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# rœ   )r   r	   )r   s   "r   r   r   Ú   s   € ÷ *ñ *´#ð *¼(Ä3½-ñ *r   c                ó&   € \        V 4      ^ ,          # )z=Extract the AWS region from a Bedrock Mantle OpenAI base URL.©r¦   )r�   s   &r   Ú#bedrock_openai_region_from_base_urlrª   Ú   s   € ä˜XÓ& qÕ)Ð)r   c                ó0   € V ^8„  d   QhR\         R\        /# rœ   rs   )r   s   "r   r   r   ß   s   € ÷ Hñ H¬ð H´ñ Hr   c                ó>   € \        V 4      w  rVRJ;'       d    VR9   # )zCTrue for Bedrock Mantle endpoints (bare host or /openai[/v1] path).N>   r   ú/openaiú
/openai/v1r©   )r�   rS   r¤   s   &  r   Úis_bedrock_openai_base_urlr¯   ß   s'   € ä$ XÓ.�L€FØ˜Ð×GÐG $Ð*GÑ"GÐGr   c                óh   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        /# ©r   Úenvr   ©r	   r   r   )r   s   "r   r   r   å   s+   € ÷ Jñ J¤h¬t´C¼°H­~Õ&>ð JÌ#ñ Jr   c                ó:  € V e+   V P                  RR4      ;'       g    RP                  4       # ^ RIHp V! 4       e(   ^ RIHp V! RR4      ;'       g    RP                  4       # \        P                  P                  RR4      ;'       g    RP                  4       # )zêReturn AWS_BEARER_TOKEN_BEDROCK when Bedrock API-key auth is configured.

Under a HERMES_HOME override the read goes through the profile secret scope so a
served profile never inherits the launch profile's bearer from the process env.ÚAWS_BEARER_TOKEN_BEDROCKr   r   )Ú
get_secret)r$   r%   r!   r   r"   r¶   ÚosÚenviron)r²   r   r¶   s   &  r   Úresolve_bedrock_bearer_tokenr¹   å   s�   € ð
 ‚Ø—‘Ð2°BÓ7×=Ð=¸2×DÑDÓFÐFÝ9ÙÓ!Ò-Ý1ÙÐ5°rÓ:×@Ð@¸b×GÑGÓIÐIÜ�J‰J�N‰NÐ5°rÓ:×@Ð@¸b×GÑGÓIÐIr   c                   óD   a € ] tR t^ót o RtRtRV 3R lR lltR tRtV t	R# )	ÚBedrockOpenAISigV4Authz@httpx auth hook that SigV4-signs Bedrock Mantle OpenAI requests.Tc                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   rS   rR   ra   )r   Ú__classdict__s   "€r   r   Ú#BedrockOpenAISigV4Auth.__annotate__ø   s   ø€ ÷ ñ ™sð ©Sñ r   c                ót   € T;'       g    R P                  4       ;'       g    \        4       V n        W n        R# ©r   N)r%   r˜   rS   rR   )ÚselfrS   rR   s   &&&r   Ú__init__ÚBedrockOpenAISigV4Auth.__init__ø   s)   € Ø—|�| ×*Ñ*Ó,×PÐPÔ0NÓ0PˆŒØŽr   c              #  óä  "  € ^ RI Hp ^ RIHp \	        4       p\        4       P                  ! R/ VB P                  4       pVf   \        R4      hVP                  P                  4        UUu/ uF:  w  rg\        V4      P                  4       R9  g   K%  \        V4      \        V4      bK<  	  pppT! VP                  \        VP                  4      VP                  ;'       g    RVR7      p	V! VP!                  4       V P"                  V P$                  4      P'                  V	4       VP                  P)                  \+        V	P                  P                  4       4      4       Vx € R# u uppi 5i)	é    )Ú	SigV4Auth)Ú
AWSRequestNz™No AWS credentials available for Bedrock OpenAI Responses. Configure AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY, AWS_PROFILE, SSO, or an instance/task role.r   )ÚmethodÚurlÚdataÚheadersrY   >   Úauthorizationú
x-amz-dateúx-amz-security-token)Úbotocore.authrÆ   Úbotocore.awsrequestrÇ   r,   rO   r\   Úget_credentialsr&   rË   Úitemsr   r1   rÈ   rÉ   ÚcontentÚget_frozen_credentialsrR   rS   Úadd_authÚupdater   )
rÁ   ÚrequestrÆ   rÇ   r*   ÚcredentialsÚkÚvrË   Úaws_requests
   &&        r   Ú	auth_flowÚ BedrockOpenAISigV4Auth.auth_flowü   s$  é € Ý+Ý2Ü*Ó,ˆÜ$Ó&×.Ò.Ñ8°Ñ8×HÑHÓJˆØÒÜðqóð ð
 /6¯o©o×.CÑ.CÔ.Eô eÑ.E¡d aÜ˜!“f—l‘l“nÐ,cÑcô "”3�q“6œ3˜q›6’>Ñ.Eˆñ eá ¨¯©¼CÀÇÁÓ<LÐSZ×SbÑSb×SiÐSiÐfiÐszÔ{ˆÙ�+×4Ñ4Ó6¸¿¹ÀdÇkÁkÓR×[Ñ[Ð\gÔhØ�‰×Ñœt K×$7Ñ$7×$=Ñ$=Ó$?Ó@ÔAØŒùóeùs   ‚A+E0Á-"E*ÂE*Â-6E0Ã$BE0)rS   rR   Nri   )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úrequires_request_bodyrÂ   rÜ   Ú__static_attributes__Ú__classdictcell__©r½   s   @r   r»   r»   ó   s"   ø‡ € ÙJà Ð÷ò ÷ð r   r»   Útimeoutc                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   rS   rç   )r   r	   Úfloat)r   s   "r   r   r     s   € ÷ "ñ "¬Sð "¼hÄu½oñ "r   c               óÂ   € R\        V 4      /p\        V\        \        34      '       d"   \        V\        4      '       g   V^ 8”  d   WR&   \
        P                  ! R/ VB # )z?Build an httpx client that SigV4-signs Bedrock OpenAI requests.Úauthrç   rY   )r»   Ú
isinstancer:   ré   rt   ÚhttpxÚClient)rS   rç   r*   s   &$ r   Ú build_bedrock_openai_http_clientrï     sP   € à$Ô&<¸VÓ&DÐE€FÜ�'œC¤˜<×(Ò(´¸GÄT×1JÒ1JÈwÐYZÌ{Ø#ˆyÑÜ�<Š<Ñ!˜&Ñ!Ð!r   c                ó–   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          R\         \        \        3,          /# )r   Úclient_kwargsrç   r   )r   r   r   r	   ré   )r   s   "r   r   r     s=   € ÷ ñ ¼$¼sÄC¸x½.ð ÔV^Ô_dÕVeð ÔquÔvyÔ{~Ðv~Õqñ r   c               ó^  € \        V P                  R4      ;'       g    R4      pV P                  R4      p\        V4      '       d4   \        V\         4      '       d    VP	                  4       '       d
   VR9  d   V # \        V4      ;'       g    \        4       pRV R&   \        WAR7      V R&   V # )z­Install SigV4 auth on OpenAI SDK kwargs for Bedrock Mantle; a real API key keeps the SDK's
bearer auth, the ``aws-sdk``/``no-key-required`` placeholders mean IAM chain auth.r�   r   Úapi_keyúaws-sdk)rç   Úhttp_client>   rô   úno-key-required)r   r$   r¯   rì   r%   rª   r˜   rï   )rñ   rç   r�   ró   rS   s   &$   r   Ú&configure_bedrock_openai_client_kwargsr÷     s–   € ô �=×$Ñ$ ZÓ0×6Ð6°BÓ7€HØ×Ñ 	Ó*€GÜ% h×/Ò/Ü�7œC× Ò  W§]¡]§_¢_¸ÐHfÔ9fàÐÜ0°Ó:×^Ð^Ô>\Ó>^€FØ(€M�)ÑÜ#CÀFÔ#\€M�-Ñ ØÐr   c                ó$   € V ^8„  d   QhR\         /# r   )rE   )r   s   "r   r   r   .  s   € ÷ 
ñ 
œEñ 
r   c                 ó  € . p R F`  w  r\        \        \        4      ;_uu_ 4        Y Uu. uF#  p\        \        P
                  ! V4      V4      NK%  	  up,          p RRR4       Kb  	  \        V 4      # u upi   + '       g   i     K…  ; i)zLbotocore + urllib3 transport-failure exception classes (best-effort import).N))zbotocore.exceptions)ÚConnectionErrorÚHTTPClientError)zurllib3.exceptions)ÚProtocolErrorÚNewConnectionErrorrú   )r   rD   rH   ÚgetattrÚ	importlibÚimport_modulerE   )ÚtypesÚmoduleÚnamesÚnames       r   Ú_stale_error_typesr  .  sx   € à€Eó‰ˆô
 ”k¤>×2Õ2ØÐQVÓWÑQVÈ”gœi×5Ò5°fÓ=¸tÖDÑQVÑWÕWˆE÷ 3Ñ2ñô �‹<Ðùò X÷ 3×2Ð2ús   ¦A9«)A4Á	A9Á4A9Á9B
c                ó0   € V ^8„  d   QhR\         R\        /# ©r   rL   r   ©ÚBaseExceptionrt   )r   s   "r   r   r   ;  s   € ÷ ñ ¤=ð ´Tñ r   c                óJ  € \        V \        4       4      '       d   R# \        V \        4      ;'       dq    \        ;QJ d:    R \        P
                  ! V P                  4       4       F  '       g   K   R# 	  R# ! R \        P
                  ! V P                  4       4       4      # )zWTrue for botocore/urllib3 transport errors or AssertionErrors raised inside those libs.Tc              3   ó˜   "  € T F@  w  rVP                   P                  R R4      ;'       g    RP                  \        4      x € KB  	  R# 5i)rÞ   r   N)Ú	f_globalsr$   r~   Ú_STALE_LIB_MODULE_PREFIXES)r3   ÚframeÚ_linenos   &  r   r5   Ú,is_stale_connection_error.<locals>.<genexpr>?  sA   é € ð 3áB‰NˆEð 
�‰×	Ñ	˜Z¨Ó	,×	2Ð	2°×>Ñ>Ô?Y×ZÐZÛBùs
   ‚)A
¬A
F)rì   r  ÚAssertionErrorÚanyÚ	tracebackÚwalk_tbÚ__traceback__)rL   s   &r   Úis_stale_connection_errorr  ;  s†   € ä�#Ô)Ó+×,Ò,ÙÜ�cœ>Ó*÷ ð ¯s«sñ 3ä'×/Ò/°×0AÑ0AÔBó3¯s¬sð ªsð ¨sñ 3ä'×/Ò/°×0AÑ0AÔBó3ó 0ð r   c                ó0   € V ^8„  d   QhR\         R\        /# r  r  )r   s   "r   r   r   E  s   € ÷ <ñ <¬-ð <¼Dñ <r   c                óŒ  € \        V 4      P                  4       pRV9  d   R# \        \        4      ;_uu_ 4        ^ RIHp \        W4      '       dG   \        V RR4      ;'       g    / P                  R/ 4      P                  RR4      pVR9   uuRRR4       #  RRR4       R	V9   ;'       g    R
V9   #   + '       g   i     L"; i)zÂTrue when IAM denied ``bedrock:InvokeModelWithResponseStream`` (permanent: callers fall back
to converse()). Message-based: the AnthropicBedrock SDK wraps the response but keeps the action name.ÚinvokemodelwithresponsestreamF)ÚClientErrorÚresponseNÚErrorÚCoder   znot authorizedÚaccessdenied)ÚAccessDeniedExceptionÚUnauthorizedException)	r   r1   r   rD   Úbotocore.exceptionsr  rì   rþ   r$   )rL   Úmsgr  Úcodes   &   r   Ú is_streaming_access_denied_errorr$  E  s¥   € ô ˆc‹(�.‰.Ó
€CØ&¨cÔ1ÙÜ	”+×	Õ	Ý3Ü�c×'Ò'Ü˜C ¨TÓ2×8Ð8°b×=Ñ=¸gÀrÓJ×NÑNÈvÐWYÓZˆDØÐMÑM÷	 
Ò	à'÷ 
ð
 ˜sÑ"×;Ð; n¸Ñ&;Ð;÷ 
×	ús   º+B3Á&'B3Â3C	Úinstance_metadataTc                ó0   € V ^8„  d   QhR\         R\         /# )r   r%  r   )rt   )r   s   "r   r   r   ^  s   € ÷ ñ ´tð Ätñ r   c                óh  € \        \        4      ;_uu_ 4        ^ RIpVP                  P	                  4       pV '       g   VP                  RR4       VP                  4       pVe   VP                  4       MRp\        T;'       d    VP                  4      uuRRR4       #   + '       g   i     R# ; i)z»True if boto3's default chain resolves credentials (IMDS, task role, ...). *instance_metadata*
False skips the EC2 metadata lookup (169.254.169.254), which off EC2 only costs its timeout.NÚec2_metadata_disabledÚtrueF)
r   r@   Úbotocore.sessionÚsessionÚget_sessionÚset_config_variablerÑ   rÔ   rt   Ú
access_key)r%  Úbotocorer+  rØ   r™   s   $    r   Ú_boto3_chain_has_credentialsr0  ^  sˆ   € ô 
”)×	Õ	ÛØ×"Ñ"×.Ñ.Ó0ˆß Ø×'Ñ'Ð(?ÀÔHØ×-Ñ-Ó/ˆØ;FÒ;R�;×5Ñ5Ô7ÐX\ˆÜ�H×4Ð4 ×!4Ñ!4Ó5÷ 
×	×	Ñ	ñ ús   ˜A,B ÂB Â B1	c                óŠ   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        R\         \        ,          /# ©r   r²   r%  r   ©r	   r   r   rt   )r   s   "r   r   r   l  s:   € ÷ eñ eÜ	”$”sœC�x•.Õ	!ðeÜ@DðeäŒc…]ñer   c               ó  a € S e   S M\         P                  o \         FN  p\        ;QJ d    V 3R lV 4       F  '       d   K   RM	  RM! V 3R lV 4       4      '       g   KE  V^ ,          u # 	  \	        VR7      '       d   R# R# )znName of the active AWS auth source: env vars first (no I/O), then ``"iam-role"`` via boto3's chain, else None.Nc              3   ód   <"  € T F%  pSP                  VR 4      P                  4       x € K'  	  R# 5irÀ   )r$   r%   )r3   r)   r²   s   & €r   r5   Ú+resolve_aws_auth_env_var.<locals>.<genexpr>r  s(   øé € Ð9±5¨Cˆs�w‰w�s˜BÓ×%Ñ%×'Ð'³5ùs   ƒ-0FT©r%  ziam-role)r·   r¸   Ú_AWS_AUTH_ENV_CHAINÚallr0  )r²   r%  r£   s   f$ r   Úresolve_aws_auth_env_varr:  l  sa   ø€ ð ’‰#¤b§j¡j€Cß$ˆß‹3Ô9±5Ó9�3�3Š3Ô9±5Ó9×9Ô9Ø˜•8ŠOñ %ô 6ÐHY×ZÓZˆ:ÐdÐ`dÐdr   c                ót   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        R\        /# r2  r3  )r   s   "r   r   r   w  s5   € ÷ Zñ ZœX¤d¬3´¨8¥nÕ5ð ZÔTXð ZÔdhñ Zr   c               ó   € \        WR7      RJ# )ac  True if any AWS credential source (env vars or boto3 chain) is detected.

This two-tier approach mirrors the pattern from OpenClaw PR #62673: cloud environments (EC2, ECS,
Lambda) provide credentials via instance metadata, not environment variables. The env-var check is a
fast path for local development; the boto3 fallback covers all cloud deployments.
r7  N)r:  )r²   r%  s   &$r   Úhas_aws_credentialsr=  w  s   € ô $ CÔMÐUYÐYÐYr   c                óh   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        /# r±   r³   )r   s   "r   r   r   �  s'   € ÷ 	ñ 	¤¬¬c´3¨h­Õ 8ð 	ÄCñ 	r   c                ó¬  € V e   T M\         P                  p V P                  RR4      P                  4       ;'       g!    V P                  RR4      P                  4       pV'       d   V# \	        \
        4      ;_uu_ 4        ^ RIpVP                  P                  4       P                  R4      ;'       g    RuuRRR4       #   + '       g   i     R# ; i)uh   AWS_REGION â†’ AWS_DEFAULT_REGION â†’ botocore configured region (~/.aws/config profiles) â†’ us-east-1.NÚ
AWS_REGIONr   ÚAWS_DEFAULT_REGIONrS   ú	us-east-1)
r·   r¸   r$   r%   r   r@   r*  r+  r,  Úget_config_variable)r²   Úexplicitr/  s   &  r   Úresolve_bedrock_regionrE  �  s—   € à’‰#¤b§j¡j€CØ�w‰w�| RÓ(×.Ñ.Ó0×]Ð]°C·G±GÐ<PÐRTÓ4U×4[Ñ4[Ó4]€HßØˆÜ	”)×	Õ	ÛØ×Ñ×+Ñ+Ó-×AÑAÀ(ÓK×ZÐZÈ{÷ 
×	×	Ñ	ñ ús   Â 7CÃC	c                óh   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        /# ©r   Úconfigr   ©r	   r   r   r   )r   s   "r   r   r   �  s'   € ÷ 2ñ 2¬8´D¼¼c¸µNÕ+Cð 2Ìsñ 2r   c                ó\  € V f.   \        \        4      ;_uu_ 4        ^ RIHp V! 4       p RRR4       \	        T ;'       g    / P                  R4      ;'       g    / P                  R4      ;'       g    R4      P                  4       pT;'       g    \        4       #   + '       g   i     Ly; i)zÌ``bedrock.region`` from config.yaml, else :func:`resolve_bedrock_region`. Every non-runtime Bedrock
endpoint must use this so auxiliary calls never leave the primary runtime's region. *config* skips disk.N©Úload_config_readonlyr8   rS   r   )r   r@   Úhermes_cli.configrL  r   r$   r%   rE  )rH  rL  Ú
cfg_regions   &  r   r˜   r˜   �  s€   € ð ‚~Ü”i× Õ Ý>Ù)Ó+ˆF÷ !ô �v—|�| ×(Ñ(¨Ó3×9Ð9°r×>Ñ>¸xÓH×NÐNÈBÓO×UÑUÓW€JØ×1Ð1Ô/Ó1Ð1÷	 !× ús   œBÂB+	c                ó0   € V ^8„  d   QhR\         R\         /# rœ   ra   )r   s   "r   r   r   ˜  s   € ÷ ,ñ ,¬cð ,´cñ ,r   c                óz   € \         P                  ! RT ;'       g    R4      pV'       d   VP                  ^4      # R# )zUAWS region from a ``bedrock-runtime.<region>.amazonaws.com`` URL (default us-east-1).zbedrock-runtime\.([a-z0-9-]+)\.r   rB  ©ÚreÚsearchr£   )r�   r4   s   & r   Úbedrock_region_from_runtime_urlrT  ˜  s.   € ä
�	Š	Ð4°h·n°nÀ"ÓE€Aßˆ1�7‰7�1‹:Ð+ Ð+r   c                ó    € V ^8„  d   QhR\         \        \        \        3,          ,          R\         \        \        \        3,          ,          /# rG  rI  )r   s   "r   r   r   ž  s9   € ÷ ñ ¤X¬d´3¼°8­nÕ%=ð ÌÔRVÔWZÔ\_ÐW_ÕR`ÕIañ r   c                óò  € V f0   / p \        \        4      ;_uu_ 4        ^ RIHp V! 4       p RRR4       T ;'       g    / P	                  R4      ;'       g    / P	                  R4      ;'       g    / pVP	                  R4      '       d   VP	                  R4      '       g   R# RVR,          RVR,          /pR	 F(  w  rEVP	                  V4      '       g   K  W$,          W5&   K*  	  V#   + '       g   i     LÂ; i)
zYConverse ``guardrailConfig`` from ``bedrock.guardrail`` in config.yaml (None when unset).NrK  r8   Ú	guardrailÚguardrail_identifierÚguardrail_versionÚguardrailIdentifierÚguardrailVersion))Ústream_processing_modeÚstreamProcessingMode)Útracer^  )r   r@   rM  rL  r$   )rH  rL  ÚgrÚoutÚsrcÚdsts   &     r   Úbedrock_guardrail_configrc  ž  sË   € à‚~ØˆÜ”i× Õ Ý>Ù)Ó+ˆF÷ !ð �<ˆ<�R×
Ñ
˜YÓ
'×
-Ð
-¨2×	2Ñ	2°;Ó	?×	EÐ	EÀ2€BØ�F‰FÐ)×*Ò*¨r¯v©vÐ6I×/JÒ/JÙØ  "Ð%;Õ"<Ð>PÐRTÐUhÕRiÐ
j€CÛ\‰ˆØ�6‰6�#�;Œ;Ø•wˆC‹Hñ ]ð €J÷ !× ús   žC&Ã&C6	c                óŠ   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        \        \        3,          /# rG  rI  )r   s   "r   r   r   ¯  s0   € ÷ ñ ¤h¬t´C¼°H­~Õ&>ð Ì$ÌsÔTWÈxÍ.ñ r   c                óâ   € \        V 4      pV'       g   / # R\        VR,          4      R\        VR,          4      /p\        VP                  RR4      4      P                  4       R	9   d   RVR&   V# )
a  InvokeModel/Messages-wire form of the configured guardrail. The AnthropicBedrock SDK speaks
InvokeModel, which has no ``guardrailConfig`` body field; Bedrock reads the guardrail from these
headers instead (same enforcement, keeps prompt caching / thinking / 1M context).z"X-Amzn-Bedrock-GuardrailIdentifierrZ  zX-Amzn-Bedrock-GuardrailVersionr[  r^  r   ÚENABLEDzX-Amzn-Bedrock-Trace>   r)  ÚenabledÚenabled_full)rc  r   r$   r1   )rH  r_  rË   s   &  r   Úbedrock_guardrail_headersri  ¯  sq   € ô 
" &Ó	)€BßØˆ	à,¬c°"Ð5JÕ2KÓ.LØ)¬3¨rÐ2DÕ/EÓ+Fð€Gô ˆ2�6‰6�'˜2ÓÓ×%Ñ%Ó'Ð+NÔNØ*3ˆÐ&Ñ'Ø€Nr   zamazon-bedrock-guardrailActionc                ó0   € V ^8„  d   QhR\         R\        /# ©r   r  r   )r   rt   )r   s   "r   r   r   Â  s   € ÷ Nñ N´cð N¼dñ Nr   c                ó�   € \        V RR4      ;'       g    / p\        VP                  \        R4      4      P	                  4       R8H  # )a  True when Bedrock substituted the InvokeModel reply with guardrail messaging. Unlike Converse
(``stopReason=guardrail_intervened``), InvokeModel keeps ``stop_reason=end_turn`` and signals the
block only via an unmodelled body field the Anthropic SDK keeps in ``model_extra``.Úmodel_extraNr   Ú
INTERVENED)rþ   r   r$   ÚGUARDRAIL_ACTION_FIELDÚupper)r  Úextras   & r   Ú'anthropic_response_guardrail_intervenedrr  Â  s?   € ô �H˜m¨TÓ2×8Ð8°b€EÜˆu�y‰yÔ/°Ó4Ó5×;Ñ;Ó=ÀÑMÐMr   c                ó4   € V ^8„  d   QhR\         R\         RR/# )r   r�   Úapi_moder   Nra   )r   s   "r   r   r   Ê  s!   € ÷ 'ñ '¬#ð '¼ð 'Àñ 'r   c                óð   € \        V4      V n        \        4       V n        RV n        / V n        R;V n        V n        Wn        RV n	        VR8X  d    ^ RI
Hp V! V P                  4      V n        R# RV n        R# )aº  Point *agent* at a non-Mantle Bedrock wire: ``bedrock_converse`` (boto3 direct, no SDK client) or
``anthropic_messages`` (AnthropicBedrock SDK, SigV4 via the boto3 chain). ``aws-sdk`` is a sentinel,
never a credential, so the generic Anthropic/OpenAI client builders must not see it. Startup and every
later rebuild (/model switch, fallback restore, fallback-to-Bedrock) share this so region and guardrail
state never lag the active endpoint.Nrô   FÚanthropic_messages)Úbuild_anthropic_bedrock_client)rT  Ú_bedrock_regionrc  Ú_bedrock_guardrail_configrZ   Ú_client_kwargsró   Ú_anthropic_api_keyÚ_anthropic_base_urlÚ_is_anthropic_oauthÚagent.anthropic_adapterrw  Ú_anthropic_client)Úagentr�   rt  rw  s   &&& r   Úbind_bedrock_runtimer�  Ê  so   € ô <¸HÓE€EÔÜ&>Ó&@€EÔ#Ø€E„LØ€EÔØ/8Ð8€E„M�EÔ,Ø (ÔØ %€EÔØÐ'Ô'ÝJÙ"@À×AVÑAVÓ"WˆÖà"&ˆÖr   c                óP   € V ^8„  d   QhR\         \        \        ,          ,          /# r   )r	   r�   r   )r   s   "r   r   r   Þ  s   € ÷ ñ ¤8¬D´­IÕ#6ñ r   c            	     ó  € \        \        4      ;_uu_ 4        \        \        4       4      p V '       d,   \	        V  Uu. uF  qR,          NK  	  up4      uuRRR4       #  RRR4       R# u upi   + '       g   i     R# ; i)zVLive-discover Bedrock model IDs; None on failure/empty so callers use the static list.ÚidN)r   r@   Údiscover_bedrock_modelsr˜   r•   )Ú
discoveredr4   s     r   Úbedrock_model_ids_or_noner‡  Þ  sb   € ä	”)×	Õ	Ü,Ô-KÓ-MÓNˆ
ßÜ1ÁJÓ2OÁJ¸q°T·7°7ÁJÑ2OÓP÷ 
Ò	à÷ 
ñ ùò 3P÷ 
Ö	ñ ús   ˜%A/½A*ÁA/Á*A/Á/B 	zanthropic.claudezamazon.novac                ó0   € V ^8„  d   QhR\         R\        /# ry   rs   )r   s   "r   r   r   ô  s   € ÷ Zñ Z¤sð Z¬tñ Zr   c                ó¦   a € \         ;QJ d-    V 3R l\         4       F  '       g   K   R'       * # 	  R'       * # ! V 3R l\         4       4      '       * # )z<False for denylisted models; unknown models default to True.c              3   óH   <"  € T F  qSP                  4       9   x € K  	  R # 5ir/   r0   ©r3   Úpatternrz   s   & €r   r5   Ú+_model_supports_tool_use.<locals>.<genexpr>ö  s   øé € ÐYÑ>X°7˜hŸn™nÓ.Ö.Ó>Xùó   ƒ"TF)r  Ú_NON_TOOL_CALLING_PATTERNSrˆ   s   fr   Ú_model_supports_tool_user�  ô  s7   ø€ ç‹sÔYÕ>XÓY�sŒsÔYÐYŠsÔYÐYˆsÔYÕ>XÓYÓYÔYÐYr   c                ó0   € V ^8„  d   QhR\         R\        /# ry   rs   )r   s   "r   r   r   ù  s   € ÷ Qñ Q¬3ð Q´4ñ Qr   c                 óÔ   a € \         P                  S 4      '       d   \        S 4      o \        ;QJ d#    V 3R  l\         4       F  '       g   K   R# 	  R# ! V 3R  l\         4       4      # )c              3   óH   <"  € T F  qSP                  4       9   x € K  	  R # 5ir/   r0   r‹  s   & €r   r5   Ú/_model_supports_prompt_cache.<locals>.<genexpr>ý  s   øé € ÐPÑ:O¨w˜(Ÿ.™.Ó*Ö*Ó:OùrŽ  TF)Ú_APPLICATION_PROFILE_ARN_RErS  Ú#_resolve_inference_profile_model_idr  Ú_CACHE_POINT_PATTERNSrˆ   s   fr   Ú_model_supports_prompt_cacher˜  ù  sI   ø€ ä"×)Ñ)¨(×3Ò3Ü6°xÓ@ˆß‹3ÔPÕ:OÓP�3Œ3ÐPŠ3ÐPˆ3ÔPÕ:OÓPÓPÐPr   z #/(?P<path>[A-Za-z0-9_./\[\]-]*)Ú
cachePointÚtypeÚdefaultc                óF   € V ^8„  d   QhR\         R\        \        ,          /# r  )r	  r	   r   )r   s   "r   r   r     s"   € ÷ cñ c¬ð c¼8ÄC½=ñ cr   c                ó0  a€ \        V 4      pVP                  4       pRV9  g   RV9  d
   RV9  d   R# \        P                  V4      pV'       d   VP	                  R4      MRP                  4       oRS9   g   RS9   d   R# \        V3R	 lR
 4       R4      # )uÌ   Converse section whose cachePoint Bedrock refused, or None. Message-based: the JSON pointer in the
ValidationException is the only thing naming the section (raw or SDK-wrapped). Unlocalisable â†’ "tools".Ú
cachepointznot permittedÚ
extraneousNr¤   r   Ú
toolconfigÚtoolsc              3   ó8   <"  € T F  qS9   g   K  Vx € K  	  R # 5ir/   rY   )r3   Ú	placementr¤   s   & €r   r5   Ú2cache_point_rejection_placement.<locals>.<genexpr>  s   øé € ÐXÑ,B˜yÐSWÑFW—’Ó,Bùs   ƒ�
)ÚsystemÚmessages)r   r1   Ú_CACHE_POINT_PATH_PATTERNrS  r£   Únext)rL   r"  Úloweredr¡   r¤   s   &   @r   Úcache_point_rejection_placementrª    s„   ø€ ô ˆc‹(€CØ�i‰i‹k€GØ˜7Ô" ¸gÔ'EÈ,Ð^eÔJeÙÜ%×,Ñ,¨SÓ1€Eß#(ˆE�K‰K˜Ô¨b×7Ñ7Ó9€DØ�tÔ˜w¨$œÙÜÔXÑ,BÓXÐZaÓbÐbr   c                ó4   € V ^8„  d   QhR\         R\         RR/# )r   rz   r£  r   Nra   )r   s   "r   r   r     s&   € ÷ Sñ S¬ð S¼ð SÀñ Sr   c                ó–   € V\         9   d>   \        P                  V P                  4       \	        4       4      P                  V4       R# R# )zDRecord that ``model_id`` refuses cachePoint blocks in ``placement``.N)ÚCACHE_POINT_PLACEMENTSÚ_CACHE_POINT_REJECTIONSÚ
setdefaultr1   ÚsetÚadd©rz   r£  s   &&r   Únote_cache_point_rejectionr³    s4   € àÔ*Ô*Ü×*Ñ*¨8¯>©>Ó+;¼S»UÓC×GÑGÈ	ÖRñ +r   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   rz   r£  r   rs   )r   s   "r   r   r      s&   € ÷ Nñ N¤#ð N´#ð N¼$ñ Nr   c                óP   € V\         P                  V P                  4       R4      9  # )z=False once Bedrock has refused this placement for this model.rY   )r®  r$   r1   r²  s   &&r   Úcache_point_allowedr¶     s"   € àÔ3×7Ñ7¸¿¹Ó8HÈ"ÓMÑMÐMr   c                ó   € V ^8„  d   QhRR/# ©r   r   NrY   )r   s   "r   r   r   %  s   € ÷ $ñ $ dñ $r   c                 ó.   € \         P                  4        R# )z4Clear recorded cachePoint rejections. Used in tests.N)r®  rm   rY   r   r   Úreset_cache_point_rejectionsrº  %  s   € ä×!Ñ!Ö#r   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r   Úblocksr   )r   r	   r�   )r   s   "r   r   r   *  s   € ÷ <ñ <¤#ð <¬(´4­.ñ <r   c                ó  € \        V \        4      '       g   R# V  Uu. uF<  p\        V\        4      '       d"   \        VP	                  4       4      R08X  d   K:  VNK>  	  pp\        V4      \        V 4      8X  d   R# T# u upi )zM``blocks`` minus cachePoint entries, or None if not a list / nothing removed.Nr™  )rì   r�   r   r°  ÚkeysÚlen©r½  ÚbÚcleaneds   &  r   Ú_without_cache_pointsrÄ  *  si   € ä�fœd×#Ò#ÙÙ Ób™&�Q¬°A´t×)<Ò)<ÄÀQÇVÁVÃXÃÐS_ÐR`ÑA`�qˆq™&€GÐbÜ�w“<¤3 v£;Ô.ˆ4Ð;°GÐ;ùò cs   �7A>ÁA>c                ó€   € V ^8„  d   QhR\         \        \        3,          R\        R\         \        \        3,          /# )r   r*   r£  r   rT   )r   s   "r   r   r   2  s1   € ÷ ñ œt¤C¬ H�~ð ¼#ð Ä$ÄsÌCÀxÅ.ñ r   c           	     óØ  € VR8X  dÙ   V P                  R4      p\        V\        4      '       dC   V Uu. uF5  p\        \        V\        4      '       d   VP                  R4      MR4      NK7  	  upM. p\
        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   V # / V CR\        W$4       UUu. uF  w  r5Vf   TM/ VCRV/CNK  	  upp/C# VR8X  d)   \        V P                  R4      4      pVf   V # / V CRV/C# VR8X  dJ   V P                  R	4      p\        T;'       g    / P                  R4      4      pVf   V # / V CR	/ VCRV/C/C# V # u upi u uppi )
z¥Copy of Converse kwargs with ``placement``'s cachePoint removed; the SAME object
back when nothing was stripped (callers use identity to decide a retry cannot help).r¦  rÓ   Nc              3   ó(   "  € T F  qR J x € K
  	  R # 5ir/   rY   ©r3   rÓ   s   & r   r5   Ú%strip_cache_points.<locals>.<genexpr>:  s   é € Ð?Ñ.> 7˜$�Ó.>ùó   ‚FTr¥  r¡  Ú
toolConfig)r$   rì   r�   rÄ  r   r9  Úzip)r*   r£  r¦  r"  Úcleaned_contentsrÓ   rÃ  Útool_configs   &&      r   Ústrip_cache_pointsrÏ  2  sŠ  € ð �JÔØ—:‘:˜jÓ)ˆô ˜¤$×'Ò'ñ emó
ÙdlÐ]`Ô!¼
À3Ì×8MÒ8M #§'¡'¨)Ô"4ÐSWÖXÑdlò
à-/ð 	÷ ‹3Ñ?Ñ.>Ó?�3�3Š3Ñ?Ñ.>Ó?×?Ò?ØˆMð�&ð ˜*ÜX[Ð\dÔXwô'
ÙXwÉÈ�7’?‰CÐ(C¨3Ð(C°	¸7Ñ(CÒCÑXwò'
ñ ð 	ð �HÔÜ'¨¯
©
°8Ó(<Ó=ˆØ šˆvÐKÐ.K°Ð.K¸À7Ñ.KÐKØ�GÔØ—j‘j Ó.ˆÜ'¨×):Ð):¸×(?Ñ(?ÀÓ(HÓIˆØ šˆvÐiÐ.i°Ð.i¸ÐGhÈ+ÐGhÐW^Ð`gÑGhÑ.iÐiØ€Mùò
ùó
'
s   ³;E!ÃE&
c          	      ó–   € V ^8„  d   QhR\         R\        \        \        3,          R\        \        \        \        3,          ,          /# )r   rL   r*   r   )r	  r   r   r   r	   )r   s   "r   r   r   I  s<   € ÷ ñ ¬Mð Ä4ÌÌSÈÅ>ð ÔV^Ô_cÔdgÔilÐdlÕ_mÕVnñ r   c                óÚ   € \        V 4      pVf   R# \        W4      pW1J d   R# \        VP                  RR4      4      p\	        WB4       \
        P                  RT;'       g    RV4       V# )z¦Record Bedrock's cachePoint verdict and return retry kwargs, or None when the error
was not a cachePoint rejection / the marker was already absent (caller re-raises).NÚmodelIdr   u¡   bedrock: %s rejected a cachePoint block in %s â€” dropping that cache marker for this model and retrying. Prompt caching stays active for the remaining sections.Úmodel)rª  rÏ  r   r$   r³  rA   rB   )rL   r*   r£  Úretry_kwargsrz   s   &&   r   Ú"recover_from_cache_point_rejectionrÕ  I  sp   € ô 0°Ó4€IØÒÙÜ% fÓ8€LØÓÙÜ�6—:‘:˜i¨Ó,Ó-€HÜ˜xÔ3Ü
‡N�Nð	LØMU×M`ÐM`ÐY`Ðbkôð Ðr   z)ValidationException.*(?:redacted|encrypt)c                ó.  € \        V \        4      '       g   R# V  Uu. uFP  p\        V\        4      '       d6   \        VP                  R4      \        4      '       d   RVR,          9   d   KN  VNKR  	  pp\	        V4      \	        V 4      8X  d   R# T# u upi )z�``blocks`` minus reasoningContent entries carrying redactedContent, or None if not a list /
nothing removed. Pure reasoningText blocks are kept.NÚreasoningContentÚredactedContent)rì   r�   r   r$   rÀ  rÁ  s   &  r   Ú_without_redacted_reasoningrÙ  d  sƒ   € ô �fœd×#Ò#ÙÙ ó ™&�QÜ�1”d×Ò¤
¨1¯5©5Ð1CÓ+DÄd× KÒ KØ Ð#5Õ!6Ñ6÷ ˆq™&€Gð ô �w“<¤3 v£;Ô.ˆ4Ð;°GÐ;ùò	s   �ABÁ-Bc           	     óò  € V P                  R4      p\        V\        4      '       g   V # V Uu. uF5  p\        \        V\        4      '       d   VP                  R4      MR4      NK7  	  pp\
        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   V # / V CR\        W4       UUu. uF)  w  r$Ve   \        V4      ^ 8”  g   K  Vf   TM/ VCRV/CNK+  	  upp/C# u upi u uppi )zóCopy of Converse kwargs with redacted reasoning blocks removed; the SAME object
back when nothing was stripped (callers use identity to decide a retry cannot help).
Turns left with empty content are dropped (they carried no replayable signal).r¦  rÓ   Nc              3   ó(   "  € T F  qR J x € K
  	  R # 5ir/   rY   rÈ  s   & r   r5   Ú+strip_redacted_reasoning.<locals>.<genexpr>{  s   é € Ð
;Ñ*:˜w�d�?Ó*:ùrÊ  FT)r$   rì   r�   rÙ  r   r9  rÌ  rÀ  )r*   r¦  r"  rÍ  rÓ   s   &    r   Ústrip_redacted_reasoningrÝ  p  sú   € ð �z‰z˜*Ó%€HÜ�h¤×%Ò%Øˆñ óáˆCô 	$¼*ÀSÌ$×:OÒ:O C§G¡G¨IÔ$6ÐUYÖZÙð ð ÷ ƒsÑ
;Ñ*:Ó
;‡s‡s‚sÑ
;Ñ*:Ó
;×;Ò;Øˆðˆfð �jä Ô;ô#á;‰LˆCØŠ?œc '›l¨QÑ.ô 	@ˆwŠ‰Ð$? sÐ$?¨I°wÑ$?Ò?Ù;ò#ñ ð ùòùó#s   ®;C.Â9C3
ÃC3
c           	     óè   € \         P                  \        V 4      4      '       g   R# \        V4      pW!J d   R# \        P                  R\        VP                  RR4      4      ;'       g    R4       V# )zªReturn retry kwargs with redacted reasoning blocks stripped, or None when the error
was not an encrypted-content rejection / nothing redacted remained (caller re-raises).Nz˜bedrock: %s rejected replayed redacted reasoning (encrypted content is sealed to the issuing model/flow) - stripping redacted blocks and resending once.rÒ  r   rÓ  )Ú%_REDACTED_REASONING_REJECTION_PATTERNrS  r   rÝ  rA   rB   r$   )rL   r*   rÔ  s   && r   Ú)recover_from_redacted_reasoning_rejectionrà  „  sd   € ô 1×7Ñ7¼¸C»×AÒAÙÜ+¨FÓ3€LØÓÙÜ
‡N�Nð	FäˆF�J‰J�y "Ó%Ó&×1Ð1¨'ôð
 Ðr   z^(?:(?:Ú|z)\.)?anthropic\.claudec                ó0   € V ^8„  d   QhR\         R\        /# ry   rs   )r   s   "r   r   r   š  s   € ÷ Cñ C¬ð C´ñ Cr   c                ó0   € \         P                  V 4      RJ# )zdTrue for Claude on Bedrock (``anthropic.claude-*``, any regional prefix): AnthropicBedrock SDK path.N)Ú_ANTHROPIC_BEDROCK_MODEL_REr¡   rˆ   s   &r   Úis_anthropic_bedrock_modelrå  š  s   € ä&×,Ñ,¨XÓ6¸dÐBÐBr   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r   r¡  r   ©r�   r   )r   s   "r   r   r   ¡  s"   € ÷ ?ñ ?¤T¬$¥Zð ?´D¼µJñ ?r   c                óÎ   € R T ;'       g    .  4        Uu. uFC  pRRVP                  RR4      RVP                  RR4      RRVP                  RR	R
R/ /4      ///NKE  	  up# u upi )uN   OpenAI ``{"function": {...}}`` tool defs â†’ Converse ``{"toolSpec": {...}}``.c              3   óD   "  € T F  qP                  R / 4      x € K  	  R# 5i)ÚfunctionN©r$   )r3   Úts   & r   r5   Ú,convert_tools_to_converse.<locals>.<genexpr>¦  s   é € Ð=±¨A—%‘%˜
 B×'Ð'³ùs   ‚ ÚtoolSpecr  r   ÚdescriptionÚinputSchemaÚjsonÚ
parametersrš  ÚobjectÚ
propertiesrë  )r¡  Úfns   & r   Úconvert_tools_to_converserö  ¡  s‚   € ñ
 >°·°¸"°Ô=ó?ñ >ˆ2ð Ø�—‘�v˜rÓ" M°2·6±6¸-ÈÓ3LØ˜ §¡ |°f¸hÈÐVXÐ5YÓ ZÐ[ðó ñ >ñ?ð ?ùò ?s   –A	A"z(empty)Útextc                ó$   € V ^8„  d   QhR\         /# r   ra   )r   s   "r   r   r   °  s   € ÷ =ñ =œñ =r   c                ó`   € V f   RM
\        V 4      p V P                  4       '       d   V # \        # )zR``text`` if it has non-whitespace content, else the placeholder (None/non-str ok).r   )r   r%   Ú_EMPTY_TEXT_PLACEHOLDER)r÷  s   &r   Ú
_safe_textrû  °  s'   € à’‰2¤3 t£9€DØ—:‘:—<’<ˆ4Ð<Ô%<Ð<r   c                ó0   € V ^8„  d   QhR\         R\        /# )r   rÉ   r   )r   r   )r   s   "r   r   r   ¶  s   € ÷ 
}ñ 
}¤Cð 
}¬Dñ 
}r   c                ór  € V P                  R4      w  rpVP                  R4      '       d    VR,          P                  R4      ^ ,          MR;'       g    Rp \        P                  ! V4      pRR	R
V9   d   VP                  R
4      R,          MRRRV///#   \
         d    TP                  R4      p LGi ; i)u¨   ``data:<mime>;base64,...`` â†’ Converse image block with RAW bytes (boto3 base64-encodes on the
wire; passing the string through double-encodes and Bedrock rejects it).Ú,údata::é   NNÚ;r   z
image/jpegzutf-8Úimager   rŸ   ÚjpegÚsourceÚbyteséÿÿÿÿ)r|   r~   rG   Úbase64Ú	b64decoder@   Úencode)rÉ   ÚheaderÚ_rÊ   Ú
media_typeÚ	raw_bytess   &     r   Ú_image_block_from_data_urlr  ¶  s¶   € ð —m‘m CÓ(�O€FˆtØ.4×.?Ñ.?À×.HÒ.H�&˜•*×"Ñ" 3Ó'¨Ö*Èb×aÐaÐUa€Jð)ä×$Ò$ TÓ*ˆ	ð �h¸SÀJÔ=N 
× 0Ñ 0°Ó 5°bÖ 9ÐTZÐ\dÐgnÐpyÐfzÐ{Ð|Ð|øô ô )Ø—K‘K Ó(Š	ð)ús   ÁB ÂB6Â5B6c                ó:   € V ^8„  d   QhR\         \        ,          /# r   rç  )r   s   "r   r   r   Ã  s   € ÷ 0ñ 0¬T´$­Zñ 0r   c           
     ó  € \        V \        4      '       g   R\        V 4      /.# . pV  EF9  p\        V\        4      '       d   VP	                  R\        V4      /4       K8  \        V\
        4      '       dF   VP                  RR4      R8X  d/   VP	                  R\        VP                  RR4      4      /4       K“  \        V\
        4      '       g   K«  VP                  RR4      R8X  g   KÄ  VP                  R/ 4      p\        V\
        4      '       d   VP                  RR4      MRpTP	                  VP                  R4      '       d   \        V4      MRRV R2/4       EK<  	  T;'       g    \        \        4      .# )	ue   OpenAI content â†’ Converse blocks; blank text â†’ placeholder, remote image URLs â†’ text reference.r÷  rš  r   Ú	image_urlrÉ   rÿ  z[Image: Ú])
rì   r�   rû  r   Úappendr   r$   r~   r  Ú_PLACEHOLDER_BLOCK)rÓ   r½  Úpartr  rÉ   s   &    r   Ú_convert_content_to_converser  Ã  s/  € ä�gœt×$Ò$Øœ GÓ,Ð-Ð.Ð.Ø€FÜˆÜ�dœC× Ò Ø�M‰M˜6¤:¨dÓ#3Ð4Ö5Ü˜œd×#Ò#¨¯©°¸Ó(<ÀÔ(FØ�M‰M˜6¤:¨d¯h©h°v¸rÓ.BÓ#CÐDÖEÜ˜œd×#Ô#¨¯©°¸Ó(<ÀÖ(KØŸ™ ¨bÓ1ˆIÜ.8¸ÄD×.IÒ.I�)—-‘-  rÔ*ÈrˆCØ�M‰M¸S¿^¹^ÈG×=TÒ=TÔ4°SÔ9Ð[aÐemÐnqÐmrÐrsÐctÐZu×vñ ð ×/Ð/”dÔ-Ó.Ð/Ð/r   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   rç  )r   s   "r   r   r   Ô  s   € ÷ Xñ Xœt¤D�zñ Xr   c                ó¢  € \        V \        4      '       d   V .M\        V \        4      '       d   T M. pV Uu. uFC  p\        V\        4      '       d)   VP	                  R4      R8X  d   VP	                  RR4      MTNKE  	  ppV Uu. uF7  p\        V\        4      '       g   K  VP                  4       '       g   K3  RV/NK9  	  up# u upi u upi )uP   System content â†’ text blocks; blank parts are dropped, not placeholder-filled.rš  r÷  r   )rì   r   r�   r   r$   r%   )rÓ   Úpartsr  Útextsr÷  s   &    r   Ú_system_blocksr  Ô  s£   € ä# G¬S×1Ò1ˆW‰IÄ*ÈWÔVZ×B[ÒB[±wÐac€EÙqvÓwÑqvÐim¤Z°´d×%;Ò%;ÀÇÁÈÓ@PÐTZÔ@ZˆT�X‰X�f˜bÔ!Ð`dÒdÑqv€EÐwÙ',ÓW¡u˜t´
¸4Ä×0EŒNÈ$Ï*É*Ï,ŒNˆV�T‹N¡uÑWÐWùò xùÚWs   ¸A	CÂCÂ$CÂ<Cc                ó$   € V ^8„  d   QhR\         /# r   ©r   )r   s   "r   r   r   Û  s   € ÷ Vñ V´dñ Vr   c                 ó   € R RV RVRV//# )ÚtoolUseÚ	toolUseIdr  ÚinputrY   ©Útool_use_idr  Ú
input_dicts   &&&r   Ú_tool_use_blockr%  Û  s   € Ø˜ [°&¸$ÀÈÐTÐUÐUr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   )r	   r  )r   s   "r   r   r   ß  s   € ÷ ñ ¤¬%¥ñ r   c                ó¤   €  \        V \        4      '       d!   V '       d   \        P                  ! V RR7      # R#   \        \
        3 d     R# i ; i)uB   Strict base64 â†’ bytes; None for empty/non-str/undecodable input.T)ÚvalidateN)rì   r   r  r  rI   Ú	TypeError)Úencodeds   &r   Ú_decode_redactedr+  ß  sF   € ðÜ;EÀgÌs×;SÒ;S×X_Œv×Ò °$Ô7ÐiÐeiÐiøÜœ	Ð"ô Úðús   ‚:  : ¸: ºAÁAc                óF   € V ^8„  d   QhR\         R\         \        ,          /# ©r   Úordered_blocksr   rç  )r   s   "r   r   r   ç  s   € ÷ ñ ¬4ð ´D¼µJñ r   c                óè  € . pV  EFè  p\        V\        4      '       g   K  RV9   d:   \        VR,          \        4      '       d   VP                  RVR,          /4       K\  RV9   Ed   VR,          p\        V\        4      '       g   K…  \        VP	                  R4      \        4      '       da   RVR,          /p\        VP	                  R4      \        4      '       d   VR,          '       d   VR,          VR&   VP                  RRV//4       VP	                  R4      p\        V\        4      '       d6   V'       d+   \        V4      pVe   VP                  RRV//4       EK`  EKc  EKf  EKi  RV9   g   EKs  \        VR,          \        4      '       g   EK“  VR,          pVP                  \        VP	                  RR	4      VP	                  R
R	4      VP	                  R/ 4      4      4       EKë  	  V# )z¥Rebuild the exact Bedrock block sequence captured at normalization time; redacted reasoning is
stored base64 (JSON-safe sidecar) and undecodable entries are skipped.r÷  r×  Ú	signatureÚreasoningTextÚredactedContentBase64rØ  r  r   r   r  r!  )rì   r   r   r  r$   r+  r%  )r.  Úcontent_blocksÚblockÚ	reasoningÚreasoning_textr*  ÚredactedÚtus   &       r   Ú_replay_ordered_blocksr9  ç  s¥  € ð "$€NÜˆÜ˜%¤×&Ò&ÙØ�UŒ?œz¨%°­-¼×=Ò=Ø×!Ñ! 6¨5°­=Ð"9Ö:Ø 5Õ(ØÐ0Õ1ˆIÜ˜i¬×.Ò.Ùô ˜)Ÿ-™-¨Ó/´×5Ò5Ø28¸)ÀFÕ:KÐ1L�Ü˜iŸm™m¨KÓ8¼#×>Ò>À9È[×CYÔCYØ2;¸KÕ2H�N ;Ñ/Ø×%Ñ%Ð'9¸OÈ^Ð;\Ð&]Ô^Ø—m‘mÐ$;Ó<ˆGÜ˜'¤3×'Ò'¯GÜ+¨GÓ4�ØÒ'Ø"×)Ñ)Ð+=Ð@QÐS[Ð?\Ð*]×^ò (ò -4Ò'ð ˜%×¤J¨u°YÕ/?Ä×$FÕ$FØ�yÕ!ˆBØ×!Ñ!¤/°"·&±&¸ÀbÓ2IÈ2Ï6É6ÐRXÐZ\ÓK]Ð_a×_eÑ_eÐfmÐoqÓ_rÓ"s×tñ/  ð0 Ðr   c                ó$   € V ^8„  d   QhR\         /# r   )r   )r   s   "r   r   r     s   € ÷ ñ œcñ r   c                ó¦   €  \        V \        4      '       d   \        P                  ! V 4      # T #   \        P                  \
        3 d    / u # i ; i)zOJSON-decode a tool-call argument string; {} on failure; non-str passes through.)rì   r   rñ  ÚloadsÚJSONDecodeErrorr)  )Úargss   &r   Ú_parse_tool_argsr?    sF   € ðÜ#-¨d´C×#8Ò#8Œt�zŠz˜$ÓÐB¸dÐBøÜ× Ñ ¤)Ð,ô ØŠ	ðús   ‚+0 ®0 °AÁAc                ó:   € V ^8„  d   QhR\         \        ,          /# r   )r	   r   )r   s   "r   r   r     s   € ÷ añ a¬(´4­.ñ ar   c                 ó0   € \        V 4      pVe   RRV//# R # )Nr×  rØ  )r+  )r*  r7  s   & r   Ú_redacted_reasoning_blockrB    s)   € Ü Ó(€HØBJÒBVÐÐ!2°HÐ =Ð>Ð`Ð\`Ð`r   c                ó$   € V ^8„  d   QhR\         /# r   r  )r   s   "r   r   r     s   € ÷ Cñ C¬dñ Cr   c                 óŠ   € R \        V \        4      '       d   T MR/p\        V\        4      '       d   V'       d   WR&   RRV//# )r÷  r   r0  r×  r1  )rì   r   )r÷  r0  r6  s   && r   Ú_reasoning_text_blockrE    sA   € Ø¤j°´s×&;Ò&;™dÀÐD€NÜ�)œS×!Ò!§iØ&/�{Ñ#Ø °.Ð AÐBÐBr   Úthinkingc                 óV   € \        V P                  R 4      V P                  R4      4      # )rF  r0  )rE  r$   ©rÂ  r>  s   &&r   Ú<lambda>rI    s   € Ô 5°a·e±e¸JÓ6GÈÏÉÈ{ÓI[Ô \r   Úredacted_thinkingc                 ó6   € \        V P                  R 4      4      # )rÊ   )rB  r$   rH  s   &&r   rI  rI    s   € Ô)BÀ1Ç5Á5ÈÃ=Ô)Qr   c                 ó    € \        V P                  R 4      \        4      '       d)   V R ,          P                  4       '       d   R V R ,          /# R# )r÷  N)rì   r$   r   r%   rH  s   &&r   rI  rI    s?   € ´:¸a¿e¹eÀF»mÌS×3QÒ3QÐVWÐX^ÕV_×VeÑVe×VgÒVg˜V Q v¥YÐ/ÐqÐmqÐqr   Útool_usec                 óº   € \        V P                  R R4      V P                  RR4      VP                  V P                  R 4      V P                  R/ 4      4      4      # )r„  r   r  r!  )r%  r$   rH  s   &&r   rI  rI  !  sM   € ¤°·±°d¸B³ÀÇÁÀvÈrÓARÐTX×T\ÑT\Ð]^×]bÑ]bÐcgÓ]hÐjk×joÑjoÐpwÐy{Ój|ÓT}Ô ~r   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r   r"  r   )r   r�   )r   s   "r   r   r   %  s   € ÷ 
?ñ 
?¤4ð 
?¬D´­Jñ 
?r   c           
      óš  a€ V P                  R 4      ;'       g    .  Uu/ uF_  p\        V\        4      '       g   K  VP                  R4      \        VP                  R4      ;'       g    / P                  RR4      4      bKa  	  upoV3R lV P                  R4      ;'       g    .  4       pV Uu. uF
  q3f   K  VNK  	  up# u upi u upi )Ú
tool_callsr„  rê  Ú	argumentsú{}c              3   óÂ   <"  € T FT  p\        V\        4      '       g   K  VP                  R 4      \        9   g   K7  \        VR ,          ,          ! VS4      x € KV  	  R# 5i)rš  N)rì   r   r$   Ú_ANTHROPIC_TO_CONVERSE)r3   rÂ  r>  s   & €r   r5   Ú,_anthropic_ordered_blocks.<locals>.<genexpr>*  sN   øé € ð á;ˆAÜ�aœ×ô 	3à#$§5¡5¨£=Ô4JÑ#Jô 	3Ô˜q �yÖ)¨!¨T×2Ð2Û;ùs   ƒA A¼#AÚanthropic_content_blocks)r$   rì   r   r?  )r"  ÚtcÚ	convertedr4  r>  s   &   @r   Ú_anthropic_ordered_blocksr[  %  s»   ø€ ð —7‘7˜<Ó(×.Ð.¨BÐ.óá.ˆB´:¸bÄ$×3Gô 	Zˆ�‰ˆt‹Ô&¨¯©¨zÓ(:×(@Ð(@¸b×'EÑ'EÀkÐSWÓ'XÓYÒYÙ.ñ€Dôà—'‘'Ð4Ó5×;Ð;¸Ð;ó€Iñ
  )Ó>™y�e�EˆE™yÑ>Ð>ùòùò ?s   ŸC¼,CÁ)CÂ0CÂ:Cc          	      ó^   € V ^8„  d   QhR\         R\        R\        R\        \         ,          /# ©r   r"  ÚclaudeÚownr   ©r   rt   r�   )r   s   "r   r   r   2  s-   € ÷ ñ ¤4ð ´ð ¼Dð ÌTÔRVÍZñ r   c                óÒ  € . pV P                  R4      ;'       g    .  EF\  p\        V\        4      '       g   K  VP                  R4      R8X  dÃ   \        VP                  R4      \        4      '       dž   VR,          P	                  4       '       d�   V'       g	   V'       dC   VP                  R4      '       d,   VP                  \        VR,          VR,          4      4       KÆ  V'       g%   VP                  \        VR,          R4      4       Kò  Kô  VP                  R4      R8X  g   EK  \        VP                  R4      ;'       g    VP                  R4      4      ;p'       g   EKK  VP                  V4       EK_  	  V P                  R	4      pV'       gP   V'       gH   \        V\        4      '       d2   VP	                  4       '       d   VP                  \        VR4      4       V# )
a“  Thinking from the persisted ``reasoning_details`` (Anthropic shape, as Converse captures it), in stored
order: Claude gets signed thinking + redacted blobs, other models readable text only (falling back to
``reasoning_content``). This is the carrier a turn reloaded from state.db replays from, since the
ordered ``bedrock_content_blocks`` sidecar is live-only. Converse wants reasoning ahead of toolUse.Úreasoning_detailsrš  rF  r0  NrJ  rÊ   r2  Úreasoning_content)r$   rì   r   r   r%   r  rE  rB  )r"  r^  r_  r½  Údr4  r÷  s   &&&    r   Ú_reasoning_details_blocksre  2  sP  € ð
 €FØ�W‰WÐ(Ó)×/Ð/¨RÓ/ˆÜ˜!œT×"Ò"ÙØ�5‰5�‹=˜JÔ&¬:°a·e±e¸JÓ6GÌ×+MÒ+MÐRSÐT^ÕR_×ReÑRe×RgÒRgßŸ# 1§5¡5¨×#5Ò#5Ø—‘Ô3°A°jµMÀ1À[Å>ÓRÖSßØ—‘Ô3°A°jµMÀ4ÓHÖIñ à�U‰U�6‹]Ð1×1Ü2°1·5±5¸³=×3bÐ3bÀAÇEÁEÐJaÓDbÓcÐc�×cÑcØ�M‰M˜%× ñ 0ð �7‰7Ð&Ó'€DßŸ&¤Z°´c×%:Ò%:¸t¿z¹z¿|º|Ø�‰Ô+¨D°$Ó7Ô8Ø€Mr   c          	      ó^   € V ^8„  d   QhR\         R\        R\        R\        \         ,          /# r]  r`  )r   s   "r   r   r   I  s/   € ÷ ñ œ4ð ´$ð ÄDð ÔUYÔZ^ÕU_ñ r   c                óÄ  € V P                  R4      p\        V\        4      '       d   \        V4      ;p'       d   V# V'       d   \	        V 4      ;p'       d   V# \        WV4      p\        V\        4      '       d+   VP                  4       '       d   VP                  RV/4       M0\        V\        4      '       d   VP                  \        V4      4       V P                  R. 4      ;'       g    .  Fj  p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       Kl  	  V# )
u]  Assistant message â†’ Converse blocks, from the first carrier that yields any: the ordered
``bedrock_content_blocks`` sidecar, (Claude only) the ordered ``anthropic_content_blocks`` sidecar,
else thinking from ``reasoning_details`` followed by text, then tool calls. Anthropic-shaped carriers
hold Claude signatures, so other models never read them.Úbedrock_content_blocksr÷  rR  rê  r„  r   r  rS  rT  )r$   rì   r�   r9  r[  re  r   r%   r  Úextendr  r%  r?  )r"  rÓ   r^  r_  r.  r3  rY  rõ  s   &&&&    r   Ú_assistant_blocksrj  I  s(  € ð
 —W‘WÐ5Ó6€NÜ�.¤$×'Ò'Ô?UÐVdÓ?eÐ-e¨^Ö-eØÐßÔ%>¸sÓ%CÐC�>ÖCØÐÜ.¨s¸CÓ@€NÜ�'œ3×Ò G§M¡M§O¢OØ×Ñ˜v wÐ/Õ0Ü	�GœT×	"Ò	"Ø×ÑÔ:¸7ÓCÔDØ�w‰w�| RÓ(×.Ð.¨BÒ.ˆØ�V‰V�J Ó#ˆØ×Ñœo¨b¯f©f°T¸2Ó.>ÀÇÁÀvÈrÓ@RÔTdÐeg×ekÑekÐlwÐy}Óe~ÓTó  Aö  	Bñ /ð Ðr   zbedrock.native_assistantc                óF   € V ^8„  d   QhR\         R\        \        ,          /# rP  )r   r	   r   )r   s   "r   r   r   y  s"   € ÷ ~ñ ~”ð ~œ(¤3�-ñ ~r   c                 óZ   € \        R  V P                  R4      ;'       g    .  4       R4      # )c              3   óê   "  € T Fi  p\        V\        4      '       g   K  VP                  R 4      \        8X  g   K7  \        VP                  R4      \        4      '       g   K^  VR,          x € Kk  	  R# 5i)rš  rÓ  N)rì   r   r$   ÚCONVERSE_ISSUER_TYPEr   )r3   rd  s   & r   r5   Ú_issuer.<locals>.<genexpr>z  s]   é € ð wÑ%G Ü˜q¤$×'ô Ø,-¯E©E°&«MÔ=QÑ,Qô ÜV`Ðab×afÑafÐgnÓaoÔqt×Vuô ��7—’Ó%Gùs   ‚A3ŸA3»"A3Á"A3rb  N)r¨  r$   )r"  s   &r   Ú_issuerrp  y  s7   € Üñ w S§W¡WÐ-@Ó%A×%GÐ%GÀRÐ%Gó wØx|ó~ð ~r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   rÓ  r   ©r	   r   )r   s   "r   r   r   ~  s"   € ÷ 
añ 
a¤8¬C¥=ð 
a´Sñ 
ar   c                 óº  a€ V f   R# \         P                  V 4      '       d   \        V 4      p V P                  4       oRS9   d   R# \        ;QJ d#    V3R l\
         4       F  '       g   K   RM	  RM! V3R l\
         4       4      '       d   R# \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d   R# R	# )
NÚsignedr^  c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir/   rY   ©r3   Úpr©  s   & €r   r5   Ú*_converse_replay_policy.<locals>.<genexpr>†  s   øé € Ð
BÑ!A˜A�Ž<Ó!Aùó   ƒTFÚissuerc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir/   rY   rv  s   & €r   r5   rx  ˆ  s   øé € ÐPÑ0O¨1˜wž,Ó0Oùry  r%   Úunsigned)r•  rS  r–  r1   r  Ú _CONVERSE_REPLAY_ISSUER_PATTERNSÚ_CONVERSE_REPLAY_STRIP_PATTERNS)rÓ  r©  s   &@r   Ú_converse_replay_policyr  ~  s�   ø€ Ø‚}ÙÜ"×)Ñ)¨%×0Ò0Ü3°EÓ:ˆØ�k‰k‹m€GØ�7ÔÙß
ƒsÔ
BÕ!AÓ
B‡s‡s‚sÔ
BÕ!AÓ
B×BÒBÙß“cÔPÕ0OÓP—c—c’cÔPÕ0OÓP×PÒPˆ7Ð`ÐV`Ð`r   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r   r4  r   ©r   r	   )r   s   "r   r   r   ‹  s"   € ÷ wñ wœtð w¬´­ñ wr   c                 ó  € V P                  R 4      p\        V\        4      '       g   V # VP                  R4      ;'       g    / P                  R4      p\        V\        4      '       d   VP	                  4       '       d	   R RRV///# R# )r×  r1  r÷  N)r$   rì   r   r   r%   )r4  r5  r÷  s   &  r   Ú_unsigned_reasoningr„  ‹  s|   € Ø—	‘	Ð,Ó-€IÜ�i¤×&Ò&ØˆØ�M‰M˜/Ó*×0Ð0¨b×5Ñ5°fÓ=€DÜFPÐQUÔWZ×F[ÒF[Ð`d×`jÑ`j×`lÒ`lÐ °6¸4°.Ð AÐBÐvÐrvÐvr   c                ó0   € V ^8„  d   QhR\         R\         /# r�  r  )r   s   "r   r   r   “  s   € ÷ ñ ”Tð œdñ r   c                 ó   € V # r/   rY   ©r4  s   &r   Ú	_verbatimrˆ  “  s   € Ø€Lr   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# r�  r‚  )r   s   "r   r   r   —  s   € ÷ :ñ :œdð :¤x´¥~ñ :r   c                 ó   € R V 9   d   R# T # )r×  NrY   r‡  s   &r   Ú_without_reasoningr‹  —  s   € Ø%¨Ô.ˆ4Ð9°EÐ9r   rt  r%   r|  rz  c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# r¼  rç  )r   s   "r   r   r   £  s&   € ÷ Dñ Dœd¤4�jð D´4¼µ:ñ Dr   c                 óL   € \        W4       Uu. uF
  q"f   K  VNK  	  up# u upi r/   )Úmap)r½  ÚkeepÚkepts   && r   Ú_filter_reasoningr‘  £  s#   € Ü  Ô.ÓCÑ.�T�DˆDÑ.ÑCÐCùÒCs   Ž!˜!c                ó^   € V ^8„  d   QhR\         R\        \         ,          R\        R\        /# )r   Úpolicyrz  r_  Úin_loop)r   r	   rt   )r   s   "r   r   r   §  s-   € ÷ &ñ &œcð &¬8´C­=ð &¼tð &ÔQUñ &r   c               ó¼   € \         V ,          w  rEV'       d   V'       g   V R9   d   \        # T# Ve    V R8X  d   \        V4      R8w  d   \        # T# V'       d   V# T# )aP  Which reasoning one assistant turn may replay to the model now answering. A turn stamped by ANOTHER
model (fallback or ``/model`` switch, including mid tool loop) loses the in-flight loop's verbatim replay:
sealed ``redactedContent`` opens only for its issuer, and Claude rejects another family's blobs outright
(``Invalid `data` in `redacted_thinking` block``), so a non-Claude turn replays no reasoning to Claude.
Unstamped turns (older sessions) keep the policy, and the rejection-driven resend covers them; under
``issuer`` only the answering model's own stamped turns keep any reasoning.rt  )r|  rz  )Ú_REASONING_FILTERSrˆ  r  r‹  )r“  rz  r_  r”  ÚpriorÚloops   &&&$  r   Ú_reasoning_filterr™  §  s^   € ô % VÕ,�K€Eß
ß# vÐ1GÔ'GŒyÐRÈUÐRØÒØ%+¨xÔ%7Ô<SÐTZÓ<[Ð_gÔ<gÔ!ÐrÐmrÐrßˆ4Ð% Ð%r   c          	      óÌ   € V ^8„  d   QhR\         \        ,          R\        \        ,          R\        \        \         \        ,          ,          \         \        ,          3,          /# )r   r¦  rÓ  r   )r�   r   r	   r   rE   )r   s   "r   r   r   ¶  sC   € ÷ (2ñ (2Ü”4�jð(2Ü!)¬#¥ð(2ä
Œ8”Dœ•JÕ¤¤d¥Ð+Õ,ñ(2r   c                óZ  a a€ \        V4      p\        V 3R l\        \        S 4      ^,
          RR4       4       R4      p. p. oR V3R llp\	        S 4       EFB  w  rgVP                  RR4      pVP                  R4      p	VR8X  d   VP                  \        V	4      4       KL  VR8X  d]   \        V	\        4      '       d   T	M\        P                  ! V	4      p
V! R	R
RVP                  RR4      RR\        V
4      /.//.4       K¯  VR8X  dq   Ve   \        V4      MRpVRJ;'       d    W±8H  p\        W+WÆV8¬  R7      p\        \!        WyVR8H  VR7      V4      pT! RT;'       g    \#        \$        4      .4       EK&  VR	8X  g   EK0  V! R	\'        V	4      4       EKE  	  S'       d:   S^ ,          R,          R	8w  d%   SP)                  ^ RR	R\#        \$        4      ./4       S'       d9   SR,          R,          R	8w  d$   SP+                  RR	R\#        \$        4      ./4       T;'       g    RS3# )u„  OpenAI messages â†’ ``(system_blocks_or_None, converse_messages)``; tool results become ``toolResult``
user blocks. Converse needs strict user/assistant alternation with a user turn first and last:
same-role neighbours merge, placeholder user turns pad the ends. ``model`` selects the reasoning
replay policy for turns before the in-flight tool loop (None replays every carrier verbatim).c              3   óf   <"  € T F&  pSV,          P                  R 4      R8X  g   K"  Vx € K(  	  R# 5i)ÚroleÚuserNrë  )r3   Úir¦  s   & €r   r5   Ú/convert_messages_to_converse.<locals>.<genexpr>¿  s+   øé € ÐhÑ"B˜QÀhÈqÅkÇoÁoÐV\ÓF]ÐagÑFg—q’qÓ"Bùs   ƒ1§
1c                óJ   € V ^8„  d   QhR\         R\        \        ,          RR/# )r   r�  r½  r   N)r   r�   r   )r   s   "r   r   Ú2convert_messages_to_converse.<locals>.__annotate__Ã  s*   € ÷ Dñ Dœ#ð D¤t¬D¥zð D°dñ Dr   c                 ó®   <€ S'       d7   SR,          R,          V 8X  d"   SR,          R,          P                  V4       R# SP                  RV RV/4       R# )é   r�  rÓ   Nr  )ri  r  )r�  r½  Úconverse_msgss   &&€r   Úappend_turnÚ1convert_messages_to_converse.<locals>.append_turnÃ  sF   ø€ ß˜]¨2Õ.¨vÕ6¸$Ô>Ø˜"Õ˜iÕ(×/Ñ/°Ö7à× Ñ  &¨$°	¸6Ð!BÖCr   r�  r   rÓ   r¥  Útoolrž  Ú
toolResultr   Útool_call_idr÷  Ú	assistantN)r”  rt  )r^  r_  r  )r  r¨  ÚrangerÀ  Ú	enumerater$   ri  r  rì   r   rñ  Údumpsrû  rp  r™  r‘  rj  r   r  r  Úinsertr  )r¦  rÓ  r“  Ú
loop_startÚsystem_blocksr¦  Úidxr"  r�  rÓ   Úresult_contentrz  r_  r�  r½  r¥  s   f&             @r   Úconvert_messages_to_converser´  ¶  s  ù€ ô % UÓ+€FäÔh¤%¬¨H«¸Õ(9¸2¸rÔ"BÓhÐjlÓm€JØ "€MØ "€M÷Dð Dô ˜h×'‰ˆØ�w‰w�v˜rÓ"ˆØ—'‘'˜)Ó$ˆØ�8ÔØ× Ñ ¤°Ó!8Ö9Ø�VŒ^Ü(2°7¼C×(@Ò(@™WÄdÇjÂjÐQXÓFYˆNÙ˜ ,Ø˜SŸW™W ^°RÓ8¸)ÀvÌzÐZhÓOiÐFjÐEkð1mð "nð !oö pà�[Ô Ø%*Ò%6”W˜S”\¸DˆFØ Ð$×8Ð8¨©ˆCÜ$ V°SÈÑBSÔTˆDÜ&Ô'8¸ÈfÐX`ÑN`ÐfiÔ'jÐlpÓqˆFÙ˜ V×%IÐ%I´Ô5GÓ0HÐ/I×JØ�V�^Ù˜Ô <¸WÓ E×Fñ! (÷" ˜ qÕ)¨&Õ1°VÔ;Ø×Ñ˜Q ¨°¼TÔBTÓ=UÐ<VÐ WÔXß˜ rÕ*¨6Õ2°fÔ<Ø×Ñ˜f f¨i¼$Ô?QÓ:RÐ9SÐTÔUØ×!Ð!˜T =Ð1Ð1r   Úend_turnÚstopÚstop_sequencerR  Ú
max_tokensÚlengthÚcontent_filteredÚcontent_filterÚguardrail_intervenedc                ó:   € V ^8„  d   QhR\         \        ,          /# r   rr  )r   s   "r   r   r   ê  s   € ÷ ;ñ ;¤(¬3¥-ñ ;r   c                óÊ   € \        V \        \        34      '       d/   \        P                  ! \        V 4      4      P                  R4      # \        V \        4      '       d   V # R# )uY   Redacted reasoning payload â†’ base64 str (bytes encoded, str passed through, else None).ÚasciiN)rì   r  Ú	bytearrayr  Ú	b64encodeÚdecoder   )r7  s   &r   Ú_encode_redactedrÃ  ê  sK   € ä�(œU¤IÐ.×/Ò/Ü×Ò¤ h£Ó0×7Ñ7¸Ó@Ð@Ü! (¬C×0Ò0ˆ8Ð:°dÐ:r   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   r#  r  r   )r   r   )r   s   "r   r   r   ñ  s!   € ÷ ñ œsð ¬#ð ¼oñ r   c           
      ó\   € \        V R \        V\        P                  ! V4      R7      R7      # )rê  )r  rS  )r„  rš  rê  )r   rñ  r®  r"  s   &&&r   Ú_tool_call_nsrÆ  ñ  s*   € ÜØ˜Z´/ÀtÔW[×WaÒWaÐblÓWmÔ2nôð r   c                ó    € V ^8„  d   QhR\         \        \        \        3,          ,          R\         \        \        \        3,          ,          /# r-  )r�   r   r   r   )r   s   "r   r   r   ÷  s7   € ÷ ñ ´´d¼3Ä¸8µnÕ1Eð Ì$ÌtÔTWÔY\ÐT\Í~ÕJ^ñ r   c                 óð  € . pV  Fí  p\        V\        4      '       d   VP                  R 4      MRp\        V\        4      '       g   KD  \        VP                  R4      \        4      '       dP   VR,          '       dA   TP	                  RRRVR,          /VP                  R4      '       d   RVR,          /M/ C4       VP                  R4      '       g   KÑ  VP	                  RRRVR,          /4       Kï  	  V# )	r×  Nr÷  rš  rF  r0  r2  rJ  rÊ   )rì   r   r$   r   r  )r.  Údetailsr4  r5  s   &   r   Ú_persisted_reasoning_detailsrÊ  ÷  s×   € Ø$&€GÛˆÜ5?ÀÄt×5LÒ5L�E—I‘IÐ0Ô1ÐRVˆ	Ü˜)¤T×*Ò*ÙÜ�i—m‘m FÓ+¬S×1Ò1°iÀ×6GÔ6GØ�N‰N˜F J°
¸IÀfÕ<Mð mØHQÏÉÐVa×HbÒHb ¨Y°{Õ-CÑDÐhjðmô nà�=‰=Ð0×1Ô1Ø�N‰N˜FÐ$7¸ÀÐKbÕAcÐdÖeñ  ð €Nr   c                   ó^   a € ] tR tRt o RtV 3R lR ltRV 3R lR lltV 3R lR	 ltR
tV t	R# )Ú_ResponsePartsi  z9Accumulator shared by the sync and streaming normalizers.c                ó   <€ V ^8„  d   QhRR/# r¸  rY   )r   r½   s   "€r   r   Ú_ResponseParts.__annotate__  s   ø€ ÷ 4ñ 4˜$ñ 4r   c                ó0   € . V n         . V n        . V n        R # r/   )Ú
text_partsrb  rR  )rÁ   s   &r   rÂ   Ú_ResponseParts.__init__  s   € Ø%'ˆŒØ79ˆÔØ13ˆŽr   Nc                ó@   <€ V ^8„  d   QhRS[ RS[S[S[ 3,          RR/# )r   r5  r4  r   N)r   r   r   )r   r½   s   "€r   r   rÎ    s+   ø€ ÷ 5ñ 5©#ð 5±d¹3Á¸8µnð 5ÐW[ñ 5r   c                ó\  € \        V\        4      '       g   R# \        VP                  R4      \        4      '       d   / VCVR,          CpVP                  RR4      pV'       d6   V'       d	   V! V4       VP                  RR4      \        V4      ,           VR&   VP                  R4      p\        V\        4      '       d%   V'       d   VP                  RR4      V,           VR&   \	        VP                  R4      4      pV'       d&   V P
                  P                  RRR	V/4       WbR
&   R# R# )zÂFold a Converse ``reasoningContent`` payload into the accumulators and ``block``. The sync response
nests ``reasoningText: {text, signature}``; stream deltas carry ``text`` / ``signature`` flat.Nr1  r÷  r   r0  rØ  rš  rJ  rÊ   r2  )rì   r   r$   r   rÃ  rb  r  )rÁ   r5  r4  Úon_textÚthinking_textr0  r*  s   &&&&   r   Úabsorb_reasoningÚ_ResponseParts.absorb_reasoning  sõ   € ô ˜)¤T×*Ò*ÙÜ�i—m‘m OÓ4´d×;Ò;ØC˜9ÐC¨	°/Õ(BÐCˆIØ!Ÿ™ f¨bÓ1ˆßßÙ˜Ô&Ø!ŸI™I f¨bÓ1´C¸Ó4FÕFˆE�&‰MØ—M‘M +Ó.ˆ	Ü�i¤×%Ò%¯)Ø!&§¡¨;¸Ó!;¸iÕ!GˆE�+ÑÜ" 9§=¡=Ð1BÓ#CÓDˆßØ×"Ñ"×)Ñ)¨6Ð3FÈÐPWÐ*XÔYØ-4Ð)Ó*ñ r   c          
      ót   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[S[S[3,          RS[RS[RS[/# )r   r.  Ú
usage_dataÚstop_reasonrÓ  r   )r�   r   r   r   r:   r   )r   r½   s   "€r   r   rÎ  !  sM   ø€ ÷ 
ñ 
¡D©©c±3¨h­Õ$8ð 
ÁdÉ3ÑPSÈ8Ånð 
Ñcfð 
Ñorð 
ñ  xGñ 
r   c                ó.  a€ \        RV P                  '       d   RP                  V P                  4      MRV P                  ;'       g    R\	        V4      ;'       g    V P
                  ;'       g    RV Uu. uFZ  p\        VP                  R4      \        4      '       g   K*  VR,          P                  R4      '       g   KJ  VR,          R,          NK\  	  up;p'       d   RP                  V4      MRT;'       g    RR7      pV3R lR 4       w  r‰p
SP                  R	^ 4      V,           V	,           p\        WºWº,           W‰R
7      p\        P                  VR4      pV P                  '       d
   VR8X  d   Rp\        \        ^ W}R7      .WÄR7      # u upi )a"  Assemble the OpenAI-shaped response. Converse's inputTokens EXCLUDES cache read/write tokens
(OpenAI's prompt_tokens includes them), so they are added back. ``reasoning_details`` carries every
reasoning block in Anthropic shape (signed thinking included) because it is the persisted column.r«  Ú
Nr×  r÷  z

)r�  rÓ   rR  rb  rc  rh  c              3   óH   <"  € T F  pSP                  V^ 4      x € K  	  R# 5i)rÅ   Nrë  )r3   rÙ   rÙ  s   & €r   r5   Ú'_ResponseParts.build.<locals>.<genexpr>-  s$   øé € ð @
Ù*k QˆJ�N‰N˜1˜a× Ð Ó*kùrŽ  ÚinputTokens)Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚcache_read_input_tokensÚcache_creation_input_tokensr¶  rR  )ÚindexÚmessageÚfinish_reason)ÚchoicesÚusagerÓ  )ÚcacheReadInputTokensÚcacheWriteInputTokensÚoutputTokens)
r   rÐ  ÚjoinrR  rÊ  rb  rì   r$   r   Ú_STOP_REASON_TO_FINISH_REASON)rÁ   r.  rÙ  rÚ  rÓ  rÂ  r  r"  Úcache_read_tokensÚcache_write_tokensÚoutput_tokensrà  ré  rç  s   &&f&&         r   ÚbuildÚ_ResponseParts.build!  sy  ø€ ô ØÀDÇOÇOÀO d§i¡i°·±Ô&@ÐY]Ø—‘×.Ð.¨$Ü:¸>ÓJ×lÐlÈd×NdÑNd×lÐlÐhlÙftó ?fÑftÐabÜ˜aŸe™eÐ$6Ó7¼×>ô @]ØCDÐEWÕCX×C\ÑC\Ð]c×Cdô @]¸qÐASÕ?TÐU[×?\Ð?\Ñftñ ?fð 6f°Uö 6f˜fŸk™k¨%Ô0ØlpØ#1×#9Ð#9°Tô
ˆô@
Ù*kó@
Ñ<Ð¨}ð #Ÿ™ }°aÓ8Ð;LÕLÐOaÕaˆÜØ'ÐWdÕWtØ$5ô
ˆô 6×9Ñ9¸+ÀvÓNˆØ�?�?ˆ?˜}°Ô6Ø(ˆMÜÜ$¨1°cÔWÐXÐ`eô
ð 	
ùò?fs   Á7'FÂ#FÃF)rb  rÐ  rR  r/   )
rÞ   rß   rà   rá   râ   rÂ   rÖ  rò  rä   rå   ræ   s   @r   rÌ  rÌ    s&   ø‡ € ÙC÷4ð 4÷
5ò 5÷(
ö 
r   rÌ  c                ó0   € V ^8„  d   QhR\         R\        /# rk  )r   r   )r   s   "r   r   r   =  s   € ÷ ñ ¬$ð ´?ñ r   c                óŠ  € \        4       p. pV P                  R/ 4      P                  R/ 4      P                  R. 4       EF>  pRV9   d?   VP                  P                  VR,          4       VP                  RVR,          /4       KI  RV9   d;   / pVP	                  VR,          V4       V'       d   VP                  RV/4       Kˆ  KŠ  RV9   g   K“  VR,          pVP                  \        VP                  RR4      VP                  R	R4      VP                  R
/ 4      4      4       VP                  P                  \        VP                  RR4      VP                  R	R4      VP                  R
/ 4      4      4       EKA  	  VP                  W P                  R/ 4      V P                  RR4      V P                  RR4      4      # )uÙ   Bedrock Converse response â†’ OpenAI ``ChatCompletion``-shaped SimpleNamespace (``.choices[0].message.
{content,tool_calls,reasoning_content,reasoning_details,bedrock_content_blocks}``, ``finish_reason``, ``.usage``).Úoutputræ  rÓ   r÷  r×  r  r   r   r  r!  ré  Ú
stopReasonrµ  rÒ  )	rÌ  r$   rÐ  r  rÖ  r%  rR  rÆ  rò  )r  r  r.  r4  Úordered_reasoningr8  s   &     r   Únormalize_converse_responserù  =  s�  € ô Ó€EØ€NØ—‘˜h¨Ó+×/Ñ/°	¸2Ó>×BÑBÀ9Èb×QˆØ�UŒ?Ø×Ñ×#Ñ# E¨&¥MÔ2Ø×!Ñ! 6¨5°­=Ð"9Ö:Ø 5Ô(Ø02ÐØ×"Ñ" 5Ð);Õ#<Ð>OÔPß Ø×%Ñ%Ð'9Ð;LÐ&MÖNñ !à˜%ÖØ�yÕ!ˆBØ×!Ñ!¤/°"·&±&¸ÀbÓ2IÈ2Ï6É6ÐRXÐZ\ÓK]Ð_a×_eÑ_eÐfmÐoqÓ_rÓ"sÔtØ×Ñ×#Ñ#¤M°"·&±&¸ÀbÓ2IÈ2Ï6É6ÐRXÐZ\ÓK]Ð_a×_eÑ_eÐfmÐoqÓ_rÓ$s×tñ Rð �;‰;ØŸ™ W¨bÓ1°8·<±<ÀÈjÓ3YÐ[c×[gÑ[gÐhqÐsuÓ[vóð r   c                ó$   € V ^8„  d   QhR\         /# r   r   )r   s   "r   r   r   V  s   € ÷ 8ñ 8´oñ 8r   c                ó   € \        V 4      # )ui   Consume a ConverseStream event stream (no callbacks) â†’ same shape as ``normalize_converse_response()``.)Ústream_converse_with_callbacks)Úevent_streams   &r   Ú normalize_converse_stream_eventsrþ  V  s   € ä)¨,Ó7Ð7r   c                ó$   € V ^8„  d   QhR\         /# r   r   )r   s   "r   r   r   [  s   € ÷ Yuñ Yuô ñYur   c           	     ó¦  aaaa€ \        4       o/ oRoRp. oRpRpRp	/ p
RR/R VV3R lllpR VV3R llpV P                  R. 4       EFŒ  pVe(   \        \        4      ;_uu_ 4        V! 4        RRR4       V'       d   V! 4       '       d   R	p	 EMHR
V9   d©   VR
,          pV! VR	R7      ;poVP                  R/ 4      pRV9   dy   R	pV! 4        RVR,          P                  RR4      RVR,          P                  RR4      RR/p\	        VR,          VR,          / 4      SV&   V'       d   V! VR,          4       Kô  Kö  Kø  RV9   EdŠ   VR,          pV! V4      ;poVP                  R/ 4      pRV9   dl   VR,          pSP                  VRR/4      pVP                  RR4      V,           VR&   SP                  V4       V'       d   V'       g   V! V4       EK‘  EK”  EK—  RV9   d4   Ve0   VR;;,          VR,          P                  RR4      ,          uu&   EKÑ  RV9   d¯   VR,          p\        V\        4      '       d�   VP                  RR4      '       g8   VP                  R4      '       g!   \        VP                  R4      4      '       d;   SP                  VR/ /4      P                  R/ 4      pSP                  VVV4       EK€  EKƒ  EK†  EK‰  RV9   d•   V! VR,          4      pRoVev   \        VR,          4      pSP                  P                  \        VR,          VR,          V4      4       RSP                  V/ 4      9   d   VSV,          R,          R&   RpEK  V! 4        EK$  RV9   d   VR,          P                  RR4      pEKG  RV9   g   EKQ  VR,          P                  R/ 4      pR  Uu/ uF  pVVP                  V^ 4      bK  	  p
pEK�  	  Vf   V	'       g   \        R4      hV! 4        SP                  \!        S4       Uu. uF  pSV,          NK  	  upY¨;'       g    RR4      #   + '       g   i     ELÎ; iu upi u upi )!uC  boto3 ``converse_stream()`` response + callbacks â†’ the ``normalize_converse_response()`` shape.
``on_text_delta`` only fires while no toolUse block has been seen (as on the Anthropic/chat_completions
paths); ``on_interrupt_check`` True stops streaming; ``on_event`` fires for EVERY event before branching
and its exceptions are swallowed so a watchdog hook can never abort the stream.

Blocks are keyed by the ``contentBlockIndex`` Bedrock stamps on every contentBlockStart/Delta/Stop:
text blocks get NO contentBlockStart, so a counter keyed on starts shredded them (#108200).NFÚ	new_blockc                ó^   € V ^8„  d   QhR\         \        \        3,          R\        R\        /# )r   Úpayloadr  r   )r   r   r   rt   r:   )r   s   "r   r   Ú4stream_converse_with_callbacks.<locals>.__annotate__p  s.   € ÷ gñ gœT¤#¤s (�^ð g¼4ð gÌCñ gr   c               óˆ   <€ V P                  R4      p\        V\        4      '       d   V# V'       g   Sf   \        S4      # S# )z°Index of the block a contentBlock* event addresses. Without ``contentBlockIndex`` (test doubles,
proxies) a start opens a fresh slot and a delta/stop continues the current one.ÚcontentBlockIndex)r$   rì   r:   rÀ  )r  r  r²  Úcurrent_block_indexÚstream_blockss   &$ €€r   Úblock_indexÚ3stream_converse_with_callbacks.<locals>.block_indexp  s?   ø€ ð �k‰kÐ-Ó.ˆÜ�cœ3×ÒØˆJß%.Ð2EÒ2MŒs�=Ó!ÐfÐSfÐfr   c                ó   € V ^8„  d   QhRR/# r¸  rY   )r   s   "r   r   r  x  s   € ÷ (ñ (˜ñ (r   c                  ó�   <€ S '       d=   SP                   P                  R P                  S 4      4       S P                  4        R# R# rÀ   )rÐ  r  rí  rm   )Úcurrent_text_bufferr  s   €€r   Ú
flush_textÚ2stream_converse_with_callbacks.<locals>.flush_textx  s5   ø€ ßØ×Ñ×#Ñ# B§G¡GÐ,?Ó$@ÔAØ×%Ñ%Ö'ñ r   ÚstreamTÚcontentBlockStart)r  Ústartr  r   r   r  Ú
input_jsonÚcontentBlockDeltaÚdeltar÷  r!  r×  r0  rØ  ÚcontentBlockStopÚmessageStopr÷  rµ  Úmetadataré  zHBedrock Converse stream ended before messageStop; response is incomplete)rß  rì  rê  rë  )rÌ  r$   r   r@   r%  r¯  r  rì   r   rÃ  rÖ  r?  rR  rÆ  r   rò  Úsorted)rý  Úon_text_deltaÚon_tool_startÚon_reasoning_deltaÚon_interrupt_checkÚon_eventÚcurrent_toolÚhas_tool_userÚ  ÚinterruptedrÙ  r	  r  ÚeventÚstart_eventr²  r  Údelta_eventr  r÷  r4  r5  r$  Ú
meta_usager]   rŸ  r  r  r  r  s   &&&&&&                    @@@@r   rü  rü  [  se  û€ ô Ó€EØ/1€MØ)-ÐØ#'€LØ%'ÐØ€LØ€KØ€KØ!#€JðgÀ%÷ gó g÷(ñ (ð
 ×!Ñ! (¨B×/ˆØÒÜœ)×$Õ$Ù”
÷ %çÑ"4×"6Ò"6ØˆKÚØ %Ô'ØÐ 3Õ4ˆKÙ(3°KÈ4Ô(PÐPˆCÐ%Ø—O‘O G¨RÓ0ˆEØ˜EÔ!Ø#�Ù”Ø +¨U°9Õ-=×-AÑ-AÀ+ÈrÓ-RÐTZÐ\aÐbkÕ\l×\pÑ\pÐqwÐy{Ó\|ð  Kð  MOð   P�Ü%4°\À+Õ5NÐP\Ð]cÕPdÐfhÓ%i�˜cÑ"ß Ù! ,¨vÕ"6Ö7ñ !ñ "ð ! EÕ)ØÐ 3Õ4ˆKÙ(3°KÓ(@Ð@ˆCÐ%Ø—O‘O G¨RÓ0ˆEØ˜ŒØ˜V•}�Ø%×0Ñ0°°v¸r°lÓC�Ø %§	¡	¨&°"Ó 5¸Õ <��f‘Ø#×*Ñ*¨4Ô0ß ¯Ù! $×'ò *6’=à˜eÔ#¨Ò(@Ø˜\×*¨e°IÕ.>×.BÑ.BÀ7ÈBÓ.OÕOÖ*Ø# uÔ,Ø!Ð"4Õ5�	Ü˜i¬×.Ò.°I·M±MÀ&È"×4MÒ4MÐQZ×Q^ÑQ^Ð_j×QkÒQkÔoð  AJ÷  ANñ  ANð  O`ó  Aa÷  pbò  pbØ)×4Ñ4°SÐ;MÈrÐ:RÓS×^Ñ^Ð_qÐsuÓv�EØ×*Ñ*¨9°eÐ=O×Pò pbÒ.ò -ð
   5Ô(Ù˜eÐ$6Õ7Ó8ˆCØ"&ÐØÒ'Ü-¨l¸<Õ.HÓI�
Ø× Ñ ×'Ñ'¬°lÀ;Õ6OÐQ]Ð^dÕQeÐgqÓ(rÔsØ × 1Ñ 1°#°rÓ :Ô:Ø=G�M #Õ& yÕ1°'Ñ:Ø#“á—Ø˜eÔ#Ø Õ.×2Ñ2°<ÀÓL‹KØ˜5× Ø˜zÕ*×.Ñ.¨w¸Ó;ˆJñ BRó  Sñ  BR¸#˜#˜zŸ~™~¨c°1Ó5Ò5ñ  BRˆJð  SŠJñg 0ðh Ò§;ÜÐiÓjÐjÙ„LØ�;‰;´&¸Ô2GÓHÑ2G¨Q˜ a×(Ð(Ñ2GÑHÈ*×VoÐVoÐeoÐqsÓtÐt÷k %×$Ð$üòb Sùò Is   Á(P5Î7Q	ÐQÐ5Qc          
      ó€   € V ^8„  d   QhR\         R\        R\        \        ,          R\        \        \        3,          /# ©r   rÓ  Úreasoning_configr¸  r   ©r   r   r	   r:   rE   )r   s   "r   r   r   ¹  s:   € ÷ ñ ¤cð ¼Tð ÌxÔX[Í}ð ÔafÔgkÔmqÐgqÕarñ r   c                óx  € ^ RI Hp T! YT;'       g    ^ 4      pR Uu/ uF  qUV9   g   K  WTV,          bK  	  pp/ pVP                  R4      ;'       g    / P                  R4      R8X  dJ   RV P                  4       9  d   R.VR&   VP                  R^4      VR&   Ve   VP                  R	V4      VR
&   Wg3# u upi )a+  Claude thinking over Converse: the same ``thinking``/``output_config`` the AnthropicBedrock path sends,
carried in ``additionalModelRequestFields`` (AWS: "pass the thinking and effort parameters inside
additionalModelRequestFields"); manual budgets also need temperature 1 and room above the budget.)Ú_thinking_kwargsrF  rš  rg  zclaude-3zinterleaved-thinking-2025-05-14Úanthropic_betaÚtemperaturer¸  Ú	maxTokens)rF  Úoutput_config)r~  r+  r$   r1   )rÓ  r(  r¸  r+  rF  rÙ   ÚfieldsÚ	inferences   &&&     r   Ú_claude_converse_reasoningr2  ¹  sÀ   € õ 9áÐ 0¸¿¸ÀqÓI€HÙ&CÓUÑ&C ÈHÁ}Œnˆa˜!•ŠnÑ&C€FÐUØ "€IØ�
‰
�:Ó×$Ð$ "×)Ñ)¨&Ó1°YÔ>Ø˜UŸ[™[›]Ô*Ø(IÐ'JˆFÐ#Ñ$Ø#+§<¡<°¸qÓ#Aˆ	�-Ñ ØÒ!Ø%-§\¡\°,À
Ó%KˆI�kÑ"ØÐÐùò Vs
   žB7«B7ÚminimalÚlowÚmediumc          
      ó€   € V ^8„  d   QhR\         R\        R\        \        ,          R\        \        \        3,          /# r'  r)  )r   s   "r   r   r   Î  s:   € ÷ ñ ¤Cð ¼4ð ÌXÔVYÍ]ð Ô_dÔeiÔkoÐeoÕ_pñ r   c                óâ   € VP                  R4      RJ d   / / 3# \        P                  \        VP                  RR4      4      P                  4       R4      pRRRRV//VR8X  d
   R	R
RR
RR
/3# / 3# )zcNova 2 ``reasoningConfig`` (off by default). At ``high``, temperature/topP/maxTokens must be unset.rg  FÚeffortr5  ÚhighÚreasoningConfigrš  ÚmaxReasoningEffortr-  NÚtopPr.  )r$   Ú_NOVA_EFFORTr   r1   )rÓ  r(  r¸  r8  s   &&& r   Ú_nova_converse_reasoningr>  Î  s�   € à×Ñ˜IÓ&¨%Ó/Ø�2ˆvˆÜ×ÑœcÐ"2×"6Ñ"6°xÀÓ"JÓK×QÑQÓSÐU[Ó\€FØ ¨	Ð3GÈÐPÐQØBHÈFÔBRˆ˜˜f d¨K¸Ð>ðð ØXZðð r   c                 ó(   € R V P                  4       9   # )zamazon.nova-2-liter0   ©rÓ  s   &r   rI  rI  Ú  s   € Ð'¨5¯;©;«=Ò8r   c          
      óL   € V ^8„  d   QhR\         R\         R\        R\         RR/# )r   r*   Úinference_configrÓ  r(  r   Nr   )r   s   "r   r   r   Þ  s1   € ÷ *ñ *¤dð *¼dð *Ì3ð *Ôbfð *Ðw{ñ *r   c                 óà   a€ \        V3R  l\         4       R4      pVf   R# V! SW44      w  rgV'       d   W`R&   VP                  4        F!  w  r‰V	f   VP                  VR4       K  W‘V&   K#  	  R# )c              3   ó`   <"  € T F#  w  rT! S;'       g    R 4      '       g   K  Vx € K%  	  R# 5irÀ   rY   )r3   ÚmatchesrÂ  rÓ  s   &  €r   r5   Ú,_apply_converse_reasoning.<locals>.<genexpr>ß  s(   øé € Ð]Ñ(D™*˜'ÉÐPU×P[ÐP[ÐY[×H\—A’AÓ(Dùs   ƒ.•
.¤
.NÚadditionalModelRequestFields)r¨  Ú_CONVERSE_REASONING_BUILDERSrÒ   rv   )
r*   rB  rÓ  r(  r¸  Úbuilderr0  r1  r]   Úvalues
   &&f&&     r   Ú_apply_converse_reasoningrK  Þ  sk   ø€ ÜÔ]Õ(DÓ]Ð_cÓd€GØ‚ÙÙ Ð'7ÓDÑ€FßØ17Ð-Ñ.Ø—o‘oÖ'‰
ˆØŠ=Ø× Ñ   dÖ+à$)˜SÓ!ó	 (r   c                óš  € V ^8„  d   QhR\         R\        \        ,          R\        \        \        ,          ,          R\        \        ,          R\        \
        ,          R\        \
        ,          R\        \        \         ,          ,          R\        \        ,          R	\        \        ,          R
\        R\        \         \        3,          /# )r   rÓ  r¦  r¡  r¸  r-  Útop_pÚstop_sequencesÚguardrail_configr(  Úprompt_cacher   )r   r�   r   r	   r:   ré   rt   r   )r   s   "r   r   r   ì  s¥   € ÷ )ñ )Üð)Üœt�*ð)Ü-5´d¼4µjÕ-Að)ÜV^Ô_bÕVcð)äœ%•ð)ä08¼µð)ô œT¤#�YÕ'ð)ô CKÌ4Å.ð)ô œt•nð	)ô <@ð	)ô
 
Œ#Œsˆ(…^ñ)r   c
                óx  € \        WR7      w  r«V	'       d;   \        V 4      '       d*   \         Uu0 uF  p\        W4      '       g   K  VkK  	  upM	\	        4       pVf   / MRV/pRV RVRV/pV
'       d$   RV9   d   V
\        \        4      .,           MT
VR&   ^ RIHp V! V 4      '       gY   \        P                  T ;'       g    R4      '       g4   TP                  R	V3R
V33 UUu/ uF  w  ppVf   K  VVbK  	  upp4       V'       d   WnR&   V'       d   \        V4      M. pV'       d)   \        V 4      '       g   \        P                  RV 4       M-V'       d&   RRV9   d   V\        \        4      .,           MT/VR&   RV9   de   \!        V4      ^8¼  dU   VR,          P#                  R4      p\%        V\&        4      '       d'   V'       d   VP)                  \        \        4      4       V'       d   WR&   V'       d$   \%        V\
        4      '       d   \+        WþWV4       V'       g   VR V# u upi u uppi )uþ  Build kwargs for ``bedrock-runtime.converse()`` / ``converse_stream()``. ``max_tokens=None`` omits
``maxTokens`` (model maximum; default stays 4096). cachePoint markers go on system, tools and the
second-newest message (survives as the tail grows â€” mirrors Anthropic system_and_3), each only if the
model supports caching and Bedrock has not rejected that placement. ``reasoning_config`` becomes the
model's ``additionalModelRequestFields`` reasoning switch (Claude ``thinking``, Nova 2 ``reasoningConfig``).r@  r.  rÒ  r¦  ÚinferenceConfigr¥  )Ú_forbids_sampling_paramsr   r-  r<  ÚstopSequencesud   Model %s does not support tool calling â€” tools stripped. The agent will operate in text-only mode.r¡  rË  rÓ   ÚguardrailConfigéþÿÿÿ)r´  r˜  r­  r¶  r°  r   Ú_CACHE_POINTr~  rS  Ú _BEDROCK_XAI_GROK_NO_SAMPLING_REr¡   rÖ   rö  r�  rA   rB   rÀ  r$   rì   r�   r  rK  )rÓ  r¦  r¡  r¸  r-  rM  rN  rO  r(  rP  Úsystem_promptÚconverse_messagesrw  Úcache_atrB  r*   rS  rÙ   rÚ   Úconverse_toolsrÓ   s   &&&&&&&&&&           r   Úbuild_converse_kwargsr]  ì  s
  € ô (DÀHÔ'ZÑ$€MßWcô  iEð  FK÷  iLò  iLÕ1ÓSÑ1�aÔ5HÈ×5R—�Ñ1ÒSô  RUó  RW€HØ-7Ò-?¡rÀkÐS]ÐE^ÐØ'¨°
Ð<MÐO`ÐbrÐs€FßØCKÈxÔCW˜=¬D´Ó,>Ð+?Ö?Ð]jˆˆxÑÝ@Ù# E×*Ò*Ô3S×3YÑ3YÐZ_×ZeÐZeÐce×3fÒ3fØ×Ñ°MÀ;Ð3OÐRXÐZ_ÐQ`Ñ2aÔ sÑ2a©$¨!¨QÐef¤  A¢Ñ2aÒ sÔtßØ,:˜Ñ)ß9>Ô.¨uÔ5ÀB€NßÔ6°u×=Ò=ä�‰ð8Ø9>õ	
÷ 
Ø 'ÐRYÐ]eÔRe¨¼4ÄÓ;MÐ:NÖ)NÐkyÐzˆˆ|ÑØ�XÔ¤#Ð&7Ó"8¸AÔ"=Ø# BÕ'×+Ñ+¨IÓ6ˆÜ�gœt×$Ò$¯Ø�N‰Nœ4¤Ó-Ô.ßØ$4Ð Ñ!ßœJÐ'7¼×>Ò>Ü! &¸EÐU_Ô`ßØÐ$Ð%Ø€Mùò; Tùó !ts   °H1ÁH1Ã'	H6
Ã5H6
c                óV  € V ^8„  d   QhR\         R\         R\        \        ,          R\        \        \        ,          ,          R\        \        ,          R\        \
        ,          R\        \
        ,          R\        \        \         ,          ,          R	\        \        ,          R
\        /
# )r   rS   rÓ  r¦  r¡  r¸  r-  rM  rN  rO  r   )r   r�   r   r	   r:   ré   r   )r   s   "r   r   r     sŒ   € ÷ 1ñ 1Üð1Üð1Ü'+¬D¥zð1Ü:BÄ4ÌÅ:Õ:Nð1äœ•ð1ä3;¼Eµ?ð1äRZÔ[`ÕRað1ô œT¤#�YÕ'ð1ô CKÌ4Å.ð1ô ñ	1r   c	                ó  € ^ RI Hp	 \        V 4      p
\        WW4WVWxV	! W#4      '       * R7	      p V
P                  ! R/ VB p\        T4      #   \
         d«   p\        YÛ4      pTe!   \        T
P                  ! R/ TB 4      u Rp?# \        YÛ4      pTe!   \        T
P                  ! R/ TB 4      u Rp?# \        T4      '       d6   \        P                  RY\        T4      P                  4       \        T 4       h Rp?ii ; i)u¦   Non-streaming Converse call â†’ OpenAI-compatible response. Retries once without a rejected cachePoint
placement; evicts the cached client on stale-connection errors.)Úis_one_shot_request)rP  Nu|   bedrock: stale-connection error on converse(region=%s, model=%s): %s â€” evicting cached client so the next call reconnects.rY   )Úagent.prompt_cachingr`  rf   r]  Úconverser@   rÕ  rù  rà  r  rA   rB   rš  rÞ   rw   )rS   rÓ  r¦  r¡  r¸  r-  rM  rN  rO  r`  rZ   r*   r  rL   rÔ  Úredacted_retry_kwargss   &&&&&&&&&       r   Úcall_converserd    sñ   € õ 9Ü(¨Ó0€Fä" 5°EÀ{Ð[iÙ4GÈÓ4XÔ0XôZ€FðØ—?’?Ñ, VÑ,ˆô ' xÓ0Ð0øô ô Ü9¸#ÓFˆØÒ#Ü.¨v¯ªÑ/NÀÑ/NÓOÕOÜ IÈ#Ó VÐØ Ò,Ü.¨v¯ªÑ/WÐAVÑ/WÓXÕXÜ$ S×)Ò)Ü�N‰NðMØNTÔ]aÐbeÓ]f×]oÑ]oôô & fÔ-Øûðús0   ®A ÁD Á)C;Á?D Â)C;Â.D Â4AC;Ã;D i  c                 ó.   € \         P                  4        R# )z/Clear the model discovery cache. Used in tests.N)Ú_discovery_cacherm   rY   r   r   Úreset_discovery_cacherg  =  s   € ä×ÑÖr   c                ó‚   € V ^8„  d   QhR\         R\        R\         R\        R\        R\        \         \        3,          /# )r   rz   r  ÚproviderÚ
input_modsÚoutput_modsr   )r   r   r�   r   )r   s   "r   r   r   B  sL   € ÷ añ aœ3ð a¤cð a´Sð aÄdð aÔY]ð aÔbfÔgjÔloÐgoÕbpñ ar   c                 óN   € R T RT;'       g    T P                  4       RVRVRVRR/# )r„  r  ri  Úinput_modalitiesÚoutput_modalitiesÚ	streamingT)r%   )rz   r  ri  rj  rk  s   &&&&&r   Ú_model_entryrp  B  s;   € Ø�(˜F T×%5Ð%5¨X×$<Ñ$<Ó$>À
ÈHØ 
Ð,?ÀÈkÐ[_ðað ar   c                ól   € V ^8„  d   QhR\         R\        \        \        \        3,          ,          RR/# ©r   Ú
filter_setÚmodelsr   N©r°  r�   r   r   r   )r   s   "r   r   r   G  s/   € ÷ ñ ´ð ¼TÄ$ÄsÌCÀxÅ.Õ=Qð ÐVZñ r   c                ó  € V P                  4       P                  R. 4       EFY  pVP                  R4      ;'       g    RP                  4       pV'       g   K7  VP                  R4      ;'       g    RpRV9   d'   VP                  R4      ^ ,          P	                  4       MRpV'       d   VP	                  4       V9  d	   Wa9  d   K¦  VP                  R. 4      pVP                  R/ 4      P                  RR4      P                  4       R	8w  g    VP                  R
R4      '       d   RV9  d   EK  VP                  \        WCP                  R4      VP                  4       VP                  R. 4      V4      4       EK\  	  R# )z_Append active, streaming-capable, text-output foundation models (optionally provider-filtered).ÚmodelSummariesrÒ  r   ÚproviderNamer=   ÚoutputModalitiesÚmodelLifecycleÚstatusÚACTIVEÚresponseStreamingSupportedFÚTEXTÚ	modelNameÚinputModalitiesN)Úlist_foundation_modelsr$   r%   rG   r1   rp  r  rp  )rZ   rs  rt  Úsummaryrz   Úprovider_nameÚmodel_prefixrk  s   &&&     r   Ú_list_foundation_modelsr…  G  s2  € à×0Ñ0Ó2×6Ñ6Ð7GÈ×LˆØ—K‘K 	Ó*×0Ð0¨b×7Ñ7Ó9ˆßÙØŸ™ NÓ3×9Ð9°rˆØ9<À¼�x—~‘~ cÓ*¨1Õ-×3Ñ3Ô5Èbˆß˜-×-Ñ-Ó/°zÔAÀlÔFdÙØ—k‘kÐ"4°bÓ9ˆØ�K‰KÐ(¨"Ó-×1Ñ1°(¸BÓ?×EÑEÓGÈ8ÔSØ—{‘{Ð#?À×GÒGÈ6ÐYdÔKdÚØ�‰”lØ—k‘k +Ó.°×0CÑ0CÓ0EÀwÇ{Á{ÐSdÐfhÓGiÐkvó
÷ 	ó Mr   c                ól   € V ^8„  d   QhR\         R\        \        \        \        3,          ,          RR/# rr  ru  )r   s   "r   r   r   Z  s/   € ÷ )ñ )´ð )¼dÄ4ÌÌSÈÅ>Õ>Rð )ÐW[ñ )r   c           
     óZ  a€ . RrC V P                   ! R/ V'       d   RV/M/ B pVP                  VP                  R. 4      4       VP                  R4      ;p'       d   K[   T Uu0 uF  qfR,          P                  4       kK  	  ppT EF  pTP                  R4      ;'       g    RP	                  4       p	T	'       d,   TP                  R4      R	8w  g   T	P                  4       T9   d   Kb  S'       dc   \
        ;QJ d/    T3R
 lTP                  R. 4       4       F  '       g   K   RM$	  RM ! T3R
 lTP                  R. 4       4       4      '       g   KÌ  TP                  \        Y˜P                  R4      RR.R.4      4       TP                  T	P                  4       4       EK  	  R# u upi )z\Append active cross-region inference profiles whose IDs are not already present (paginated).NTÚ	nextTokenÚinferenceProfileSummariesr„  ÚinferenceProfileIdr   r{  r|  c              3   ó|   <"  € T F1  p\        VP                  R R4      4      P                  4       S9   x € K3  	  R# 5i)ÚmodelArnr   N)Ú_extract_provider_from_arnr$   r1   )r3   r4   rs  s   & €r   r5   Ú+_list_inference_profiles.<locals>.<genexpr>g  s5   øé € ð "
Ù]vÐXYÔ& q§u¡u¨Z¸Ó'<Ó=×CÑCÓEÈÖSÓ]vùs   ƒ9<rt  FÚinferenceProfileNamezinference-profiler~  rY   )	Úlist_inference_profilesri  r$   r1   r%   r  r  rp  r±  )
rZ   rs  rt  ÚprofilesÚ
next_tokenr  r4   Úseen_idsÚprofileÚ
profile_ids
   &f&       r   Ú_list_inference_profilesr–  Z  sb  ø€ à˜tˆjØ
Ø×1Ò1Ñf×R\°kÀ:Ñ5NÐbdÑfˆØ�‰˜Ÿ™Ð%@À"ÓEÔFØ&Ÿl™l¨;Ó7Ð7�
×7Ð7ØÙ)/Ó0© A�$•—‘–©€HÐ0ÜˆØ—k‘kÐ"6Ó7×=Ð=¸2×DÑDÓFˆ
ß˜WŸ[™[¨Ó2°hÔ>À*×BRÑBRÓBTÐX`ÔB`ÙßŸc›cô "
Ø]d×]hÑ]hÐiqÐsuÔ]vó"
ŸcŸcšcô "
Ø]d×]hÑ]hÐiqÐsuÔ]vó"
÷ 
ò 
ñ Ø�‰”l :¯{©{Ð;QÓ/RÐTgÐjpÐiqÐtzÐs{Ó|Ô}Ø�‰�Z×%Ñ%Ó'×(ó ùò 1s   Á%F(c          	      ó    € V ^8„  d   QhR\         R\        \        \         ,          ,          R\        \        \         \        3,          ,          /# )r   rS   Úprovider_filterr   )r   r	   r�   r   r   )r   s   "r   r   r   o  s=   € ÷ ñ ¤Cð ¼(Ä4ÌÅ9Õ:Mð ÔY]Ô^bÔcfÔhkÐckÕ^lÕYmñ r   c                ó8  € ^ RI HpHp T  RRP                  \	        T;'       g    . 4      4       2pV! 4       e   V! 4        RV 2p\
        P                  V4      pV'       d6   \        P                  ! 4       VR,          ,
          \        8  d
   VR,          #  \        V 4      p. pT;'       g    .  U	u0 uF  q™P                  4       kK  	  p
p	\        \        P                  R	3\        \        P                   R
33 F  w  r¼p T! YjT4       K  	  TP#                  R R7       R\        P                  ! 4       RT/\
        T&   T#   \         d#   p\        P                  RT4       . u Rp?# Rp?ii ; iu up	i   \         d   pT! Y×4        Rp?K—  Rp?ii ; i)z’Foundation models + inference profiles (cached 1h per region/filter), ``global.`` profiles first then
by name; [] when the client cannot be built.rV   Ú:rþ  Nrá  Ú	timestamprt  z7Failed to create Bedrock client for model discovery: %sz,Failed to list Bedrock foundation models: %sz(Skipping inference profile discovery: %sc                 ót   € V R ,          P                  R4      '       d   ^ M^V R,          P                  4       3# )r„  zglobal.r  )r~   r1   )r4   s   &r   rI  Ú)discover_bedrock_models.<locals>.<lambda>Š  s*   €  A d¥G×$6Ñ$6°y×$AÒ$A™qÀqÈ!ÈFÍ)Ï/É/ÓJ[Ñ\r   ©r]   )r!   r   rW   rí  r  rf  r$   ÚtimeÚ_DISCOVERY_CACHE_TTL_SECONDSrk   r@   rA   rB   r1   r…  r–  ÚdebugÚsort)rS   r˜  r   rW   Ú	cache_keyÚcachedrZ   Úert  Úfrs  ÚstepÚlogræ  s   &&            r   r…  r…  o  sq  € ÷
 KØ�(˜!˜CŸH™H¤V¨O×,AÐ,A¸rÓ%BÓCÐDÐE€IÙÓ!Ò-Ù&Ó(Ð)¨¨9¨+Ð6ˆ	Ü×!Ñ! )Ó,€Fß”4—9’9“; ¨Õ!4Õ4Ô8TÔTØ�hÕÐðÜ,¨VÓ4ˆð $&€FØ&5×&;Ð&;¸Ð&;Ó=Ñ&; —'‘'–)Ñ&;€JÐ=ä	 ¤&§.¡.Ð2`ÐaÜ	!¤6§<¡<Ð1[Ð\óÑˆ�7ð	Ù� VÖ,ñð ‡K�KÑ\€KÔ]Ø#.´·	²	³¸XÀvÐ"NÔ�YÑØ€Møô ô Ü�‰ÐPÐRSÔTØ�	ûðüò >øô ô 	Ù��OŠOûð	ús<   ÂE Â5E6Ä	E;ÅE3ÅE.Å(E3Å.E3Å;FÆFÆFc                ó0   € V ^8„  d   QhR\         R\         /# )r   Úarnr   ra   )r   s   "r   r   r   �  s   € ÷ +ñ +¤Cð +¬Cñ +r   c                óf   € \         P                  ! RV 4      pV'       d   VP                  ^4      # R# )uQ   ``arn:aws:bedrock:...:foundation-model/anthropic.claude-v2`` â†’ ``"anthropic"``.zfoundation-model/([^.]+)r   rQ  )rª  r¡   s   & r   r�  r�  �  s(   € ä�IŠIÐ1°3Ó7€Eß"ˆ5�;‰;�q‹>Ð*¨Ð*r   zxai.grok-4.6i ¡ i@B i@ ià“ zamazon.nova-microi ô i� gÍÌÌÌÌÌì?c                óR   € V ^8„  d   QhR\         R\         R\        \        ,          /# )r   rz   rS   r   )r   r	   r:   )r   s   "r   r   r   Â  s%   € ÷ ñ ¬3ð ¼ð ÄÌÅñ r   c           	     óR  € ^ RI Hp  \        V4      pRp\         FY  pR\        T\        ,          4      ,          p TP                  T RRRR	T/./.R
^/R7       \        P                  RYR 4       Tu # 	  \        P                  RYR,          4       R#   \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i  \         dV   p\        T4      pT! T4      pT'       d/   TR8¼  d"   \        P                  RYR 4       Tu Rp?u #  Rp?Kÿ   Rp?EK  Rp?ii ; i)u@  Discover a model's real context window by provoking a length error â€” the only authoritative source
("prompt is too long: 1300032 tokens > 1000000 maximum"); length validation runs before inference so the
probe costs nothing. An accepted tier is a safe lower bound; None (no creds/network/unparseable) â†’ static table.)Úparse_context_limit_from_errorz(Bedrock context probe skipped for %s: %sNr   zdata r�  rž  rÓ   r÷  r.  )rÒ  r¦  rR  zOBedrock context probe for %s accepted ~%s-token prompt; window is at least thatrþ  i   z/Probed Bedrock context window for %s: %s tokensz<Bedrock context probe for %s returned no parseable limit: %s:NéÈ   N)Úagent.model_metadatar®  rf   r@   rA   r¡  Ú_BEDROCK_PROBE_TIERSr:   Ú_WORDS_PER_TOKENrb  r   Úinfo)	rz   rS   r®  rZ   rL   Ú
last_errorÚtier_tokensÚ	oversizedÚlimits	   &&       r   Úprobe_bedrock_context_lengthr¸  Â  s!  € õ DðÜ,¨VÓ4ˆð €Jß+ˆØœc +Ô0@Õ"@ÓAÕAˆ	ð	Ø�O‰O H¸ÀÈÐV\Ð^gÐUhÐTiÐ8jÐ7kØ-8¸!Ð,<ð ô >ä�L‰Lð 3Ø4<ÈQÀôRàÒñ ,ô ‡L�LÐOÐQYÐfjÕ[kÔlÙøô) ô Ü�‰Ð?ÀÔOÝûðûô ô 	Ü˜S›ˆJÙ2°:Ó>ˆEß˜ $œÜ—‘ÐMÈxÐbcÐ[dÔfØ—õ 'Žuûð	ús4   ˆB ¼7CÂCÂ"B>Â>CÃD&Ã;D!ÄD&Ä!D&c                óH   € V ^8„  d   QhR\         R\         R\        R\        /# )r   rz   rS   Úprober   )r   rt   r:   )r   s   "r   r   r   à  s)   € ÷ *ñ *¬ð *´cð *Ätð *ÔWZñ *r   c                ó4  € \         P                  V 4      '       d   T MRpV'       d   \        W14      p V'       d   V'       d   \        W4      ;p'       d   V# \         Uu. uF  qUV P                  4       9   g   K  VNK  	  ppV'       d   \        \        V\        R7      ,          # V'       d$   \        P                  RV\        R 4       \        # V \        9  d3   \        P                  V 4       \        P                  RV \        R 4       \        # u upi )u$  Context window: live probe (if ``probe`` and ``region``) â†’ static table â†’ default. The table is fallback
only: a stale substring match silently caps the window (a 1M Opus pinned to 200K via "opus-4").
An application-inference-profile ARN is first resolved to the model it wraps (#114476).r   rž  zÅBedrock inference profile %s resolved no known model window; using the %s default. Grant bedrock:GetInferenceProfile or set model.context_length explicitly if the wrapped model has a larger window.rþ  z±Bedrock model %s has no known context window; using the static %s-token fallback (not a detected limit). Set model.context_length in config.yaml if the model's window is larger.)r•  rS  r–  r¸  ÚBEDROCK_CONTEXT_LENGTHSr1   ÚmaxrÀ  rA   rB   ÚBEDROCK_DEFAULT_CONTEXT_LENGTHro   r±  )rz   rS   rº  Úprofile_arnÚprobedr]   rE  s   &&&    r   Úget_bedrock_context_lengthrÁ  à  sé   € ô :×@Ñ@À×JÒJ‘(ÐPR€KßÜ6°{ÓKˆß—Ô'CÀHÓ'UÐU˜VÖUØˆÝ5ÓQÑ5�sÀÇÁÓ@PÑ9P�sˆsÑ5€GÐQßÜ&¤s¨7¼Ô'<Õ=Ð=ßÜ�‰ð1ð Ü-¨aÐ0ô	
ô *Ð)ð 
Ô/Ô	/Ü×"Ñ" 8Ô,Ü�‰ðoàÔ7¸Ð:ô	
ô
 *Ð)ùò% Rs   Á DÁ;Dz:application-inference-profile/z ^arn:[^:]+:bedrock:([a-z0-9-]+):c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   r¿  rS   r   ra   )r   s   "r   r   r   	  s!   € ÷ ñ ´Sð Ä#ð Ìsñ r   c                óÔ  € V \         9   d   \         V ,          # \        P                  V 4      pV'       d   VP                  ^4      MR;'       g    T;'       g    \	        4       pT p \        V4      pVP                  V R7      P                  R4      ;'       g    . p\        R V 4       V 4      pV\         V &   V#   \         d!   p\        P                  RY4        Rp?L1Rp?ii ; i)uu  Application-profile ARN â†’ the wrapped model's ARN (its ``foundation-model/<id>`` tail satisfies the
static-table substring match); the profile ARN itself when ``bedrock:GetInferenceProfile`` is not
granted or unavailable, so callers keep the default-window behaviour. Both outcomes are cached per
process: this runs on every context-length resolution, not once per model.r   )ÚinferenceProfileIdentifierrt  c              3   ód   "  € T F&  qP                  R 4      '       g   K  VR ,          x € K(  	  R# 5i)rŒ  Nrë  r2   s   & r   r5   Ú6_resolve_inference_profile_model_id.<locals>.<genexpr>  s!   é € ÐL±¨1¿%¹%À
×:Kœ˜˜:Ÿš³ùs   ‚0Ÿ0z/Inference profile resolution skipped for %s: %sN)rn   Ú_ARN_REGION_REr¡   r£   rE  rk   Úget_inference_profiler$   r¨  r@   rA   r¡  )r¿  rS   Ú
arn_regionr™   rZ   rt  rL   s   &&     r   r–  r–  	  s×   € ð
 Ô4Ô4Ü-¨kÕ:Ð:Ü×%Ñ% kÓ2€Jß%/ˆj×Ñ˜qÔ!°R×^Ð^¸F×^Ð^ÔF\ÓF^€FØ€HðZÜ,¨VÓ4ˆØ×-Ñ-ÈÐ-ÓU×YÑYÐZbÓc×iÐiÐgiˆÜÑL±ÓLÈkÓZˆð 3;Ô" ;Ñ/Ø€Oøô ô ZÜ�‰ÐFÈ×YÑYûðZús   Á(2B< ÂB< Â<C'ÃC"Ã"C'c                óø  € V ^8„  d   Qh/ ^ \         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d1   \        \        \        \        \        3,          \        3,          ;R&   ^\         9   d(   \        \        \        \        3,          R3,          ;R&   ^\         9   d   \        \        R3,          ;R&   ^\         9   d   \        \        R3,          ;R&   ^\         9   d   \        \        R3,          ;R&   ^\         9   d$   \        \        \        R3,          R3,          ;R	&   ^\         9   d   \        \        \
        3,          ;R
&   ^	\         9   d   \        \        \        3,          ;R&   ^
\         9   d   \        \        \        3,          ;R&   ^\         9   d
   \
        ;R&   ^\         9   d   \        \        \        3,          ;R&   # )r   rd   rj   r[   .r#   Ú_BEDROCK_PROFILE_PREFIXESr}   r’   r8  r®  rf  r¼  ro   rn   )Ú__conditional_annotations__r   r   r   rE   r°  r:   )r   s   "r   r   r      s�  € ÷ ñ ÷6 3Ò 2œt¤C¬ H�~Ñ 2ñ7÷8 3Ò 2œt¤C¬ H�~Ñ 2ñ9÷> ?Ò >œ$œu¤S¬#¬s ]Õ3´SÐ8Õ9Ñ >ñ?÷Dò œU¤5¬¬c¨¥?°CÐ#7Õ8ñ ñE÷V vÒ uœ5¤ c �?Ñ uñW÷Z XÒ W¤%¬¨S¨¥/Ñ Wñ[÷dò ¤E¬#¨s¨(¥Oñ ñe÷h
ò ”Uœ5¤ c �?¨CÐ/Õ0ñ ñi
÷J -Ò ,œœc¤3˜h�Ñ ,ñK÷p) &Ò %”$”sœC�x•.Ñ %ñq)÷p,ò œœc¤3˜h�ñ ñq,÷r- $Ò #œÑ #ñs-÷J0 4Ò 3¤¤S¬# X¥Ñ 3òK0r   ))r   ÚAWS_ACCESS_KEY_ID)r   ÚAWS_SECRET_ACCESS_KEY)Úaws_session_tokenÚAWS_SESSION_TOKEN)r    ÚAWS_PROFILE)ÚglobalÚusÚeuÚapacÚapÚauÚjpÚcaÚsaÚmeÚaf)Úin)úopenai.gpt-6-astrar-   úopenai.gpt-6-solúopenai.gpt-6-lunaúopenai.gpt-5.5úopenai.gpt-5.6-solúopenai.gpt-5.6-terraúopenai.gpt-5.6-luna)r¤  é"   é;   r/   )zurllib3.z	botocore.zboto3.))rµ   )rÍ  rÎ  )rÑ  )Ú&AWS_CONTAINER_CREDENTIALS_RELATIVE_URI)ÚAWS_WEB_IDENTITY_TOKEN_FILE)údeepseek.r1údeepseek-r1z
stability.zcohere.embedzamazon.titan-embed)r¡  r¥  r¦  )F)TF)ré  rê  zmoonshotai.kimi-k3)zopenai.gpt-6)NNNNN)Né   NNNNNT)Nrë  NNNN)zanthropic.claude-fable-5zanthropic.claude-fablezanthropic.claude-sonnet-5zanthropic.claude-opus-5zanthropic.claude-opus-4-8zanthropic.claude-opus-4-7zanthropic.claude-opus-4-6zanthropic.claude-sonnet-4-6)	zanthropic.claude-sonnet-4-5zanthropic.claude-haiku-4-5zanthropic.claude-opus-4zanthropic.claude-sonnet-4zanthropic.claude-3-5-sonnetzanthropic.claude-3-5-haikuzanthropic.claude-3-opuszanthropic.claude-3-sonnetzanthropic.claude-3-haiku)zamazon.nova-prozamazon.nova-lite)zmeta.llama4-maverickzmeta.llama4-scoutzmeta.llama3-3-70b-instructzmistral.mistral-largezdeepseek.v3)rÞ  rß  rà  rá  râ  rã  rä  )i Ö iÀ‘! )r   T)r   )«rÌ  râ   r?   r   r  rÿ   rñ  Úloggingr·   rR  rŸ  r  Ú
contextlibr   r  r   Útypingr   r   r   r	   r
   Úurllib.parser   rí   Úagent.errorsr   Ú	getLoggerrÞ   rA   rd   rj   r[   r#   r,   rË  r}   r’   Ú	frozensetr   ÚcompileÚ
IGNORECASEr    rX  rJ   rO   r^   rf   rk   rp   rw   r„   r‰   r�   r•   rš   r¦   rª   r¯   r¹   ÚAuthr»   rï   r÷   r  r  r  r$  r8  r0  r:  r=  rE  r˜   rT  rc  ri  ro  rr  r�  r‡  r�  r—  r�  r˜  r­  r®  r§  rW  rª  r³  r¶  rº  rÄ  rÏ  rÕ  ÚDOTALLrß  rÙ  rÝ  rà  rí  rä  rå  rö  rú  r  rû  r  r  r  r%  r+  r9  r?  rB  rE  rV  r[  re  rj  r~  r}  rn  rp  r  r„  rˆ  r‹  r–  r‘  r™  r´  rî  rÃ  rÆ  rÊ  rÌ  rù  rþ  rü  r2  r=  r>  rH  rK  r]  rd  rf  r   rg  rp  r…  r–  r…  r�  r   Úfromkeysr¼  r¾  r°  ro   r±  r²  r¸  rÁ  r•  rÇ  rn   r–  r   )rÌ  s   @r   Ú<module>rø     sÍ  øðöõ Û Û Û Û Û 	Û 	Û Û Ý Ý !ß 3Õ 3Ý !ã å )à	×	Ò	˜8Ó	$€à02Ð Ó 2Ø02Ð Ó 2ð =?Ð Ó >ð<Ð ó õ ðF .vÐ Ó uà4MÐPWÕ4WÐ  Ó Wð
7Ð "ó ñ #,Ñ+bÑ?aÓ+bÓ"bÐ ØŸ*š*Ð%PÐRT×R_ÑR_Ó`Ð ð $&§:¢:Ð.HÈ"Ï-É-Ó#XÐ  Ø Ð òõ<õ(TõLò#õGõ	[õ?õ
0õ]õBõXõ*õ
H÷Jô˜UŸZ™Zô ð8"ÐPT÷ "ðÐhl÷ ð( AÐ õ
õõ<ð 4Ð ó ð¸d÷ ñeØGK÷eð eñZÐ[_÷ Zð Z÷	÷2õ,÷÷"ð  :Ð õNõ'õ(òÐ ð ,¨]Ð;Ð õZõ
Qð 9Ð Ø*,Ð Ó ,àŸJšJÐ'JÈBÏMÉMÓZÐ Ø˜v yÐ1Ð2€õcõSõNõ
$õ
<õõ.ð, )+¯
ª
Ø0°"·-±-À"Ç)Á)Õ2Kó)Ð %ò
	<òò(ð" !ŸjšjØˆs�x‰xÐ1Ó2Ð3Ð3IÐJÈBÏMÉMóÐ õ
Cõ?ð $Ð ØÐ5Ð6Ð õ=õ
}õ0õ"XõVõõõ>õaõ
Cð Ñ\ØÑQØ
ÑqàÑ~ðÐ õ
?÷÷.ðJ #WÐ Ø#4Ð  ð 2Ð õ~õ

aõwõõ:ð
 ˆy˜)Ð$ØÐ  )Ð,ØÐ$ iÐ0ØÐ!Ð#5Ð6ð	Ð õDõ&÷(2ð^ �˜¨°¸\È<ÐYaØÐ(Ð*@ÐBRð!Ð õ;õõ÷5
ñ 5
õpõ28÷
Yuõ|ð$ ˜5 %¨°¸(ÐC€õð  Ð!;Ð<Ù8Ð:RÐSð Ð õ*÷)÷X1ðB $&Ð Ó %Ø#Ð òõ
aõ
õ&)÷*õ@+ð �Gð+ð ‡m‚mð ð ó	ð+ð ‡m‚mñ ð ó	ð+ð" ‡m‚mÑ;¸WÓEð#+ð" H[Ð\cñ#+ð& ‡m‚mñ àóð'+ð2 ˜)ñ3+ð4 ‡m‚mñ ð óð5+Ð ó ð@ ")Ð Ù!›eÐ Ó #ñ .Ð ØÐ õ÷<*ð *ðH !ŸjšjÐ)KÓLÐ Ø—’Ð?ÀÇÁÓO€Ø13Ð Ó 3÷ò r   