a
    bg.                     @   s   d Z ddlmZmZmZmZmZmZ ddlm	Z	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mZ ddlmZmZmZ ddlmZ d	Zd
Zee eeef eeef ddddZeee eee f eedddZ!G dd deZ"dS )z Wrapper around Anyscale Endpoint    )AnyDictListMappingOptionalSet)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)
GenerationGenerationChunk	LLMResult)convert_to_secret_strget_from_dict_or_envpre_init)Field	SecretStr)
BaseOpenAIacompletion_with_retrycompletion_with_retry)is_openai_v1z%https://api.endpoints.anyscale.com/v1z$mistralai/Mixtral-8x7B-Instruct-v0.1N)keysresponsetoken_usagereturnc                 C   sN   |  |d }|D ]6}||vr0|d | ||< q||  |d | 7  < qdS )zUpdate token usage.usageN)intersection)r   r   r   Z_keys_to_use_key r   o/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/llms/anyscale.pyupdate_token_usage   s
    r   )choicespromptsr   
model_namer   c           	   
   C   sd   g }t |D ]@\}}| | }|t|d d t|d|dddg q||d}t||dS )	z2Create the LLMResult from the choices and prompts.messagecontentfinish_reasonlogprobs)r%   r&   )textgeneration_info)r   r"   )generations
llm_output)	enumerateappendr
   dictgetr   )	r    r!   r   r"   r)   i_choicer*   r   r   r   create_llm_result+   s    

r2   c                       s&  e Zd ZU dZeedZeed< ee	ddZ
e	ed< eedZeed< eedZeed< eed	d
dZeeedddZeeeef d	 fddZeeeef d	 fddZeed	ddZdee eee  ee eedddZdee eee  ee  eedddZ!  Z"S )Anyscalea  Anyscale large language models.

    To use, you should have the environment variable ``ANYSCALE_API_KEY``set with your
    Anyscale Endpoint, or pass it as a named parameter to the constructor.
    To use with Anyscale Private Endpoint, please also set ``ANYSCALE_BASE_URL``.

    Example:
        .. code-block:: python
            from langchain.llms import Anyscale
            anyscalellm = Anyscale(anyscale_api_key="ANYSCALE_API_KEY")
            # To leverage Ray for parallel processing
            @ray.remote(num_cpus=1)
            def send_query(llm, text):
                resp = llm.invoke(text)
                return resp
            futures = [send_query.remote(anyscalellm, text) for text in texts]
            results = ray.get(futures)
    defaultanyscale_api_base anyscale_api_keyr"   )default_factoryprefix_messages)r   c                 C   s   dS )NFr   )clsr   r   r   is_lc_serializable\   s    zAnyscale.is_lc_serializable)valuesr   c                 C   s,  t |ddtd|d< tt |dd|d< t |ddtd|d< zdd	l}t r|d  |d d
}|ds|jf i |j	|d< |ds|j
f i |j	|d< n&|d |d< |d  |d< |j|d< W n ty   tdY n0 |d r|d dkrtd|d r(|d dkr(td|S )z?Validate that api key and python package exists in environment.r6   ZANYSCALE_API_BASEr4   r8   ZANYSCALE_API_KEYr"   Z
MODEL_NAMEr   N)api_keybase_urlclientZasync_clientZopenai_api_baseZopenai_api_keyzTCould not import openai python package. Please install it with `pip install openai`.	streamingn   z!Cannot stream results when n > 1.Zbest_ofz'Cannot stream results when best_of > 1.)r   DEFAULT_BASE_URLr   DEFAULT_MODELopenair   get_secret_valuer.   ZOpenAIZcompletionsZAsyncOpenAIZ
CompletionImportError
ValueError)r;   r=   rF   Zclient_paramsr   r   r   validate_environment`   sN    






zAnyscale.validate_environmentc                    s   i d| j it jS )zGet the identifying parameters.r"   )r"   super_identifying_paramsself	__class__r   r   rL      s
    zAnyscale._identifying_paramsc                    s8   d| j i}t s(|| j | jd i |t jS )z,Get the parameters used to invoke the model.model)r>   Zapi_base)r"   r   updater8   rG   r6   rK   _invocation_params)rN   Zopenai_credsrO   r   r   rS      s    zAnyscale._invocation_paramsc                 C   s   dS )zReturn type of llm.zAnyscale LLMr   rM   r   r   r   	_llm_type   s    zAnyscale._llm_typeN)r!   stoprun_managerkwargsr   c                 K   sB  | j }i ||}| |||}g }i }h d}	d}
|D ]}| jrt|dkrVtdd}| j|d ||fi |D ]}|du r|}qt||7 }qt|dusJ ||j|jr|j	dnd|jr|j	dndd q8t
| f|d |d	|}t|ts| }||d
  t|	|| |
s8|	d}
q8| j|||||
dS )at  Call out to OpenAI's endpoint with k unique prompts.

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

        Returns:
            The full LLM output.

        Example:
            .. code-block:: python

                response = openai.generate(["Tell me a joke."])
           Zprompt_tokensZcompletion_tokensZtotal_tokensNrC   ,Cannot stream results with multiple prompts.r   r%   r&   r'   r%   r&   promptrV   r    system_fingerprintr]   )rS   get_sub_promptsrA   lenrI   _streamr,   r'   r(   r.   r   
isinstancer-   extendr   r2   rN   r!   rU   rV   rW   paramsZsub_promptsr    r   Z_keysr]   Z_promptsZ
generationchunkr   r   r   r   	_generate   s`    
zAnyscale._generatec                    sD  | j }i ||}| |||}g }i }h d}	d}
|D ]}| jrt|dkrVtdd}| j|d ||fi |2 z"3 dH W }|du r|}qt||7 }qt6 |dusJ ||j|jr|j	dnd|jr|j	dndd q8t
| f|d |d	|I dH }t|ts| }||d
  t|	|| q8| j|||||
dS )z:Call out to OpenAI's endpoint async with k unique prompts.rX   NrC   rY   r   r%   r&   rZ   r[   r    r^   )rS   r_   rA   r`   rI   Z_astreamr,   r'   r(   r.   r   rb   r-   rc   r   r2   rd   r   r   r   
_agenerate  sd    
zAnyscale._agenerate)NN)NN)#__name__
__module____qualname____doc__r   rD   r6   str__annotations__r   r8   rE   r"   listr:   r   classmethodboolr<   r   r   rJ   propertyr   r   rL   rS   rT   r   r	   r   rg   r   rh   __classcell__r   r   rO   r   r3   A   sB   
7  
R  
r3   )#rl   typingr   r   r   r   r   r   Zlangchain_core.callbacksr   r	   Zlangchain_core.outputsr
   r   r   Zlangchain_core.utilsr   r   r   Zpydanticr   r   Zlangchain_community.llms.openair   r   r   Z langchain_community.utils.openair   rD   rE   rm   r   intr2   r3   r   r   r   r   <module>   s     	