Ë
    uPêjò+  ã                   ó   — U d Z ddlZddlmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ dZeed	<   d
edeeef   fd„Zd
edee   fd„Zdedee   fd„Zdedeeef   fd„Zdedefd„Zdedeeef   fd„Z G d„ de
«      Zy)zÂ
AWS Bedrock CountTokens API transformation logic.

This module handles the transformation of requests from Anthropic Messages API format
to AWS Bedrock's CountTokens API format and vice versa.
é    N)ÚMapping)ÚFinalÚLiteral)Ú	JsonValue)Ú
BaseAWSLLM)Úget_bedrock_base_modeli   Ú)DEFAULT_ANTHROPIC_INVOKE_MODEL_MAX_TOKENSÚvalueÚreturnc                 ó*   — t        | t        «      r| S i S ©N©Ú
isinstanceÚdict©r
   s    úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/bedrock/count_tokens/transformation.pyÚ
_json_dictr      ó   € Ü˜u¤dÔ+ˆ5Ð3°Ð3ó    c                 ó*   — t        | t        «      r| S g S r   )r   Úlistr   s    r   Ú
_json_listr      r   r   Úcontentc                 óT   — t        | t        «      rd| igS t        | t        «      r| S g S )NÚtext)r   Ústrr   )r   s    r   Ú_to_converse_contentr      s.   € Ü�'œ3ÔØ˜Ð!Ð"Ð"Ü�'œ4Ô ØˆØ€Ir   Úmessagec                 ór   — t        | «      }|j                  d«      t        |j                  dd«      «      dœS )NÚroler   Ú )r    r   )r   Úgetr   )r   Úfieldss     r   Ú_to_converse_messager$   '   s5   € Ü˜wÓ'€Fà—
‘
˜6Ó"Ü'¨¯
©
°9¸bÓ(AÓBñð r   Úraw_namec                 ó–   — t        j                  ddt        | t        «      r| nd«      }|r|d   j	                  «       r|nd|› �}|d d S )Nz[^a-zA-Z0-9_]Ú_r!   r   Út_é@   )ÚreÚsubr   r   Úisalpha)r%   ÚnameÚprefixeds      r   Ú_sanitized_bedrock_tool_namer/   /   sJ   € Ü—&‘&Ð)¨3¼JÀxÔQTÔ<U±Ð[]Ó^€DÙ"&¨$¨q©'¯/©/Ô*;‘dÀ2ÀdÀVÀ€HØ�C�Rˆ=Ðr   Útoolc           
      ó®   — t        | «      }t        |j                  dd«      «      }d||j                  d«      xs |d|j                  ddi dœ«      id	œiS )
