§
    šŠtj£/  ã                  ó  — 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       úd/var/www/html/CA-Chatbot/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@   rA   Ú_Úasync_retryingr>   s      €€r:   Ú	wrapped_fz7_async_retry_decorator.<locals>.wrap.<locals>.wrapped_fQ   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   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ð   ø€ Ø€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     r:   ú	<genexpr>z"_check_response.<locals>.<genexpr>]   s3   è è € Ð
>Ð
>¨�3ˆq�Œ~ÑÔ !Ò#Ð
>Ð
>Ð
>Ð
>Ð
>Ð
>r<   Údatar   z'LocalAI API returned an empty embedding)Úanyr-   r/   r1   )rJ   r-   s     r:   Ú_check_responserU   \   sL   € Ý
Ð
>Ð
>¨X°fÔ-=Ð
>Ñ
>Ô
>Ñ>Ô>ð 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Ð5¨fÐ5Ð5ˆÝ˜xÑ(Ô(Ð(r<   ©rA   r   r   r   rG   )r;   )r   rA   Úretry_decoratorr]   s   `   r:   Úembed_with_retryr`   d   sQ   ø€ å-¨jÑ9Ô9€Oàð)ð )ð )ð )ð )ñ „_ð)ð ÐÐ&Ð&˜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Ð2¨6Ð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ñô ð ð
 %+§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.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ØØØØð	"
ñ "
ô "
ˆˆ~Ñð !ÐÝ';ØØ Ø Ø'ð	(
ñ (
ô (
ˆÐ#Ñ$õ )=ØØ!Ø!Øð	)
ñ )
ô )
ˆÐ$Ñ%ð	Øˆ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)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ð	
ð 	
ð Ôð	
ˆð Ôð 	Øˆ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ú
ú Ú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ÐUÀt�×$Ò$ T°$´/Ð$ÑBÔBÐUÐUÐUr<   rG   )r¥   r·   rt   s   `  r:   Ú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¶   ri   Úappend)r¥   r·   rt   r   r¨   rJ   s         r:   Úaembed_documentsz"LocalAIEmbeddings.aembed_documents2  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¨   rN   s      r:   Úembed_queryzLocalAIEmbeddings.embed_queryE  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¶   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:°s±u´u€OÐ<Ð<Ð<Ñ<ØINÐÐNÐNÐNÑNØ€JÐÐÐÑØ8Ø€KÐÐÐÑØ<ØCG€OÐGÐGÐGÑGØ5Ø€GÐÐÐÑØ#ÐÐ#Ð#Ð#Ñ#Ø8Ø#( 5¸Ð#>Ñ#>Ô#>€LÐ>Ð>Ð>Ñ>ØVà�: HÀ2ÐFÑFÔF€Là€_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð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<   