o
    Zh                     @   sj   d dl mZmZ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mZmZ G dd dee	ZdS )    )AnyDictListMappingOptionalTupleN)
Embeddingsget_from_dict_or_env)	BaseModel
ConfigDictmodel_validatorc                	   @   s   e Zd ZU dZdZeed< 	 dZeed< 	 dZeed< 	 dZ	e
ed	< 	 d
Zee ed< eddZeddededefddZedeeef fddZ	d!deeeef  dedeee
  fddZdee deee
  fddZdedee
 fdd Zd
S )"MosaicMLInstructorEmbeddingsaa  MosaicML embedding service.

    To use, you should have the
    environment variable ``MOSAICML_API_TOKEN`` set with your API token, or pass
    it as a named parameter to the constructor.

    Example:
        .. code-block:: python

            from langchain_community.llms import MosaicMLInstructorEmbeddings
            endpoint_url = (
                "https://models.hosted-on.mosaicml.hosting/instructor-large/v1/predict"
            )
            mosaic_llm = MosaicMLInstructorEmbeddings(
                endpoint_url=endpoint_url,
                mosaicml_api_token="my-api-key"
            )
    zBhttps://models.hosted-on.mosaicml.hosting/instructor-xl/v1/predictendpoint_urlz&Represent the document for retrieval: embed_instructionz<Represent the question for retrieving supporting documents: query_instructiong      ?retry_sleepNmosaicml_api_tokenZforbid)extrabefore)modevaluesreturnc                 C   s   t |dd}||d< |S )z?Validate that api key and python package exists in environment.r   ZMOSAICML_API_TOKENr	   )clsr   r    r   ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/embeddings/mosaicml.pyvalidate_environment0   s
   z1MosaicMLInstructorEmbeddings.validate_environmentc                 C   s
   d| j iS )zGet the identifying parameters.r   )r   selfr   r   r   _identifying_params:   s   
z0MosaicMLInstructorEmbeddings._identifying_paramsFinputis_retryc              
   C   sP  d|i}| j  dd}ztj| j||d}W n tjjy+ } ztd| d }~ww zb|jdkrN|sFdd l}|	| j
 | j|dd	W S td
|j | }t|trg d}	|	D ]}
|
|v ri||
 } nq]td| t|trt|d tr|}W |S |g}W |S td|  tjjy } ztd| d|j d }~ww )NZinputszapplication/json)AuthorizationzContent-Type)headersjsonz$Error raised by inference endpoint: i  r   T)r!   z>Error raised by inference API: rate limit exceeded.
Response: )dataoutputZoutputsz#No key data or output in response: zUnexpected response type: zError raised by inference API: z.
Response: )r   requestspostr   
exceptionsRequestException
ValueErrorstatus_codetimesleepr   _embedtextr$   
isinstancedictlistJSONDecodeError)r   r    r!   payloadr#   responseer-   Zparsed_responseZoutput_keyskeyZoutput_item
embeddingsr   r   r   r/   ?   sX   

	z#MosaicMLInstructorEmbeddings._embedtextsc                    s     fdd|D }  |}|S )zEmbed documents using a MosaicML deployed instructor embedding model.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        c                    s   g | ]} j |fqS r   )r   ).0r0   r   r   r   
<listcomp>   s    z@MosaicMLInstructorEmbeddings.embed_documents.<locals>.<listcomp>)r/   )r   r:   Zinstruction_pairsr9   r   r   r   embed_documents{   s   	
z,MosaicMLInstructorEmbeddings.embed_documentsr0   c                 C   s   | j |f}| |gd }|S )zEmbed a query using a MosaicML deployed instructor embedding model.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        r   )r   r/   )r   r0   Zinstruction_pairZ	embeddingr   r   r   embed_query   s   
	z(MosaicMLInstructorEmbeddings.embed_query)F)__name__
__module____qualname____doc__r   str__annotations__r   r   r   floatr   r   r   Zmodel_configr   classmethodr   r   r   propertyr   r   r   r   boolr/   r=   r>   r   r   r   r   r   	   s>   
 



<r   )typingr   r   r   r   r   r   r'   Zlangchain_core.embeddingsr   Zlangchain_core.utilsr
   Zpydanticr   r   r   r   r   r   r   r   <module>   s     