§
    æ˜ºhå/  ã                  ó  — 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mZ d dl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)Ú	BaseModelÚExtraÚFieldÚroot_validator)Úget_from_dict_or_envÚget_pydantic_field_names)Ú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       ún/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/embeddings/localai.pyÚ_create_retry_decoratorr:   !   sÍ   € Ø€M€M€Mà€KØ€Kõ ØÝ 
Ô 6Ñ7Ô7Ý¨°ÀÐMÑMÔMå# F¤LÔ$8Ñ9Ô9Ý% f¤lÔ&;Ñ<Ô<ñ=å% f¤lÔ&EÑFÔFñGõ & f¤lÔ&AÑBÔBñCõ & f¤lÔ&JÑKÔKñ	Lõ &¥f­g¬oÑ>Ô>ðñ ô ð ó    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?   r@   Ú_Úasync_retryingr=   s      €€r9   Ú	wrapped_fz7_async_retry_decorator.<locals>.wrap.<locals>.wrapped_fM   sp   øè è € Ø)ð 3ð 3ð 3ð 3ð 3ð 3ð 3�aØ!˜T 4Ð2¨6Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð *å Ð!6Ñ7Ô7Ð7s   †)r?   r   r@   r   r   r   © )r=   rE   rD   s   ` €r9   Úwrapz$_async_retry_decorator.<locals>.wrapL   s/   øø€ ð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð
 Ðr;   )r=   r   r   r   )r,   r   r   r-   r   r   r.   r/   r0   r1   r2   r3   r   r4   r5   r6   )r   r,   r7   r8   rG   rD   s        @r9   Ú_async_retry_decoratorrH   7   sð   ø€ Ø€M€M€Mà€KØ€Kõ #ØÝ 
Ô 6Ñ7Ô7Ý¨°ÀÐMÑMÔMå# F¤LÔ$8Ñ9Ô9Ý% f¤lÔ&;Ñ<Ô<ñ=å% f¤lÔ&EÑFÔFñGõ & f¤lÔ&AÑBÔBñCõ & f¤lÔ&JÑKÔKñ	Lõ &¥f­g¬oÑ>Ô>ðñ ô €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     r9   ú	<genexpr>z"_check_response.<locals>.<genexpr>Y   s3   è è € Ð
>Ð
>¨�3ˆq�Œ~ÑÔ !Ò#Ð
>Ð
>Ð
>Ð
>Ð
>Ð
>r;   Údatar   z'LocalAI API returned an empty embedding)Úanyr,   r.   r0   )rI   r,   s     r9   Ú_check_responserT   X   sL   € Ý
Ð
>Ð
>¨X°fÔ-=Ð
>Ñ
>Ô
>Ñ>Ô>ð OØˆˆˆàŒl×#Ò#Ð$MÑNÔNÐNØ€Or;   r@   c                óN   ‡ — t          ‰ ¦  «        }|dˆ fd„¦   «         } |di |¤ŽS )ú)Use tenacity to retry the embedding call.r@   r   r   c                 óF   •—  ‰j         j        di | ¤Ž}t          |¦  «        S ©NrF   )ÚclientÚcreaterT   ©r@   rI   r   s     €r9   Ú_embed_with_retryz+embed_with_retry.<locals>._embed_with_retryd   s,   ø€ à+�:Ô$Ô+Ð5Ð5¨fÐ5Ð5ˆÝ˜xÑ(Ô(Ð(r;   ©r@   r   r   r   rF   )r:   )r   r@   Úretry_decoratorr\   s   `   r9   Úembed_with_retryr_   `   sQ   ø€ å-¨jÑ9Ô9€Oàð)ð )ð )ð )ð )ñ „_ð)ð ÐÐ&Ð&˜vÐ&Ð&Ð&r;   c              ‹  óZ   ‡ K  — t          ‰ ¦  «        dˆ fd„¦   «         } |di |¤Žƒ d{V —†S )rV   r@   r   r   c               ›  óV   •K  —  ‰j         j        di | ¤Žƒ d {V —†}t          |¦  «        S rX   )rY   ÚacreaterT   r[   s     €r9   Ú_async_embed_with_retryz7async_embed_with_retry.<locals>._async_embed_with_retryo   sB   øè è € à2˜Ô*Ô2Ð<Ð<°VÐ<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ˆÝ˜xÑ(Ô(Ð(r;   Nr]   rF   )rH   )r   r@   rc   s   `  r9   Úasync_embed_with_retryrd   l   se   øè è € õ ˜JÑ'Ô'ð)ð )ð )ð )ð )ñ (Ô'ð)ð )Ð(Ð2Ð2¨6Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r;   c                  óì  — e Zd ZU 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#<   	  G d$„ d%¦  «        Z ed&¬'¦  «        d<d*„¦   «         Z e¦   «         d=d,„¦   «         Zed>d-„¦   «         Zd?d1„Zd?d2„Z	 d@dAd8„Z 	 d@dAd9„Z!dBd:„Z"dBd;„Z#dS )Cr   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"
            )

    r   rY   ztext-embedding-ada-002ÚstrÚmodelÚ
