§
    ™Štjò<  ã                  óÞ  — d Z ddlmZ ddlZddlZddlmZmZ ddl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 erdd
lmZmZmZmZ ddlmZ 	 ddlZdZn# e $ r dZY nw xY w	 ddl!m"Z" dZ#n# e $ r dZ#Y nw xY w ej$        e%¦  «        Z& edd¬¦  «        Z' G d„ dee¦  «        Z( G d„ de(¦  «        Z) G d„ de*e¦  «        Z+ e	d¬¦  «         G d„ d¦  «        ¦   «         Z,d d„Z-dS )!zText splitter base interface.é    )ÚannotationsN)ÚABCÚabstractmethod)Ú	dataclass)ÚEnum)ÚTYPE_CHECKINGÚAnyÚLiteralÚTypeVar)ÚBaseDocumentTransformerÚDocument)ÚSelfÚoverride)ÚCallableÚ
CollectionÚIterableÚSequence)ÚSetTF)ÚPreTrainedTokenizerBaseÚTSÚTextSplitter)Úboundc                  ó¶   — e Zd ZdZddedddfd8d„Zed9d„¦   «         Z	 d:d;d„Zd<d„Z	d=d#„Z
d>d&„Zed?d+„¦   «         Ze	 	 	 	 d@dAd5„¦   «         ZedBd7„¦   «         ZdS )Cr   z)Interface for splitting text into chunks.i   éÈ   FTÚ
chunk_sizeÚintÚchunk_overlapÚlength_functionúCallable[[str], int]Úkeep_separatorúbool | Literal['start', 'end']Úadd_start_indexÚboolÚstrip_whitespaceÚreturnÚNonec                óþ   — |dk    rd|› �}t          |¦  «        ‚|dk     rd|› �}t          |¦  «        ‚||k    rd|› d|› d�}t          |¦  «        ‚|| _        || _        || _        || _        || _        || _        dS )a$  Create a new `TextSplitter`.

        Args:
            chunk_size: Maximum size of chunks to return
            chunk_overlap: Overlap in characters between chunks
            length_function: Function that measures the length of given chunks
            keep_separator: Whether to keep the separator and where to place it
                in each corresponding chunk `(True='start')`
            add_start_index: If `True`, includes chunk's start index in metadata
            strip_whitespace: If `True`, strips whitespace from the start and end of
                every document

        Raises:
            ValueError: If `chunk_size` is less than or equal to 0
            ValueError: If `chunk_overlap` is less than 0
            ValueError: If `chunk_overlap` is greater than `chunk_size`
        r   zchunk_size must be > 0, got z chunk_overlap must be >= 0, got zGot a larger chunk overlap (z) than chunk size (z), should be smaller.N)Ú
ValueErrorÚ_chunk_sizeÚ_chunk_overlapÚ_length_functionÚ_keep_separatorÚ_add_start_indexÚ_strip_whitespace)Úselfr   r   r   r    r"   r$   Úmsgs           ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_text_splitters/base.pyÚ__init__zTextSplitter.__init__/   sÁ   € ð4 ˜Š?ˆ?Ø=°Ð=Ð=ˆCÝ˜S‘/”/Ð!Ø˜1ÒÐØD°]ÐDÐDˆCÝ˜S‘/”/Ð!Ø˜:Ò%Ð%ð6¨}ð 6ð 6Øð6ð 6ð 6ð õ ˜S‘/”/Ð!Ø%ˆÔØ+ˆÔØ /ˆÔØ-ˆÔØ /ˆÔØ!1ˆÔÐÐó    ÚtextÚstrú	list[str]c                ó   — dS )z–Split text into multiple components.

        Args:
            text: The text to split.

        Returns:
            A list of text chunks.
        N© )r/   r4   s     r1   Ú
split_textzTextSplitter.split_text\   s   € € € r3   NÚtextsÚ	metadatasúlist[dict[Any, Any]] | Noneúlist[Document]c           	     ó®  — |pi gt          |¦  «        z  }g }t          |¦  «        D ]­\  }}d}d}|                      |¦  «        D ]Ž}	t          j        ||         ¦  «        }
| j        rE||z   | j        z
  }|                     |	t          d|¦  «        ¦  «        }||