Nr-   r!   ÚtoolSpecÚdescriptionÚjsonÚinput_schemaÚobject)ÚtypeÚ
properties)r-   r3   ÚinputSchema)r   r/   r"   )r0   r#   r-   s      r   Ú_to_bedrock_tool_specr:   5   s`   € Ü˜tÓ$€FÜ.¨v¯z©z¸&À"Ó/EÓF€DàØØ!Ÿ:™: mÓ4Ò<¸Ø" F§J¡J¨~ÈÐ`bÑ?cÓ$dÐeñ
ðð r   c                   ó>  — e Zd ZdZdeeef   ded   fd„Zdeeef   de	eef   fd„Z
deeef   de	eef   fd„Zdedee   fd	„Zd
ede	eef   dz  fd„Zdeeef   de	eef   fd„Z	 	 ddedededz  dedz  def
d„Zdeeef   de	eef   fd„Zdeeef   ddfd„Zy)ÚBedrockCountTokensConfiga  
    Configuration and transformation logic for AWS Bedrock CountTokens API.

    AWS Bedrock CountTokens API Specification:
    - Endpoint: POST /model/{modelId}/count-tokens
    - Input formats: 'invokeModel' or 'converse'
    - Response: {"inputTokens": <number>}
    Úrequest_datar   )ÚconverseÚinvokeModelc                 óä   — |j                  d«      }t        |t        «      rO|D ]I  }t        |t        «      sŒ|j                  d«      }t        |t        «      sŒ6t	        d„ |D «       «      sŒI y yy)zÎ
        Detect whether to use 'converse' or 'invokeModel' input format.

        Args:
            request_data: The original request data

        Returns:
            'converse' or 'invokeModel'
        Úmessagesr   c              3   óH   K  — | ]  }t        |t        «      xr d |v –— Œ y­w)r7   Nr   )Ú.0Úblocks     r   ú	<genexpr>z>BedrockCountTokensConfig._detect_input_type.<locals>.<genexpr>_   s'   è ø€ Ò4vÐej´ZÀÄtÓ5LÒ5`ÐQWÐ[`ÐQ`Ó5`Ñ4vùs   ‚ "r?   r>   )r"   r   r   r   Úany)Úselfr=   rA   r   r   s        r   Ú_detect_input_typez+BedrockCountTokensConfig._detect_input_typeK   so   € ð '×*Ñ*¨:Ó6ˆÜ�h¤Ô%ð
 $ò )�Ü! '¬4Ô0ØØ!Ÿ+™+ iÓ0�Ü˜g¤tÕ,´Ñ4vÐnuÔ4vÕ1vÙ(ð)ð ð r   c                 ór   — | j                  |«      }|dk(  r| j                  |«      S | j                  |«      S )a  
        Transform request to Bedrock CountTokens format.
        Supports both Converse and InvokeModel input types.

        Input (Anthropic format):
        {
            "model": "claude-3-5-sonnet",
            "messages": [{"role": "user", "content": "Hello!"}]
        }

        Output (Bedrock CountTokens format for Converse):
        {
            "input": {
                "converse": {
                    "messages": [...],
                    "system": [...] (if present)
                }
            }
        }

        Output (Bedrock CountTokens format for InvokeModel):
        {
            "input": {
                "invokeModel": {
                    "body": "<base64-encoded raw model input>"
                }
            }
        }
        r>   )rH   Ú_transform_to_converse_formatÚ!_transform_to_invoke_model_format)rG   r=   Ú