deploymentNz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_kwargsc                  ó    — e Zd ZdZej        ZdS )úLocalAIEmbeddings.Configz'Configuration for this pydantic object.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚforbidÚextrarF   r;   r9   ÚConfigr}   ¥   s   € € € € € Ø5Ð5à”ˆˆˆr;   r„   T)ÚpreÚ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         r9   Ú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ñô ð ð
 %+§J¢J¨zÑ$:Ô$:��jÑ!øà7×DÒDÀUÇZÂZÁ\Ä\Ñ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.rn   ÚOPENAI_API_KEYrj   ÚOPENAI_API_BASEÚ )Údefaultrk   ÚOPENAI_PROXYri   ÚOPENAI_API_VERSIONro   ÚOPENAI_ORGANIZATIONr   NrY   zTCould not import openai python package. Please install it with `pip install openai`.)r   r,   Ú	EmbeddingÚImportError)r�   r†   Údefault_api_versionr,   s       r9   Úvalidate_environmentz&LocalAIEmbeddings.validate_environmentÄ   s  € õ $8ØÐ$Ð&6ñ$
ô $
ˆÐÑ õ %9ØØØØð	%
ñ %
ô %
ˆÐ Ñ!õ "6ØØØØð	"
ñ "
ô "
ˆˆ~Ñð !ÐÝ';ØØ Ø Ø'ð	(
ñ (
ô (
ˆÐ#Ñ$õ )=ØØ!Ø!Øð	)
ñ )
ô )
ˆÐ$Ñ%ð	ØˆMˆMˆMà%Ô/ˆF�8ÑÐøÝð 	ð 	ð 	Ýð?ñô ð ð	øøøð
 ˆs   Á0A? Á?Bc                ó¬   — | j         | j        | j        | j        | j        | j        | j        dœ| j        ¥}| j        rdd l	}| j        | j        dœ|_
        |S )N)rg   ru   rv   Úapi_keyÚorganizationÚapi_baseÚapi_versionr   )ÚhttpÚhttps)rg   ru   rv   rn   ro   rj   ri   r{   rk   r,   Úproxy)ÚselfÚopenai_argsr,   s      r9   Ú_invocation_paramsz$LocalAIEmbeddings._invocation_paramsï   s   € ð ”ZØ#Ô3Ø”|ØÔ*Ø Ô4ØÔ,ØÔ2ð	