d<   t          |	¦  «        }t          |	|
¬¦  «        }| 
                    |¦  «         Œ�Œ®|S )a,  Create a list of `Document` objects from a list of texts.

        Args:
            texts: A list of texts to be split and converted into documents.
            metadatas: Optional list of metadata to associate with each document.

        Returns:
            A list of `Document` objects.
        r   Ústart_index)Úpage_contentÚmetadata)ÚlenÚ	enumerater9   ÚcopyÚdeepcopyr-   r*   ÚfindÚmaxr   Úappend)r/   r:   r;   Ú
metadatas_Ú	documentsÚir4   ÚindexÚprevious_chunk_lenÚchunkrA   ÚoffsetÚnew_docs                r1   Úcreate_documentszTextSplitter.create_documentsg   sù   € ð Ð3 2 $­¨U©¬Ñ"3ˆ
Øˆ	Ý  Ñ'Ô'ð 	*ð 	*‰GˆAˆtØˆEØ!"ÐØŸš¨Ñ.Ô.ð *ð *�Ýœ=¨°A¬Ñ7Ô7�ØÔ(ð 4Ø"Ð%7Ñ7¸$Ô:MÑM�FØ ŸIšI e­S°°F©^¬^Ñ<Ô<�EØ.3�H˜]Ñ+Ý),¨U©¬Ð&Ý"°ÀÐIÑIÔI�Ø× Ò  Ñ)Ô)Ð)Ð)ð*ð Ðr3   rJ   úIterable[Document]c                óª   — g g }}|D ]6}|                      |j        ¦  «         |                      |j        ¦  «         Œ7|                      ||¬¦  «        S )z�Split documents.

        Args:
            documents: The documents to split.

        Returns:
            A list of split documents.
        )r;   )rH   r@   rA   rQ   )r/   rJ   r:   r;   Údocs        r1   Úsplit_documentszTextSplitter.split_documentsƒ   sc   € ð ˜rˆyˆØð 	+ð 	+ˆCØ�LŠL˜Ô)Ñ*Ô*Ð*Ø×Ò˜Sœ\Ñ*Ô*Ð*Ð*Ø×$Ò$ U°iÐ$Ñ@Ô@Ð@r3   ÚdocsÚ	separatorú
