§
    ™Štj¡8  ã                  óD  — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
mZ ddlmZ ee	e         geee                  f         Z	 ee	e         geeee                           f         Z	 dd„Z G d„ de¦  «        Zdd„Zdd„Zdd„Zej        d d„¦   «         Zg d¢ZdS )!an  Utilities for working with embedding functions and LangChain's Embeddings interface.

This module provides tools to wrap arbitrary embedding functions (both sync and async)
into LangChain's Embeddings interface. This enables using custom embedding functions
with LangChain-compatible tools while maintaining support for both synchronous and
asynchronous operations.
é    )ÚannotationsN)Ú	AwaitableÚCallableÚSequence)ÚAny)Ú
EmbeddingsÚembedú:Embeddings | EmbeddingsFunc | AEmbeddingsFunc | str | NoneÚreturnr   c                óL  — | €t          d¦  «        ‚t          | t          ¦  «        rYt          ¦   «         }|€>ddlm}m} 	  |d¦  «        }d|› d�}n# |$ r d}Y nw xY wt          d	| › d
|› d�¦  «        ‚ || ¦  «        S t          | t          ¦  «        r| S t          | ¦  «        S )a¨  Ensure that an embedding function conforms to LangChain's Embeddings interface.

    This function wraps arbitrary embedding functions to make them compatible with
    LangChain's Embeddings interface. It handles both synchronous and asynchronous
    functions.

    Args:
        embed: Either an existing Embeddings instance, or a function that converts
            text to embeddings. If the function is async, it will be used for both
            sync and async operations.

    Returns:
        An Embeddings instance that wraps the provided function(s).

    ??? example "Examples"

        Wrap a synchronous embedding function:

        ```python
        def my_embed_fn(texts):
            return [[0.1, 0.2] for _ in texts]

        embeddings = ensure_embeddings(my_embed_fn)
        result = embeddings.embed_query("hello")  # Returns [0.1, 0.2]
        ```

        Wrap an asynchronous embedding function:

        ```python
        async def my_async_fn(texts):
            return [[0.1, 0.2] for _ in texts]

        embeddings = ensure_embeddings(my_async_fn)
        result = await embeddings.aembed_query("hello")  # Returns [0.1, 0.2]
        ```

        Initialize embeddings using a provider string:

        ```python
        # Requires langchain>=0.3.9 and langgraph-checkpoint>=2.0.11
        embeddings = ensure_embeddings("openai:text-embedding-3-small")
        result = embeddings.embed_query("hello")
        ```
    Nzembed must be providedr   )ÚPackageNotFoundErrorÚversionÚ	langchainzFound langchain version z, butzlangchain is not installed;z'Could not load embeddings from string 'z'. aF   loading embeddings by provider:identifier string requires langchain>=0.3.9 as well as the provider-specific package. Install LangChain with: pip install 'langchain>=0.3.9' and the provider-specific package (e.g., 'langchain-openai>=0.3.0'). Alternatively, specify 'embed' as a compatible Embeddings object or python function.)	Ú