ð 	
ð Ôð	
ˆð Ôð 	ØˆMˆMˆMð Ô)ØÔ*ðð ˆFŒLð Ð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ú
ú ÚinputrR   r   rM   )rg   ÚendswithÚreplacer_   r«   ©r©   r¬   r­   s      r9   Ú_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´   NrR   r   rM   )rg   rµ   r¶   rd   r«   r·   s      r9   Ú_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¸   rh   )rO   r¬   r©   s     €r9   ú
<listcomp>z5LocalAIEmbeddings.embed_documents.<locals>.<listcomp>.  s.   ø€ ÐUÐUÐUÀt�×$Ò$ T°$´/Ð$ÑBÔBÐUÐUÐUr;   rF   )r©   r»   rs   s   `  r9   Úembed_documentsz!LocalAIEmbeddings.embed_documents   s    ø€ ð VÐUÐUÐUÈuÐ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º   rh   Úappend)r©   r»   rs   r   r¬   rI   s         r9   Úaembed_documentsz"LocalAIEmbeddings.aembed_documents0  se   è è € ð ˆ
Øð 	(ð 	(ˆDØ!×2Ò2°4ÀÄÐ2ÑPÔPÐPÐPÐPÐPÐPÐPˆHØ×Ò˜hÑ'Ô'Ð'Ð'ØÐr;   c                ó>   — |                       || j        ¬¦  «        }|S )zµCall 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      r9   Úembed_queryzLocalAIEmbeddings.embed_queryC  s$   € ð ×(Ò(¨°d´oÐ(ÑFÔFˆ	ØÐr;   c              ƒ  óN   K  — |                       || j        ¬¦  «        ƒ d{V —†}|S )z»Call 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º   rh   rÉ   s      r9   Úaembed_queryzLocalAIEmbeddings.aembed_queryO  s:   è è € ð ×/Ò/°¸T¼_Ð/ÑMÔMÐMÐMÐMÐMÐMÐMˆ	ØÐr;   )r†   rz   r   rz   )r†   r   r   r   )r   r   )r¬   rf   r­   rf   r   r®   )r   )r»   r¼   rs   r½   r   r¾   )r¬   rf   r   r®   )$r~   r   r€   r�   Ú__annotations__rg   rh   ri   rj   rk   rm   rn   ro   Úsetrp   rr   rs   r-   ru   rv   rx   r   rJ   r{   r„   r   r”   r    Úpropertyr«   r¸   rº   rÄ   rÇ   rÊ   rÌ   rF   r;   r9   r   r   w   s–  € € € € € € ðð ð( €K€K�KØ)€EÐ)Ð)Ð)Ñ)Ø€JÐÐÐÑØ(,ÐÐ,Ð,Ð,Ñ,Ø%)€OÐ)Ð)Ð)Ñ)à"&€LÐ&Ð&Ð&Ñ&Ø $ÐÐ$Ð$Ð$Ñ$Ø8Ø$(€NÐ(Ð(Ð(Ñ(Ø)-ÐÐ-Ð-Ð-Ñ-Ø7:°s±u´u€OÐ<Ð<Ð<Ñ<ØINÐÐNÐNÐNÑNØ€JÐÐÐÑØ8Ø€KÐÐÐÑØ<ØCG€OÐGÐGÐGÑGØ5Ø€GÐÐÐÑØ#ÐÐ#Ð#Ð#Ñ#Ø8Ø#( 5¸Ð#>Ñ#>Ô#>€LÐ>Ð>Ð>Ñ>ØVðð ð ð ð ñ ô ð ð
 €^˜ÐÑÔðð ð ñ Ôðð2 €^ÑÔð(ð (ð (ñ Ôð(ðT ðð ð ñ „Xðð("ð "ð "ð "ð"ð "ð "ð "ð  =>ðVð Vð Vð Vð Vð" =>ðð ð ð ð ð&
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð 
ð 
r;   )r   r   r   r   )r   r   r   r   )rI   rJ   r   rJ   )r   r   r@   r   r   r   ))Ú
__future__r   r5   r‹   Útypingr   r   r   r   r   r	   r
   r   r   r   Úlangchain_core.embeddingsr   Úlangchain_core.pydantic_v1r   r   r   r   Úlangchain_core.utilsr   r   Útenacityr   r   r   r   r   r   Ú	getLoggerr~   r4   r:   rH   rT   r_   rd   r   rF   r;   r9   ú<module>r×      sú  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 1Ð 0Ð 0Ð 0Ð 0Ð 0Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ OÐ OÐ OÐ OÐ OÐ OÐ OÐ Oðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð,ð ð ð ðBð ð ð ð	'ð 	'ð 	'ð 	'ð3ð 3ð 3ð 3ðbð bð bð bð b˜	 :ñ bô bð bð bð br;   