
    -j                    t   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!        rd dl"m#Z# d dl$m%Z%  ej&        e'          Z(eeeeeegZ)ddZ*e
 G d de                      Z+ G d de+          Z,	 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                @    t           D ]}t          | |          r dS dS )z3Return whether the given LLM supports n-completion.TF)MULTIPLE_COMPLETION_SUPPORTED
isinstance)r   llm_types     Y/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/ragas/llms/base.py is_multiple_completion_supportedr   %   s4    1  c8$$ 	44	5    c                      e Zd ZU ded<   ddZddZe	 	 	 	 ddd            Ze	 	 	 	 ddd            Z	 	 	 	 	 dddZ	dS ) BaseRagasLLMr   
run_configc                    || _         d S N)r"   )selfr"   s     r   set_run_configzBaseRagasLLM.set_run_config1   s    $r   nintr   floatc                    |dk    rdndS )z8Return the temperature to use for completion based on n.   g333333?:0yE> )r%   r'   s     r   get_temperaturezBaseRagasLLM.get_temperature4   s    !eess%r   r+   r,   Npromptr   temperaturestopt.Optional[t.List[str]]	callbacksr   r   c                    d S r$   r-   r%   r/   r'   r0   r1   r3   s         r   generate_textzBaseRagasLLM.generate_text8   s	     	r   c                
   K   d S r$   r-   r5   s         r   agenerate_textzBaseRagasLLM.agenerate_textC   s       	r   Tis_asyncr   c                &  K   |r0t          | j        | j                  } ||||||           d{V S t          j                    }t          | j        | j                  }	t          |	|||||          }
|                    d|
           d{V S )z)Generate text using the given event loop.)r/   r'   r0   r1   r3   N)	r   r8   r"   asyncioget_event_loopr   r6   r   run_in_executor)r%   r/   r'   r0   r1   r3   r9   agenerate_text_with_retryloopgenerate_text_with_retryr6   s              r   generatezBaseRagasLLM.generateN   s        	C(7#T_) )% 32'#          )++D'01CT_'U'U$#('#  M --dMBBBBBBBBBr   r"   r   )r'   r(   r   r)   r+   r,   NNr/   r   r'   r(   r0   r)   r1   r2   r3   r   r   r   )r+   r,   NNT)r/   r   r'   r(   r0   r)   r1   r2   r3   r   r9   r   r   r   )
__name__
__module____qualname____annotations__r&   r.   r   r6   r8   rA   r-   r   r   r!   r!   -   s         % % % %& & & &  !(,#    ^  !(,#    ^ !(,# C  C  C  C  C  C  Cr   r!   c                  J    e Zd ZdZ	 dddZ	 	 	 	 dddZ	 	 	 	 dddZ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                ^    || _         |t                      }|                     |           d S r$   )rK   r   r&   )r%   rK   r"   s      r   __init__zLangchainLLMWrapper.__init__y   s5     +"JJ'''''r   r+   r,   r/   r   r'   r(   r0   r)   r1   r2   r3   r   r   r   c                   |                      |          }t          | j                  r | j                            |g||||          S | j                            |g|z  |||          }d |j        D             g}||_        |S )Nr'   promptsr'   r0   r1   r3   rR   r0   r1   r3   c                    g | ]
}|d          S r   r-   .0gs     r   
<listcomp>z5LangchainLLMWrapper.generate_text.<locals>.<listcomp>       ===QAaD===r   )r.   r   rK   generate_promptgenerationsr%   r/   r'   r0   r1   r3   resultr\   s           r   r6   z!LangchainLLMWrapper.generate_text   s     **Q*//+D,>?? 	%55'# 6    '771'#	 8  F >=&*<===>K!,FMr   c                ,  K   |                      |          }t          | j                  r&| j                            |g||||           d {V S | j                            |g|z  |||           d {V }d |j        D             g}||_        |S )NrP   rQ   rS   c                    g | ]
}|d          S rU   r-   rV   s     r   rY   z6LangchainLLMWrapper.agenerate_text.<locals>.<listcomp>   rZ   r   )r.   r   rK   agenerate_promptr\   r]   s           r   r8   z"LangchainLLMWrapper.agenerate_text   s       **Q*//+D,>?? 	+<<'# =           ->>1'#	 ?        F >=&*<===>K!,FMr   r   c                   || _         t          | j        t                    st          | j        t                    rD	 ddlm} n# t          $ r t          d          w xY 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   rK   r   r   openairc   ImportErrortimeoutrequest_timeoutexception_types)r%   r"   rc   s      r   r&   z"LangchainLLMWrapper.set_run_config   s    $ d(*55 
	=
:
 :
 
	=1111111   !r   2<1CD..<DO+++
	= 
	=s   A Ar$   )rK   r
   r"   rL   rC   rD   rB   )rE   rF   rG   __doc__rN   r6   r8   r&   r-   r   r   rJ   rJ   q   s          UY( ( ( ( ( !(,#    B !(,#    <= = = = = =r   rJ   gpt-3.5-turbo-16kmodelstrr"   rL   c                Z    d }||j         }t          | |          }t          ||          S )N)rk   rf   )rf   r   rJ   )rk   r"   rf   openai_models       r   llm_factoryro      s9     G$E7;;;L|Z888r   )r   r
   r   r   )rj   N)rk   rl   r"   rL   r   r!   ).
__future__r   r;   loggingtypingtabcr   r   dataclassesr   	functoolsr   langchain_community.chat_modelsr   langchain_community.llmsr	   langchain_core.language_modelsr
   langchain_core.outputsr   langchain_openai.chat_modelsr   r   langchain_openai.llmsr   r   langchain_openai.llms.baser   ragas.run_configr   r   r   TYPE_CHECKINGlangchain_core.callbacksr   ragas.llms.promptr   	getLoggerrE   loggerr   r   r!   rJ   ro   r-   r   r   <module>r      s-   " " " " " "       # # # # # # # # ! ! ! ! ! !       8 8 8 8 8 8 - - - - - - < < < < < < , , , , , , D D D D D D D D 5 5 5 5 5 5 5 5 1 1 1 1 1 1 B B B B B B B B B B? .222222------		8	$	$ !     @C @C @C @C @C3 @C @C @CFZ= Z= Z= Z= Z=, Z= Z= Z=| KO9 9 9 9 9 9 9r   