U
    h                      @  s   d dl mZ d dlZd dlmZmZmZmZmZ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 erd d
lmZ eeZG dd deZdS )    )annotationsN)TYPE_CHECKINGAnyDictIteratorListOptional)CallbackManagerForLLMRun)LLM)GenerationChunk)Fieldroot_validator)get_from_dict_or_envpre_init)
get_fields)
Predictionc                   @  sP  e Zd ZU dZded< eeddZded< dZd	ed
< dZ	d	ed< edddZ
ded< dZded< eedZded< G dd dZeddddZeddddZeddddZedd ddd!d"d#Zed$d$d!d%d&Zeddd'd(Zeddd)d*Zd7dd+d,ddd-d.d/Zd8dd+d,dd0d-d1d2Zddd3d4d5d6ZdS )9	Replicatea  Replicate models.

    To use, you should have the ``replicate`` python package installed,
    and the environment variable ``REPLICATE_API_TOKEN`` set with your API token.
    You can find your token here: https://replicate.com/account

    The model param is required, but any other model parameters can also
    be passed in with the format model_kwargs={model_param: value, ...}

    Example:
        .. code-block:: python

            from langchain_community.llms import Replicate

            replicate = Replicate(
                model=(
                    "stability-ai/stable-diffusion: "
                    "27b93a2413e7f36cd83da926f3656280b2931564ff050bf9575f1fdf9bcd7478",
                ),
                model_kwargs={"image_dimensions": "512x512"}
            )
    strmodelinput)default_factoryaliaszDict[str, Any]model_kwargsNzOptional[str]replicate_api_token
prompt_keyT)defaultexcluder   version_objFbool	streaming)r   z	List[str]stopc                   @  s   e Zd ZdZdZdS )zReplicate.ConfigTZforbidN)__name__
__module____qualname__Zallow_population_by_field_nameextra r%   r%   F/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/llms/replicate.pyConfig;   s   r'   zDict[str, str])returnc                 C  s   ddiS )Nr   REPLICATE_API_TOKENr%   selfr%   r%   r&   
lc_secrets?   s    zReplicate.lc_secretsc                 C  s   dS )NTr%   clsr%   r%   r&   is_lc_serializableC   s    zReplicate.is_lc_serializablec                 C  s
   dddgS )z*Get the namespace of the langchain object.Z	langchainZllms	replicater%   r-   r%   r%   r&   get_lc_namespaceG   s    zReplicate.get_lc_namespace)pre)valuesr(   c                 C  s   dd t |  D }|di }|r0td |di |}t|D ]H}||krH||krltd| dt| d| d	 ||||< qH||d< |S )
z>Build extra kwargs from additional params that were passed in.c                 S  s   h | ]
}|j qS r%   )r   ).0fieldr%   r%   r&   	<setcomp>O   s     z(Replicate.build_extra.<locals>.<setcomp>r   zDInit param `input` is deprecated, please use `model_kwargs` instead.r   zFound z supplied twice.zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.)r   r3   poploggerwarninglist
ValueError)r.   r3   Zall_required_field_namesr   r$   
field_namer%   r%   r&   build_extraL   s"    zReplicate.build_extrar   c                 C  s   t |dd}||d< |S )z?Validate that api key and python package exists in environment.r   r)   )r   )r.   r3   r   r%   r%   r&   validate_environmentc   s      zReplicate.validate_environmentc                 C  s   | j | jdS )zGet the identifying parameters.r   r   r?   r*   r%   r%   r&   _identifying_paramsl   s    zReplicate._identifying_paramsc                 C  s   dS )zReturn type of model.r0   r%   r*   r%   r%   r&   	_llm_typet   s    zReplicate._llm_typezOptional[List[str]]z"Optional[CallbackManagerForLLMRun])promptr    run_managerkwargsr(   c           
      K  s   | j rDd}| j|f||d|D ]}|dkr6|j}q"||j7 }q"nJ| j|f|}|  |jdkrnt|jt|j	t
r|j	}nd|j	}|dk	st|p| j}|D ]}	|	|kr|d||	 }q|S )zCall to replicate endpoint.N)r    rC   failed )r   _streamtext_create_predictionwaitstatusRuntimeErrorerror
isinstanceoutputr   joinAssertionErrorr    find)
r+   rB   r    rC   rD   
completionchunk
predictionstop_conditionssr%   r%   r&   _cally   s4     



zReplicate._callzIterator[GenerationChunk]c                 k  s   | j |f|}|p| j}d}d}| D ]z}	||	7 }|D ]<}
|
|kr8|  d}t|	|
d}|	d | }	|	s8 qvq8|	r|r|j|	| jd t|	dV  |r( qq(d S )NFrF   Tr   )verbose)rH   )	rI   r    Zoutput_iteratorcancelmaxrR   Zon_llm_new_tokenrY   r   )r+   rB   r    rC   rD   rU   rV   Zstop_condition_reachedZcurrent_completionrO   rW   
stop_indexr%   r%   r&   rG      s.    
zReplicate._streamr   )rB   rD   r(   c           	      K  s  zdd l }W n tk
r(   tdY nX | jd krd| jkrj| jd\}}|j|}|j|| _n|j| j}|j| _| j	d krt
| jjd d d d  dd	 d
}|d d | _	| j	|i| j|}d| jkr|jjj| j|dS |jj| j|dS d S )Nr   zZCould not import replicate python package. Please install it with `pip install replicate`.:
componentsZschemasZInputZ
propertiesc                 S  s   | d  ddS )N   zx-orderr   )get)itemr%   r%   r&   <lambda>       z.Replicate._create_prediction.<locals>.<lambda>)key)r   )versionr   )r0   ImportErrorr   r   splitmodelsr`   versionsZlatest_versionr   sortedZopenapi_schemaitemsr   Zpredictionscreate)	r+   rB   rD   Zreplicate_pythonZ	model_strversion_strr   Zinput_propertiesZinput_r%   r%   r&   rI      sB    



 
 zReplicate._create_prediction)NN)NN)r!   r"   r#   __doc____annotations__r   dictr   r   r   r   r   r:   r    r'   propertyr,   classmethodr/   r1   r   r=   r   r>   r@   rA   rX   rG   rI   r%   r%   r%   r&   r      s<   
  $  "r   )
__future__r   loggingtypingr   r   r   r   r   r   Zlangchain_core.callbacksr	   Z#langchain_core.language_models.llmsr
   Zlangchain_core.outputsr   Zlangchain_core.pydantic_v1r   r   Zlangchain_core.utilsr   r   Zlangchain_core.utils.pydanticr   Zreplicate.predictionr   	getLoggerr!   r8   r   r%   r%   r%   r&   <module>   s    