ValueErrorÚ
isinstanceÚstrÚ_get_init_embeddingsÚimportlib.metadatar   r   r   ÚEmbeddingsLambda)r	   Úinit_embeddingsr   r   Ú
lc_versionÚversion_infos         úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langgraph/store/base/embed.pyÚensure_embeddingsr   "   s  € ð^ €}ÝÐ1Ñ2Ô2Ð2Ý�%�ÑÔð &Ý.Ñ0Ô0ˆØÐ"ØHÐHÐHÐHÐHÐHÐHÐHð=Ø$˜W [Ñ1Ô1�
ØK¸*ÐKÐKÐK��øØ'ð =ð =ð =Ø<���ð=øøøõ ðg¸%ð gð gÀLð gð gð gñô ð ð ˆ˜uÑ%Ô%Ð%å�%�Ñ$Ô$ð ØˆÝ˜EÑ"Ô"Ð"s   Á A ÁAÁAc                  óH   ‡ — e Zd ZdZdd„Zdd
„Zdd„Zdˆ fd„Zdˆ fd„Zˆ xZ	S )r   a&  Wrapper to convert embedding functions into LangChain's Embeddings interface.

    This class allows arbitrary embedding functions to be used with LangChain-compatible
    tools. It supports both synchronous and asynchronous operations, and can handle:
    1. A synchronous function for sync operations (async operations will use sync function)
    2. An async function for both sync/async operations (sync operations will raise an error)

    The embedding functions should convert text into fixed-dimensional vectors that
    capture the semantic meaning of the text.

    Args:
        func: Function that converts text to embeddings. Can be sync or async.
            If async, it will be used for async operations, but sync operations
            will raise an error. If sync, it will be used for both sync and async operations.

    ??? example "Examples"

        With a sync function:

        ```python
        def my_embed_fn(texts):
            # Return 2D embeddings for each text
            return [[0.1, 0.2] for _ in texts]

        embeddings = EmbeddingsLambda(my_embed_fn)
        result = embeddings.embed_query("hello")  # Returns [0.1, 0.2]
        await embeddings.aembed_query("hello")  # Also returns [0.1, 0.2]
        ```

        With an async function:

        ```python
        async def my_async_fn(texts):
            return [[0.1, 0.2] for _ in texts]

        embeddings = EmbeddingsLambda(my_async_fn)
        await embeddings.aembed_query("hello")  # Returns [0.1, 0.2]
        # Note: embed_query() would raise an error
        ```
    Úfuncú EmbeddingsFunc | AEmbeddingsFuncr   ÚNonec                óf   — |€t          d¦  «        ‚t          |¦  «        r	|| _        d S || _        d S )Nzfunc must be provided)r   Ú_is_async_callableÚafuncr   )Úselfr   s     r   Ú__init__zEmbeddingsLambda.__init__—   s>   € ð ˆ<ÝÐ4Ñ5Ô5Ð5Ý˜dÑ#Ô#ð 	ØˆDŒJˆJˆJàˆDŒIˆIˆIó    Útextsú	list[str]úlist[list[float]]c                ó\   — t          | dd¦  «        }|€t          d¦  «        ‚ ||¦  «        S )aF  Embed a list of texts into vectors.

        Args:
            texts: list of texts to convert to embeddings.

        Returns:
            list of embeddings, one per input text. Each embedding is a list of floats.

        Raises:
            ValueError: If the instance was initialized with only an async function.
        r   Nz’EmbeddingsLambda was initialized with an async function but no sync function. Use aembed_documents for async operation or provide a sync function.)Úgetattrr   )r"   r%   r   s      r   Úembed_documentsz EmbeddingsLambda.embed_documents¢   sB   € õ �t˜V TÑ*Ô*ˆØˆ<ÝðWñô ð ð ˆt�E‰{Œ{Ðr$   Útextr   úlist[float]c                ó:   — |                       |g¦  «        d         S )a1  Embed a single piece of text.

        Args:
            text: Text to convert to an embedding.

        Returns:
            Embedding vector as a list of floats.

        Note:
            This is equivalent to calling embed_documents with a single text
            and taking the first result.
        r   )r*   )r"   r+   s     r   Úembed_queryzEmbeddingsLambda.embed_query¶   s   € ð ×#Ò# T FÑ+Ô+¨AÔ.Ð.r$   c              ƒ  óž   •K  — t          | dd¦  «        }|€'t          ¦   «                              |¦  «        ƒ d{V —†S  ||¦  «        ƒ d{V —†S )aY  Asynchronously embed a list of texts into vectors.

        Args:
            texts: list of texts to convert to embeddings.

        Returns:
            list of embeddings, one per input text. Each embedding is a list of floats.

        Note:
            If no async function was provided, this falls back to the sync implementation.
        r!   N)r)   ÚsuperÚaembed_documents)r"   r%   r!   Ú	__class__s      €r   r1   z!EmbeddingsLambda.aembed_documentsÅ   si   øè è € õ ˜˜g tÑ,Ô,ˆØˆ=Ý™œ×1Ò1°%Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø�U˜5‘\”\Ð!Ð!Ð!Ð!Ð!Ð!Ð!r$   c              ƒ  ó¬   •K  — t          | dd¦  «        }|€'t          ¦   «                              |¦  «        ƒ d{V —†S  ||g¦  «        ƒ d{V —†d         S )aA  Asynchronously embed a single piece of text.

        Args:
            text: Text to convert to an embedding.

        Returns:
            Embedding vector as a list of floats.

        Note:
            This is equivalent to calling aembed_documents with a single text
            and taking the first result.
        r!   Nr   )r)   r0   Úaembed_query)r"   r+   r!   r2   s      €r   r4   zEmbeddingsLambda.aembed_queryÖ   sp   øè è € õ ˜˜g tÑ,Ô,ˆØˆ=Ý™œ×-Ò-¨dÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø�e˜T˜F‘m”mÐ#Ð#Ð#Ð#Ð#Ð# QÔ'Ð'r$   )r   r   r   r   )r%   r&   r   r'   )r+   r   r   r,   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r*   r.   r1   r4   Ú__classcell__)r2   s   @r   r   r   m   s¢   ø€ € € € € ð'ð 'ðR	ð 	ð 	ð 	ðð ð ð ð(/ð /ð /ð /ð"ð "ð "ð "ð "ð "ð"(ð (ð (ð (ð (ð (ð (ð (ð (ð (r$   r   Úobjr   Úpathústr | list[str]r&   c                ó¶   ‡— |r|dk    rt          j        | dd¬¦  «        gS t          |t          ¦  «        rt	          |¦  «        n|}dˆfd„Š ‰| |d¦  «        S )aÌ  Extract text from an object using a path expression or pre-tokenized path.

    Args:
        obj: The object to extract text from
        path: Either a path string or pre-tokenized path list.

    !!! info "Path types handled"
        - Simple paths: "field1.field2"
        - Array indexing: "[0]", "[*]", "[-1]"
        - Wildcards: "*"
        - Multi-field selection: "{field1,field2}"
        - Nested paths in multi-field: "{field1,nested.field2}"
    ú$TF©Ú	sort_keysÚensure_asciir:   r   Útokensr&   ÚposÚintr   c           	     óX  •— |t          |¦  «        k    rrt          | t          t          t          t
          f¦  «        rt          | ¦  «        gS | €g S t          | t          t          f¦  «        rt          j	        | dd¬¦  «        gS g S ||         }g }| 
                    d¦  «        rï|                     d¦  «        rÚt          | t          ¦  «        sg S |dd…         }|dk    r*| D ]%}|                      ‰|||dz   ¦  «        ¦  «         Œ&�nž	 t          |¦  «        }|d	k     rt          | ¦  «        |z   }d	|cxk    rt          | ¦  «        k     r,n n)|                      ‰| |         ||dz   ¦  «        ¦  «         �n.# t          t          f$ r g cY S w xY w| 
                    d
