§
    ‰eîi]º  ã                   ój  — U d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZ  ej        e¦  «        Zi Ze	eef         ed<   i Ze	eef         ed<   d„ Zdefd	„Zdefd
„Zd„ Zdedefd„ZdZdefd„Zdedefd„Zg d¢Zd[dee	eef                  dee         fd„Zd[dee	eef                  defd„Z d[dee	eef                  defd„Z!g d¢Z"dedefd„Z#dedefd„Z$de
e	         de
e	         fd„Z%de
e	         fd„Z&de
e	         deee
e	                  e
e	         f         fd„Z'd edefd!„Z(d"e	defd#„Z)defd$„Z*	 	 	 	 d\defd%„Z+	 	 	 	 	 	 d]d'ede
e	         dee
e	                  d(e,d)ee-         d*ee-         d+ee
e                  d,ee	         de	eef         fd-„Z.	 	 	 	 	 	 d]ded'ede
e	         dee
e	                  d(e,d)ee-         d*ee-         d+ee
e                  d,ee	         defd.„Z/	 	 	 	 	 	 d]ded'ede
e	         dee
e	                  d(e,d)ee-         d*ee-         d+ee
e                  d,ee	         defd/„Z0i Z1e	eef         ed0<   d1Z2d2„ Z3	 d[ded3ee
e                  de
e	eef                  fd4„Z4d5edefd6„Z5dede
e         fd7„Z6 ej7        d8ej8        ¦  «         ej7        d9ej8        ¦  «         ej7        d:ej8        ¦  «        gZ9 ej7        d;ej8        ¦  «         ej7        d<ej8        ¦  «         ej7        d=ej8        ¦  «        gZ: ej7        d>ej8        ¦  «         ej7        d?ej8        ¦  «         ej7        d@ej8        ¦  «        gZ;dAedefdB„Z<dAedefdC„Z=i dDdE“dFdE“dGdE“dHdE“dIdE“dJdE“dKdE“dLdE“dMdE“dNdE“dOdE“dPdQ“dRdQ“dSdT“dUdT“dVdT“dWdT“dTdTdXœ¥Z>e	ee,f         edY<   dTZ?dede,fdZ„Z@dS )^uí  AWS Bedrock Converse API adapter for Hermes Agent.

Provides native integration with Amazon Bedrock using the Converse API,
bypassing the OpenAI-compatible endpoint in favor of direct AWS SDK calls.
This enables full access to the Bedrock ecosystem:

  - **Native Converse API**: Unified interface for all Bedrock models
    (Claude, Nova, Llama, Mistral, etc.) with streaming support.
  - **AWS credential chain**: IAM roles, SSO profiles, environment variables,
    instance metadata â€” zero API key management for AWS-native environments.
  - **Dynamic model discovery**: Auto-discovers available foundation models
    and cross-region inference profiles via the Bedrock control plane.
  - **Guardrails support**: Optional Bedrock Guardrails configuration for
    content filtering and safety policies.
  - **Inference profiles**: Supports cross-region inference profiles
    (us.anthropic.claude-*, global.anthropic.claude-*) for better capacity
    and automatic failover.

Architecture follows the same pattern as ``anthropic_adapter.py``:
  - All Bedrock-specific logic is isolated in this module.
  - Messages/tools are converted between OpenAI format and Converse format.
  - Responses are normalized back to OpenAI-compatible objects for the agent loop.

Reference: OpenClaw's ``extensions/amazon-bedrock/`` plugin, which implements
the same Converse API integration in TypeScript via ``@aws-sdk/client-bedrock``.

Requires: ``boto3`` (optional dependency â€” only needed when using the Bedrock provider).
é    N)ÚSimpleNamespace)ÚAnyÚDictÚListÚOptionalÚTupleÚ_bedrock_runtime_client_cacheÚ_bedrock_control_client_cachec                  óJ   — 	 ddl } | S # t          $ r t          d¦  «        ‚w xY w)z5Import boto3, raising a clear error if not installed.r   Nz¤The 'boto3' package is required for the AWS Bedrock provider. Install it with: pip install boto3
Or install Hermes with Bedrock support: pip install -e '.[bedrock]')Úboto3ÚImportError)r   s    ú7/home/div/.hermes/hermes-agent/agent/bedrock_adapter.pyÚ_require_boto3r   0   sH   € ð
ØˆˆˆØˆøÝð 
ð 
ð 
ÝðRñ
ô 
ð 	
ð
øøøs   ‚ ˆ"Úregionc                 óˆ   — | t           vr-t          ¦   «         }|                     d| ¬¦  «        t           | <   t           |          S )u¡   Get or create a cached ``bedrock-runtime`` client for the given region.

    Uses the default AWS credential chain (env vars â†’ profile â†’ instance role).
    zbedrock-runtime©Úregion_name)r	   r   Úclient©r   r   s     r   Ú_get_bedrock_runtime_clientr   =   sK   € ð
 Õ2Ð2Ð2ÝÑ Ô ˆØ05·²Ø¨6ð 1=ñ 1
ô 1
Õ% fÑ-õ )¨Ô0Ð0ó    c                 óˆ   — | t           vr-t          ¦   «         }|                     d| ¬¦  «        t           | <   t           |          S )zLGet or create a cached ``bedrock`` control-plane client for model discovery.Úbedrockr   )r
   r   r   r   s     r   Ú_get_bedrock_control_clientr   J   sI   € àÕ2Ð2Ð2ÝÑ Ô ˆØ05·²Ø 6ð 1=ñ 1
ô 1
Õ% fÑ-õ )¨Ô0Ð0r   c                  ój   — t                                ¦   «          t                               ¦   «          dS )z?Clear cached boto3 clients. Used in tests and profile switches.N)r	   Úclearr
   © r   r   Úreset_client_cacher   T   s,   € å!×'Ò'Ñ)Ô)Ð)Ý!×'Ò'Ñ)Ô)Ð)Ð)Ð)r   Úreturnc                 óN   — | t           v }t                                | d¦  «         |S )a·  Evict the cached ``bedrock-runtime`` client for a single region.

    Per-region counterpart to :func:`reset_client_cache`. Used by the converse
    call wrappers to discard clients whose underlying HTTP connection has
    gone stale, so the next call allocates a fresh client (with a fresh
    connection pool) instead of reusing a dead socket.

    Returns True if a cached entry was evicted, False if the region was not
    cached.
    N)r	   Úpop)r   Úexisteds     r   Úinvalidate_runtime_clientr#   Z   s*   € ð Õ5Ð5€GÝ!×%Ò% f¨dÑ3Ô3Ð3Ø€Nr   )zurllib3.z	botocore.zboto3.Úexcc              #   ó–   K  — t          | dd¦  «        }|�3|j        }|j                             dd¦  «        }|pdV — |j        }|­1dS dS )zJYield ``__name__``-style module strings for each frame in exc's traceback.Ú__traceback__NÚ__name__Ú )ÚgetattrÚtb_frameÚ	f_globalsÚgetÚtb_next)r$   ÚtbÚframeÚmodules       r   Ú_traceback_frames_modulesr1   „   s`   è è € å	��o tÑ	,Ô	,€BØ
ˆ.Ø”ˆØ”×$Ò$ Z°Ñ4Ô4ˆØˆl˜ÐÐÐØŒZˆð	 ˆ.ˆ.ˆ.ˆ.ˆ.r   c                 ór  ‡— 	 ddl m}m} ||f}n# t          $ r d}Y nw xY w|rt	          | |¦  «        rdS 	 ddlm}m}m} |||f}n# t          $ r d}Y nw xY w|rt	          | |¦  «        rdS t	          | t          ¦  «        r5t          | ¦  «        D ]%Št          ˆfd„t          D ¦   «         ¦  «        r dS Œ&dS )u«  Return True if ``exc`` indicates a dead/stale Bedrock HTTP connection.

    Matches:
      * ``botocore.exceptions.ConnectionError`` and subclasses
        (``ConnectionClosedError``, ``EndpointConnectionError``,
        ``ReadTimeoutError``, ``ConnectTimeoutError``).
      * ``urllib3.exceptions.ProtocolError`` / ``NewConnectionError`` /
        ``ConnectionError`` (best-effort import â€” urllib3 is a transitive
        dependency of botocore so it is always available in practice).
      * Bare ``AssertionError`` raised from a frame inside urllib3, botocore,
        or boto3. These are internal-invariant failures (typically triggered
        by corrupted connection-pool state after a dropped socket) and are
        recoverable by swapping the client.

    Non-library ``AssertionError``s (from application code or tests) are
    intentionally not matched â€” only library-internal asserts signal stale
    connection state.
    r   )ÚConnectionErrorÚHTTPClientErrorr   T)ÚProtocolErrorÚNewConnectionErrorr3   c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S ©N)Ú