str | Nonec                ój   — |                      |¦  «        }| j        r|                     ¦   «         }|pd S ©N)Újoinr.   Ústrip)r/   rV   rW   r4   s       r1   Ú
_join_docszTextSplitter._join_docs’   s5   € Ø�~Š~˜dÑ#Ô#ˆØÔ!ð 	 Ø—:’:‘<”<ˆDØˆ|�tÐr3   ÚsplitsúIterable[str]c                ó´  — |                       |¦  «        }g }g }d}|D �]‹}|                       |¦  «        }||z   t          |¦  «        dk    r|ndz   | j        k    �r|| j        k    r!t                               d|| j        ¦  «         t          |¦  «        dk    rÛ|                      ||¦  «        }	|	�|                     |	¦  «         || j        k    s,||z   t          |¦  «        dk    r|ndz   | j        k    r}|dk    rw||                       |d         ¦  «        t          |¦  «        dk    r|ndz   z  }|dd …         }|| j        k    °K||z   t          |¦  «        dk    r|ndz   | j        k    r|dk    °w|                     |¦  «         ||t          |¦  «        dk    r|ndz   z  }�Œ�|                      ||¦  «        }	|	�|                     |	¦  «         |S )Nr   zACreated a chunk of size %d, which is longer than the specified %dé   )r+   rB   r)   ÚloggerÚwarningr]   rH   r*   )
r/   r^   rW   Úseparator_lenrV   Úcurrent_docÚtotalÚdÚlen_rT   s
             r1   Ú_merge_splitszTextSplitter._merge_splits˜   s>  € ð ×-Ò-¨iÑ8Ô8ˆàˆØ!#ˆØˆØð 	Kñ 	KˆAØ×(Ò(¨Ñ+Ô+ˆDà˜‘µ°[Ñ1AÔ1AÀAÒ1EÐ1E  È1ÑMØÔ"ò#ñ #ð ˜4Ô+Ò+Ð+Ý—N’Nð'àØÔ(ñ	ô ð õ �{Ñ#Ô# aÒ'Ð'ØŸ/š/¨+°yÑAÔA�CØ�ØŸš CÑ(Ô(Ð(ð   $Ô"5Ò5Ð5Ø ™½¸[Ñ9IÔ9IÈAÒ9MÐ9M¨¨ÐSTÑUØÔ*ò+ð +à! AšI˜Ià ×!6Ò!6°{À1´~Ñ!FÔ!FÝ-0°Ñ-=Ô-=ÀÒ-AÐ-A˜M˜MÀqñ"ñ ˜ð '2°!°"°"¤o˜ð   $Ô"5Ò5Ð5Ø ™½¸[Ñ9IÔ9IÈAÒ9MÐ9M¨¨ÐSTÑUØÔ*ò+ð +à! AšI˜Ið ×Ò˜qÑ!Ô!Ð!Ø�T­c°+Ñ.>Ô.>ÀÒ.BÐ.B˜]˜]ÈÑJÑJˆE‰EØ�oŠo˜k¨9Ñ5Ô5ˆØˆ?Ø�KŠK˜ÑÔÐØˆr3   Ú	tokenizerr   Úkwargsr	   c                ó    ‡— t           sd}t          |¦  «        ‚t          ‰t          ¦  «        sd}t          |¦  «        ‚d	ˆfd„} | d
d|i|¤ŽS )a  Text splitter that uses Hugging Face tokenizer to count length.

        Args:
            tokenizer: The Hugging Face tokenizer to use.

        Returns:
            An instance of `TextSplitter` using the Hugging Face tokenizer for length
                calculation.
        z`Could not import transformers python package. Please install it with `pip install transformers`.zATokenizer received was not an instance of PreTrainedTokenizerBaser4   r5   r%   r   c                óH   •— t          ‰                     | ¦  «        ¦  «        S rZ   )rB   Útokenize©r4   rj   s    €r1   Ú_huggingface_tokenizer_lengthzNTextSplitter.from_huggingface_tokenizer.<locals>._huggingface_tokenizer_lengthà   s   ø€ Ý�y×)Ò)¨$Ñ/Ô/Ñ0Ô0Ð0r3   r   ©r4   r5   r%   r   r8   )Ú_HAS_TRANSFORMERSr(   Ú
isinstancer   )Úclsrj   rk   r0   rp   s    `   r1   Úfrom_huggingface_tokenizerz'TextSplitter.from_huggingface_tokenizerÄ   sŽ   ø€ õ !ð 	"ðEð õ ˜S‘/”/Ð!å˜)Õ%<Ñ=Ô=ð 	"ð Tð õ ˜S‘/”/Ð!ð	1ð 	1ð 	1ð 	1ð 	1ð 	1ð ˆsÐKÐKÐ#@ÐKÀFÐKÐKÐKr3   Úgpt2ÚallÚencoding_nameÚ
model_nameÚallowed_specialú(Literal['all'] | AbstractSet[str] | NoneÚdisallowed_specialú Literal['all'] | Collection[str]r   c                ó  ‡‡‡	— ‰€t          ¦   «         Št          sd}t          |¦  «        ‚|�t          j        |¦  «        Š	nt          j        |¦  «        Š	d
ˆˆˆ	fd„}t          | t          ¦  «        r||‰‰dœ}i |¥|¥} | dd	|i|¤ŽS )am  Text splitter that uses `tiktoken` encoder to count length.

        Args:
            encoding_name: The name of the tiktoken encoding to use.
            model_name: The name of the model to use.

                If provided, this will override the `encoding_name`.
            allowed_special: Special tokens that are allowed during encoding.
            disallowed_special: Special tokens that are disallowed during encoding.

        Returns:
            An instance of `TextSplitter` using tiktoken for length calculation.

        Raises:
            ImportError: If the tiktoken package is not installed.
        Nz”Could not import tiktoken python package. This is needed in order to calculate max_tokens_for_prompt. Please install it with `pip install tiktoken`.r4   r5   r%   r   c                óN   •— t          ‰                     | ‰‰¬¦  «        ¦  «        S ©N)rz   r|   )rB   Úencode)r4   rz   r|   Úencs    €€€r1   Ú_tiktoken_encoderz=TextSplitter.from_tiktoken_encoder.<locals>._tiktoken_encoder  s4   ø€ ÝØ—
