
    7|hX1                       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jB                  e"      Z#dd	Z$dd
Z%ddZ&ddZ'ddZ( G d dee      Z)y)    )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LocalAIEmbeddingsc           
        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)
embeddingsr*   min_secondsmax_secondss       e/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/embeddings/localai.py_create_retry_decoratorr9   %   s    KK 
 6 67M#FLL$8$89%fll&;&;<=%fll&E&EFG &fll&A&ABC &fll&J&JK	L &fgoo>     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%   c                     d fd}|S )Nc                 f   K   2 3 d {   } | i | d {   c S 7 7 6 t        d      w)Nzthis is unreachable)AssertionError)argskwargs_async_retryingfuncs      r8   	wrapped_fz7_async_retry_decorator.<locals>.wrap.<locals>.wrapped_fQ   sD     ) 3 3a!42622232 * !677s(   1%!%1#1%11)r?   r   r@   r   returnr    )rC   rD   rB   s   ` r8   wrapz$_async_retry_decorator.<locals>.wrapP   s    	8
 r:   )rC   r   rE   r   )r*   r   r   r+   r   r   r,   r-   r.   r/   r0   r1   r   r2   r3   r4   )r5   r*   r6   r7   rG   rB   s        @r8   _async_retry_decoratorrH   ;   s    KK #
 6 67M#FLL$8$89%fll&;&;<=%fll&E&EFG &fll&A&ABC &fll&J&JK	L &fgoo>N Kr:   c                n    t        d | d   D              rdd l}|j                  j                  d      | S )Nc              3  >   K   | ]  }t        |d          dk(    yw)	embeddingr    N)len).0ds     r8   	<genexpr>z"_check_response.<locals>.<genexpr>]   s     
>3q~!#
>s   datar   z'LocalAI API returned an empty embedding)anyr*   r,   r.   )responser*   s     r8   _check_responserS   \   s3    