input_types      r   Ú+transform_anthropic_to_bedrock_count_tokenszDBedrockCountTokensConfig.transform_anthropic_to_bedrock_count_tokensg   s?   € ðB !×3Ñ3°LÓAˆ
à˜Ò#Ø×5Ñ5°lÓCÐCà×9Ñ9¸,ÓGÐGr   c                 ó(  — t        |j                  d«      «      }|j                  d«      }|j                  d«      }|D �cg c]  }t        |«      ‘Œ }}d|i}| j                  |«      }|r||d<   | j	                  |«      }	|	r|	|d<   dd|iiS c c}w )z?Transform to Converse input format, including system and tools.rA   ÚsystemÚtoolsÚ
toolConfigÚinputr>   )r   r"   r$   Ú_transform_systemÚ_transform_tools)
rG   r=   rA   rO   rP   r   Úuser_messagesÚconverse_inputÚsystem_blocksÚtool_configs
             r   rJ   z6BedrockCountTokensConfig._transform_to_converse_format�   s³   € ä$ \×%5Ñ%5°jÓ%AÓBˆØ$×(Ñ(¨Ó2ˆØ#×'Ñ'¨Ó0ˆð _gÖ0gÐSZÔ1EÀgÕ1NÐ0gˆÐ0gà7AÀ=Ð6Qˆð  $×5Ñ5°fÓ=ˆÙØ'4ˆN˜8Ñ$ð "×2Ñ2°5Ó9ˆÙØ+6ˆN˜<Ñ(à˜* nÐ5Ð6Ð6ùò 1hs   ÁBrO   c                 óÈ   — |€g S t        |t        «      rd|igS t        |t        «      r3|D �cg c]'  }t        |t        «      sŒd|j	                  dd«      i‘Œ) c}S g S c c}w )z;Transform Anthropic system prompt to Bedrock system blocks.r   r!   )r   r   r   r   r"   )rG   rO   rD   s      r   rS   z*BedrockCountTokensConfig._transform_system¦   se   € àˆ>ØˆIÜ�fœcÔ"Ø˜VÐ$Ð%Ð%Ü�fœdÔ#àAGÖc¸Ì:ÐV[Ô]aÕKb�V˜UŸY™Y v¨rÓ2Ò3ÒcÐcØˆ	ùò ds   ®AÁArP   Nc                 ó\   — |syt        |«      D �cg c]  }t        |«      ‘Œ }}d|iS c c}w )z7Transform Anthropic tools to Bedrock toolConfig format.NrP   )r   r:   )rG   rP   r0   Úbedrock_toolss       r   rT   z)BedrockCountTokensConfig._transform_tools±   s9   € áØäYcÐdiÓYjÖ0kÐQUÔ1FÀtÕ1LÐ0kˆÐ0kà˜Ð'Ð'ùò 1ls   ‘)c                 óP  — ddl }ddl}|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}d|v r(|j                  dd«       |j                  dt        «       |j                  |j                  |«      j                  «       «      j                  «       }dd	d
|iiiS c c}}w )z&Transform to InvokeModel input format.r   NÚmodelrA   Úanthropic_versionzbedrock-2023-05-31Ú
max_tokensrR   r?   Úbody)	Úbase64r4   ÚitemsÚ
setdefaultr	   Ú	b64encodeÚdumpsÚencodeÚdecode)rG   r=   ra   r4   ÚkÚvÚ	body_dataÚencoded_bodys           r   rK   z:BedrockCountTokensConfig._transform_to_invoke_model_formatº   s©   € ãÛð .:×-?Ñ-?Ó-A×R¡T Q¨ÀQÈ'Ã\˜A˜q™DÐRˆ	ÑRà˜Ñ"ð × Ñ Ð!4Ð6JÔKØ× Ñ  Ô/XÔYð %×.Ñ.¨t¯z©z¸)Ó/D×/KÑ/KÓ/MÓN×UÑUÓWˆØ˜-¨&°,Ð)?Ð@ÐAÐAùó Ss
   œB"ªB"r]   Úaws_region_nameÚapi_baseÚaws_bedrock_runtime_endpointc                 ó    — t        |«      }|j                  d«      }| j                  |¬«      }| j                  |||¬«      \  }}|› d|› d�}	|	S )aÔ  
        Construct the AWS Bedrock CountTokens API endpoint using existing LiteLLM functions.

        Args:
            model: The resolved model ID from router lookup
            aws_region_name: AWS region (e.g., "eu-west-1")
            api_base: Optional custom API base URL (takes highest priority)
            aws_bedrock_runtime_endpoint: Optional custom Bedrock runtime endpoint

        Returns:
            Complete endpoint URL for CountTokens API
        zbedrock/)Úmodel_id)rm   rn   rl   z/model/z/count-tokens)r   ÚremoveprefixÚencode_model_idÚget_runtime_endpoint)
rG   r]   rl   rm   rn   rp   Úencoded_model_idÚbase_urlr'   Úendpoints
             r   Ú!get_bedrock_count_tokens_endpointz:BedrockCountTokensConfig.get_bedrock_count_tokens_endpointÍ   sq   € ô( *¨%Ó0ˆð ×(Ñ(¨Ó4ˆØ"&×"6Ñ"6ÀÐ"6Ó"IÐà×/Ñ/ØØ)EØ+ð 0ó 
‰ˆ�!ð
 &˜J gÐ.>Ð-?¸}ÐMˆàˆr   Úbedrock_responsec                 ó.   — |j                  dd«      }d|iS )zû
        Transform Bedrock CountTokens response to Anthropic format.

        Input (Bedrock response):
        {
            "inputTokens": 123
        }

        Output (Anthropic format):
        {
            "input_tokens": 123
        }
        ÚinputTokensr   Úinput_tokens)r"   )rG   rx   r{   s      r   Ú'transform_bedrock_response_to_anthropicz@BedrockCountTokensConfig.transform_bedrock_response_to_anthropicð   s!   € ð  /×2Ñ2°=À!ÓDˆà Ð-Ð-r   c                 óÀ  — |j                  d«      st        d«      ‚| j                  |«      }|dk(  r“|j                  dg «      }|st        d«      ‚t        |t        «      st        d«      ‚t        |«      D ]J  \  }}t        |t        «      st        d|› d�«      ‚d	|vrt        d|› d
