
    NgX1                       d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZmZmZ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mZ d dlmZmZmZmZmZm Z   ej!        e"          Z#ddZ$ddZ%ddZ&ddZ'ddZ( G d d	ee          Z)dS )    )annotationsN)
AnyCallableDictListLiteralOptionalSequenceSetTupleUnion)
Embeddings)get_from_dict_or_envget_pydantic_field_namespre_init)	BaseModel
ConfigDictFieldmodel_validator)AsyncRetryingbefore_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponential
embeddingsLocalAIEmbeddingsreturnCallable[[Any], Any]c           
        dd l }d}d}t          dt          | j                  t	          d||          t          |j        j                  t          |j        j                  z  t          |j        j	                  z  t          |j        j
                  z  t          |j        j                  z  t          t          t          j                            S )Nr      
   T   
multiplierminmaxreraisestopwaitr   before_sleep)openair   r   max_retriesr   r   errorTimeoutAPIErrorAPIConnectionErrorRateLimitErrorServiceUnavailableErrorr   loggerloggingWARNING)r   r-   min_secondsmax_secondss       b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/embeddings/localai.py_create_retry_decoratorr;   %   s    MMMKK 
 677MMM#FL$899%fl&;<<=%fl&EFFG &fl&ABBC &fl&JKK	L &fgo>>       r   c           
        dd l }d}d}t          dt          | j                  t	          d||          t          |j        j                  t          |j        j                  z  t          |j        j	                  z  t          |j        j
                  z  t          |j        j                  z  t          t          t          j                            dfd}|S )Nr   r!   r"   Tr#   r$   r(   funcr   r   c                     d fd}|S )Nargsr   kwargsr   r   c                 Z   K   2 3 d {V } | i | d {V c S 6 t          d          )Nzthis is unreachable)AssertionError)r@   rA   _async_retryingr>   s      r:   	wrapped_fz7_async_retry_decorator.<locals>.wrap.<locals>.wrapped_fQ   sp      ) 3 3 3 3 3 3 3a!T42622222222222 * !6777s   )r@   r   rA   r   r   r    )r>   rF   rE   s   ` r:   wrapz$_async_retry_decorator.<locals>.wrapP   s/    	8 	8 	8 	8 	8 	8 	8
 r<   )r>   r   r   r   )r-   r   r   r.   r   r   r/   r0   r1   r2   r3   r4   r   r5   r6   r7   )r   r-   r8   r9   rH   rE   s        @r:   _async_retry_decoratorrI   ;   s    MMMKK #
 677MMM#FL$899%fl&;<<=%fl&EFFG &fl&ABBC &fl&JKK	L &fgo>>  N      Kr<   responsedictc                    t          d | d         D                       rdd l}|j                            d          | S )Nc              3  H   K   | ]}t          |d                    dk    V  dS )	embeddingr#   N)len).0ds     r:   	<genexpr>z"_check_response.<locals>.<genexpr>]   s3      
>
>3q~!#
>
>
>
>
>
>r<   datar   z'LocalAI API returned an empty embedding)anyr-   r/   r1   )rJ   r-   s     r:   _check_responserU   \   sL    