>Xf-=
>>ll##$MNNOr:   c                @     t               }|d fd       } |di |S ))Use tenacity to retry the embedding call.c                 R     j                   j                  di | }t        |      S NrF   )clientcreaterS   r@   rR   r5   s     r8   _embed_with_retryz+embed_with_retry.<locals>._embed_with_retryh   s)    +:$$++5f5x((r:   r@   r   rE   r   rF   )r9   )r5   r@   retry_decoratorr[   s   `   r8   embed_with_retryr^   d   s/    -j9O) ) &v&&r:   c                X    K   t               d fd       } |di | d{   S 7 w)rU   c                 n   K    j                   j                  di |  d {   }t        |      S 7 wrW   )rX   acreaterS   rZ   s     r8   _async_embed_with_retryz7async_embed_with_retry.<locals>._async_embed_with_retrys   s5     2**22<V<<x(( =s    535Nr\   rF   )rH   )r5   r@   rb   s   `  r8   async_embed_with_retryrc   p   s6      J') () )262222s    *(*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d2d)              Zed3d*       Ze d4d+       Z!d5d,Z"d5d-Z#	 d6	 	 	 	 	 d7d.Z$	 d6	 	 	 	 	 d7d/Z%d8d0Z&d8d1Z'y)9r   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   rX   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forbidrF   )extraprotected_namespacesbefore)modec           
     `   t        |       }|j                  di       }t        |      D ]M  }||v rt        d| d      ||vst	        j
                  d| d| d| d       |j                  |      ||<   O |j                  |j                               }|rt        d| d	      ||d<   |S )
z>Build extra kwargs from additional params that were passed in.rz   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)clsvaluesall_required_field_namesr|   
field_nameinvalid_model_kwargss         r8   build_extrazLocalAIEmbeddings.build_extra   s     $<C#@ 

>2.v, 		;JU" 6*5E!FGG!99!* .L !))34JN
 %+JJz$:j!		;  8DDUZZ\R23 4S T 
 "'~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<   |S # t        $ r t        d      w xY w)z?Validate that api key and python package exists in environment.rm   OPENAI_API_KEYri   OPENAI_API_BASE )defaultrj   OPENAI_PROXYrh   OPENAI_API_VERSIONrn   OPENAI_ORGANIZATIONr   NrX   zTCould not import openai python package. Please install it with `pip install openai`.)r   r*   	EmbeddingImportError)r   r   default_api_versionr*   s       r8   validate_environmentz&LocalAIEmbeddings.validate_environment   s     $8$&6$
  %9	%
 ! "6	"
~ !';  '	(
#$ )=!!	)
$%	%//F8   	? 	s   A1 1Bc                   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  d| j                  }| j                  r"dd l	}| j                  | j                  d|_
        |S )N)rf   rt   ru   api_keyorganizationapi_baseapi_versionr   )httphttps)rf   rt   ru   rm   rn   ri   rh   rz   rj   r*   proxy)selfopenai_argsr*   s      r8   _invocation_paramsz$LocalAIEmbeddings._invocation_params   s     ZZ#33||** 44,,22	
 	
  ))**FL r:   c                   | j                   j                  d      r|j                  dd      }t        | fd|gi| j                  d   d   d   S ))Call out to LocalAI's embedding endpoint.001
 inputrP   r   rK   )rf   endswithreplacer^   r   r   textengines      r8   _embedding_funcz!LocalAIEmbeddings._embedding_func  sp     ::u% <<c*D
&
 %%
 	 	 !	" 	"r:   c                  K   | j                   j                  d      r|j                  dd      }t        | fd|gi| j                   d{   d   d   d   S 7 w)	r   r   r   r   r   NrP   r   rK   )rf   r   r   rc   r   r   s      r8   _aembedding_funcz"LocalAIEmbeddings._aembedding_func  s~      ::u% <<c*D(f )) 
   !" 	"s   A
AAAc                b    |D cg c]  }| j                  || j                        ! c}S c c}w )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.
        r   r   rg   )r   textsrr   r   s       r8   embed_documentsz!LocalAIEmbeddings.embed_documents"  s.     PUUt$$T$//$BUUUs   $,c                   K   g }|D ]8  }| j                  || j                         d{   }|j                  |       : |S 7 w)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   rg   append)r   r   rr   r5   r   rR   s         r8   aembed_documentsz"LocalAIEmbeddings.aembed_documents2  sT      
 	(D!2242PPHh'	(  Qs   (AAAc                @    | j                  || 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   rK   s      r8   embed_queryzLocalAIEmbeddings.embed_queryE  s#     ((doo(F	r:   c                \   K   | j                  || j                         d{   }|S 7 w)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   rg   r   s      r8   aembed_queryzLocalAIEmbeddings.aembed_queryQ  s0      //T__/MM	 Ns   !,*,)r   ry   rE   r   )r   r   rE   r   )rE   r   )r   re   r   re   rE   List[float])r   )r   z	List[str]rr   zOptional[int]rE   zList[List[float]])r   re   rE   r   )(__name__
__module____qualname____doc__rX   __annotations__rf   rg   rh   ri   rj   rl   rm   rn   setro   rq   rr   r+   rt   ru   rw   r   dictrz   r   model_configr   classmethodr   r   r   propertyr   r   r   r   r   r   r   rF   r:   r8   r   r   {   s   ( FC)E3)J(,,%)O])"&L-& $#$8$(NM()--7:uO4<INFNJ8K<CGO@G5GS#t#8#(#>L.>VH2FL(#  $2 ( (T  (""  =>VV,9V	V" =>,9	&

r:   )r5   r   rE   zCallable[[Any], Any])r5   r   rE   r   )rR   r   rE   r   )r5   r   r@   r   rE   r   )*
__future__r   r3   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   r2   r9   rH   rS   r^   rc   r   rF   r:   r8   <module>r      s}    "     1 
 C B  
		8	$,B	'3`	: `r:   