o
    Zh                     @  s4  d dl mZ d dlZd dlZd dlZd dlmZmZ d dl	m
Z
 d dlmZ d dl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 d dlmZmZm Z  ej!rmd dl"m#Z# d dl$m%Z% e&e'Z(eeeeeegZ)d!ddZ*e
G dd deZ+G dd de+Z,	d"d#dd Z-dS )$    )annotationsN)ABCabstractmethod)	dataclass)partial)ChatVertexAI)VertexAI)BaseLanguageModel)	LLMResult)AzureChatOpenAI
ChatOpenAI)AzureOpenAIOpenAI)
BaseOpenAI)	RunConfigadd_async_retry	add_retry)	Callbacks)PromptValuellmr	   returnboolc                 C  s   t D ]
}t| |r dS qdS )z3Return whether the given LLM supports n-completion.TF)MULTIPLE_COMPLETION_SUPPORTED
isinstance)r   Zllm_type r   F/var/www/html/lang_env/lib/python3.10/site-packages/ragas/llms/base.py is_multiple_completion_supported%   s
   
r   c                   @  sp   e Zd ZU ded< dddZd d	d
Ze				d!d"ddZe				d!d"ddZ					d#d$ddZ	dS )%BaseRagasLLMr   
run_configc                 C  s
   || _ d S N)r   )selfr   r   r   r   set_run_config1   s   
zBaseRagasLLM.set_run_confignintr   floatc                 C  s   |dkrdS dS )z8Return the temperature to use for completion based on n.   g333333?:0yE>r   )r    r"   r   r   r   get_temperature4   s   zBaseRagasLLM.get_temperaturer%   r&   Npromptr   temperaturestopt.Optional[t.List[str]]	callbacksr   r
   c                 C  s   d S r   r   r    r(   r"   r)   r*   r,   r   r   r   generate_text8   s   	zBaseRagasLLM.generate_textc                   s   d S r   r   r-   r   r   r   agenerate_textC   s   	zBaseRagasLLM.agenerate_textTis_asyncr   c                   sh   |rt | j| j}||||||dI dH S t }t| j| j}	t|	|||||d}
|d|
I dH S )z)Generate text using the given event loop.)r(   r"   r)   r*   r,   N)	r   r/   r   asyncioZget_event_loopr   r.   r   Zrun_in_executor)r    r(   r"   r)   r*   r,   r0   Zagenerate_text_with_retryloopZgenerate_text_with_retryr.   r   r   r   generateN   s.   
zBaseRagasLLM.generater   r   )r"   r#   r   r$   r%   r&   NNr(   r   r"   r#   r)   r$   r*   r+   r,   r   r   r
   )r%   r&   NNT)r(   r   r"   r#   r)   r$   r*   r+   r,   r   r0   r   r   r
   )
__name__
__module____qualname____annotations__r!   r'   r   r.   r/   r3   r   r   r   r   r   -   s,   
 


r   c                   @  sP   e Zd ZdZ	ddddZ			
		d d!ddZ			
		d d!ddZd"ddZdS )#LangchainLLMWrappera  
    A simple base class for RagasLLMs that is based on Langchain's BaseLanguageModel
    interface. it implements 2 functions:
    - generate_text: for generating text from a given PromptValue
    - agenerate_text: for generating text from a given PromptValue asynchronously
    Nlangchain_llmr	   r   t.Optional[RunConfig]c                 C  s"   || _ |d u r
t }| | d S r   )r<   r   r!   )r    r<   r   r   r   r   __init__y   s   zLangchainLLMWrapper.__init__r%   r&   r(   r   r"   r#   r)   r$   r*   r+   r,   r   r   r
   c                 C  sd   | j |d}t| jr| jj|g||||dS | jj|g| |||d}dd |jD g}||_|S )Nr"   promptsr"   r)   r*   r,   rA   r)   r*   r,   c                 S     g | ]}|d  qS r   r   .0gr   r   r   
<listcomp>       z5LangchainLLMWrapper.generate_text.<locals>.<listcomp>)r'   r   r<   Zgenerate_promptgenerationsr    r(   r"   r)   r*   r,   resultrJ   r   r   r   r.      s$   
z!LangchainLLMWrapper.generate_textc                   sr   | j |d}t| jr| jj|g||||dI d H S | jj|g| |||dI d H }dd |jD g}||_|S )Nr?   r@   rB   c                 S  rC   rD   r   rE   r   r   r   rH      rI   z6LangchainLLMWrapper.agenerate_text.<locals>.<listcomp>)r'   r   r<   Zagenerate_promptrJ   rK   r   r   r   r/      s&   
z"LangchainLLMWrapper.agenerate_textr   c                 C  s`   || _ t| jtst| jtr.zddlm} W n ty"   tdw |j| j_	|| j _
d S d S )Nr   )RateLimitErrorz\openai.error.RateLimitError not found. Please install openai package as `pip install openai`)r   r   r<   r   r   ZopenairM   ImportErrortimeoutrequest_timeoutZexception_types)r    r   rM   r   r   r   r!      s   
z"LangchainLLMWrapper.set_run_configr   )r<   r	   r   r=   r5   r6   r4   )r7   r8   r9   __doc__r>   r.   r/   r!   r   r   r   r   r;   q   s    !r;   gpt-3.5-turbo-16kmodelstrr   r=   c                 C  s(   d }|d ur	|j }t| |d}t||S )N)rS   rO   )rO   r   r;   )rS   r   rO   Zopenai_modelr   r   r   llm_factory   s
   
rU   )r   r	   r   r   )rR   N)rS   rT   r   r=   r   r   ).
__future__r   r1   loggingtypingtabcr   r   dataclassesr   	functoolsr   Zlangchain_community.chat_modelsr   Zlangchain_community.llmsr   Zlangchain_core.language_modelsr	   Zlangchain_core.outputsr
   Zlangchain_openai.chat_modelsr   r   Zlangchain_openai.llmsr   r   Zlangchain_openai.llms.baser   Zragas.run_configr   r   r   TYPE_CHECKINGZlangchain_core.callbacksr   Zragas.llms.promptr   	getLoggerr7   loggerr   r   r   r;   rU   r   r   r   r   <module>   s@    


C^