
    iX%                     V    d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
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)AnyDictListOptional)
BaseAWSLLM)get_bedrock_base_modelc                   ^   e Zd ZdZdeeef   de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
e   deeeef      fdZd	e
eeeef         de
eeef      fd
Zdeeef   deeef   fdZ	 	 ddedede
e   de
e   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_datareturnc                 4    d|v rt        |d   t              ryy)z
        Detect whether to use 'converse' or 'invokeModel' input format.

        Args:
            request_data: The original request data

        Returns:
            'converse' or 'invokeModel'
        messagesconverseinvokeModel)
isinstancelist)selfr   s     /Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/bedrock/count_tokens/transformation.py_detect_input_typez+BedrockCountTokensConfig._detect_input_type   s"     %*\*5Mt*T     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": "{...raw model input...}"
                }
            }
        }
        r   )r   _transform_to_converse_format!_transform_to_invoke_model_format)r   r   
input_types      r   +transform_anthropic_to_bedrock_count_tokenszDBedrockCountTokensConfig.transform_anthropic_to_bedrock_count_tokens+   s?    B ,,\:
#55lCC99,GGr   c                    |j                  dg       }|j                  d      }|j                  d      }g }|D ]u  }|j                  d      g d}|j                  dd      }t        |t              r|d   j                  d|i       nt        |t              r||d<   |j                  |       w d|i}	| j                  |      }
|
r|
|	d<   | j                  |      }|r||	d	<   d
d|	iiS )z?Transform to Converse input format, including system and tools.r   systemtoolsrole)r   contentr     text
toolConfiginputr   )getr   strappendr   _transform_system_transform_tools)r   r   r   r   r   user_messagesmessagetransformed_messager    converse_inputsystem_blockstool_configs               r   r   z6BedrockCountTokensConfig._transform_to_converse_formatS   s     ##J3!!(+  ) GF+3 kk)R0G'3'#I.55vw6GHGT*18#I.  !45   +5m)D ..v6'4N8$ ++E2+6N<(*n566r   r   c                     |g S t        |t              rd|igS t        |t              r2|D cg c]&  }t        |t              r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   dictr%   )r   r   blocks      r   r(   z*BedrockCountTokensConfig._transform_systemw   sv    >Ifc"V$%%fd# $#EeT* 62./# 
 	s   +Ar   c                 8   |syg }|D ]  }|j                  dd      }t        j                  dd|      }|r|d   j                         sd|z   }|dd }|j                  d	      xs |}|j                  d
di d      }|j	                  d||d|idi        d|iS )z7Transform Anthropic tools to Bedrock toolConfig format.Nnamer!   z[^a-zA-Z0-9_]_r   t_@   descriptioninput_schemaobject)type
propertiestoolSpecjson)r4   r8   inputSchemar   )r%   resubisalphar'   )r   r   bedrock_toolstoolr4   r8   r9   s          r   r)   z)BedrockCountTokensConfig._transform_tools   s     D88FB'D66*C6DDGOO-d{9D((=19TK88 DL    $'2(.'=! . ''r   c                     ddl }|j                         D ci c]  \  }}|dk7  s|| }}}ddd|j                  |      iiiS c c}}w )z&Transform to InvokeModel input format.r   Nmodelr$   r   body)r>   itemsdumps)r   r   r>   kv	body_datas         r   r   z:BedrockCountTokensConfig._transform_to_invoke_model_format   sZ     	 '3&8&8&:K&:daa7lQT&:	K-&$**Y2G)HIJJ Ls
   AANrF   aws_region_nameapi_baseaws_bedrock_runtime_endpointc                     t        |      }|j                  d      r|dd }| 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/   N)rN   rO   rM   z/model/z/count-tokens)r   
startswithget_runtime_endpoint)	r   rF   rM   rN   rO   model_idbase_urlr5   endpoints	            r   !get_bedrock_count_tokens_endpointz:BedrockCountTokensConfig.get_bedrock_count_tokens_endpoint   sd    ( *%0 z*|H//)E+ 0 
!
 Zwxj>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%   )r   rX   r[   s      r   'transform_bedrock_response_to_anthropicz@BedrockCountTokensConfig.transform_bedrock_response_to_anthropic   s!      (++M1=--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
        rF   zmodel parameter is requiredr   r   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%   
ValueErrorr   r   r   	enumerater1   len)r   r   r   r   ir+   s         r   validate_count_tokens_requestz6BedrockCountTokensConfig.validate_count_tokens_request   s     (:;;,,\:
##''
B7H !TUUh- !:;;'1
7!'40$xs2G%HII($xs2K%LMMG+$xs2N%OPP 2 < A% !OPP &r   )NN)__name__
__module____qualname____doc__r   r&   r   r   r   r   r   r   r(   r)   r   rW   r\   rc    r   r   r
   r
      s}   tCH~ # $&H38n&H 
c3h&HP"7 cN"7	c3h"7H $tCH~:N (d4S>23(	$sCx.	!(B
K cN
K	c3h
K  #'6:!! ! 3-	!
 '/sm! 
!F. $S#X.	c3h.(&Q$sCx. &QT &Qr   r
   )rg   r@   typingr   r   r   r   !litellm.llms.bedrock.base_aws_llmr   !litellm.llms.bedrock.common_utilsr   r
   rh   r   r   <module>rl      s+    
 , , 8 DAQz AQr   