>
>Xf-=
>
>
>>> Ol##$MNNNOr<   rA   c                N     t                     }|d fd            } |di |S ))Use tenacity to retry the embedding call.rA   r   r   c                 F     j         j        di | }t          |          S NrG   )clientcreaterU   rA   rJ   r   s     r:   _embed_with_retryz+embed_with_retry.<locals>._embed_with_retryh   s,    +:$+55f55x(((r<   rA   r   r   r   rG   )r;   )r   rA   retry_decoratorr]   s   `   r:   embed_with_retryr`   d   sQ    -j99O) ) ) ) ) _) &&v&&&r<   c                Z    K   t                     d fd            } |di | d{V S )rW   rA   r   r   c                 V   K    j         j        di |  d {V }t          |          S rY   )rZ   acreaterU   r\   s     r:   _async_embed_with_retryz7async_embed_with_retry.<locals>._async_embed_with_retrys   sB      2*2<<V<<<<<<<<x(((r<   Nr^   rG   )rI   )r   rA   rd   s   `  r:   async_embed_with_retryre   p   se       J'') ) ) ) ) (') )(226222222222r<   c                     e Zd ZU dZdZded<   dZded<   eZded<   dZd	ed
<   dZ	d	ed<   dZ
d	ed<   dZded<   	 dZd	ed<   dZd	ed<    e            Zded<   dZded<   dZded<   	 dZded<   	 dZded<   	 dZded<   dZded <   	  ee!          Zd"ed#<   	  ed$d%&          Z ed'(          ed=d+                        Zed>d-            Ze d?d.            Z!d@d2Z"d@d3Z#	 dAdBd9Z$	 dAdBd:Z%dCd;Z&dCd<Z'dS )Dr   a  LocalAI embedding models.

    Since LocalAI and OpenAI have 1:1 compatibility between APIs, this class
    uses the ``openai`` Python package's ``openai.Embedding`` as its client.
    Thus, you should have the ``openai`` python package installed, and defeat
    the environment variable ``OPENAI_API_KEY`` by setting to a random string.
    You also need to specify ``OPENAI_API_BASE`` to point to your LocalAI
    service endpoint.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import LocalAIEmbeddings
            openai = LocalAIEmbeddings(
                openai_api_key="random-string",
                openai_api_base="http://localhost:8080"
            )

    Nr   rZ   ztext-embedding-ada-002strmodel
deploymentzOptional[str]openai_api_versionopenai_api_baseopenai_proxyi  intembedding_ctx_lengthopenai_api_keyopenai_organizationzUnion[Literal['all'], Set[str]]allowed_specialallz.Union[Literal['all'], Set[str], Sequence[str]]disallowed_speciali  
chunk_size   r.   z+Optional[Union[float, Tuple[float, float]]]request_timeoutheadersFboolshow_progress_bar)default_factoryDict[str, Any]model_kwargsforbidrG   )extraprotected_namespacesbefore)modevaluesr   c           
        t          |           }|                    di           }t          |          D ]S}||v rt          d| d          ||vr6t	          j        d| d| d| d           |                    |          ||<   T|                    |                                          }|rt          d| d	          ||d<   |S )
z>Build extra kwargs from additional params that were passed in.r|   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r   getlist
ValueErrorwarningswarnpopintersectionkeys)clsr   all_required_field_namesr~   
field_nameinvalid_model_kwargss         r:   build_extrazLocalAIEmbeddings.build_extra   s2    $<C#@#@ 

>2..v,, 		; 		;JU"" !F*!F!F!FGGG!999N* N NN N)3N N N  
 %+JJz$:$:j!7DDUZZ\\RR 	T2 T T T  
 "'~r<   r   c                <   t          |dd          |d<   t          |ddd          |d<   t          |ddd          |d<   d}t          |d	d
|          |d	<   t          |ddd          |d<   	 ddl}|j        |d<   n# t          $ r t          d          w xY w|S )z?Validate that api key and python package exists in environment.ro   OPENAI_API_KEYrk   OPENAI_API_BASE )defaultrl   OPENAI_PROXYrj   OPENAI_API_VERSIONrp   OPENAI_ORGANIZATIONr   NrZ   zTCould not import openai python package. Please install it with `pip install openai`.)r   r-   	EmbeddingImportError)r   r   default_api_versionr-   s       r:   validate_environmentz&LocalAIEmbeddings.validate_environment   s    $8$&6$
 $
  %9	%
 %
 %
 ! "6	"
 "
 "
