
    dh/                       S SK Jr  S SKrS SKrS SKJrJrJrJrJ	r	J
r
JrJrJrJr  S SKJr  S SKJrJrJr  S SKJrJrJrJr  S SKJrJrJrJrJrJ r   \RB                  " \"5      r#SS	 jr$SS
 jr%SS jr&SS jr'SS jr( " S S\\5      r)g)    )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           
        SS K nSnSn[        S[        U R                  5      [	        SX#S9[        UR                  R                  5      [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        [        [        R                  5      S9$ )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       ^/var/www/html/shao/venv/lib/python3.13/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           
       ^ SS K nSnSn[        S[        U R                  5      [	        SX#S9[        UR                  R                  5      [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        [        [        R                  5      S9mS	U4S jjnU$ )
Nr   r   r   Tr    r!   r%   c                   >^  SUU 4S jjnU$ )Nc                 f   >#    T  S h  vN nT" U 0 UD6I S h  vN s  $  N N
 [        S5      e7f)Nzthis is unreachable)AssertionError)argskwargs_async_retryingfuncs      r8   	wrapped_f7_async_retry_decorator.<locals>.wrap.<locals>.wrapped_fQ   s<     ) 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   wrap$_async_retry_decorator.<locals>.wrapP   s    	8 	8
 r:   )rC   r   rF   r   )r*   r   r   r+   r   r   r,   r-   r.   r/   r0   r1   r   r2   r3   r4   )r5   r*   r6   r7   rH   rB   s        @r8   _async_retry_decoratorrJ   ;   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                x    [        S U S    5       5      (       a  SS KnUR                  R                  S5      eU $ )Nc              3  B   #    U H  n[        US    5      S:H  v   M     g7f)	embeddingr    N)len).0ds     r8   	<genexpr>"_check_response.<locals>.<genexpr>]   s      
>-=3q~!#-=s   datar   z'LocalAI API returned an empty embedding)anyr*   r,   r.   )responser*   s     r8   _check_responserV   \   s6    

>Xf-=
>>>ll##$MNNOr:   c                D   ^  [        T 5      nUSU 4S jj5       nU" S0 UD6$ ))Use tenacity to retry the embedding call.c                 R   > TR                   R                  " S0 U D6n[        U5      $ NrG   )clientcreaterV   r@   rU   r5   s     r8   _embed_with_retry+embed_with_retry.<locals>._embed_with_retryh   s'    $$++5f5x((r:   r@   r   rF   r   rG   )r9   )r5   r@   retry_decoratorr^   s   `   r8   embed_with_retryrb   d   s/    -j9O) ) &v&&r:   c                \   ^ #    [        T 5      SU 4S jj5       nU" S0 UD6I Sh  vN $  N7f)rX   c                 n   >#    TR                   R                  " S0 U D6I S h  vN n[        U5      $  N7frZ   )r[   acreaterV   r]   s     r8   _async_embed_with_retry7async_embed_with_retry.<locals>._async_embed_with_retrys   s2     #**22<V<<x(( =s    535Nr`   rG   )rJ   )r5   r@   rf   s   `  r8   async_embed_with_retryrh   p   s5      J') () )262222s   ",*,c                     \ rS rSr% SrSrS\S'   SrS\S'   \rS\S	'   Sr	S
\S'   Sr
S
\S'   SrS
\S'   SrS\S'    SrS
\S'   SrS
\S'   \" 5       rS\S'   SrS\S'   SrS\S'    SrS\S'    SrS\S'    SrS\S'   SrS \S!'    \" \S"9rS#\S$'    \" S%S&S'9r\" S(S)9\S3S* j5       5       r\S4S+ j5       r \!S5S, j5       r"S6S- jr#S6S. jr$ S7     S8S/ jjr% S7     S8S0 jjr&S9S1 jr'S9S2 jr(S&r)g):r   {   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   r[   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)modec           
     r   [        U 5      nUR                  S0 5      n[        U5       HQ  nXC;   a  [        SU S35      eXB;  d  M  [        R
                  " SU SU SU S35        UR                  U5      X4'   MS     UR                  UR                  5       5      nU(       a  [        SU S	35      eX1S'   U$ )
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)clsvaluesall_required_field_namesr   
field_nameinvalid_model_kwargss         r8   build_extraLocalAIEmbeddings.build_extra   s     $<C#@ 

>2.v,J" 6*5E!FGG9!* .L !))34JN
 %+JJz$:! '  8DDUZZ\R23 4S T 
 "'~r:   c                    [        USS5      US'   [        USSSS9US'   [        USSSS9US'   Sn[        US	S
US9US	'   [        USSSS9US'    SSKnUR                  US'   U$ ! [         a    [        S5      ef = f)z?Validate that api key and python package exists in environment.rs   OPENAI_API_KEYro   OPENAI_API_BASE )defaultrp   OPENAI_PROXYrn   OPENAI_API_VERSIONrt   OPENAI_ORGANIZATIONr   Nr[   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_environment&LocalAIEmbeddings.validate_environment   s     $8$&6$
  %9	%
 ! "6	"
~ !';  '	(
#$ )=!!	)
$%	%//F8   	? 	s   A% %A;c                $   U R                   U R                  U R                  U R                  U R                  U R
                  U R                  S.U R                  EnU R                  (       a"  SS K	nU R                  U R                  S.Ul
        U$ )N)rl   rz   r{   api_keyorganizationapi_baseapi_versionr   )httphttps)rl   rz   r{   rs   rt   ro   rn   r   rp   r*   proxy)selfopenai_argsr*   s      r8   _invocation_params$LocalAIEmbeddings._invocation_params   s     ZZ#33||** 44,,22	
 	
  ))**FL r:   c                   U R                   R                  S5      (       a  UR                  SS5      n[        U 4SU/0U R                  D6S   S   S   $ ))Call out to LocalAI's embedding endpoint.001
 inputrS   r   rM   )rl   endswithreplacerb   r   r   textengines      r8   _embedding_func!LocalAIEmbeddings._embedding_func  ss     ::u%% <<c*D