’
ØØ$3Ø'9ð ñ ô ñô ð r3   )rx   ry   rz   r|   r   rq   r8   )ÚsetÚ_HAS_TIKTOKENÚImportErrorÚtiktokenÚencoding_for_modelÚget_encodingÚ
issubclassÚTokenTextSplitter)
rt   rx   ry   rz   r|   rk   r0   rƒ   Úextra_kwargsr‚   s
      ``    @r1   Úfrom_tiktoken_encoderz"TextSplitter.from_tiktoken_encoderå   sã   øøø€ ð2 Ð"Ý!™eœeˆOÝð 	#ðAð õ
 ˜cÑ"Ô"Ð"àÐ!ÝÔ-¨jÑ9Ô9ˆCˆCåÔ'¨Ñ6Ô6ˆCð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ �cÕ,Ñ-Ô-ð 	0à!.Ø(Ø#2Ø&8ð	ð ˆLð 0˜Ð/ ,Ð/ˆFàˆsÐ?Ð?Ð#4Ð?¸Ð?Ð?Ð?r3   úSequence[Document]c                óF   — |                       t          |¦  «        ¦  «        S )z¾Transform sequence of documents by splitting them.

        Args:
            documents: The sequence of documents to split.

        Returns:
            A list of split documents.
        )rU   Úlist)r/   rJ   rk   s      r1   Útransform_documentsz TextSplitter.transform_documents!  s   € ð ×#Ò#¥D¨¡O¤OÑ4Ô4Ð4r3   )r   r   r   r   r   r   r    r!   r"   r#   r$   r#   r%   r&   ©r4   r5   r%   r6   rZ   )r:   r6   r;   r<   r%   r=   )rJ   rR   r%   r=   )rV   r6   rW   r5   r%   rX   )r^   r_   rW   r5   r%   r6   )rj   r   rk   r	   r%   r   ©rv   NNrw   )rx   r5   ry   rX   rz   r{   r|   r}   rk   r	   r%   r   )rJ   rŽ   rk   r	   r%   rŽ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB   r2   r   r9   rQ   rU   r]   ri   Úclassmethodru   r�   r   r‘   r8   r3   r1   r   r   ,   sG  € € € € € Ø3Ð3ð Ø Ø03Ø9>Ø %Ø!%ð+2ð +2ð +2ð +2ð +2ðZ ðð ð ñ „^ðð JNðð ð ð ð ð8Að Að Að Aðð ð ð ð*ð *ð *ð *ðX ðLð Lð Lñ „[ðLð@ ð $Ø!%ØDHØ?Dð9@ð 9@ð 9@ð 9@ñ „[ð9@ðv ð5ð 5ð 5ñ „Xð5ð 5ð 5r3   c                  ó6   ‡ — e Zd ZdZ	 	 	 	 ddˆ fd„Zdd„Zˆ xZS )r‹   z/Splitting text to tokens using model tokenizer.rv   Nrw   rx   r5   ry   rX   rz   r{   r|   r}   rk   r	   r%   r&   c                ó
  •— |€t          ¦   «         } t          ¦   «         j        di |¤Ž t          sd}t	          |¦  «        ‚|�t          j        |¦  «        }nt          j        |¦  «        }|| _        || _	        || _
        dS )aë  Create a new `TextSplitter`.

        Args:
            encoding_name: The name of the tiktoken encoding to use.
            model_name: The name of the model to use.

                If provided, this will override the `encoding_name`.
            allowed_special: Special tokens that are allowed during encoding.
            disallowed_special: Special tokens that are disallowed during encoding.

        Raises:
            ImportError: If the tiktoken package is not installed.
        NzŠCould not import tiktoken python package. This is needed in order to for TokenTextSplitter. Please install it with `pip install tiktoken`.r8   )r„   Úsuperr2   r…   r†   r‡   rˆ   r‰   Ú
