Ë
    uPêj  ã                   ó*  — U d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ dZeed	<    ej"                  d
ej$                  «      Zeed<   dedz  dedz  fd„Zdeeef   defd„Z G d„ d«      Zdedz  dedefd„Zdedz  dedefd„Zy)a¼  Shared auth, region resolution, and routing helpers for the Amazon Bedrock Mantle provider.

Mantle authenticates with a Bearer token when one is available
(litellm_params.api_key, BEDROCK_MANTLE_API_KEY, or the standard
AWS_BEARER_TOKEN_BEDROCK); otherwise it falls back to AWS SigV4 (service
"bedrock") over the standard credential chain (IAM role / access key / profile /
web identity). The Chat Completions and Responses backends share this behaviour
through BedrockMantleAuthMixin so the two paths can never drift apart.

The two routing helpers (mantle_supports_responses, mantle_base_segment) are
pure functions of (model, model_cost) so they can be unit-tested without patching
global state.
é    N)ÚMapping)ÚFinal)ÚCredentialRetrievalErrorÚNoCredentialsErrorÚPartialCredentialsErrorÚProfileNotFound)Ú
BaseAWSLLM©Úget_secret_strz	us-east-1ÚBEDROCK_MANTLE_DEFAULT_REGIONz,^https?://bedrock-mantle\.([^/.]+)\.api\.awsÚMANTLE_HOST_REÚapi_keyÚreturnc                 ó:   — | xs t        d«      xs t        d«      S )NÚBEDROCK_MANTLE_API_KEYÚAWS_BEARER_TOKEN_BEDROCKr
   ©r   s    úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/bedrock_mantle/common_utils.pyÚresolve_mantle_bearer_tokenr   #   s   € ØÒl”nÐ%=Ó>ÒlÄ.ÐQkÓBlÐló    Úparamsc                 ó¦  — | j                  d«      }t        |t        «      r|rt        j                  |«       |S | j                  d«      }t        |t        «      r|nd xs t        d«      }|r7t        j                  |j                  d«      «      }|r|j                  d«      S t        d«      xs  t        d«      xs t        d«      xs t        S )	NÚaws_region_nameÚapi_baseÚBEDROCK_MANTLE_API_BASEú/é   ÚBEDROCK_MANTLE_REGIONÚAWS_REGION_NAMEÚ
AWS_REGION)ÚgetÚ
isinstanceÚstrr	   Ú_validate_aws_region_namer   r   ÚmatchÚrstripÚgroupr   )r   Úregionr   Úbaser%   s        r   Úresolve_mantle_regionr*   '   s¹   € Ø—J‘JÐ0Ó1€FÜ�&œ#Ô¡6Ü×,Ñ,¨VÔ4ØˆØ—j‘j Ó,€HÜ)¨(´CÔ8‘8¸dÒpÄ~ÐVoÓGp€DÙÜ%×+Ñ+¨D¯K©K¸Ó,<Ó=ˆÙØ—;‘;˜q“>Ð!äÐ.Ó/ò 	)ÜÐ+Ó,ò	)ä˜,Ó'ò	)ô )ð	r   c                   ó¶   — e Zd ZU eed<   ededz  dedz  fd„«       Zededefd„«       Z		 	 	 	 dded	ed
edededz  dedz  de
dz  de
dz  deeedz  f   fd„Zy)ÚBedrockMantleAuthMixinÚ_aws_signerr   Nr   c                 ó   — t        | «      S ©N)r   r   s    r   Ú_resolve_bearer_tokenz,BedrockMantleAuthMixin._resolve_bearer_token=   s   € ä*¨7Ó3Ð3r   r   c                 ó   — t        | «      S r/   )r*   )r   s    r   Ú_resolve_regionz&BedrockMantleAuthMixin._resolve_regionA   s   € ä$ VÓ,Ð,r   ÚheadersÚoptional_paramsÚrequest_datar   ÚmodelÚstreamÚfake_streamc	                 óî  — | j                  |«      }	|	s‹t        j                  |j                  d«      «      }
i |¥d|
r|
j	                  d«      n| j                  i |¥d|i¥«      i¥}|j                  «       D ��ci c]  \  }}|j                  «       dk7  sŒ||“Œ }}}	 | j                  j                  d|||||	|||¬«	      S c c}}w # t        t        t        t        f$ r}t        d«      |‚d }~ww xY w)	Nr   r   r   r   ÚauthorizationÚbedrock)	Úservice_namer3   r4   r5   r   r   r6   r7   r8   zûBedrock Mantle auth failed: no Bearer token and no usable AWS credentials. Set BEDROCK_MANTLE_API_KEY (or AWS_BEARER_TOKEN_BEDROCK) or pass api_key for Bearer auth, or provide AWS credentials (IAM role / access key / profile / web identity) for SigV4.)r0   r   r%   r&   r'   r2   ÚitemsÚlowerr-   Ú_sign_requestr   r   r   r   Ú
ValueError)Úselfr3   r4   r5   r   r   r6   r7   r8   ÚbearerÚ
host_matchÚkÚvÚes                 r   Úsign_requestz#BedrockMantleAuthMixin.sign_requestE   s%  € ð ×2Ñ2°7Ó;ˆÙô !/× 4Ñ 4°X·_±_ÀSÓ5IÓ JˆJðØ!ðà!á!ð ×$Ñ$ QÔ'à×-Ñ-Ð.W°Ð.WÀ*ÈhÑ.WÓXñˆOð )0¯©«×X¡  1¸1¿7¹7»9ÈÓ;W�q˜!‘tÐXˆGÑXð	Ø×#Ñ#×1Ñ1Ø&ØØ /Ø)Ø!ØØØØ'ð 2ó 
ð 
ùó Yøô Ü#ÜÜ$ð	
ò 	ô ðNóð
 ðûð	ús$   Á;CÂCÂ #C
 Ã
