o
    ưik                     @   s   d Z ddlZddlmZmZmZm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 d
dlmZ dZG dd deZG dd deZdS )z
GigaChat Embedding Transformation

Transforms OpenAI /v1/embeddings format to GigaChat format.
API Documentation: https://developers.sber.ru/docs/ru/gigachat/api/reference/rest/post-embeddings
    N)ListOptionalTupleUnion)LlmProviders)BaseLLMException)BaseEmbeddingConfig)Logging)AllEmbeddingInputValuesAllMessageValues)EmbeddingResponse   get_access_tokenz+https://gigachat.devices.sberbank.ru/api/v1c                   @   s   e Zd ZdZdS )GigaChatEmbeddingErrorzGigaChat Embedding API error.N)__name__
__module____qualname____doc__ r   r   e/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/gigachat/embedding/transformation.pyr      s    r   c                   @   sr  e Zd ZdZd)ddZedd Zdedee fd	d
Z	de
de
dedede
f
ddZdee dee deeee ee f fddZ	d*dee dee dede
de
dee defddZdedede
de
de
f
ddZdedejdededee de
de
de
defd d!Z		d+de
ded"ee de
de
dee dee de
fd#d$Zd%ed&edee
ejf defd'd(ZdS ),GigaChatEmbeddingConfigzu
    Configuration class for GigaChat Embeddings API.

    GigaChat embeddings endpoint: POST /api/v1/embeddings
    returnNc                 C   s   d S Nr   )selfr   r   r   __init__'   s   z GigaChatEmbeddingConfig.__init__c                 C   s   dd | j  D S )Nc                 S   s>   i | ]\}}| d st|tjtjttfs|dur||qS )__N)
startswith
isinstancetypesFunctionTypeBuiltinFunctionTypeclassmethodstaticmethod).0kvr   r   r   
<dictcomp>,   s     z6GigaChatEmbeddingConfig.get_config.<locals>.<dictcomp>)__dict__items)clsr   r   r   
get_config*   s   z"GigaChatEmbeddingConfig.get_configmodelc                 C   s   g S )z8GigaChat embeddings don't support additional parameters.r   )r   r,   r   r   r   get_supported_openai_params<   s   z3GigaChatEmbeddingConfig.get_supported_openai_paramsnon_default_paramsoptional_paramsdrop_paramsc                 C   s   |S )zAMap OpenAI params to GigaChat format (no special mapping needed).r   )r   r.   r/   r,   r0   r   r   r   map_openai_params@   s   z)GigaChatEmbeddingConfig.map_openai_paramsapi_baseapi_keyc                 C   s   |pt }tjj||fS )z
        Returns provider info for GigaChat.

        Returns:
            Tuple of (custom_llm_provider, api_base, dynamic_api_key)
        )GIGACHAT_BASE_URLr   ZGIGACHATvalue)r   r2   r3   r   r   r   $_get_openai_compatible_provider_infoJ   s   z<GigaChatEmbeddingConfig._get_openai_compatible_provider_infolitellm_paramsstreamc                 C   s   |pt }| dS )z-Get the complete URL for embeddings endpoint.z/embeddings)r4   )r   r2   r3   r,   r/   r7   r8   baser   r   r   get_complete_urlX   s   

z(GigaChatEmbeddingConfig.get_complete_urlinputheadersc                 C   sH   t |tr	|g}nt |tr|}n|g}|dr|dd }||dS )z
        Transform OpenAI embedding request to GigaChat format.

        GigaChat format:
        {
            "model": "Embeddings",
            "input": ["text1", "text2", ...]
        }
        z	gigachat/	   N)r,   r;   )r   strlistr   )r   r,   r;   r/   r<   Z
input_listr   r   r   transform_embedding_requeste   s   


z3GigaChatEmbeddingConfig.transform_embedding_requestraw_responsemodel_responselogging_objrequest_datac	                 C   s   |  }	|j|d|d|i|	d d}
d|	v r8|	d D ]}d|v r0d|d v r0|
|d d 7 }
d|v r7|d= q|
|
d|	d< td
i |	S )a  
        Transform GigaChat embedding response to OpenAI format.

        GigaChat returns:
        {
            "object": "list",
            "data": [{"object": "embedding", "embedding": [...], "index": 0, "usage": {...}}],
            "model": "Embeddings"
        }
        r;   Zcomplete_input_dict)r;   r3   Zadditional_argsoriginal_responser   datausageprompt_tokens)rH   total_tokensNr   )jsonZ	post_callgetr   )r   r,   rA   rB   rC   r3   rD   r/   r7   Zresponse_jsonrI   Zembr   r   r   transform_embedding_response   s&   
z4GigaChatEmbeddingConfig.transform_embedding_responsemessagesc           
      C   s$   t |}dd| d}	i |	|S )z?
        Set up headers with OAuth token for GigaChat.
        zapplication/jsonzBearer )zContent-TypeAuthorizationr   )
r   r<   r,   rM   r/   r7   r3   r2   Zaccess_tokendefault_headersr   r   r   validate_environment   s
   z,GigaChatEmbeddingConfig.validate_environmenterror_messagestatus_codec                 C   s   t ||dS )z%Return GigaChat-specific error class.)rR   message)r   )r   rQ   rR   r<   r   r   r   get_error_class   s   z'GigaChatEmbeddingConfig.get_error_class)r   Nr   )NN)r   r   r   r   r   r"   r+   r>   r   r-   dictboolr1   r   r   r6   r:   r
   r@   httpxResponser   LiteLLMLoggingObjrL   r   rP   intr   ZHeadersr   rT   r   r   r   r   r       s    






!	

8	
r   )r   r   typingr   r   r   r   rW   Zlitellmr   Z)litellm.llms.base_llm.chat.transformationr   Z.litellm.llms.base_llm.embedding.transformationr   Z*litellm.litellm_core_utils.litellm_loggingr	   rY   Zlitellm.types.llms.openair
   r   Zlitellm.types.utilsr   Zauthenticatorr   r4   r   r   r   r   r   r   <module>   s    