_tokenizerÚ_allowed_specialÚ_disallowed_special)	r/   rx   ry   rz   r|   rk   r0   r‚   Ú	__class__s	           €r1   r2   zTokenTextSplitter.__init__3  s™   ø€ ð* Ð"Ý!™eœeˆOØ�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"Ýð 	#ðAð õ
 ˜cÑ"Ô"Ð"àÐ!ÝÔ-¨jÑ9Ô9ˆCˆCåÔ'¨Ñ6Ô6ˆCØˆŒØ /ˆÔØ#5ˆÔ Ð Ð r3   r4   r6   c                ó€   ‡ — dˆ fd„}t          ‰ j        ‰ j        ‰ j        j        |¬¦  «        }t          ||¬¦  «        S )	ar  Splits the input text into smaller chunks based on tokenization.

        This method uses a custom tokenizer configuration to encode the input text
        into tokens, processes the tokens in chunks of a specified size with overlap,
        and decodes them back into text chunks. The splitting is performed using the
        `split_text_on_tokens` function.

        Args:
            text: The input text to be split into smaller chunks.

        Returns:
            A list of text chunks, where each chunk is derived from a portion
                of the input text based on the tokenization and chunking rules.
        Ú_textr5   r%   ú	list[int]c                óR   •— ‰j                              | ‰j        ‰j        ¬¦  «        S r€   )rœ   r�   r�   rž   )r¡   r/   s    €r1   Ú_encodez-TokenTextSplitter.split_text.<locals>._encodek  s1   ø€ Ø”?×)Ò)ØØ $Ô 5Ø#'Ô#;ð *ñ ô ð r3   )r   Útokens_per_chunkÚdecoder�   ro   )r¡   r5   r%   r¢   )Ú	Tokenizerr*   r)   rœ   r¦   Úsplit_text_on_tokens)r/   r4   r¤   rj   s   `   r1   r9   zTokenTextSplitter.split_text[  sc   ø€ ð 	ð 	ð 	ð 	ð 	ð 	õ ØÔ-Ø!Ô-Ø”?Ô)Øð	