~ !';  '	(
 (
 (
#$ )=!!	)
 )
 )
$%	MMM%/F8 	 	 	?  	
 s   0A? ?Bc                    | j         | j        | j        | j        | j        | j        | j        d| j        }| j        rdd l	}| j        | j        d|_
        |S )N)rh   rv   rw   api_keyorganizationapi_baseapi_versionr   )httphttps)rh   rv   rw   ro   rp   rk   rj   r|   rl   r-   proxy)selfopenai_argsr-   s      r:   _invocation_paramsz$LocalAIEmbeddings._invocation_params   s     Z#3|* 4,2	
 	
 	
  	MMM )* FL r<   textengineList[float]c                   | j                             d          r|                    dd          }t          | fd|gi| j        d         d         d         S ))Call out to LocalAI's embedding endpoint.001
 inputrS   r   rN   )rh   endswithreplacer`   r   r   r   r   s      r:   _embedding_funcz!LocalAIEmbeddings._embedding_func  s     :u%% 	+ <<c**D
 
&
 %
 
 	 	 !	" 	"r<   c                  K   | j                             d          r|                    dd          }t          | fd|gi| j         d{V d         d         d         S )	r   r   r   r   r   NrS   r   rN   )rh   r   r   re   r   r   s      r:   _aembedding_funcz"LocalAIEmbeddings._aembedding_func  s       :u%% 	+ <<c**D( f )       
   !" 	"r<   r   texts	List[str]Optional[int]List[List[float]]c                       fd|D             S )aN  Call out to LocalAI's embedding endpoint for embedding search docs.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size of embeddings. If None, will use the chunk size
                specified by the class.

        Returns:
            List of embeddings, one for each text.
        c                H    g | ]}                     |j                   S )r   r   ri   )rP   r   r   s     r:   
<listcomp>z5LocalAIEmbeddings.embed_documents.<locals>.<listcomp>0  s.    UUUt$$T$/$BBUUUr<   rG   )r   r   rt   s   `  r:   embed_documentsz!LocalAIEmbeddings.embed_documents"  s      VUUUuUUUUr<   c                   K   g }|D ]9}|                      || j                   d{V }|                    |           :|S )aT  Call out to LocalAI's embedding endpoint async for embedding search docs.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size of embeddings. If None, will use the chunk size
                specified by the class.

        Returns:
            List of embeddings, one for each text.
        r   N)r   ri   append)r   r   rt   r   r   rJ   s         r:   aembed_documentsz"LocalAIEmbeddings.aembed_documents2  se       
 	( 	(D!2242PPPPPPPPHh''''r<   c                >    |                      || j                  }|S )zCall out to LocalAI's embedding endpoint for embedding query text.

        Args:
            text: The text to embed.

        Returns:
            Embedding for the text.
        r   r   r   r   rN   s      r:   embed_queryzLocalAIEmbeddings.embed_queryE  s$     ((do(FF	r<   c                N   K   |                      || j                   d{V }|S )zCall out to LocalAI's embedding endpoint async for embedding query text.

        Args:
            text: The text to embed.

        Returns:
            Embedding for the text.
        r   N)r   ri   r   s      r:   aembed_queryzLocalAIEmbeddings.aembed_queryQ  s:       //T_/MMMMMMMM	r<   )r   r{   r   r   )r   r   r   r   )r   r   )r   rg   r   rg   r   r   )r   )r   r   rt   r   r   r   )r   rg   r   r   )(__name__
__module____qualname____doc__rZ   __annotations__rh   ri   rj   rk   rl   rn   ro   rp   setrq   rs   rt   r.   rv   rw   ry   r   rK   r|   r   model_configr   classmethodr   r   r   propertyr   r   r   r   r   r   r   rG   r<   r:   r   r   {   s         ( F)E))))J(,,,,,%)O))))"&L&&&& $$$$$8$(N(((()-----7:suuO<<<<INNNNNJ8K<CGOGGGG5G#####8#(5#>#>#>L>>>>V:H2FFFL_(###   [ $#2 ( ( ( X(T    X(" " " "" " " "  =>V V V V V" =>    &
 
 
 

 
 
 
 
 
r<   )r   r   r   r   )r   r   r   r   )rJ   rK   r   rK   )r   r   rA   r   r   r   )*
__future__r   r6   r   typingr   r   r   r   r   r	   r
   r   r   r   langchain_core.embeddingsr   langchain_core.utilsr   r   r   pydanticr   r   r   r   tenacityr   r   r   r   r   r   	getLoggerr   r5   r;   rI   rU   r`   re   r   rG   r<   r:   <module>r      s   " " " " " "                          1 0 0 0 0 0         
 C B B B B B B B B B B B                
	8	$	$   ,   B   	' 	' 	' 	'3 3 3 3` ` ` ` `	: ` ` ` ` `r<   