¦  «        �r)|                     d¦  «        �rt          | t          ¦  «        sg S d„ |dd…                              d¦  «        D ¦   «         }|D ]Ñ}	t!          |	¦  «        }
|
r¾| }|
D ]&}t          |t          ¦  «        r||v r	||         }Œ$d } |�‘t          |t          t          t          t
          f¦  «        r#|                     t          |¦  «        ¦  «         Œ‹t          |t          t          f¦  «        r*|                     t          j	        |dd¬¦  «        ¦  «         ŒÒnÖ|dk    rŽt          | t          ¦  «        r;|                      ¦   «         D ]%}|                      ‰|||dz   ¦  «        ¦  «         Œ&n€t          | t          ¦  «        r(| D ]%}|                      ‰|||dz   ¦  «        ¦  «         Œ&nBt          | t          ¦  «        r-|| v r)|                      ‰| |         ||dz   ¦  «        ¦  «         |S )NTFr?   ú[ú]é   éÿÿÿÿÚ*r   Ú{Ú}c                ó6   — g | ]}|                      ¦   «         ‘ŒS © )Ústrip)Ú.0Úfs     r   ú
<listcomp>z?get_text_at_path.<locals>._extract_from_obj.<locals>.<listcomp>  s    € Ð@Ð@Ð@ A�a—g’g‘i”iÐ@Ð@Ð@r$   ú,)Úlenr   r   rD   ÚfloatÚboolÚlistÚdictÚjsonÚdumpsÚ
startswithÚendswithÚextendr   Ú
IndexErrorÚsplitÚtokenize_pathÚappendÚvalues)r:   rB   rC   ÚtokenÚresultsÚindexÚitemÚidxÚfieldsÚfieldÚnested_tokensÚcurrent_objÚnested_tokenÚvalueÚ_extract_from_objs                 €r   rn   z+get_text_at_path.<locals>._extract_from_objü   s*  ø€ Ø•#�f‘+”+ÒÐÝ˜#¥¥S­%µÐ6Ñ7Ô7ð MÝ˜C™œ�zÐ!Ø�Ø�	Ý˜C¥$­ Ñ.Ô.ð MÝœ
 3°$ÀUÐKÑKÔKÐLÐLØˆIà�s”ˆØˆà×Ò˜CÑ Ô ð :	O U§^¢^°CÑ%8Ô%8ð :	OÝ˜c¥4Ñ(Ô(ð Ø�	à˜!˜B˜$”KˆEØ˜Š|ˆ|Øð Mð M�DØ—N’NÐ#4Ð#4°T¸6À3ÈÁ7Ñ#KÔ#KÑLÔLÐLÐLñMðÝ˜e™*œ*�CØ˜Q’w�wÝ! #™hœh¨™n˜Ø˜CÐ*Ð*Ò*Ð*¥# c¡(¤(Ò*Ð*Ð*Ð*Ð*ØŸšÐ'8Ð'8¸¸S¼À6È3ÐQRÉ7Ñ'SÔ'SÑTÔTÐTùøÝ"¥JÐ/ð ð ð Ø�I�I�Iðøøøð ×Ò˜cÑ"Ô"ñ (	O u§~¢~°cÑ':Ô':ñ (	OÝ˜c¥4Ñ(Ô(ð Ø�	à@Ð@¨¨q°¨t¬×):Ò):¸3Ñ)?Ô)?Ð@Ñ@Ô@ˆFØð ð �Ý -¨eÑ 4Ô 4�Ø ð Ø/2�KØ(5ð "ð "˜å& {µDÑ9Ô9ð"à ,°Ð ;Ð ;à*5°lÔ*C˜K˜Kà*.˜KØ!Ø"Ð.Ý% kµC½½eÅTÐ3JÑKÔKð Ø#ŸNšN­3¨{Ñ+;Ô+;Ñ<Ô<Ð<Ð<Ý'¨µd½D°\ÑBÔBð Ø#ŸNšNÝ $¤
Ø$/¸4Èeð!"ñ !"ô !"ñô ð øð#ð0 �cŠ\ˆ\Ý˜#�tÑ$Ô$ð MØ ŸZšZ™\œ\ð Nð N�EØ—N’NÐ#4Ð#4°U¸FÀCÈ!ÁGÑ#LÔ#LÑMÔMÐMÐMðNå˜C¥Ñ&Ô&ð MØð Mð M�DØ—N’NÐ#4Ð#4°T¸6À3ÈÁ7Ñ#KÔ#KÑLÔLÐLÐLøõ ˜#�tÑ$Ô$ð O¨°#¨¨Ø—’Ð0Ð0°°U´¸VÀSÈ1ÁWÑMÔMÑNÔNÐNàˆs   ÄA-E< Å<FÆFr   )r:   r   rB   r&   rC   rD   r   r&   )rY   rZ   r   r   r`   )r:   r;   rB   rn   s      @r   Úget_text_at_pathro   é   s�   ø€ ð ð E�4˜3’;�;Ý”
˜3¨$¸UÐCÑCÔCÐDÐDå$.¨tµSÑ$9Ô$9ÐC�]˜4Ñ Ô Ð ¸t€FðIð Ið Ið Ið Ið IðV Ð˜S &¨!Ñ,Ô,Ð,r$   r   c                óÒ  — | sg S g }g }d}|t          | ¦  «        k     �r| |         }|dk    rÔ|r*|                     d                     |¦  «        ¦  «         g }d}dg}|dz  }|t          | ¦  «        k     rb|dk    r\| |         dk    r|dz  }n| |         dk    r|dz  }|                     | |         ¦  «         |dz  }|t          | ¦  «        k     r|dk    °\|                     d                     |¦  «        ¦  «         Œö|dk    rÕ|r*|                     d                     |¦  «        ¦  «         g }d}dg}|dz  }|t          | ¦  «        k     rb|dk    r\| |         dk    r|dz  }n| |         dk    r|dz  }|                     | |         ¦  «         |dz  }|t          | ¦  «        k     r|dk    °\|                     d                     |¦  «        ¦  «         �ŒÑ|dk    r-|r*|                     d                     |¦  «        ¦  «         g }n|                     |¦  «         |dz  }|t          | ¦  «        k     �°|r(|                     d                     |¦  «        ¦  «         |S )	zæTokenize a path into components.

    !!! info "Types handled"
        - Simple paths: "field1.field2"
        - Array indexing: "[0]", "[*]", "[-1]"
        - Wildcards: "*"
        - Multi-field selection: "{field1,field2}"
    r   rF   Ú rH   rG   rK   rL   ú.)rT   ra   Újoin)	r;   rB   ÚcurrentÚiÚcharÚbracket_countÚindex_charsÚbrace_countÚfield_charss	            r   r`   r`   M  s¦  € ð ð Øˆ	à€FØ€GØ	€AØ