ñ 
ô 
ˆ	õ $¨¸ÐCÑCÔCÐCr3   r“   )rx   r5   ry   rX   rz   r{   r|   r}   rk   r	   r%   r&   r’   )r”   r•   r–   r—   r2   r9   Ú__classcell__)rŸ   s   @r1   r‹   r‹   0  ss   ø€ € € € € Ø9Ð9ð $Ø!%ØDHØ?Dð&6ð &6ð &6ð &6ð &6ð &6ð &6ðPDð Dð Dð Dð Dð Dð Dð Dr3   r‹   c                  ó‚   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )ÚLanguagez"Enum of the programming languages.ÚcppÚgoÚjavaÚkotlinÚjsÚtsÚphpÚprotoÚpythonÚrÚrstÚrubyÚrustÚscalaÚswiftÚmarkdownÚlatexÚhtmlÚsolÚcsharpÚcobolÚcÚluaÚperlÚhaskellÚelixirÚ
powershellÚvisualbasic6N) r”   r•   r–   r—   ÚCPPÚGOÚJAVAÚKOTLINÚJSr   ÚPHPÚPROTOÚPYTHONÚRÚRSTÚRUBYÚRUSTÚSCALAÚSWIFTÚMARKDOWNÚLATEXÚHTMLÚSOLÚCSHARPÚCOBOLÚCÚLUAÚPERLÚHASKELLÚELIXIRÚ
POWERSHELLÚVISUALBASIC6r8   r3   r1   r«   r«   |  s    € € € € € Ø,Ð,à
€CØ	€BØ€DØ€FØ	€BØ	€BØ
€CØ€EØ€FØ€AØ
€CØ€DØ€DØ€EØ€EØ€HØ€EØ€DØ
€CØ€FØ€EØ€AØ
€CØ€DØ€GØ€FØ€JØ!€L€L€Lr3   r«   )Úfrozenc                  óB   — e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   d	S )
r§   zTokenizer data class.r   r   r¥   zCallable[[list[int]], str]r¦   zCallable[[str], list[int]]r�   N)r”   r•   r–   r—   Ú__annotations__r8   r3   r1   r§   r§   �  sQ   € € € € € € àÐàÐÐÑØ*àÐÐÑØ,à&Ð&Ð&Ñ&Ø=à&Ð&Ð&Ñ&Ø=Ð=r3   r§   r4   r5   rj   r%   r6   c                óÎ  — g }|                      | ¦  «        }d}|j        |j        k    rd}t          |¦  «        ‚|t	          |¦  «        k     r—t          ||j        z   t	          |¦  «        ¦  «        }|||…         }|sne|                     |¦  «        }|r|                     |¦  «         |t	          |¦  «        k    rn%||j        |j        z
  z  }|t	          |¦  «        k     °—|S )zÔSplit incoming text and return chunks using tokenizer.

    Args:
        text: The input text to be split.
        tokenizer: The tokenizer to use for splitting.

    Returns:
        A list of text chunks.
    r   z3tokens_per_chunk must be greater than chunk_overlap)r�   r¥   r   r(   rB   Úminr¦   rH   )	r4   rj   r^   Ú	input_idsÚ	start_idxr0   Úcur_idxÚ	chunk_idsÚdecodeds	            r1   r¨   r¨   ®  sû   € ð €FØ× Ò  Ñ&Ô&€IØ€IØÔ! YÔ%<Ò<Ð<ØCˆÝ˜‰oŒoÐà
•c˜)‘n”nÒ
$Ð
$Ý�i )Ô"<Ñ<½cÀ)¹n¼nÑMÔMˆØ˜i¨Ð/Ô0ˆ	Øð 	ØØ×"Ò" 9Ñ-Ô-ˆØð 	#Ø�MŠM˜'Ñ"Ô"Ð"Ø•c˜)‘n”nÒ$Ð$ØØ�YÔ/°)Ô2IÑIÑIˆ	ð •c˜)‘n”nÒ
$Ð
$ð €Mr3   )r4   r5   rj   r§   r%   r6   ).r—   Ú
__future__r   rD   ÚloggingÚabcr   r   Údataclassesr   Úenumr   Útypingr   r	   r
   r   Úlangchain_core.documentsr   r   Útyping_extensionsr   r   Úcollections.abcr   r   r   r   r   ÚAbstractSetr‡   r…   r†   Ú$transformers.tokenization_utils_baser   rr   Ú	getLoggerr”   rb   r   r   r‹   r5   r«   r§   r¨   r8   r3   r1   ú<module>rù      s¾  ðØ #Ð #à "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð GÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,àð 3ØHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHØ2Ð2Ð2Ð2Ð2Ð2ðØ€O€O€Oà€M€MøØð ð ð Ø€M€M€MðøøøðØLÐLÐLÐLÐLÐLàÐÐøØð ð ð ØÐÐÐðøøøð 
ˆÔ	˜8Ñ	$Ô	$€à€WˆT˜Ð(Ñ(Ô(€ðA5ð A5ð A5ð A5ð A5Ð*¨Cñ A5ô A5ð A5ðHIDð IDð IDð IDð ID˜ñ IDô IDð IDðX"ð "ð "ð "ð "ˆs�Dñ "ô "ð "ðB €�$ÐÑÔð>ð >ð >ð >ð >ñ >ô >ñ Ôð>ð ð ð ð ð ð s$   ÁA ÁA'Á&A'Á+A4 Á4A>Á=A>