C4Ã#C/Ã/C4)NNNN)Ú__name__Ú
__module__Ú__qualname__r	   Ú__annotations__Ústaticmethodr#   r0   Údictr2   ÚboolÚtupleÚbytesrG   © r   r   r,   r,   :   sÛ   … ØÓàð4 s¨T¡zð 4°c¸D±jò 4ó ð4ð ð- ð -¨ò -ó ð-ð #Ø Ø"Ø#'ñ1àð1ð ð1ð ð	1ð
 ð1ð �t‘ð1ð �T‰zð1ð �t‘ð1ð ˜D‘[ð1ð 
ˆt�U˜T‘\Ð!Ñ	"ô1r   r,   r6   Ú
model_costc                 ó„   — |j                  d| › �i «      }d|j                  d«      xs g v ry|j                  d«      dk(  S )aÂ  Whether a Bedrock Mantle model can serve the native Responses API.

    Purely data-driven from the model's price-map capability signal -- either
    /v1/responses in supported_endpoints, or mode=responses -- both overridable
    via register_model and proxy model_info, so onboarding a model is a JSON
    change, never a code change. There is deliberately NO model-name match here:
    capability is per-model, not per-family (openai.gpt-oss-120b supports
    Responses while openai.gpt-oss-safeguard-120b does not, despite sharing the
    gpt-oss substring), so a substring gate would be wrong. A model absent from
    model_cost simply has no signal and returns False (chat-completions emulation).
    úbedrock_mantle/z/v1/responsesÚsupported_endpointsTÚmodeÚ	responses©r!   ©r6   rR   Úentrys      r   Úmantle_supports_responsesr[   y   sI   € ð —>‘> O°E°7Ð";¸RÓ@€EØ˜5Ÿ9™9Ð%:Ó;ÒA¸rÑBØØ�9‰9�VÓ Ñ+Ð+r   c                 óZ   — |j                  d| › �i «      }|j                  d«      du rdS dS )aƒ  Return the base path segment for a Bedrock Mantle model's OpenAI surface.

    Data-driven from the model's price-map use_openai_responses_path flag
    (overridable via register_model / proxy model_info). Per the AWS model cards,
    gpt-5.x and the google gemma-4-* family carry that flag and are served on the
    /openai/v1 base (.../openai/v1/responses and .../openai/v1/chat/completions);
    every other model including gpt-oss uses the standard /v1 base. The segment is
    the base for the model's whole OpenAI-compatible surface, so both the chat and
    responses configs derive from it -- there is no separate model-name rule.
    rT   Úuse_openai_responses_pathTz	openai/v1Úv1rX   rY   s      r   Úmantle_base_segmentr_   ‹   s7   € ð —>‘> O°E°7Ð";¸RÓ@€EØŸ)™)Ð$?Ó@ÀDÑHˆ;ÐRÈdÐRr   )Ú__doc__ÚreÚcollections.abcr   Útypingr   Úbotocore.exceptionsr   r   r   r   Ú!litellm.llms.bedrock.base_aws_llmr	   Úlitellm.secret_managers.mainr   r   rK   ÚcompileÚ
IGNORECASEr   r#   r   Úobjectr*   r,   rM   rN   r[   r_   rQ   r   r   ú<module>rj      sØ   ðòó 
Ý #Ý ÷ó õ 9Ý 7à'2Ð ˜uÓ 2ð #˜Ÿ
™
Ð#RÐTV×TaÑTaÓb€�Ó bðm¨¨t©ð m¸¸d¹
ó mð '¨#¨v¨+Ñ"6ð ¸3ó ÷&<ñ <ð~, S¨4¡Zð ,¸Tð ,Àdó ,ð$S˜s T™zð S°tð SÀô Sr   