�«      ‚d|vsŒ=t        d|› d�«      ‚ yt        |«      dk  rt        d«      ‚y)zû
        Validate the incoming count tokens request.
        Supports both Converse and InvokeModel input formats.

        Args:
            request_data: The request payload

        Raises:
            ValueError: If the request is invalid
        r]   zmodel parameter is requiredr>   rA   z1messages parameter is required for Converse inputzmessages must be a listzMessage z must be a dictionaryr    z must have a 'role' fieldr   z must have a 'content' fieldé   z,Request must contain content to count tokensN)r"   Ú
ValueErrorrH   r   r   Ú	enumerater   Úlen)rG   r=   rL   rA   Úir   s         r   Úvalidate_count_tokens_requestz6BedrockCountTokensConfig.validate_count_tokens_request  s   € ð ×Ñ Ô(ÜÐ:Ó;Ð;à ×3Ñ3°LÓAˆ
à˜Ò#à*×.Ñ.¨z¸2Ó>ˆHÙÜ Ð!TÓUÐUä˜h¬Ô-Ü Ð!:Ó;Ð;ä'¨Ó1ò Q‘
��7Ü! '¬4Ô0Ü$ x°¨sÐ2GÐ%HÓIÐIà Ñ(Ü$ x°¨sÐ2KÐ%LÓMÐMà GÒ+Ü$ x°¨sÐ2NÐ%OÓPÐPñQô �<Ó  AÒ%Ü Ð!OÓPÐPð &r   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   rH   r   rM   rJ   r   rS   rT   rK   rw   r|   rƒ   © r   r   r<   r<   A   sp  „ ñð¨w°s¸I°~Ñ/Fð È7ÐSlÑKmó ð8&Hà˜c 9˜nÑ-ð&Hð 
ˆc�9ˆnÑ	ó&HðP7¸'À#ÀyÀ.Ñ:Qð 7ÐVZÐ[^Ð`iÐ[iÑVjó 7ð.	¨	ð 	°d¸9±oó 	ð( ið (°D¸¸i¸Ñ4HÈ4Ñ4Oó (ðB¸gÀcÈ9ÀnÑ>Uð BÐZ^Ð_bÐdmÐ_mÑZnó Bð.  $Ø37ñ!àð!ð ð!ð ˜‘*ð	!ð
 '*¨D¡jð!ð 
ó!ðF.Ø '¨¨Y¨Ñ 7ð.à	ˆc�9ˆnÑ	ó.ð(&Q¸'À#ÀyÀ.Ñ:Qð &QÐVZô &Qr   r<   )r‡   r*   Úcollections.abcr   Útypingr   r   Úpydanticr   Ú!litellm.llms.bedrock.base_aws_llmr   Ú!litellm.llms.bedrock.common_utilsr   r	   Ú__annotations__r   r   r   r   r   r   r$   r/   r:   r<   rˆ   r   r   ú<module>r�      sÐ   ðòó 
Ý #ß !å å 8Ý Dð
 48Ð )¨5Ó 7ð4�ið 4 D¨¨i¨Ñ$8ó 4ð4�ið 4 D¨¡Oó 4ð )ð °°Y±ó ð )ð °°S¸)°^Ñ0Dó ð¨9ð ¸ó ð	 	ð 	¨d°3¸	°>Ñ.Bó 	ôiQ˜zõ iQr   