
    h=                         d Z ddl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 ddlmZ ddl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 ddlmZ  G d de      Zy)z
Transformation logic from OpenAI /v1/embeddings format to Cohere's /v1/embed format.

Why separate file? Make it easy to see how transformation works

Convers
- v3 embedding models
- v2 embedding models

Docs - https://docs.cohere.com/v2/reference/embed
    )AnyListOptionalUnioncastN)#COHERE_DEFAULT_EMBEDDING_INPUT_TYPE)Logging)BaseEmbeddingConfig)BaseLLMException)CohereEmbeddingRequestCohereEmbeddingRequestWithModel)AllEmbeddingInputValuesAllMessageValues)EmbeddingResponsePromptTokensDetailsWrapperUsage)is_base64_encoded   CohereErrorc                      e Zd ZdZd&dZdedee   fdZ	 d'dededed	e	def
d
Z
	 	 d(dededee   dededee   dee   defdZdede	fdZ	 d)dee   dee   dedededee	   defdZdedee   dedefdZdededededef
dZdee   dededefdZdej0                  dee   dedeeef   dededededefdZded ej0                  dededee   d!edededefd"Zd#ed$e deeejB                  f   de"fd%Z#y)*CohereEmbeddingConfigz?
    Reference: https://docs.cohere.com/v2/reference/embed
    returnNc                      y N )selfs    d/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/cohere/embed/transformation.py__init__zCohereEmbeddingConfig.__init__&   s        modelc                 
    ddgS )Nencoding_format
dimensionsr   r   r!   s     r   get_supported_openai_paramsz1CohereEmbeddingConfig.get_supported_openai_params)   s    !<00r    non_default_paramsoptional_paramsdrop_paramsc                     |j                         D ]2  \  }}|dk(  rt        |t              r||d<   !|g|d<   (|dk(  s.||d<   4 |S )Nr#   embedding_typesr$   output_dimension)items
isinstancelist)r   r'   r(   r!   r)   kvs          r   map_openai_paramsz'CohereEmbeddingConfig.map_openai_params,   sa     ',,.DAq%%a&9:O$56:;O$56l"67 23 / r    headersmessageslitellm_paramsapi_keyapi_basec                 .    ddi}|rd| |d<   i ||}|S )NzContent-Typezapplication/jsonzBearer Authorizationr   )	r   r3   r!   r4   r(   r5   r6   r7   default_headerss	            r   validate_environmentz*CohereEmbeddingConfig.validate_environment=   s;     .
 18	/BOO,0_00r    c                 
    d|v S )N3r   r%   s     r   _is_v3_modelz"CohereEmbeddingConfig._is_v3_modelO   s    e|r    streamc                     |xs dS )Nzhttps://api.cohere.ai/v2/embedr   )r   r7   r6   r!   r(   r5   r?   s          r   get_complete_urlz&CohereEmbeddingConfig.get_complete_urlR   s     ;;;r    inputinference_paramsc                     d}|D ]  }t        |      } |rt        ||d      }nt        ||t              }|j                         D ]
  \  }}|||<    |S )NFimage)r!   images
input_type)r!   textsrG   )r   r   r   r-   )	r   r!   rB   rC   
is_encoded	input_strtransformed_requestr0   r1   s	            r   _transform_requestz(CohereEmbeddingConfig._transform_request]   sy     
I*95J  "A"# #B># %**,DAq%&" - #"r    c           
         t        |t              r1t        |d   t              st        |d   t              rt        d      t	        t
        | j                  |t        |t              rt	        t        t           |      n|g|            S )Nr   zInput must be a list of strings)r!   rB   rC   )	r.   r/   int
ValueErrorr   dictrL   r   str)r   r!   rB   r(   r3   s        r   transform_embedding_requestz1CohereEmbeddingConfig.transform_embedding_requestv   sy     eT"uQx&*U1Xs*C>??##0:5$0Gd49e,eW!0 $ 
 	
r    encodingmetac                 4   d}|j                  di       j                  d      }|j                  di       j                  d      }d }|'|%|D ]  }|t        |j                  |            z  }! nt        ||      }|r||z  }|r||z  }t	        |d||      S )Nr   billed_unitsinput_tokensrF   )image_tokenstext_tokens)prompt_tokenscompletion_tokenstotal_tokensprompt_tokens_details)getlenencoder   r   )	r   rB   rS   rT   rW   rY   rX   r]   texts	            r   _calculate_usagez&CohereEmbeddingConfig._calculate_usage   s    %)XXnb%A%E%En%U&*hh~r&B&F&Fx&PFJK$7HOOD$9 ::  %?)'%! ,+&%"7	
 	
r    responselogging_objdatamodel_responsec	                    |j                         }	|j                  ||d|i|	       	 |	d   }
g }|
j                         D ]-  \  }}t        |      D ]  \  }}|j	                  d||d        / d|_        ||_        ||_        d}|D ]  }|t        |j                  |            z  }! t        |d| j                  |||	j                  d	i                    |S )
Ncomplete_input_dict)rB   r6   additional_argsoriginal_response
embeddings	embedding)objectindexrl   r/   r   usagerT   )json	post_callr-   	enumerateappendrm   re   r!   r_   r`   setattrrb   r^   )r   rc   r6   rd   re   rf   r!   rS   rB   response_jsonrk   output_datar0   embedding_listidxrl   rW   ra   s                     r   _transform_responsez)CohereEmbeddingConfig._transform_response   s    !2D9+	 	 	

	 #<0
!+!1!1!3A~"+N";Y""*SyQ #< "4
 !')$DC 566L  	!!%=3D3DVR3PQ	
 r    raw_responserequest_datac	                 j    | j                  ||||||t        j                  |j                  d         S )NrB   )rc   r6   rd   re   rf   r!   rS   rB   )ry   litellmrS   model_call_details)	r   r!   rz   rf   rd   r6   r{   r(   r5   s	            r   transform_embedding_responsez2CohereEmbeddingConfig.transform_embedding_response   sE     ''!#)%%009 ( 	
 		
r    error_messagestatus_codec                     t        ||      S )N)r   messager   )r   r   r   r3   s       r   get_error_classz%CohereEmbeddingConfig.get_error_class   s     #!
 	
r    )r   N)F)NNr   )$__name__
__module____qualname____doc__r   rQ   r   r&   rP   boolr2   r   r   r;   r>   rA   r   rL   r   rR   r   r   rb   httpxResponseLiteLLMLoggingObjr   r   r   r/   ry   r   rN   Headersr   r   r   r    r   r   r   !   s   1 1c 1 "   	
  
0 "&"&  '(	
   # 3- 
$# $  "&	<3-	< #	< 		<
 	< 	< 	< 
	<##!%c#>B#	(#2

 '
 	

 
 

(
d3i 
3 
d 
u 
82..2 #2 '	2
 D0012 *2 2 2 2 
2h

 nn
 *	

 '
 #
 
 
 
 

,
 
/2
=B4CV=W
	
r    r   ) r   typingr   r   r   r   r   r   r}   r   *litellm.litellm_core_utils.litellm_loggingr	   r   litellm.llms.base_llmr
   )litellm.llms.base_llm.chat.transformationr   litellm.types.llms.bedrockr   r   litellm.types.llms.openair   r   litellm.types.utilsr   r   r   litellm.utilsr   common_utilsr   r   r   r    r   <module>r      sJ   
 4 3   7 S 5 F P T T + &U
/ U
r    