U
    h                     @   s   d dl 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 d dlmZ dZdZd	Zd
jeededZG dd de
ZdS )    )AnyDictListMappingOptionalN)CallbackManagerForLLMRun)LLM)get_from_dict_or_envpre_init)enforce_stop_tokensz### Instruction:z### Response:ziBelow is an instruction that describes a task. Write a response that appropriately completes the request.z7{intro}
{instruction_key}
{instruction}
{response_key}
z{instruction})ZintroZinstruction_keyinstructionZresponse_keyc                   @   s   e Zd ZU dZdZeed< dZeed< dZ	e
e ed< dZeed	< dZe
e ed
< G dd dZeeedddZeeeef dddZeedddZeedddZdee
ee  e
e eeedddZdS )MosaicMLa2  MosaicML LLM 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 MosaicML
            endpoint_url = (
                "https://models.hosted-on.mosaicml.hosting/mpt-7b-instruct/v1/predict"
            )
            mosaic_llm = MosaicML(
                endpoint_url=endpoint_url,
                mosaicml_api_token="my-api-key"
            )
    zDhttps://models.hosted-on.mosaicml.hosting/mpt-7b-instruct/v1/predictendpoint_urlFinject_instruction_formatNmodel_kwargsg      ?retry_sleepmosaicml_api_tokenc                   @   s   e Zd ZdZdS )zMosaicML.ConfigZforbidN)__name__
__module____qualname__extra r   r   E/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/llms/mosaicml.pyConfig=   s   r   )valuesreturnc                 C   s   t |dd}||d< |S )z?Validate that api key and python package exists in environment.r   ZMOSAICML_API_TOKEN)r	   )clsr   r   r   r   r   validate_environment@   s      zMosaicML.validate_environment)r   c                 C   s   | j pi }d| jid|iS )zGet the identifying parameters.r   r   )r   r   )self_model_kwargsr   r   r   _identifying_paramsI   s    
zMosaicML._identifying_paramsc                 C   s   dS )zReturn type of llm.Zmosaicr   )r   r   r   r   	_llm_typeR   s    zMosaicML._llm_type)promptr   c                 C   s   | j rtj|d}|S )zTransform prompt.)r   )r   PROMPT_FOR_GENERATION_FORMATformat)r   r"   r   r   r   _transform_promptW   s
    zMosaicML._transform_prompt)r"   stoprun_manageris_retrykwargsr   c              
   K   s  | j pi }| |}d|gi}|| || | j dd}ztj| j||d}	W n4 tjjk
r }
 zt	d|
 W 5 d}
~
X Y nX z|	j
dkr|sddl}|| j | j|||d	d
W S t	d|	j |	 }t|trHdddg}|D ]}||kr|| } q,qt	dd| d| t|trB|d }n|}nt	d| ||rr|t|d }W n> tjjk
r }
 zt	d|
 d|	j W 5 d}
~
X Y nX |dk	rt||}|S )az  Call out to a MosaicML LLM inference endpoint.

        Args:
            prompt: The prompt to pass into the model.
            stop: Optional list of stop words to use when generating.

        Returns:
            The string generated by the model.

        Example:
            .. code-block:: python

                response = mosaic_llm.invoke("Tell me a joke.")
        inputszapplication/json)AuthorizationzContent-Type)headersjsonz$Error raised by inference endpoint: Ni  r   T)r(   z>Error raised by inference API: rate limit exceeded.
Response: dataoutputoutputszNo valid key (z, z) in response: zUnexpected response type: zError raised by inference API: z.
Response: )r   r%   updater   requestspostr   
exceptionsRequestException
ValueErrorstatus_codetimesleepr   _calltextr-   
isinstancedictjoinlist
startswithlenJSONDecodeErrorr   )r   r"   r&   r'   r(   r)   r   payloadr,   responseer8   Zparsed_responseZoutput_keyskeyZoutput_itemr;   r   r   r   r:   _   sX    




 





zMosaicML._call)NNF)r   r   r   __doc__r   str__annotations__r   boolr   r   r=   r   floatr   r   r
   r   r   propertyr   r   r    r!   r%   r   r   r:   r   r   r   r   r      s4   

   
r   )typingr   r   r   r   r   r2   Zlangchain_core.callbacksr   Z#langchain_core.language_models.llmsr   Zlangchain_core.utilsr	   r
   Zlangchain_community.llms.utilsr   ZINSTRUCTION_KEYZRESPONSE_KEYZINTRO_BLURBr$   r#   r   r   r   r   r   <module>   s    