
    gi[                         d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
 ddlZddlZddlmZ ddlmZ ddlmZmZ ddl ddlmZmZmZmZmZmZmZmZmZ dd	lm Z m!Z! dd
l"m#Z#m$Z$m%Z% ddl&m'Z'm(Z(  G d d      Z)y)zX
Translating between OpenAI's `/chat/completion` format and Amazon's `/converse` format
    N)ListLiteralOptionalTupleUnionoverload)map_finish_reason)Logging)_bedrock_converse_messages_pt_bedrock_tools_pt)*)	AllMessageValuesChatCompletionResponseMessageChatCompletionSystemMessageChatCompletionToolCallChunk#ChatCompletionToolCallFunctionChunkChatCompletionToolParam$ChatCompletionToolParamFunctionChunkChatCompletionUserMessageOpenAIMessageContentListBlock)ModelResponseUsage)CustomStreamWrapperadd_dummy_toolhas_tool_call_blocks   )BedrockErrorget_bedrock_tool_namec                      e Zd ZU dZee   ed<   eee      ed<   ee   ed<   ee   ed<   ee   ed<   	 	 	 	 	 d/dee   deee      dee   dee   dee   ddfd	Z	e
d
        Zdedee   fdZdedeeef   dedee   fdZdee   fdZdee   fdZ	 	 d0dee   dedefdZ	 d1dededededeee      defdZedeeeef   ded   dee   fd       Zedeeeef   ded   dee   fd       Zdeeeef   ded   deeeef      fd Zdee   de ee   ee   f   fd!Z!d"ede"fd#Z#dedee   ded$ede$f
d%Z%ded&e&jN                  d'e(d(ed)ee)   ded*ed+eeef   dedee(e*f   fd,Z+dee   fd-Z,dedefd.Z-y)2AmazonConverseConfigz
    Reference - https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
    #2 - https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html#conversation-inference-supported-models-features
    	maxTokensstopSequencestemperaturetopPtopKNreturnc                     t               }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' y )Nself)localsitemssetattr	__class__)	r(   r!   r"   r#   r$   r%   locals_keyvalues	            f/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/bedrock/chat/converse_transformation.py__init__zAmazonConverseConfig.__init__1   s;     (!--/JCf}!2U3 *    c                     | j                   j                         D ci c]O  \  }}|j                  d      s9t        |t        j
                  t        j                  t        t        f      s|||Q c}}S c c}}w )N__)	__dict__r*   
startswith
isinstancetypesFunctionTypeBuiltinFunctionTypeclassmethodstaticmethod)clskvs      r0   
get_configzAmazonConverseConfig.get_config>   sy     **,
,1<<%&&-- 	  qD,
 	
 
s   AA6modelc                    g d}| j                  |      }|j                  d      sU|j                  d      sD|j                  d      s3|j                  d      s"|j                  d      s|j                  d      r|j                  d       |j                  d      s|j                  d      r|j                  d	       |S )
N)	
max_tokensmax_completion_tokensstreamstream_optionsstopr#   top_pextra_headersresponse_format	anthropicmistralcoherezmeta.llama3-1zmeta.llama3-2zamazon.novatoolstool_choice)_get_base_modelr6   append)r(   rA   supported_params
base_models       r0   get_supported_openai_paramsz0AmazonConverseConfig.get_supported_openai_paramsP   s    

 ))%0
 !!+.$$Y/$$X.$$_5$$_5$$]3##G,  -1F1Fy1Q##M2r2   rO   drop_paramsc                    |dk(  rGt         j                  du s|du ry t         j                  j                  dj	                  |      d      |dk(  rt        i       S |dk(  rt        i 	      S t        |t              r8t        |j                  d
