U
    h                     @   s   d dl Z d dlZ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mZ d dlmZmZmZ d dlmZ d dlmZ e eZG d	d
 d
eZdS )    N)AnyDictListMappingOptional)CallbackManagerForLLMRun)LLM)Field	SecretStrroot_validator)convert_to_secret_strget_from_dict_or_envpre_init)
get_fields)enforce_stop_tokensc                   @   s   e Zd ZU dZdZeed< eedZ	e
eef ed< dZee ed< G dd	 d	Zed
de
eef e
eef 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deeee  ee eedddZdS )StochasticAIa2  StochasticAI large language models.

    To use, you should have the environment variable ``STOCHASTICAI_API_KEY``
    set with your API key.

    Example:
        .. code-block:: python

            from langchain_community.llms import StochasticAI
            stochasticai = StochasticAI(api_url="")
     api_url)default_factorymodel_kwargsNstochasticai_api_keyc                   @   s   e Zd ZdZdS )zStochasticAI.ConfigZforbidN)__name__
__module____qualname__extra r   r   I/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/llms/stochasticai.pyConfig'   s   r   T)pre)valuesreturnc                 C   s   dd t |  D }|di }t|D ]H}||kr*||krNtd| dt| d| d ||||< q*||d< |S )z>Build extra kwargs from additional params that were passed in.c                 S   s   h | ]
}|j qS r   )alias).0fieldr   r   r   	<setcomp>-   s     z+StochasticAI.build_extra.<locals>.<setcomp>r   zFound z supplied twice.zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.)r   r   getlist
ValueErrorloggerwarningpop)clsr   Zall_required_field_namesr   
field_namer   r   r   build_extra*   s    zStochasticAI.build_extrac                 C   s   t t|dd}||d< |S )z,Validate that api key exists in environment.r   ZSTOCHASTICAI_API_KEY)r   r   )r+   r   r   r   r   r   validate_environment<   s
    
z!StochasticAI.validate_environment)r    c                 C   s   d| j id| jiS )zGet the identifying parameters.Zendpoint_urlr   )r   r   selfr   r   r   _identifying_paramsE   s    z StochasticAI._identifying_paramsc                 C   s   dS )zReturn type of llm.Zstochasticair   r/   r   r   r   	_llm_typeM   s    zStochasticAI._llm_type)promptstoprun_managerkwargsr    c                 K   s   | j pi }||}tj| j||d| j  dddd}|  | }d}|stj|d d | j  dddd}	|	  |	 d }
|
d	}|d
k	}t	
d qN|d }|d
k	rt||}|S )at  Call out to StochasticAI's complete 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 = StochasticAI("Tell me a joke.")
        )r3   paramszapplication/json)ZapiKeyAcceptzContent-Type)urljsonheadersFdataZresponseUrl)r9   r;   
completionNg      ?r   )r   requestspostr   r   Zget_secret_valueraise_for_statusr:   r%   timesleepr   )r0   r3   r4   r5   r6   r7   Zresponse_postZresponse_post_jsonZ	completedZresponse_getZresponse_get_jsontextr   r   r   _callR   s<    

	



zStochasticAI._call)NN)r   r   r   __doc__r   str__annotations__r	   dictr   r   r   r   r   r
   r   r   r-   r   r.   propertyr   r1   r2   r   r   rD   r   r   r   r   r      s,   
"  
r   )loggingrA   typingr   r   r   r   r   r>   Zlangchain_core.callbacksr   Z#langchain_core.language_models.llmsr   Zlangchain_core.pydantic_v1r	   r
   r   Zlangchain_core.utilsr   r   r   Zlangchain_core.utils.pydanticr   Zlangchain_community.llms.utilsr   	getLoggerr   r(   r   r   r   r   r   <module>   s   