�c�$‰iŒiŠ-‰-Ø�AŒwˆà�3Š;ˆ;Øð Ø—’˜bŸgšg gÑ.Ô.Ñ/Ô/Ð/Ø�ØˆMØ˜%ˆKØ�‰FˆAØ•c˜$‘i”i’-�- M°AÒ$5Ð$5Ø˜”7˜c’>�>Ø! QÑ&�M�MØ˜!”W ’^�^Ø! QÑ&�MØ×"Ò" 4¨¤7Ñ+Ô+Ð+Ø�Q‘�ð •c˜$‘i”i’-�- M°AÒ$5Ð$5ð �MŠM˜"Ÿ'š' +Ñ.Ô.Ñ/Ô/Ð/Øà�SŠ[ˆ[Øð Ø—’˜bŸgšg gÑ.Ô.Ñ/Ô/Ð/Ø�ØˆKØ˜%ˆKØ�‰FˆAØ•c˜$‘i”i’-�- K°!¢O OØ˜”7˜c’>�>Ø 1Ñ$�K�KØ˜!”W ’^�^Ø 1Ñ$�KØ×"Ò" 4¨¤7Ñ+Ô+Ð+Ø�Q‘�ð •c˜$‘i”i’-�- K°!¢O Oð �MŠM˜"Ÿ'š' +Ñ.Ô.Ñ/Ô/Ð/Ùà�SŠ[ˆ[Øð Ø—’˜bŸgšg gÑ.Ô.Ñ/Ô/Ð/Ø�øà�NŠN˜4Ñ Ô Ð Ø	ˆQ‰ˆðW �c�$‰iŒiŠ-‰-ðZ ð (Ø�Š�b—g’g˜gÑ&Ô&Ñ'Ô'Ð'à€Mr$   r   rV   c                ó|   — t          j        | ¦  «        p(t          | d¦  «        ot          j        | j        ¦  «        S )züCheck if a function is async.

    This includes both async def functions and classes with async __call__ methods.

    Args:
        func: Function or callable object to check.

    Returns:
        True if the function is async, False otherwise.
    Ú__call__)ÚasyncioÚiscoroutinefunctionÚhasattrr|   )r   s    r   r    r    �  s>   € õ 	Ô# DÑ)Ô)ð 	7Ý�4˜Ñ$Ô$ð 7ÝÔ'¨¬Ñ6Ô6ðr$   ú"Callable[[str], Embeddings] | Nonec                 ó6   — 	 ddl m}  | S # t          $ r Y d S w xY w)Nr   ©r   )Úlangchain.embeddingsr   ÚImportErrorr‚   s    r   r   r   £  sA   € ðØ8Ð8Ð8Ð8Ð8Ð8àÐøÝð ð ð Øˆtˆtðøøøs   ‚
 Š
—)r   ÚEmbeddingsFuncÚAEmbeddingsFunc)r	   r
   r   r   )r:   r   r;   r<   r   r&   )r;   r   r   r&   )r   r   r   rV   )r   r€   )r8   Ú
__future__r   r}   Ú	functoolsrY   Úcollections.abcr   r   r   Útypingr   Úlangchain_core.embeddingsr   r   rW   rU   r…   r†   r   r   ro   r`   r    Ú	lru_cacher   Ú__all__rN   r$   r   ú<module>rŽ      s—  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø Ð Ð Ð Ð Ð à 0Ð 0Ð 0Ð 0Ð 0Ð 0à˜8 Cœ=˜/¨4°°U´Ô+<Ð<Ô=€ðð ˜H SœM˜?¨I°d¸4À¼;Ô6GÔ,HÐHÔI€ððH#ð H#ð H#ð H#ðVy(ð y(ð y(ð y(ð y(�zñ y(ô y(ð y(ðx^-ð ^-ð ^-ð ^-ðH?ð ?ð ?ð ?ðDð ð ð ð( Ôðð ð ñ Ôððð ð €€€r$   