i       j                  dd            }t        |      S t         j                  j                  dj	                  |      d      )NnoneTzbBedrock doesn't support tool_choice={}. To drop it from the call, set `litellm.drop_params = True.i  messagestatus_coderequired)anyauto)r]   functionname r_   toolzBedrock doesn't support tool_choice={}. Supported tool_choice values=['auto', 'required', json object]. To drop it from the call, set `litellm.drop_params = True.)
litellmrU   utilsUnsupportedParamsErrorformatToolChoiceValuesBlockr7   dictSpecificToolChoiceBlockget)r(   rA   rO   rU   specific_tools        r0   map_tool_choice_valuesz+AmazonConverseConfig.map_tool_choice_valuesp   s     & ""d*kT.Amm:: A  H  H# !$	 ;   J&(R00F"(b11T*3 __Z488DM )m<<--66 }  D  D  	 7  r2   c                 
    g dS )N)pngjpeggifwebp r(   s    r0   get_supported_image_typesz.AmazonConverseConfig.get_supported_image_types   s    --r2   c                 
    g dS )N)	pdfcsvdocdocxxlsxlsxhtmltxtmdrs   rt   s    r0   get_supported_document_typesz1AmazonConverseConfig.get_supported_document_types   s    PPr2   json_schemaschema_namec                 L    |ddi d}n|}t        dt        ||            }|S )a3  
        Handles creating a tool call for getting responses in JSON format.

        Args:
            json_schema (Optional[dict]): The JSON schema the response should be in

        Returns:
            AnthropicMessagesTool: The tool call to send to Anthropic API to get responses in JSON format
        objectT)typeadditionalProperties
propertiesr^   )r_   
parameters)r   r^   )r   r   )r(   r   r   _input_schema_tools        r0   *_create_json_tool_call_for_response_formatz?AmazonConverseConfig._create_json_tool_call_for_response_format   sD      !(, M (M'9 ]
 r2   non_default_paramsoptional_paramsmessagesc                    |j                         D ]  \  }}|dk(  rd }d}	d|v r|d   }d}	nd|v r|d   d   }|d   d   }		 |	dd	}
| j                  ||	dk7  r|	nd
      }|g|d<   t        t        |	dk7  r|	nd            |d<   d|d<   |j	                  dd      du rd|d<   |dk(  s|dk(  r||d<   |dk(  r||d<   |dk(  r't        |t              rt        |      dk(  r|g}||d<   |dk(  r||d<   |dk(  r||d<   |dk(  r||d<   |dk(  s| j                  |||      }|||d<    	 d|vrF|Dt        |      r9t        j                  rt        d      |d<   |S t        j                  d dd!"      |S )#NrJ   r`   response_schemajson_tool_callr   schemar_   rc   )r_   r   )r   r   rN   ra   rb   rO   T	json_moderE   Ffake_streamrC   rD   r!   rG   r   r"   r#   rH   r$   )rA   rO   rU   bedrock_converse)custom_llm_providerzBedrock doesn't support tool calling without `tools=` param specified. Pass `tools=` param OR set `litellm.modify_params = True` // `litellm_settings::modify_params: True` to add dummy tool to the request.bedrock)rY   rA   llm_provider)r*   r   rh   rj   rk   r7   strlenrm   r   rd   modify_paramsr   rf   )r(   rA   r   r   rU   r   paramr/   r   r   _tool_choicer   _tool_choice_values                r0   map_openai_paramsz&AmazonConverseConfig.map_openai_params   s6    /446LE5)).2#%$-"'(9":K"2K"e+"'"6x"@K"'"6v">K )4VDGG +/:b/@FV H  -27(1F0,72,=[CS2.
 04,%))(E:dB59OM2$1H(H/4, ,1)eS)5zQ "GE380%16.*/'+0(%%)%@%@U &A &" &15GOM2k 7p	 --$$X.$$+9(:,(  44 l!* 
 r2   message_block
block_typesystemc                      y Nrs   r(   r   r   s      r0   _get_cache_point_blockz+AmazonConverseConfig._get_cache_point_block       	r2   content_blockc                      y r   rs   r   s      r0   r   z+AmazonConverseConfig._get_cache_point_block  r   r2   )r   r   c                     |j                  dd       y |dk(  rt        t        d            S t        t        d            S )Ncache_controlr   default)r   )
cachePoint)rk   SystemContentBlockCachePointBlockContentBlockr   s      r0   r   z+AmazonConverseConfig._get_cache_point_block#  sB     _d3;!%i1PQQ?	+JKKr2   c                 z   g }g }t        |      D ]  \  }}|d   dk(  sd }d }t        |d   t              r4t        |d         dkD  r#t	        |d         }| j                  |d      }ngt        |d   t              rT|d   D ]L  }|j                  dd      d	k(  st        |d	         dkD  s+t	        |d	         }| j                  |d      }N ||j                  |       ||j                  |       |j                  |        t        |      dkD  r!t        |      D ]  }|j                  |        ||fS )
Nroler   contentr   )text)r   r   r`   r   )	enumerater7   r   r   r   r   listrk   rQ   reversedpop)	r(   r   system_prompt_indicessystem_content_blocksidxrY   _system_content_block_cache_point_blockms	            r0   _transform_system_messagez.AmazonConverseConfig._transform_system_message3  sg    !#:<%h/LCv(*FJ%CG"gi0#63wy?Q;RUV;V,>GIDV,W))-)D)DH *E *&  	 2D9$Y/55,63qy>A;M4FAfI4V1151L1L !h 2M 2. 0 )4)001FG%1)001CD%,,S1) 0* $%) 56S! 7...r2   inference_paramsc                 H    d|v r|j                  d      |d<   t        di |S )Ntop_kr%   rs   )r   InferenceConfig)r(   r   s     r0   _transform_inference_paramsz0AmazonConverseConfig._transform_inference_paramsR  s0    &&'7';';G'DV$2!122r2   litellm_paramsc           	      d   | j                  |      \  }}t        j                  |      }g }i }t        t        j
                  j                               dgz   }	ddg}
dg}|j                  dd        t        ||d|j                  dd             }|j                         D ]*  \  }}||	vs||
vs||vs|||<   |j                  |       , |D ]  }|j                  |d         d	|v rd	|j                  d	      i|d
<   nd|v rd	|j                  d      i|d
<   t        |j                  dg             }d }t        |      dkD  r%|j                  dd       }t        |      }|||d<   |||| j                  |      d}d }|j                  dd       }|t        di |}||d<   |||d<   |S )Nr   rN   rO   guardrailConfigr   r   user_continue_message)r   rA   r   r   r%   inferenceConfigr   )rN   
toolChoice)r   )r   additionalModelRequestFieldsr   r   
toolConfigrs   )r   copydeepcopyr   r    __annotations__keysr   r   r*   rQ   r   r   ToolConfigBlockr   GuardrailConfigBlock)r(   rA   r   r   r   r   r   additional_request_keysadditional_request_paramssupported_converse_paramssupported_tool_call_paramssupported_guardrail_paramsbedrock_messagesr>   r?   r.   bedrock_toolsbedrock_tool_configtool_choice_values_dataguardrail_configrequest_guardrails_configs                         r0   _transform_requestz'AmazonConverseConfig._transform_requestW  sN    +/*H*H*R''==9"$$&!$( 00557%
I%! '.}%="&7%8"[$/ 0M+"0"4"45Ld"S	0
 %**,DAq227777/0)!,'..q1 - +C  d+ + %%(,,V4<%&78 (((,,W5<%&78 *;  "-*
 :>}!8H8L8Lt9 #2## "-4F#L1 ),E+#??!1  @  	 
 <@$4$8$89JD$Q!$03P6OP'7E#$ *"5E,r2   responsemodel_responserE   logging_objapi_keydatac           	      Z   |!|j                  |	||j                  d|i        |
d|j                          |j                  dd       }	 t        d$i |j	                         }	 |d   d	   }d
di}d}g }|t        |d         D ]w  \  }}	 d|v r||d   z  }d|v s|d   d   }t        |      }t        |t        j                  |d   d               }t        |d   d   d||      }|j                  |       y ||d<   |du r/|-t        |      dk(  r|d   d   j!                  d      }|||d<   n||d<   |d   d   }|d   d   }|d   d   }t#        j$                  t'        |d          dt#        j(                  d$i |!      g|_        t-        t/        j.                               |_        ||_        t5        |||"      }t7        |d|       d#|v rt7        |d#|d#          |S # t
        $ r5}t        dj                  |j                  t        |            d      d }~ww xY w)%Ncomplete_input_dict)inputr   original_responseadditional_argszraw model_response: r   zReceived={}, Error converting to valid response block={}. File an issue if litellm error - https://github.com/BerriAI/litellm/issuesi  rX   outputrY   r   	assistantr`   r   r   toolUser_   )response_tool_namer   )r_   	arguments	toolUseIdr^   )idr   r^   indexT   r   r   