startswith)Ú.0Úprefixr0   s     €r   ú	<genexpr>z,is_stale_connection_error.<locals>.<genexpr>À   s1   øè è € ÐVÐV°�6×$Ò$ VÑ,Ô,ÐVÐVÐVÐVÐVÐVr   F)Úbotocore.exceptionsr3   r4   r   Ú
isinstanceÚurllib3.exceptionsr5   r6   ÚAssertionErrorr1   ÚanyÚ_STALE_LIB_MODULE_PREFIXES)	r$   ÚBotoConnectionErrorr4   Úbotocore_errorsr5   r6   ÚUrllib3ConnectionErrorÚurllib3_errorsr0   s	           @r   Úis_stale_connection_errorrG   Ž   so  ø€ ð.ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð #6°Ð!GˆˆøÝð ð ð Øˆˆˆðøøøàð �: c¨?Ñ;Ô;ð Øˆtðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 (Ð);Ð=SÐTˆˆøÝð ð ð Øˆˆˆðøøøàð �* S¨.Ñ9Ô9ð Øˆtõ �#•~Ñ&Ô&ð Ý/°Ñ4Ô4ð 	ð 	ˆFÝÐVÐVÐVÐVÕ;UÐVÑVÔVÑVÔVð Ø�t�tðð ˆ5s   ƒ �ž·A ÁAÁA)ÚAWS_BEARER_TOKEN_BEDROCKÚAWS_ACCESS_KEY_IDÚAWS_PROFILEÚ&AWS_CONTAINER_CREDENTIALS_RELATIVE_URIÚAWS_WEB_IDENTITY_TOKEN_FILEÚenvc                 óâ  — | �| nt           j        } |                      dd¦  «                             ¦   «         rdS |                      dd¦  «                             ¦   «         r*|                      dd¦  «                             ¦   «         rdS |                      dd¦  «                             ¦   «         rdS |                      dd¦  «                             ¦   «         rdS |                      dd¦  «                             ¦   «         rdS 	 d	dl}|j                             ¦   «         }|                     ¦   «         }|�|                     ¦   «         }|r	|j	        rd
S n# t          $ r Y nw xY wdS )uŠ  Return the name of the AWS auth source that is active, or None.

    Checks environment variables first, then falls back to boto3's credential
    chain for implicit sources (EC2 IMDS, ECS task role, etc.).

    This mirrors OpenClaw's ``resolveAwsSdkEnvVarName()`` â€” used to detect
    whether the user has any AWS credentials configured without actually
    attempting to authenticate.
    NrH   r(   rI   ÚAWS_SECRET_ACCESS_KEYrJ   rK   rL   r   ziam-role)ÚosÚenvironr,   ÚstripÚbotocore.sessionÚsessionÚget_sessionÚget_credentialsÚget_frozen_credentialsÚ
access_keyÚ	Exception©rM   ÚbotocorerT   ÚcredentialsÚresolveds        r   Úresolve_aws_auth_env_varr^   Ú   s‹  € ð �ˆ#ˆ#¥b¤j€Cà
‡w‚wÐ)¨2Ñ.Ô.×4Ò4Ñ6Ô6ð *Ø)Ð)à�ŠÐ# RÑ(Ô(×.Ò.Ñ0Ô0ð #Ø—’Ð/°Ñ4Ô4×:Ò:Ñ<Ô<ð#à"Ð"à
‡w‚wˆ}˜bÑ!Ô!×'Ò'Ñ)Ô)ð Øˆ}à
‡w‚wÐ7¸Ñ<Ô<×BÒBÑDÔDð 8Ø7Ð7à
‡w‚wÐ,¨bÑ1Ô1×7Ò7Ñ9Ô9ð -Ø,Ð,ð	ØÐÐÐØÔ"×.Ò.Ñ0Ô0ˆØ×-Ò-Ñ/Ô/ˆØÐ"Ø"×9Ò9Ñ;Ô;ˆHØð "˜HÔ/ð "Ø!�zøøÝð ð ð Øˆðøøøàˆ4s   ÄAE Å
E,Å+E,c                 óð   — t          | ¦  «        �dS 	 ddl}|j                             ¦   «         }|                     ¦   «         }|�|                     ¦   «         }|r	|j        rdS n# t          $ r Y nw xY wdS )a`  Return True if any AWS credential source is detected.

    Checks environment variables first (fast, no I/O), then falls back to
    boto3's credential chain which covers EC2 instance roles, ECS task roles,
    Lambda execution roles, and other IMDS-based sources that don't set
    environment variables.

    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.
    NTr   F)r^   rS   rT   rU   rV   rW   rX   rY   rZ   s        r   Úhas_aws_credentialsr`     s¡   € õ   Ñ$Ô$Ð0Øˆtð	ØÐÐÐØÔ"×.Ò.Ñ0Ô0ˆØ×-Ò-Ñ/Ô/ˆØÐ"Ø"×9Ò9Ñ;Ô;ˆHØð ˜HÔ/ð Ø�tøøÝð ð ð Øˆðøøøàˆ5s   “AA& Á&
A3Á2A3c                 óÆ   — | �| nt           j        } |                      dd¦  «                             ¦   «         p)|                      dd¦  «                             ¦   «         pdS )u}   Resolve the AWS region for Bedrock API calls.

    Priority: AWS_REGION â†’ AWS_DEFAULT_REGION â†’ us-east-1 (fallback).
    NÚ
AWS_REGIONr(   ÚAWS_DEFAULT_REGIONz	us-east-1)rP   rQ   r,   rR   )rM   s    r   Úresolve_bedrock_regionrd   #  s`   € ð
 �ˆ#ˆ#¥b¤j€Cà�Š�˜bÑ!Ô!×'Ò'Ñ)Ô)ð 	Ø�7Š7Ð'¨Ñ,Ô,×2Ò2Ñ4Ô4ð	àðr   )zdeepseek.r1zdeepseek-r1z
stability.zcohere.embedzamazon.titan-embedÚmodel_idc                 ón   ‡— |                       ¦   «         Št          ˆfd„t          D ¦   «         ¦  «         S )zÕReturn True if the model is expected to support tool/function calling.

    Models in the denylist are known to reject toolConfig in the Converse API.
    Unknown models default to True (assume tool support).
    c              3   ó    •K  — | ]}|‰v V — Œ	d S r8   r   )r:   ÚpatternÚmodel_lowers     €r   r<   z+_model_supports_tool_use.<locals>.<genexpr>J  s(   øè è € ÐTÐT¨g�7˜kÐ)ÐTÐTÐTÐTÐTÐTr   )ÚlowerrA   Ú_NON_TOOL_CALLING_PATTERNS)re   ri   s    @r   Ú_model_supports_tool_userl   C  s;   ø€ ð —.’.Ñ"Ô"€KÝÐTÐTÐTÐTÕ9SÐTÑTÔTÑTÔTÐTÐTr   c                 óº   — |                       ¦   «         }dD ]0}|                     |¦  «        r|t          |¦  «        d…         } nŒ1|                     d¦  «        S )aÿ  Return True if the model is an Anthropic Claude model on Bedrock.

    These models should use the AnthropicBedrock SDK path for full feature
    parity (prompt caching, thinking budgets, adaptive thinking).
    Non-Claude models use the Converse API path.

    Matches:
      - ``anthropic.claude-*`` (foundation model IDs)
      - ``us.anthropic.claude-*`` (US inference profiles)
      - ``global.anthropic.claude-*`` (global inference profiles)
      - ``eu.anthropic.claude-*`` (EU inference profiles)
    )zus.úglobal.zeu.zap.zjp.Nzanthropic.claude)rj   r9   Úlen)re   ri   r;   s      r   Úis_anthropic_bedrock_modelrp   M  sm   € ð —.’.Ñ"Ô"€Kà9ð ð ˆØ×!Ò! &Ñ)Ô)ð 	Ø%¥c¨&¡k¤k l lÔ3ˆKØˆEð	ð ×!Ò!Ð"4Ñ5Ô5Ð5r   Útoolsc                 ó  — | sg S g }| D ]z}|                      di ¦  «        }|                      dd¦  «        }|                      dd¦  «        }|                      ddi dœ¦  «        }|                     d||d	|id