&
 %%
 	 	 !	" 	"r:   c                  #    U R                   R                  S5      (       a  UR                  SS5      n[        U 4SU/0U R                  D6I Sh  vN S   S   S   $  N7f)	r   r   r   r   r   NrS   r   rM   )rl   r   r   rh   r   r   s      r8   _aembedding_func"LocalAIEmbeddings._aembedding_func  s      ::u%% <<c*D(f )) 
   !" 	"s   AA!AA!c                \    U Vs/ sH  o0R                  X0R                  S9PM     sn$ s  snf )a  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   rm   )r   textsrx   r   s       r8   embed_documents!LocalAIEmbeddings.embed_documents"  s.     PUUut$$T//$BuUUUs   !)c                   #    / nU H5  nU R                  X@R                  S9I Sh  vN nUR                  U5        M7     U$  N7f)a  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   rm   append)r   r   rx   r5   r   rU   s         r8   aembed_documents"LocalAIEmbeddings.aembed_documents2  sL      
D!2242PPHh'   Qs   $AAAc                8    U R                  XR                  S9nU$ )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   rM   s      r8   embed_queryLocalAIEmbeddings.embed_queryE  s!     ((oo(F	r:   c                T   #    U R                  XR                  S9I Sh  vN nU$  N7f)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   rm   r   s      r8   aembed_queryLocalAIEmbeddings.aembed_queryQ  s-      //__/MM	 Ns   (&()r   r   rF   r   )r   r   rF   r   )rF   r   )r   rk   r   rk   rF   List[float])r   )r   z	List[str]rx   zOptional[int]rF   zList[List[float]])r   rk   rF   r   )*__name__
__module____qualname____firstlineno____doc__r[   __annotations__rl   rm   rn   ro   rp   rr   rs   rt   setru   rw   rx   r+   rz   r{   r}   r   dictr   r   model_configr   classmethodr   r   r   propertyr   r   r   r   r   r   r   __static_attributes__rG   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   rF   zCallable[[Any], Any])r5   r   rF   r   )rU   r   rF   r   )r5   r   r@   r   rF   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   rJ   rV   rb   rh   r   rG   r:   r8   <module>r      s{    "     1 
 C B  
		8	$,B	'3`	: `r:   