tool_callsusageinputTokensoutputTokenstotalTokens
stopReason)finish_reasonr   rY   )prompt_tokenscompletion_tokenstotal_tokenstracers   )	post_callr   r   ConverseResponseBlockjson	Exceptionr   rg   r   r   r   r   dumpsr   rQ   r   rk   rd   Choicesr	   MessagechoicesinttimecreatedrA   r   r+   )r(   rA   r   r   rE   r   r   r   r   r   print_verboseencodingr   completion_responseerY   chat_completion_messagecontent_strrN   r   r   _response_tool_namer   _function_chunk_tool_response_chunkjson_mode_content_strinput_tokensoutput_tokensr   r   s                                 r0   _transform_responsez(AmazonConverseConfig._transform_response  s    "!!"*--!6 =	 "  	,X]]O<=$3$7$7T$J		"7"J(--/"J"	F +>h*G	*RBH+AV35 )')*< =W W$76?2K' +2)*<V*D')>+>*& 'J/"&**WY-?-H"I'O
 ,G"9-k:'!0!	,( LL!561 !>2 .9	*!2s5zQ388J3G3K3KK3X!$05J'	249#L1 +73MB+G4^D*73MB OO/0CL0QRB*AB"
 "%TYY[!1$&+%

 	/ ))NG-@-IJY  	 _  f  fMM3q6  	 	s   G, ,	H*50H%%H*c                 
    g dS )zZ
        Abbreviations of regions AWS Bedrock supports for cross region inference
        )useuapacrs   rt   s    r0   (_supported_cross_region_inference_regionz=AmazonConverseConfig._supported_cross_region_inference_region3  s
     $#r2   c                    |j                  d      r|j                  d      d   }|j                  d      r|j                  d      d   }|j                  dd      d   }|| j                         v r|j                  dd      d   S |S )z
        Get the base model from the given model name.

        Handle model names like - "us.meta.llama3-2-11b-instruct-v1:0" -> "meta.llama3-2-11b-instruct-v1"
        AND "meta.llama3-2-11b-instruct-v1:0" -> "meta.llama3-2-11b-instruct-v1"
        zbedrock//r   z	converse/.r   )r6   splitr  )r(   rA   potential_regions      r0   rP   z$AmazonConverseConfig._get_base_model9  s     J'KK$Q'EK(KK$Q'E ;;sA.q1tLLNN;;sA&q))r2   )NNNNN)Nr   r   ).__name__
__module____qualname____doc__r   r  r   r   r   r1   r;   r@   rT   r   ri   boolrh   rm   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   RequestObjectr   httpxResponser   r
   r   r  r  rP   rs   r2   r0   r    r    %   s   
 }DI&&#
3-
3- $(-1%)""4C=4  S	*4 c]	4
 sm4 sm4 
4 
 
"   c  @',S$Y'7FJ	'	(>.49 .Qd3i Q
 '++ d^    
!	 P 6:RR !R 	R
 R 4 012R 
Rh 	)%')
	 H%	 
$	%	 	 	)%')
	 O,	 
,		 	L)%')
L 56L 
%*L89	:L /-./	t$%t,>'??	@/>3D 3_ 3
QQ '(Q 	Q
 Q 
QfGG ..G &	G
 G g&G G G D#IG G 
}11	2GR$$s) $S S r2   r    )*r#  r   r  r8   typingr   r   r   r   r   r   r&  rd   'litellm.litellm_core_utils.core_helpersr	   *litellm.litellm_core_utils.litellm_loggingr
   3litellm.litellm_core_utils.prompt_templates.factoryr   r   litellm.types.llms.bedrocklitellm.types.llms.openair   r   r   r   r   r   r   r   r   litellm.types.utilsr   r   litellm.utilsr   r   r   common_utilsr   r   r    rs   r2   r0   <module>r1     sZ       B B   E > )
 
 
 5 S S >d dr2   