œi¦  «         Œ{|S )a”  Convert OpenAI-format tool definitions to Bedrock Converse ``toolConfig``.

    OpenAI format::

        {"type": "function", "function": {"name": "...", "description": "...",
         "parameters": {"type": "object", "properties": {...}}}}

    Converse format::

        {"toolSpec": {"name": "...", "description": "...",
         "inputSchema": {"json": {"type": "object", "properties": {...}}}}}
    ÚfunctionÚnamer(   ÚdescriptionÚ
parametersÚobject)ÚtypeÚ
propertiesÚtoolSpecÚjson)rt   ru   ÚinputSchema)r,   Úappend)rq   ÚresultÚtÚfnrt   ru   rv   s          r   Úconvert_tools_to_converser�   g  s»   € ð ð Øˆ	Ø€FØð ð ˆØ�UŠU�:˜rÑ"Ô"ˆØ�vŠv�f˜bÑ!Ô!ˆØ—f’f˜]¨BÑ/Ô/ˆØ—V’V˜L°8È2Ð*NÐ*NÑOÔOˆ
Ø�ŠØØØ*Ø &¨
Ð3ðð ð
ñ 	ô 	ð 	ð 	ð €Mr   c                 ó(  — | €ddigS t          | t          ¦  «        r|                      ¦   «         rd| ignddigS t          | t          ¦  «        �r±g }| D �]¢}t          |t          ¦  «        r|                     d|i¦  «         Œ0t          |t
          ¦  «        sŒF|                     dd¦  «        }|dk    r2|                     dd¦  «        }|                     d|r|ndi¦  «         Œ”|dk    �r|                     di ¦  «        }t          |t
          ¦  «        r|                     dd¦  «        nd}|                     d¦  «        r”|                     d	¦  «        \  }}}	d
}
|                     d¦  «        r'|dd…          	                    d¦  «        d         }|r|}
|                     dd|
v r|
 	                    d¦  «        d         ndd|	idœi¦  «         �Œ‡|                     dd|› d�i¦  «         �Œ¤|r|nddigS dt          | ¦  «        igS )u¼  Convert OpenAI message content (string or list) to Converse content blocks.

    Handles:
      - Plain text strings â†’ [{"text": "..."}]
      - Content arrays with text/image_url parts â†’ mixed text/image blocks

    Filters out empty text blocks â€” Bedrock's Converse API rejects messages
    where a text content block has an empty ``text`` field (ValidationException:
    "text content blocks must be non-empty"). Ref: issue #9486.
    NÚtextÚ rx   r(   Ú	image_urlÚurlzdata:Ú,z
image/jpegé   ú;r   Úimageú/éÿÿÿÿÚjpegÚbytes)ÚformatÚsourcez[Image: Ú])
r>   ÚstrrR   Úlistr}   Údictr,   r9   Ú	partitionÚsplit)ÚcontentÚblocksÚpartÚ	part_typerƒ   r…   r†   ÚheaderÚ_ÚdataÚ
media_typeÚ	mime_parts               r   Ú_convert_content_to_converser    †  sj  € ð €Ø˜�ˆÐÝ�'�3ÑÔð KØ&-§m¢m¡o¤oÐJ�˜Ð!Ð"Ð"¸VÀS¸M¸?ÐJÝ�'�4Ñ Ô ñ !5ØˆØð 	?ñ 	?ˆDÝ˜$¥Ñ$Ô$ð Ø—’˜v t˜nÑ-Ô-Ð-ØÝ˜d¥DÑ)Ô)ð ØØŸš ¨Ñ,Ô,ˆIØ˜FÒ"Ð"Ø—x’x ¨Ñ+Ô+�Ø—’˜v¨tÐ'< t t¸Ð=Ñ>Ô>Ð>Ð>Ø˜kÒ)Ñ)Ø ŸHšH [°"Ñ5Ô5�	Ý2<¸YÍÑ2MÔ2MÐU�i—m’m E¨2Ñ.Ô.Ð.ÐSU�Ø—>’> 'Ñ*Ô*ð ?à&)§m¢m°CÑ&8Ô&8‘O�F˜A˜tØ!-�JØ×(Ò(¨Ñ1Ô1ð 3Ø$*¨1¨2¨2¤J×$4Ò$4°SÑ$9Ô$9¸!Ô$<˜	Ø$ð 3Ø)2˜JØ—M’MØØCFÈ*ÐCTÐCT j×&6Ò&6°sÑ&;Ô&;¸BÔ&?Ð&?ÐZ`Ø'.° oð"ð "ð#ñ ô ð ñ ð —M’M 6Ð+<°cÐ+<Ð+<Ð+<Ð"=Ñ>Ô>Ð>ùØÐ4ˆvˆv v¨s m _Ð4Ø•S˜‘\”\Ð"Ð#Ð#r   Úmessagesc           
      óz  — g }g }| D �]Í}|                      dd¦  «        }|                      d¦  «        }|dk    rãt          |t          ¦  «        r,|                     ¦   «         r|                     d|i¦  «         n t          |t
          ¦  «        r‹|D ]ˆ}t          |t          ¦  «        rE|                      d¦  «        dk    r,|                     d|                      dd¦  «        i¦  «         Œ\t          |t          ¦  «        r|                     d|i¦  «         Œ‰�Œ|dk    rœ|                      dd¦  «        }t          |t          ¦  «        r|nt          j        |¦  «        }d	|d|igd
œi}	|r4|d         d         dk    r"|d         d                              |	¦  «         n|                     d|	gdœ¦  «         �Œ¹|dk    �r¨g }
t          |t          ¦  «        r,|                     ¦   «         r|
                     d|i¦  «         n7t          |t
          ¦  «        r"|
 	                    t          |¦  «        ¦  «         |                      dg ¦  «        }|pg D ]¼}|                      di ¦  «        }|                      dd¦  «        }	 t          |t          ¦  «        rt          j        |¦  «        n|}n# t          j        t          f$ r i }Y nw xY w|
                     d|                      dd¦  «        |                      dd¦  «        |dœi¦  «         Œ½|
sddig}
|r4|d         d         dk    r"|d         d          	                    |
¦  «         n|                     d|
dœ¦  «         �Œh|dk    r_t          |¦  «        }
|r4|d         d         dk    r"|d         d          	                    |
¦  «         n|                     d|
dœ¦  «         �ŒÍ�ŒÏ|r.|d         d         dk    r|                     ddddigdœ¦  «         |r-|d         d         dk    r|                     dddigdœ¦  «         |r|nd|fS )u  Convert OpenAI-format messages to Bedrock Converse format.

    Returns ``(system_prompt, converse_messages)`` where:
      - ``system_prompt`` is a list of system content blocks (or None)
      - ``converse_messages`` is the conversation in Converse format

    Handles:
      - System messages â†’ extracted as system prompt
      - User messages â†’ ``{"role": "user", "content": [...]}``
      - Assistant messages â†’ ``{"role": "assistant", "content": [...]}``
      - Tool calls â†’ ``{"toolUse": {"toolUseId": ..., "name": ..., "input": ...}}``
      - Tool results â†’ ``{"toolResult": {"toolUseId": ..., "content": [...]}}``

    Converse requires strict user/assistant alternation. Consecutive messages
    with the same role are merged into a single message.
    Úroler(   r—   Úsystemrƒ   rx   ÚtoolÚtool_call_idÚ
toolResult)Ú	toolUseIdr—   rŒ   Úuser)r£   r—   Ú	assistantÚ
tool_callsrs   Ú	argumentsz{}ÚtoolUseÚidrt   )r¨   rt   Úinputr„   r   N)r,   r>   r’   rR   r}   r“   r”   r{   ÚdumpsÚextendr    ÚloadsÚJSONDecodeErrorÚ	TypeErrorÚinsert)r¡   Úsystem_blocksÚconverse_msgsÚmsgr£   r—   r™   r¦   Úresult_contentÚtool_result_blockÚcontent_blocksr«   Útcr€   Úargs_strÚ	args_dicts                   r   Úconvert_messages_to_converser¿   º  s  € ð& !#€MØ "€Màð Tñ TˆØ�wŠw�v˜rÑ"Ô"ˆØ—'’'˜)Ñ$Ô$ˆà�8ÒÐå˜'¥3Ñ'Ô'ð =¨G¯MªM©O¬Oð =Ø×$Ò$ f¨gÐ%6Ñ7Ô7Ð7Ð7Ý˜G¥TÑ*Ô*ð =Ø#ð =ð =�DÝ! $­Ñ-Ô-ð =°$·(²(¸6Ñ2BÔ2BÀfÒ2LÐ2LØ%×,Ò,¨f°d·h²h¸vÀrÑ6JÔ6JÐ-KÑLÔLÐLÐLÝ# D­#Ñ.Ô.ð =Ø%×,Ò,¨f°d¨^Ñ<Ô<Ð<øÙà�6Š>ˆ>àŸ7š7 >°2Ñ6Ô6ˆLÝ(2°7½CÑ(@Ô(@ÐY˜W˜WÅdÄjÐQXÑFYÔFYˆNàØ!-Ø!'¨Ð 8Ð9ðð ð!Ðð ð  ¨rÔ!2°6Ô!:¸fÒ!DÐ!DØ˜bÔ! )Ô,×3Ò3Ð4EÑFÔFÐFÐFà×$Ò$Ø"Ø 1Ð2ð&ð &ñ ô ð ñ à�;ÒÑØˆNå˜'¥3Ñ'Ô'ð M¨G¯MªM©O¬Oð MØ×%Ò% v¨wÐ&7Ñ8Ô8Ð8Ð8Ý˜G¥TÑ*Ô*ð MØ×%Ò%Õ&BÀ7Ñ&KÔ&KÑLÔLÐLð Ÿš ¨rÑ2Ô2ˆJØ!Ð' Rð ð �Ø—V’V˜J¨Ñ+Ô+�ØŸ6š6 +¨tÑ4Ô4�ð#Ý8BÀ8ÍSÑ8QÔ8QÐ _¥¤
¨8Ñ 4Ô 4Ð 4ÐW_�I�IøÝÔ,­iÐ8ð #ð #ð #Ø "�I�I�Ið#øøøà×%Ò%ØØ%'§V¢V¨D°"Ñ%5Ô%5Ø "§¢ v¨rÑ 2Ô 2Ø!*ð ð  ð'ñ ô ð ð ð "ð 1Ø#)¨3 - �ð ð  ¨rÔ!2°6Ô!:¸kÒ!IÐ!IØ˜bÔ! )Ô,×3Ò3°NÑCÔCÐCÐCà×$Ò$Ø'Ø-ð&ð &ñ ô ð ñ à�6Š>ˆ>Ý9¸'ÑBÔBˆNàð  ¨rÔ!2°6Ô!:¸fÒ!DÐ!DØ˜bÔ! )Ô,×3Ò3°NÑCÔCÐCÐCà×$Ò$Ø"Ø-ð&ð &ñ ô ð ñ ñ ð ð N˜ qÔ)¨&Ô1°VÒ;Ð;Ø×Ò˜Q¨¸fÀc¸]¸OÐ LÐ LÑMÔMÐMð ð K˜ rÔ*¨6Ô2°fÒ<Ð<Ø×Ò f¸6À3¸-¸ÐIÐIÑJÔJÐJà*Ð4ˆMˆM°°mÐDÐDs   Ê
+J6Ê6KËKÚstop_reasonc                 ó@   — dddddddœ}|                      | d¦  «        S )zAMap Bedrock Converse stop reasons to OpenAI finish_reason values.Ústopr«   ÚlengthÚcontent_filter)Úend_turnÚstop_sequenceÚtool_useÚ
max_tokensÚcontent_filteredÚguardrail_intervened)r,   )rÀ   Úmappings     r   Ú_converse_stop_reason_to_openairÌ   5  s8   € ð ØØ ØØ,Ø 0ðð €Gð �;Š;�{ FÑ+Ô+Ð+r   Úresponsec                 ó  — |                       di ¦  «        }|                      di ¦  «        }|                      dg ¦  «        }|                       dd¦  «        }g }g }|D ]°}d|v r|                     |d         ¦  «         Œ"d|v rŠ|d         }|                     t          |                      dd	¦  «        d
t          |                      dd	¦  «        t          j        |                      di ¦  «        ¦  «        ¬¦  «        ¬¦  «        ¦  «         Œ±t          d|rd                     |¦  «        nd|r|nd¬¦  «        }	|                       di ¦  «        }
t          |
                      dd¦  «        |
                      dd¦  «        |
                      dd¦  «        |
                      dd¦  «        z   ¬¦  «        }t          |¦  «        }|r|dk    rd}t          d|	|¬¦  «        }t          |g||                       dd	¦  «        ¬¦  «        S )uã  Convert a Bedrock Converse API response to an OpenAI-compatible object.

    The agent loop in ``run_agent.py`` expects responses shaped like
    ``openai.ChatCompletion`` â€” this function bridges the gap.

    Returns a SimpleNamespace with:
      - ``.choices[0].message.content`` â€” text response
      - ``.choices[0].message.tool_calls`` â€” tool call list (if any)
      - ``.choices[0].finish_reason`` â€” stop/tool_calls/length
      - ``.usage`` â€” token usage stats
    ÚoutputÚmessager—   Ú
stopReasonrÅ   rƒ   r­   r¨   r(   rs   rt   r¯   ©rt   r¬   ©r®   rx   rs   rª   Ú
N©r£   r—   r«   ÚusageÚinputTokensr   ÚoutputTokens©Úprompt_tokensÚcompletion_tokensÚtotal_tokensrÂ   r«   ©ÚindexrÐ   Úfinish_reasonÚmodelId©ÚchoicesrÖ   Úmodel)r,   r}   r   r{   r°   ÚjoinrÌ   )rÍ   rÏ   rÐ   r»   rÀ   Ú
text_partsr«   ÚblockÚtur¸   Ú
usage_datarÖ   rß   Úchoices                 r   Únormalize_converse_responserê   B  s@  € ð �\Š\˜( BÑ'Ô'€FØ�jŠj˜ BÑ'Ô'€GØ—[’[ ¨BÑ/Ô/€NØ—,’,˜|¨ZÑ8Ô8€Kà€JØ€Jàð ð ˆØ�Uˆ?ˆ?Ø×Ò˜e FœmÑ,Ô,Ð,Ð,Ø˜%ÐÐØ�yÔ!ˆBØ×Ò�oØ—6’6˜+ rÑ*Ô*ØÝ(ØŸš ¨Ñ+Ô+Ý"œj¨¯ª°¸Ñ)<Ô)<Ñ=Ô=ðñ ô ðñ ô ñ ô ð øõ ØØ)3Ð=�—	’	˜*Ñ%Ô%Ð%¸Ø!+Ð5�:�:°ðñ ô €Cð —’˜g rÑ*Ô*€JÝØ —n’n ]°AÑ6Ô6Ø$Ÿ.š.¨¸Ñ;Ô;à�NŠN˜=¨!Ñ,Ô,¨z¯~ª~¸nÈaÑ/PÔ/PÑPð	ñ ô €Eõ 4°KÑ@Ô@€MØð %�m vÒ-Ð-Ø$ˆåØØØ#ðñ ô €Fõ Ø�ØØ�lŠl˜9 bÑ)Ô)ðñ ô ð r   c                 ó    — t          | ¦  «        S )uì  Consume a Bedrock ConverseStream event stream and build an OpenAI-compatible response.

    Processes the stream events in order:
      - ``messageStart`` â€” role info
      - ``contentBlockStart`` â€” new text or toolUse block
      - ``contentBlockDelta`` â€” incremental text or toolUse input
      - ``contentBlockStop`` â€” block complete
      - ``messageStop`` â€” stop reason
      - ``metadata`` â€” usage stats

    Returns the same shape as ``normalize_converse_response()``.
    )Ústream_converse_with_callbacks)Úevent_streams    r   Ú normalize_converse_stream_eventsrî   Š  s   € õ *¨,Ñ7Ô7Ð7r   c                 ó¸  — g }g }d}g }d}	d}
i }|                       dg ¦  «        D �]»}|r |¦   «         r �n«d|v rœ|d                               di ¦  «        }d|v r{d}	|r*|                     d	                     |¦  «        ¦  «         g }|d                               d
d	¦  «        |d                               dd	¦  «        d	dœ}|r ||d         ¦  «         Œ²d|v rÈ|d                               di ¦  «        }d|v r.|d         }|                     |¦  «         |r|	s ||¦  «         �Œd|v r.|�*|dxx         |d                               dd	¦  «        z  cc<   �Œ6d|v rB|d         }t          |t          ¦  «        r%|                      dd	¦  «        }|r|r ||¦  «         �Œ~d|v rÊ|�š	 |d         rt          j        |d         ¦  «        ni }n# t
          j        t          f$ r i }Y nw xY w|                     t          |d
         dt          |d         t          j
        |¦  «        ¬¦  «        ¬¦  «        ¦  «         d}�Œ|r*|                     d	                     |¦  «        ¦  «         g }�ŒLd|v r|d                               dd¦  «        }
�Œnd|v rI|d                               di ¦  «        }|                      dd¦  «        |                      dd¦  «        dœ}�Œ½|r(|                     d	                     |¦  «        ¦  «         t          d|rd                      |¦  «        nd|r|nd¬!¦  «        }t          |                      dd¦  «        |                      dd¦  «        |                      dd¦  «        |                      dd¦  «        z   ¬"¦  «        }t          |
¦  «        }|r|d#k    rd$}t          d||¬%¦  «        }t          |g|d	¬&¦  «        S )'aª  Process a Bedrock ConverseStream event stream with real-time callbacks.

    This is the core streaming function that powers both the CLI's live token
    display and the gateway's progressive message updates.

    Args:
        event_stream: The boto3 ``converse_stream()`` response containing a
            ``stream`` key with an iterable of events.
        on_text_delta: Called with each text chunk as it arrives. Only fires
            when no tool_use blocks have been seen (same semantics as the
            Anthropic and chat_completions streaming paths).
        on_tool_start: Called with the tool name when a toolUse block begins.
            Lets the TUI show a spinner while tool arguments are generated.
        on_reasoning_delta: Called with reasoning/thinking text chunks.
            Bedrock surfaces thinking via ``reasoning`` content block deltas
            on supported models (Claude 4.6+).
        on_interrupt_check: Called on each event. Should return True if the
            agent has been interrupted and streaming should stop.

    Returns:
        An OpenAI-compatible SimpleNamespace response, identical in shape to
        ``normalize_converse_response()``.
    NFrÅ   ÚstreamÚcontentBlockStartÚstartr­   Tr(   r¨   rt   )r¨   rt   Ú
input_jsonÚcontentBlockDeltaÚdeltarƒ   ró   r¯   ÚreasoningContentÚcontentBlockStoprs   rÒ   rÓ   ÚmessageStoprÑ   ÚmetadatarÖ   r×   r   rØ   )r×   rØ   rª   rÔ   rÕ   rÙ   rÂ   r«   rÝ   rá   )r,   r}   rä   r>   r”   r{   r²   r³   r´   r   r°   rÌ   )rí   Úon_text_deltaÚon_tool_startÚon_reasoning_deltaÚon_interrupt_checkrå   r«   Úcurrent_toolÚcurrent_text_bufferÚhas_tool_userÀ   rè   Úeventrò   rõ   rƒ   Ú	reasoningÚthinking_textÚ
input_dictÚ
meta_usager¸   rÖ   rß   ré   s                           r   rì   rì   š  sÜ  € ð< €JØ(*€JØ#'€LØ%'ÐØ€LØ€KØ!#€Jà×!Ò! (¨BÑ/Ô/ð Dñ Dˆàð 	Ð"4Ð"4Ñ"6Ô"6ð 	Ø‰Eà %Ð'Ð'ØÐ-Ô.×2Ò2°7¸BÑ?Ô?ˆEØ˜EÐ!Ð!Ø#�à&ð -Ø×%Ò% b§g¢gÐ.AÑ&BÔ&BÑCÔCÐCØ*,Ð'à!& yÔ!1×!5Ò!5°kÀ2Ñ!FÔ!FØ! )Ô,×0Ò0°¸Ñ<Ô<Ø"$ð ð  �ð
 !ð 8Ø!�M ,¨vÔ"6Ñ7Ô7Ð7øà  EÐ)Ð)ØÐ-Ô.×2Ò2°7¸BÑ?Ô?ˆEØ˜ˆˆØ˜V”}�Ø#×*Ò*¨4Ñ0Ô0Ð0ð !ð (¨ð (Ø!�M $Ñ'Ô'Ð'ùØ˜eÐ#Ð#ØÐ+Ø  Ð.Ð.Ô.°%¸	Ô2B×2FÒ2FÀwÐPRÑ2SÔ2SÑSÐ.Ð.Ñ.ùØ# uÐ,Ð,à!Ð"4Ô5�	Ý˜i­Ñ.Ô.ð :Ø$-§M¢M°&¸"Ñ$=Ô$=�MØ$ð :Ð);ð :Ø*Ð*¨=Ñ9Ô9Ð9ùà 5Ð(Ð(ØÐ'ð$ØKWÐXdÔKeÐ!m¥¤¨L¸Ô,FÑ!GÔ!GÐ!GÐkm�J�JøÝÔ,­iÐ8ð $ð $ð $Ø!#�J�J�Jð$øøøà×!Ò!¥/Ø# KÔ0Ø#Ý,Ø)¨&Ô1Ý"&¤*¨ZÑ"8Ô"8ðñ ô ð#ñ #ô #ñ ô ð ð  $�‘Ø$ð )Ø×!Ò! "§'¢'Ð*=Ñ">Ô">Ñ?Ô?Ð?Ø&(Ð#ùà˜eÐ#Ð#Ø Ô.×2Ò2°<ÀÑLÔLˆK‰Kà˜5Ð Ð Ø˜zÔ*×.Ò.¨w¸Ñ;Ô;ˆJà)Ÿ~š~¨m¸QÑ?Ô?Ø *§¢¨~¸qÑ AÔ Aðð ˆJùð ð 8Ø×Ò˜"Ÿ'š'Ð"5Ñ6Ô6Ñ7Ô7Ð7å
ØØ)3Ð=�—	’	˜*Ñ%Ô%Ð%¸Ø!+Ð5�:�:°ðñ ô €Cõ Ø —n’n ]°AÑ6Ô6Ø$Ÿ.š.¨¸Ñ;Ô;à�NŠN˜=¨!Ñ,Ô,¨z¯~ª~¸nÈaÑ/PÔ/PÑPð	ñ ô €Eõ 4°KÑ@Ô@€MØð %�m vÒ-Ð-Ø$ˆåØØØ#ðñ ô €Fõ Ø�ØØðñ ô ð s   Æ*$GÇG*Ç)G*é   rã   rÈ   ÚtemperatureÚtop_pÚstop_sequencesÚguardrail_configc                 ó.  — t          |¦  «        \  }}	| |	d|idœ}
|r||
d<   |�||
d         d<   |�||
d         d<   |r||
d         d<   |rCt          |¦  «        }|r2t          | ¦  «        rd	|i|
d
<   nt                               d| ¦  «         |r||
d<   |
S )z�Build kwargs for ``bedrock-runtime.converse()`` or ``converse_stream()``.

    Converts OpenAI-format inputs to Converse API parameters.
    Ú	maxTokens)rà   r¡   ÚinferenceConfigr¤   Nr  r  ÚtopPÚstopSequencesrq   Ú
toolConfigud   Model %s does not support tool calling â€” tools stripped. The agent will operate in text-only mode.ÚguardrailConfig)r¿   r�   rl   ÚloggerÚwarning)rã   r¡   rq   rÈ   r  r  r	  r
  Úsystem_promptÚconverse_messagesÚkwargsÚconverse_toolss               r   Úbuild_converse_kwargsr  -  s	  € õ (DÀHÑ'MÔ'MÑ$€MÐ$ð Ø%à˜ð
ðð €Fð ð )Ø(ˆˆxÑàÐØ3>ˆÐ Ô! -Ñ0àÐØ,1ˆÐ Ô! &Ñ)àð DØ5CˆÐ Ô! /Ñ2àð Ý2°5Ñ9Ô9ˆØð 	õ (¨Ñ.Ô.ð Ø(/°Ð'@��|Ñ$Ð$å—’ð@ØAFñô ð ð
 ð 5Ø$4ˆÐ Ñ!à€Mr   c	           
      óJ  — t          | ¦  «        }	t          ||||||||¬¦  «        }
	  |	j        di |
¤Ž}n`# t          $ rS}t	          |¦  «        r>t
                               d| |t          |¦  «        j        ¦  «         t          | ¦  «         ‚ d}~ww xY wt          |¦  «        S )z±Call Bedrock Converse API (non-streaming) and return an OpenAI-compatible response.

    This is the primary entry point for the agent loop when using the Bedrock provider.
    ©rã   r¡   rq   rÈ   r  r  r	  r
  u|   bedrock: stale-connection error on converse(region=%s, model=%s): %s â€” evicting cached client so the next call reconnects.Nr   )r   r  ÚconverserY   rG   r  r  rx   r'   r#   rê   ©r   rã   r¡   rq   rÈ   r  r  r	  r
  r   r  rÍ   r$   s                r   Úcall_converser  g  sÙ   € õ )¨Ñ0Ô0€FÝ"ØØØØØØØ%Ø)ð	ñ 	ô 	€Fð
