U
    hD                     @   s   U 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	m
Z
mZmZ d dlmZmZmZ d dlmZ dZeed< G d	d
 d
e	eZdS )    )AnyDictListOptionalN)
Embeddings)	BaseModelField	SecretStrroot_validator)convert_to_secret_strget_from_dict_or_envsecret_from_env)RequestExceptionz(http://api.baichuan-ai.com/v1/embeddingsBAICHUAN_API_URLc                   @   s   e Zd ZU dZeed< edddZeed< ede	dd	d
dZ
ee ed< dZeed< G dd dZedddeedddZee eeee   dddZee eeee   dddZeeee  dddZd	S )BaichuanTextEmbeddingsa  Baichuan Text Embedding models.

    Setup:
        To use, you should set the environment variable ``BAICHUAN_API_KEY`` to
        your API key or pass it as a named parameter to the constructor.

        .. code-block:: bash

            export BAICHUAN_API_KEY="your-api-key"

    Instantiate:
        .. code-block:: python

            from langchain_community.embeddings import BaichuanTextEmbeddings

            embeddings = BaichuanTextEmbeddings()

    Embed:
        .. code-block:: python

            # embed the documents
            vectors = embeddings.embed_documents([text1, text2, ...])

            # embed the query
            vectors = embeddings.embed_query(text)
    sessionzBaichuan-Text-Embeddingmodel)defaultalias
model_nameZapi_keyZBAICHUAN_API_KEYN)r   )r   default_factorybaichuan_api_key   
chunk_sizec                   @   s   e Zd ZdZdS )zBaichuanTextEmbeddings.ConfigTN)__name__
__module____qualname__Zallow_population_by_field_name r   r   K/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/embeddings/baichuan.pyConfigD   s   r   FT)preZskip_on_failure)valuesreturnc                 C   s`   |d dkr&t t|dd}||d< n|d }t }|jd|  ddd ||d	< |S )
z/Validate that auth token exists in environment.r   NZbaichuan_auth_tokenZBAICHUAN_AUTH_TOKENzBearer identityzapplication/json)AuthorizationzAccept-EncodingzContent-typer   )r   r   requestsSessionheadersupdateZget_secret_value)clsr!   r   r   r   r   r   validate_environmentG   s&      
z+BaichuanTextEmbeddings.validate_environment)textsr"   c           	         s    fddt dt jD }g }|D ]z} jjt| jdd}|  |jdkr|	 }|
dg }t|dd	 d
}|dd |D  q*td|j dq*|S )a  Internal method to call Baichuan Embedding API and return embeddings.

        Args:
            texts: A list of texts to embed.

        Returns:
            A list of list of floats representing the embeddings, or None if an
            error occurs.
        c                    s   g | ]}|| j   qS r   )r   ).0iselfr+   r   r   
<listcomp>k   s   z1BaichuanTextEmbeddings._embed.<locals>.<listcomp>r   )inputr   )json   datac                 S   s   |  ddS )Nindexr   get)er   r   r   <lambda>{       z/BaichuanTextEmbeddings._embed.<locals>.<lambda>)keyc                 S   s   g | ]}| d g qS )Z	embeddingr6   )r,   resultr   r   r   r0   ~   s     zError: Received status code z from `BaichuanEmbedding` API)rangelenr   r   postr   r   raise_for_statusstatus_coder2   r7   sortedextendr   )	r/   r+   Zchunk_textsZembed_resultschunkresponserespZ
embeddingsZsorted_embeddingsr   r.   r   _embeda   s*    
 

zBaichuanTextEmbeddings._embedc                 C   s
   |  |S )zPublic method to get embeddings for a list of documents.

        Args:
            texts: The list of texts to embed.

        Returns:
            A list of embeddings, one for each text, or None if an error occurs.
        rG   r.   r   r   r   embed_documents   s    	z&BaichuanTextEmbeddings.embed_documents)textr"   c                 C   s    |  |g}|dk	r|d S dS )zPublic method to get embedding for a single query text.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text, or None if an error occurs.
        Nr   rH   )r/   rJ   r<   r   r   r   embed_query   s    	z"BaichuanTextEmbeddings.embed_query)r   r   r   __doc__r   __annotations__r   r   strr   r   r   r	   r   intr   r
   r   r*   r   floatrG   rI   rK   r   r   r   r   r      s   


 ( r   )typingr   r   r   r   r%   Zlangchain_core.embeddingsr   Zlangchain_core.pydantic_v1r   r   r	   r
   Zlangchain_core.utilsr   r   r   r   r   rN   rM   r   r   r   r   r   <module>   s    