
    7|h.              
          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dee   deeef   deeef   ddfdZdedee   deee f   dedef
dZ! G d de      Z"y)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.1keysresponsetoken_usagereturnNc                     | j                  |d         }|D ]%  }||vr|d   |   ||<   ||xx   |d   |   z  cc<   ' y)zUpdate token usage.usageN)intersection)r   r   r   _keys_to_use_keys        `/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/anyscale.pyupdate_token_usager!      s^     $$Xg%67L 9{" ( 1$ 7K'!24!88	9    choicesprompts
model_namec                     g }t        |      D ]V  \  }}| |   }|j                  t        |d   d   t        |j	                  d      |j	                  d                  g       X ||d}t        ||      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.   s	            r    create_llm_resultr6   +   s     K'" 
1	*95$(&,jj&A!'J!7%
	

 "-JGJDDr"   c                       e Zd ZU dZ	  ee      Zeed<    e e	d            Z
e	ed<    ee      Zeed<    ee      Zeed<   ed	efd
       Zeded	efd       Zed	eeef   f fd       Zed	eeef   f fd       Zed	efd       Z	 	 ddee   deee      dee   ded	ef
dZ	 	 ddee   deee      dee    ded	ef
dZ! x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_messagesr   c                      y)NF )clss    r    is_lc_serializablezAnyscale.is_lc_serializable\   s    r"   valuesc                    t        |ddt              |d<   t        t        |dd            |d<   t        |ddt              |d<   	 dd	l}t               rz|d   j                         |d   d
}|j                  d      s |j                  di |j                  |d<   |j                  d      sM |j                  di |j                  |d<   n-|d   |d<   |d   j                         |d<   |j                  |d<   |d   r|d   dkD  rt        d      |d   r|d   dkD  rt        d      |S # t        $ r t        d      w xY w)z?Validate that api key and python package exists in environment.r;   ANYSCALE_API_BASEr9   r=   ANYSCALE_API_KEYr%   
MODEL_NAMEr   N)api_keybase_urlclientasync_clientopenai_api_baseopenai_api_keyzTCould not import openai python package. Please install it with `pip install openai`.	streamingn   z!Cannot stream results when n > 1.best_ofz'Cannot stream results when best_of > 1.rA   )r   DEFAULT_BASE_URLr   DEFAULT_MODELopenair   get_secret_valuer2   OpenAIcompletionsAsyncOpenAI
CompletionImportError
ValueError)rB   rD   rU   client_paramss       r    validate_environmentzAnyscale.validate_environment`   s    ';$	'
"# &; );=OP&
!"  4!	 
|	~%&89JJL &': ;
! zz(+'4v}}'E}'E'Q'QF8$zz.1-?V-?-? .'.!k >* -33F,G()+12D+E+V+V+X'(#)#4#4x  +6#;?@AA+6)#4q#8FGG  	? 	s   B5D. .Ec                 8    i d| j                   it        |   S )zGet the identifying parameters.r%   )r%   super_identifying_params)self	__class__s    r    ra   zAnyscale._identifying_params   s+    
T__-
g)
 	
r"   c                     d| j                   i}t               s6|j                  | j                  j	                         | j
                  d       i |t        |   S )z,Get the parameters used to invoke the model.model)rI   api_base)r%   r   updater=   rV   r;   r`   _invocation_params)rb   openai_credsrc   s     r    rh   zAnyscale._invocation_params   sa     T__(
 ~#44EEG $ 6 6 >,=%'"<==r"   c                      y)zReturn type of llm.zAnyscale LLMrA   )rb   s    r    	_llm_typezAnyscale._llm_type   s     r"   r$   stoprun_managerkwargsc                    | j                   }i ||}| j                  |||      }g }i }h d}	d}
|D ]+  }| j                  rt        |      dkD  rt	        d      d} | j
                  |d   ||fi |D ]  }||}||z  } |J |j                  |j                  |j                  r|j                  j                  d      nd|j                  r|j                  j                  d      ndd       t        | f|d   |d	|}t        |t              s|j                         }|j                  |d
          t        |	||       |
r|j                  d      }
. | j                  |||||
      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."])
        >   total_tokensprompt_tokenscompletion_tokensNrQ   ,Cannot stream results with multiple prompts.r   r)   r*   r+   r)   r*   promptrm   r#   system_fingerprintrw   )rh   get_sub_promptsrO   lenr\   _streamr0   r+   r,   r2   r   
isinstancer1   extendr!   r6   rb   r$   rl   rm   rn   paramssub_promptsr#   r   _keysrw   _prompts
generationchunkr   s                  r    	_generatezAnyscale._generate   s   , ((%F%f%**67DA&( G,0# '	LH~~x=1$$%STT8<
)T\\(1+t[SFS ,E!)%*
"e+
	,
 "--- *%55 *4)C)C)G)G)X!%55 %/$>$>$B$B:$N!
 1 $A; +	
  "(D1  (}}Hx	23"5(K@))16J)K&O'	LP %%1 & 
 	
r"   c                   K   | j                   }i ||}| j                  |||      }g }i }h d}	d}
|D ]  }| j                  rGt        |      dkD  rt	        d      d} | j
                  |d   ||fi |2 3 d{   }||}||z  }t        | f|d   |d	| d{   }t        |t              s|j                         }|j                  |d
          t        |	||        | j                  |||||
      S 7 6 |J |j                  |j                  |j                  r|j                  j                  d      nd|j                  r|j                  j                  d      ndd       ?7 ӭw)z:Call out to OpenAI's endpoint async with k unique prompts.>   rp   rq   rr   NrQ   rs   r   r)   r*   rt   ru   r#   rx   )rh   ry   rO   rz   r\   _astreamr0   r+   r,   r2   r   r|   r1   r}   r!   r6   r~   s                  r    
_ageneratezAnyscale._agenerate  s     ((%F%f%**67DA&( G,0# $	AH~~x=1$$%STT8<
#04==QK{$6<$ , ,% ")%*
"e+
 "8" $A; +	"
 "  "(D1'}}Hx	23"5(K@I$	AJ %%1 & 
 	
?, $ "--- *%55 *4)C)C)G)G)X!%55 %/$>$>$B$B:$N!
s8   A4E56C?:C=;C?>!E5E3 AE5=C??A5E5)NN)#__name__
__module____qualname____doc__r   rS   r;   str__annotations__r   r=   rT   r%   listr?   r   classmethodboolrC   r   r   r^   propertyr   r   ra   rh   rk   r   r
   r   r   r	   r   __classcell__)rc   s   @r    r8   r8   A   s   & 3"+;<s<"'	"">i>M2J2!$7OT74   5$ 54 5 5n 
WS#X%6 
 
 >DcN > > 3   %):>	M
cM
 tCy!M
 67	M

 M
 
M
d %)?C	<
c<
 tCy!<
 ;<	<

 <
 
<
r"   r8   )#r   typingr   r   r   r   r   r   langchain_core.callbacksr	   r
   langchain_core.outputsr   r   r   langchain_core.utilsr   r   r   pydanticr   r   langchain_community.llms.openair   r   r    langchain_community.utils.openair   rS   rT   r   r!   intr6   r8   rA   r"   r    <module>r      s    &  J I V V % 
 :: 6	9
c(	9"38n	9;?S>	9		9EE9E37S>EOREE,~
z ~
r"   