Ø"�6”?Ð,Ð, VÐ,Ð,ˆˆøÝð ð ð Ý$ SÑ)Ô)ð 	.Ý�NŠNðMà˜�t C™yœyÔ1ñô ð õ
 & fÑ-Ô-Ð-Øøøøøðøøøõ ' xÑ0Ô0Ð0ó   ¨6 ¶
BÁ ABÂBc	           
      óJ  — t          | ¦  «        }	t          ||||||||¬¦  «        }
	  |	j        di |
¤Ž}n`# t          $ rS}t	          |¦  «        r>t
                               d| |t          |¦  «        j        ¦  «         t          | ¦  «         ‚ d}~ww xY wt          |¦  «        S )zåCall Bedrock ConverseStream API and return an OpenAI-compatible response.

    Consumes the full stream and returns the assembled response. For true
    streaming with delta callbacks, use ``iter_converse_stream()`` instead.
    r  uƒ   bedrock: stale-connection error on converse_stream(region=%s, model=%s): %s â€” evicting cached client so the next call reconnects.Nr   )r   r  Úconverse_streamrY   rG   r  r  rx   r'   r#   rî   r  s                r   Úcall_converse_streamr!  �  sÚ   € õ  )¨Ñ0Ô0€FÝ"ØØØØØØØ%Ø)ð	ñ 	ô 	€Fð
Ø)�6Ô)Ð3Ð3¨FÐ3Ð3ˆˆøÝð ð ð Ý$ SÑ)Ô)ð 	.Ý�NŠNðXà˜�t C™yœyÔ1ñô ð õ
 & fÑ-Ô-Ð-Øøøøøðøøøõ ,¨HÑ5Ô5Ð5r  Ú_discovery_cachei  c                  ó8   — t                                ¦   «          dS )z/Clear the model discovery cache. Used in tests.N)r"  r   r   r   r   Úreset_discovery_cacher$  Â  s   € å×ÒÑÔÐÐÐr   Úprovider_filterc           
      ó‚	  ‡— ddl }| › dd                     t          |pg ¦  «        ¦  «        › �}t                               |¦  «        }|r.|                      ¦   «         |d         z
  t
          k     r|d         S 	 t          | ¦  «        }n4# t          $ r'}t           	                    d|¦  «         g cY d}~S d}~ww xY wg }t          ¦   «         }d„ |pg D ¦   «         Š	 |                     ¦   «         }	|	                     d	g ¦  «        D �]±}
|
                     d
¦  «        pd                     ¦   «         }|sŒ/‰re|
                     d¦  «        pd                     ¦   «         }d|v r-|                     d¦  «        d                              ¦   «         nd}|‰vr|‰vrŒ–|
                     di ¦  «        }|                     dd¦  «                             ¦   «         dk    rŒÙ|
                     dd¦  «        sŒð|
                     dg ¦  «        }d|vr�Œ|                     ||
                     d¦  «        p|                     ¦   «         |
                     d¦  «        pd                     ¦   «         |
                     dg ¦  «        |ddœ¦  «         |                     |                     ¦   «         ¦  «         �Œ³n2# t          $ r%}t           	                    d|¦  «         Y d}~nd}~ww xY w	 g }d}	 i }|r||d<    |j        d$i |¤Ž}	|	                     dg ¦  «        D ]}|                     |¦  «         Œ|	                     d¦  «        }|snŒ]|D �]}|                     d¦  «        pd                     ¦   «         }|sŒ/|                     d¦  «        dk    rŒI|                     ¦   «         |v rŒ`‰r4|                     dg ¦  «        }t'          ˆfd„|D ¦   «         ¦  «        }|sŒ–|                     ||                     d¦  «        p|                     ¦   «         ddgdgddœ¦  «         |                     |                     ¦   «         ¦  «         �Œn2# t          $ r%}t                               d |¦  «         Y d}~nd}~ww xY w|                     d!„ ¬"¦  «         |                      ¦   «         |d#œt          |<   |S )%a›  Discover available Bedrock foundation models and inference profiles.

    Returns a list of model info dicts with keys:
      - ``id``: Model ID (e.g. "anthropic.claude-sonnet-4-6-20250514-v1:0")
      - ``name``: Human-readable name
      - ``provider``: Model provider (e.g. "Anthropic", "Amazon", "Meta")
      - ``input_modalities``: List of input types (e.g. ["TEXT", "IMAGE"])
      - ``output_modalities``: List of output types
      - ``streaming``: Whether streaming is supported

    Caches results for 1 hour per region to avoid repeated API calls.

    Mirrors OpenClaw's ``discoverBedrockModels()`` in
    ``extensions/amazon-bedrock/discovery.ts``.
    r   Nú:r‡   Ú	timestampÚmodelsz7Failed to create Bedrock client for model discovery: %sc                 ó6   — h | ]}|                      ¦   «         ’ŒS r   )rj   )r:   Úfs     r   ú	<setcomp>z*discover_bedrock_models.<locals>.<setcomp>é  s    € Ð=Ð=Ð= �!—'’'‘)”)Ð=Ð=Ð=r   ÚmodelSummariesrà   r(   ÚproviderNameú.ÚmodelLifecycleÚstatusÚACTIVEÚresponseStreamingSupportedFÚoutputModalitiesÚTEXTÚ	modelNameÚinputModalitiesT)r®   rt   ÚproviderÚinput_modalitiesÚoutput_modalitiesÚ	streamingz,Failed to list Bedrock foundation models: %sÚ	nextTokenÚinferenceProfileSummariesÚinferenceProfileIdc              3   ó†   •K  — | ];}t          |                     d d¦  «        ¦  «                             ¦   «         ‰v V — Œ<dS )ÚmodelArnr(   N)Ú_extract_provider_from_arnr,   rj   )r:   ÚmÚ
filter_sets     €r   r<   z*discover_bedrock_models.<locals>.<genexpr>+  s_   øè è € ð ð àõ /¨q¯uªu°ZÀÑ/DÔ/DÑEÔE×KÒKÑMÔMÐQ[Ð[ðð ð ð ð ð r   ÚinferenceProfileNamezinference-profilez(Skipping inference profile discovery: %sc                 ót   — | d                               d¦  «        rdnd| d                              ¦   «         fS )Nr®   rn   r   é   rt   )r9   rj   )rB  s    r   ú<lambda>z)discover_bedrock_models.<locals>.<lambda>?  s8   € ØˆtŒW×Ò 	Ñ*Ô*Ð1ˆˆ°Ø	ˆ&Œ	�ŠÑÔð€ r   )Úkey)r(  r)  r   )Útimerä   Úsortedr"  r,   Ú_DISCOVERY_CACHE_TTL_SECONDSr   rY   r  r  ÚsetÚlist_foundation_modelsrR   rj   r–   Úupperr}   ÚaddÚlist_inference_profilesrA   ÚdebugÚsort)r   r%  rI  Ú	cache_keyÚcachedr   Úer)  Úseen_idsrÍ   Úsummaryre   Úprovider_nameÚmodel_prefixÚ	lifecycleÚoutput_modsÚprofilesÚ
next_tokenr  ÚprofileÚ
profile_idÚprofile_modelsÚmatchesrC  s                          @r   Údiscover_bedrock_modelsrb  Ç  s³  ø€ ð& €K€K€KàÐEÐE˜CŸHšH¥V¨OÐ,A¸rÑ%BÔ%BÑCÔCÐEÐE€IÝ×!Ò! )Ñ,Ô,€FØð  �4—9’9‘;”; ¨Ô!4Ñ4Õ8TÒTÐTØ�hÔÐðÝ,¨VÑ4Ô4ˆˆøÝð ð ð Ý�ŠÐPÐRSÑTÔTÐTØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøð €FÝ‰uŒu€HØ=Ð= oÐ&;¸Ð=Ñ=Ô=€Jð"JØ×0Ò0Ñ2Ô2ˆØ—|’|Ð$4°bÑ9Ô9ð 	+ñ 	+ˆGØŸš IÑ.Ô.Ð4°"×;Ò;Ñ=Ô=ˆHØð Øð ð Ø!(§¢¨^Ñ!<Ô!<Ð!BÀ× IÒ IÑ KÔ K�ØADÈÀÀ˜xŸ~š~¨cÑ2Ô2°1Ô5×;Ò;Ñ=Ô=Ð=ÐVX�Ø ¨
Ð2Ð2°|È:Ð7UÐ7UØð  ŸšÐ$4°bÑ9Ô9ˆIØ�}Š}˜X rÑ*Ô*×0Ò0Ñ2Ô2°hÒ>Ð>ØØ—;’;Ð;¸UÑCÔCð ØØ!Ÿ+š+Ð&8¸"Ñ=Ô=ˆKØ˜[Ð(Ð(Ùà�MŠMØØ Ÿš [Ñ1Ô1Ð=°X×DÒDÑFÔFØ$Ÿ[š[¨Ñ8Ô8Ð>¸B×EÒEÑGÔGØ$+§K¢KÐ0AÀ2Ñ$FÔ$FØ%0Ø!ðð ñ ô ð ð �LŠL˜ŸšÑ)Ô)Ñ*Ô*Ð*Ñ*ð=	+øõ> ð Jð Jð JÝ�ŠÐEÀqÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøð+DØˆØˆ
ð		ØˆFØð 1Ø&0��{Ñ#Ø5�vÔ5Ð?Ð?¸Ð?Ð?ˆHØ#Ÿ<š<Ð(CÀRÑHÔHð )ð )�Ø—’ Ñ(Ô(Ð(Ð(Ø!Ÿš kÑ2Ô2ˆJØð Øð		ð  ð 	-ñ 	-ˆGØ!Ÿ+š+Ð&:Ñ;Ô;ÐA¸r×HÒHÑJÔJˆJØð ØØ�{Š{˜8Ñ$Ô$¨Ò0Ð0ØØ×ÒÑ!Ô! XÐ-Ð-Øð ð Ø!(§¢¨X°rÑ!:Ô!:�Ýð ð ð ð à+ðñ ô ñ ô �ð ð Øà�MŠMØ Ø ŸšÐ%;Ñ<Ô<ÐJÀ
×QÒQÑSÔSØ/Ø%+ HØ&, XØ!ðð ñ ô ð ð �LŠL˜×)Ò)Ñ+Ô+Ñ,Ô,Ð,Ñ,ð7	-øõ8 ð Dð Dð DÝ�ŠÐ?ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøðDøøøð ‡K‚Kð ð €Kñ ô ð ð —Y’Y‘[”[Øð#ð #Õ�YÑð €MsP   Á:B
 Â

B;ÂB6Â0B;Â6B;ÃGJ; Ê;
K*ËK%Ë%K*Ë.E(Q Ñ
RÑ!RÒRÚarnc                 ó^   — t          j        d| ¦  «        }|r|                     d¦  «        ndS )u�   Extract the model provider from a Bedrock model ARN.

    Example: "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2"
    â†’ "anthropic"
    zfoundation-model/([^.]+)rF  r(   )ÚreÚsearchÚgroup)rc  Úmatchs     r   rA  rA  K  s/   € õ ŒIÐ1°3Ñ7Ô7€EØ"Ð*ˆ5�;Š;�q‰>Œ>ˆ>¨Ð*r   c                 ó8   — t          | ¦  «        }d„ |D ¦   «         S )z±Return a flat list of available Bedrock model IDs for the given region.

    Convenience wrapper around ``discover_bedrock_models()`` for use in
    the model selection UI.
    c                 ó   — g | ]
}|d          ‘ŒS )r®   r   )r:   rB  s     r   ú
<listcomp>z)get_bedrock_model_ids.<locals>.<listcomp>\  s   € Ð$Ð$Ð$˜ˆAˆdŒGÐ$Ð$Ð$r   )rb  )r   r)  s     r   Úget_bedrock_model_idsrl  U  s%   € õ % VÑ,Ô,€FØ$Ð$˜VÐ$Ñ$Ô$Ð$r   zNValidationException.*(?:input is too long|max input token|input token.*exceed)zVValidationException.*(?:exceeds? the (?:maximum|max) (?:number of )?(?:input )?tokens)zFModelStreamErrorException.*(?:Input is too long|too many input tokens)ÚThrottlingExceptionzToo many concurrent requestsÚServiceQuotaExceededExceptionÚModelNotReadyExceptionÚModelTimeoutExceptionÚInternalServerExceptionÚerror_messagec                 óD   ‡ — t          ˆ fd„t          D ¦   «         ¦  «        S )z¿Return True if the error indicates the input context was too large.

    When this returns True, the agent should compress context and retry
    rather than treating it as a fatal error.
    c              3   óB   •K  — | ]}|                      ‰¦  «        V — Œd S r8   ©rf  ©r:   Úprr  s     €r   r<   z,is_context_overflow_error.<locals>.<genexpr>‚  s/   øè è € ÐJÐJ¨1ˆq�xŠx˜Ñ&Ô&ÐJÐJÐJÐJÐJÐJr   )rA   ÚCONTEXT_OVERFLOW_PATTERNS©rr  s   `r   Úis_context_overflow_errorrz  |  s)   ø€ õ ÐJÐJÐJÐJÕ0IÐJÑJÔJÑJÔJÐJr   c                 ó²   ‡ — t          ‰ ¦  «        rdS t          ˆ fd„t          D ¦   «         ¦  «        rdS t          ˆ fd„t          D ¦   «         ¦  «        rdS dS )uC  Classify a Bedrock error for retry/failover decisions.

    Returns:
      - ``"context_overflow"`` â€” input too long, compress and retry
      - ``"rate_limit"`` â€” throttled, backoff and retry
      - ``"overloaded"`` â€” model temporarily unavailable, retry with delay
      - ``"unknown"`` â€” unclassified error
    Úcontext_overflowc              3   óB   •K  — | ]}|                      ‰¦  «        V — Œd S r8   ru  rv  s     €r   r<   z)classify_bedrock_error.<locals>.<genexpr>�  ó/   øè è € Ð
>Ð
> qˆ1�8Š8�MÑ"Ô"Ð
>Ð
>Ð
>Ð
>Ð
>Ð
>r   Ú
rate_limitc              3   óB   •K  — | ]}|                      ‰¦  «        V — Œd S r8   ru  rv  s     €r   r<   z)classify_bedrock_error.<locals>.<genexpr>’  r~  r   Ú
overloadedÚunknown)rz  rA   ÚTHROTTLE_PATTERNSÚOVERLOAD_PATTERNSry  s   `r   Úclassify_bedrock_errorr…  …  sv   ø€ õ ! Ñ/Ô/ð "Ø!Ð!Ý
Ð
>Ð
>Ð
>Ð
>Õ,=Ð
>Ñ
>Ô
>Ñ>Ô>ð Øˆ|Ý
Ð
>Ð
>Ð
>Ð
>Õ,=Ð
>Ñ
>Ô
>Ñ>Ô>ð Øˆ|Øˆ9r   zanthropic.claude-opus-4-6i@ zanthropic.claude-sonnet-4-6z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-haikuzamazon.nova-proià“ zamazon.nova-litezamazon.nova-microi ô zmeta.llama4-maverickzmeta.llama4-scoutzmeta.llama3-3-70b-instruct)zmistral.mistral-largezdeepseek.v3ÚBEDROCK_CONTEXT_LENGTHSc                 óÎ   — |                       ¦   «         }d}t          }t                               ¦   «         D ]-\  }}||v r$t	          |¦  «        t	          |¦  «        k    r|}|}Œ.|S )z±Look up the context window size for a Bedrock model.

    Uses substring matching so versioned IDs like
    ``anthropic.claude-sonnet-4-6-20250514-v1:0`` resolve correctly.
    r(   )rj   ÚBEDROCK_DEFAULT_CONTEXT_LENGTHr†  Úitemsro   )re   ri   Úbest_keyÚbest_valrH  Úvals         r   Úget_bedrock_context_lengthr�  ½  sm   € ð —.’.Ñ"Ô"€KØ€HÝ-€HÝ+×1Ò1Ñ3Ô3ð ð ‰ˆˆSØ�+ÐÐ¥# c¡(¤(­S°©]¬]Ò":Ð":ØˆHØˆHøØ€Or   r8   )NNNN)Nr  NNNN)AÚ__doc__r{   ÚloggingrP   re  Útypesr   Útypingr   r   r   r   r   Ú	getLoggerr'   r  r	   r’   Ú__annotations__r
   r   r   r   r   Úboolr#   rB   ÚBaseExceptionr1   rG   Ú_AWS_CREDENTIAL_ENV_VARSr^   r`   rd   rk   rl   rp   r�   r    r¿   rÌ   rê   rî   rì   ÚintÚfloatr  r  r!  r"  rK  r$  rb  rA  rl  ÚcompileÚ
IGNORECASErx  rƒ  r„  rz  r…  r†  rˆ  r�  r   r   r   ú<module>r›     sñ  ððð ð ð: €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à	ˆÔ	˜8Ñ	$Ô	$€ð 13Ð ˜t C¨ Hœ~Ð 2Ð 2Ñ 2Ø02Ð ˜t C¨ Hœ~Ð 2Ð 2Ñ 2ð

ð 

ð 

ð
1¨ð 
1ð 
1ð 
1ð 
1ð1¨ð 1ð 1ð 1ð 1ð*ð *ð *ð cð ¨dð ð ð ð ðFÐ ð =ð ð ð ð ð5 =ð 5°Tð 5ð 5ð 5ð 5ðBð ð Ð ð'ð ' (¨4°°S°¬>Ô":ð 'ÀhÈsÄmð 'ð 'ð 'ð 'ðTð ˜X d¨3°¨8¤nÔ5ð Àð ð ð ð ð>
ð 
 ¨¨c°3¨h¬Ô 8ð 
ÀCð 
ð 
ð 
ð 
ð.ð ð Ð ðU sð U¨tð Uð Uð Uð Uð6¨ð 6°ð 6ð 6ð 6ð 6ð4 T¨$¤Zð °D¸´Jð ð ð ð ð>1$¨T°$¬Zð 1$ð 1$ð 1$ð 1$ðhtEØ�4ŒjðtEà
ˆ8�D˜”JÔ  d¤Ð+Ô,ðtEð tEð tEð tEðv
,°ð 
,¸ð 
,ð 
,ð 
,ð 
,ðA¨$ð A°?ð Að Að Að AðP8°oð 8ð 8ð 8ð 8ð$ ØØØðLð Lð ðLð Lð Lð Lðl #'ØØ#'Ø!Ø*.Ø'+ð7ð 7Øð7à�4Œjð7ð �D˜”JÔð7ð ð	7ð
 ˜%”ð7ð �EŒ?ð7ð ˜T #œYÔ'ð7ð ˜t”nð7ð 
ˆ#ˆsˆ(„^ð7ð 7ð 7ð 7ð| #'ØØ#'Ø!Ø*.Ø'+ð&1ð &1Øð&1àð&1ð �4Œjð&1ð �D˜”JÔð	&1ð
 ð&1ð ˜%”ð&1ð �EŒ?ð&1ð ˜T #œYÔ'ð&1ð ˜t”nð&1ð ð&1ð &1ð &1ð &1ðZ #'ØØ#'Ø!Ø*.Ø'+ð'6ð '6Øð'6àð'6ð �4Œjð'6ð �D˜”JÔð	'6ð
 ð'6ð ˜%”ð'6ð �EŒ?ð'6ð ˜T #œYÔ'ð'6ð ˜t”nð'6ð ð'6ð '6ð '6ð '6ð\ $&Ð �$�s˜C�x”.Ð %Ð %Ñ %Ø#Ð ðð ð ð ,0ðAð AØðAà˜d 3œiÔ(ðAð 
ˆ$ˆs�CˆxŒ.ÔðAð Að Að AðH+ Cð +¨Cð +ð +ð +ð +ð% #ð %¨$¨s¬)ð %ð %ð %ð %ð& €B„JÐ`ÐbdÔboÑpÔpØ€B„JÐhÐjlÔjwÑxÔxØ€B„JÐXÐZ\ÔZgÑhÔhðÐ ð €B„JÐ% r¤}Ñ5Ô5Ø€B„JÐ.°´Ñ>Ô>Ø€B„JÐ/°´Ñ?Ô?ðÐ ð €B„JÐ(¨"¬-Ñ8Ô8Ø€B„JÐ'¨¬Ñ7Ô7Ø€B„JÐ)¨2¬=Ñ9Ô9ðÐ ðK¨Sð K°Tð Kð Kð Kð Kð¨#ð °#ð ð ð ð ð2+à Wð+ð " Wð+ð " Wð	+ð
 ! Wð+ð  Wð+ð   Wð+ð " Wð+ð ! Wð+ð  Wð+ð   Wð+ð  Wð+ð  Wð+ð  Wð+ð   Wð!+ð$  Wð%+ð&  Wð'+ð( ! Wð)+ð, &-à%,ð1+ð +ð +Ð ˜˜c 3˜hœð ð ñ ð8 ")Ð ð¨ð °ð ð ð ð ð ð r   