
    Ng                    H   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m	Z	m
Z
mZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ erd dlZd dlZd d
lm Z m!Z!m"Z"m#Z#  ej$                    Z%dZ&ddZ'ddZ( eddd           G d de                      Z)dS )    )annotationsN)	TYPE_CHECKINGAnyCallableDictIterableListOptionalTupleType)
deprecatedDocument)
Embeddings)xor_args)VectorStore)maximal_marginal_relevance)ID	OneOrManyWhereWhereDocument   resultsr   returnList[Document]c                4    d t          |           D             S )Nc                    g | ]\  }}|S  r   .0doc_s      c/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/chroma.py
<listcomp>z$_results_to_docs.<locals>.<listcomp>%   s    CCCFCCCCC    )_results_to_docs_and_scoresr   s    r#   _results_to_docsr(   $   s    CC9'BBCCCCr%   List[Tuple[Document, float]]c                    d t          | d         d         | d         d         | d         d                   D             S )Nc                \    g | ])}t          |d          |d         pi           |d         f*S )r      )page_contentmetadata   r   )r    results     r#   r$   z/_results_to_docs_and_scores.<locals>.<listcomp>)   sL     	 	 	  
vay6!9?	C	C	CVAYO	 	 	r%   	documentsr   	metadatas	distances)zipr'   s    r#   r&   r&   (   sV    	 	 K #K #K #
 
		 	 	 	r%   z0.2.91.0zlangchain_chroma.Chroma)sinceremovalalternative_importc            	         e Zd ZU dZdZded<   eddddddfdadZedbd            Z e	d          	 	 	 	 	 dcddd%            Z
ded'Z	 	 dfdgd-Z	 	 dfdhd0Zedfdid4Zeddfdjd7Zeddfdkd9Zeddfdld:Zdmd<Zedfdnd=Zedfdod>Zed?d@ddfdpdDZed?d@ddfdqdEZdrdFZ	 	 	 	 	 	 dsdtdOZ edPdQdRS          drdT            ZdudXZdvdZZedddeddddfdwd]            Zeddeddddfdxd^            Z dydzd_Z!d{d`Z"dS )|Chromaa  `ChromaDB` vector store.

    To use, you should have the ``chromadb`` python package installed.

    Example:
        .. code-block:: python

                from langchain_community.vectorstores import Chroma
                from langchain_community.embeddings.openai import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                vectorstore = Chroma("langchain_store", embeddings)
    	langchainstr"_LANGCHAIN_DEFAULT_COLLECTION_NAMENcollection_nameembedding_functionOptional[Embeddings]persist_directoryOptional[str]client_settings"Optional[chromadb.config.Settings]collection_metadataOptional[Dict]clientOptional[chromadb.Client]relevance_score_fn"Optional[Callable[[float], float]]r   Nonec                @   	 ddl }ddl}n# t          $ r t          d          w xY w||| _        || _        || _        n-|rc|p|j        |_        |j        K|j                            d          \  }	}
}t          |	          dk    rt          |
          dk     rd|_
        |}n|r|j                            d          \  }	}
}t          |	          dk    r/t          |
          dk     r|j                            d          }n|j                            d	          }||_        n|j                                        }|| _         |j        |          | _        |j        p|| _        || _        | j                            |d|
          | _        || _        dS )z Initialize with a Chroma client.r   NXCould not import chromadb python package. Please install it with `pip install chromadb`..r   zduckdb+parquet)chroma_db_implT)is_persistent)namer?   r.   )chromadbchromadb.configImportError_client_settings_client_persist_directoryrA   __version__splitintrO   configSettingsClient_embedding_functionget_or_create_collection_collectionoverride_relevance_score_fn)selfr>   r?   rA   rC   rE   rG   rI   rR   majorminorr"   rU   s                r#   __init__zChroma.__init__G   s   	OOO""""" 	 	 	A  	 $3D!!DL&7D## > &J)J  1 #4@&.&:&@&@&E&EOE5!5zzQ3u::>>9I6#2  " >"*"6"<"<S"A"Auau::??s5zzA~~'/'?'?'7 (@ ( ($$ (0'?'?d'?'S'S$5F 22#+?#;#;#=#= $4D!*8?+;<<DL 2G6G # $6 <@@ #( A 
 

 ,>(((s    %c                    | j         S N)r^   rb   s    r#   
embeddingszChroma.embeddings   s    ''r%   )query_textsquery_embeddingsr   rj   Optional[List[str]]rk   Optional[List[List[float]]]	n_resultsrZ   whereOptional[Dict[str, str]]where_documentkwargsr   r   c           	     x    	 ddl }n# t          $ r t          d          w xY w | j        j        d|||||d|S )zQuery the chroma collection.r   NrM   )rj   rk   rn   ro   rq   r   )rR   rT   r`   query)rb   rj   rk   rn   ro   rq   rr   rR   s           r#   __query_collectionzChroma.__query_collection   s    	OOOO 	 	 	A  	
 &t% 
#-)
 
 
 
 	
s    !uric                    t          |d          5 }t          j        |                                                              d          cddd           S # 1 swxY w Y   dS )z!Get base64 string from image URI.rbzutf-8N)openbase64	b64encodereaddecode)rb   rv   
image_files      r#   encode_imagezChroma.encode_image   s    #t__ 	G
#JOO$5$566==gFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   9AAAuris	List[str]r2   Optional[List[dict]]idsc                     fd|D             d |D             d j         0t           j         d          r j                             |          rct          |          t                    z
  }|r	i g|z  z   g }g }t	                    D ]2\  }}	|	r|                    |           |                    |           3|rfd|D             fd|D             }
rfd|D             nd}fd	|D             }	  j                            ||
|
           nG# t          $ r:}dt          |          v r"d}t          |j
        d         dz   |z             |d}~ww xY w|rKfd|D             }rfd|D             nd}fd|D             } j                            |||           n j                                       S )as  Run more images through the embeddings and add to the vectorstore.

        Args:
            uris List[str]: File path to the image.
            metadatas (Optional[List[dict]], optional): Optional list of metadatas.
            ids (Optional[List[str]], optional): Optional list of IDs.

        Returns:
            List[str]: List of IDs of the added images.
        c                <    g | ]}                     |           S ))rv   )r   )r    rv   rb   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>   s*    @@@CT&&3&//@@@r%   Nc                N    g | ]"}t          t          j                              #S r   r<   uuiduuid4r    r"   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>   s&    3333tz||$$333r%   embed_imager   c                     g | ]
}|         S r   r   r    idxr2   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>       EEEYs^EEEr%   c                     g | ]
}|         S r   r   )r    r   	b64_textss     r#   r$   z%Chroma.add_images.<locals>.<listcomp>   s    (Q(Q(QC3(Q(Q(Qr%   c                     g | ]
}|         S r   r   r    r   ri   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>       >>>Z_>>>r%   c                     g | ]
}|         S r   r   r    r   r   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>       $G$G$G#SX$G$G$Gr%   r2   ri   r1   r   Expected metadata value to bezdTry filtering complex metadata using langchain_community.vectorstores.utils.filter_complex_metadata.r   

c                     g | ]
}|         S r   r   )r    jr   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>   s    +L+L+LQIaL+L+L+Lr%   c                     g | ]
}|         S r   r   r    r   ri   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>       666qZ]666r%   c                     g | ]
}|         S r   r   r    r   r   s     r#   r$   z%Chroma.add_images.<locals>.<listcomp>       (C(C(CAQ(C(C(Cr%   ri   r1   r   )r^   hasattrr   len	enumerateappendr`   upsert
ValueErrorr<   args)rb   r   r2   r   rr   length_diff	empty_idsnon_empty_idsr   mimages_with_metadatasembeddings_with_metadatasids_with_metadataemsgimages_without_metadatasembeddings_without_metadatasids_without_metadatasr   ri   s   ` ``              @@r#   
add_imageszChroma.add_images   s   $ A@@@4@@@	;33d333C
#/G$m5
 5
/ 1==4=HHJ 4	 d))c)nn4K ;%{(::	IM#I.. * *Q *!((----$$S))))  EEEE}EEE	(Q(Q(Q(Q=(Q(Q(Q%BLV>>>>>>>>RV * %H$G$G$G$G$G$G! $++"+#<"7-	 ,     "      6#a&&@@^  )V);c)ABBB   
+L+L+L+L)+L+L+L(:DN6666I6666$ - )D(C(C(C(C(C(C% '';6- (    ##%# $   
 
s   D, ,
E065E++E0textsIterable[str]c                   d D             dt                    | j        | j                                      rct                    t                    z
  }|r	i g|z  z   g }g }t	                    D ]2\  }}	|	r|                    |           |                    |           3|rfd|D             fd|D             }
rfd|D             nd}fd|D             }	 | j                            ||
|           nG# t          $ r:}dt          |          v r"d	}t          |j
        d
         dz   |z             |d}~ww xY w|rKfd|D             }rfd|D             nd}fd|D             }| j                            |||           n| j                                       S )a  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts (Iterable[str]): Texts to add to the vectorstore.
            metadatas (Optional[List[dict]], optional): Optional list of metadatas.
            ids (Optional[List[str]], optional): Optional list of IDs.

        Returns:
            List[str]: List of IDs of the added texts.
        Nc                N    g | ]"}t          t          j                              #S r   r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>  &    4443tz||$$444r%   c                     g | ]
}|         S r   r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>$  r   r%   c                     g | ]
}|         S r   r   )r    r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>%  s    'L'L'Lsc
'L'L'Lr%   c                     g | ]
}|         S r   r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>'  r   r%   c                     g | ]
}|         S r   r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>)  r   r%   r   r   zvTry filtering complex metadata from the document using langchain_community.vectorstores.utils.filter_complex_metadata.r   r   c                     g | ]
}|         S r   r   )r    r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>;  s    *G*G*G58*G*G*Gr%   c                     g | ]
}|         S r   r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>=  r   r%   c                     g | ]
}|         S r   r   r   s     r#   r$   z$Chroma.add_texts.<locals>.<listcomp>?  r   r%   r   )listr^   embed_documentsr   r   r   r`   r   r   r<   r   )rb   r   r2   r   rr   r   r   r   r   r   texts_with_metadatasr   r   r   r   texts_without_metadatasr   r   ri   s    ```              @r#   	add_textszChroma.add_texts   s   $ ;44e444C
U#/1AA%HHJ 4	 e**s9~~5K ;%{(::	IM#I.. * *Q *!((----$$S))))  EEEE}EEE	'L'L'L'Lm'L'L'L$BLV>>>>>>>>RV * %H$G$G$G$G$G$G! $++"+#<"6-	 ,     "      6#a&&@@^  )V);c)ABBB   
*G*G*G*GY*G*G*G':DN6666I6666$ - )D(C(C(C(C(C(C% '';5- (    ##% $   
 
s   7D 
E 5EErt   kfilterc                <     | j         ||fd|i|}d |D             S )ac  Run similarity search with Chroma.

        Args:
            query (str): Query text to search for.
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List[Document]: List of documents most similar to the query text.
        r   c                    g | ]\  }}|S r   r   r   s      r#   r$   z,Chroma.similarity_search.<locals>.<listcomp>a  s    222Q222r%   )similarity_search_with_score)rb   rt   r   r   rr   docs_and_scoress         r#   similarity_searchzChroma.similarity_searchM  sH    " <$;1
 
#
'-
 
 32/2222r%   	embeddingList[float]c                D     | j         d||||d|}t          |          S )a}  Return docs most similar to embedding vector.
        Args:
            embedding (List[float]): Embedding to look up documents similar to.
            k (int): Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.
        Returns:
            List of Documents most similar to the query vector.
        rk   rn   ro   rq   r   )_Chroma__query_collectionr(   rb   r   r   r   rq   rr   r   s          r#   similarity_search_by_vectorz"Chroma.similarity_search_by_vectorc  sH      *$) 
&)	
 

 
 
  (((r%   r)   c                D     | j         d||||d|}t          |          S )a  
        Return docs most similar to embedding vector and similarity score.

        Args:
            embedding (List[float]): Embedding to look up documents similar to.
            k (int): Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List[Tuple[Document, float]]: List of documents most similar to
            the query text and cosine distance in float for each.
            Lower score represents more similarity.
        r   r   )r   r&   r   s          r#   1similarity_search_by_vector_with_relevance_scoresz8Chroma.similarity_search_by_vector_with_relevance_scores|  sH    * *$) 
&)	
 

 
 
 +7333r%   c                    | j          | j        d|g|||d|}n-| j                             |          } | j        d|g|||d|}t          |          S )a  Run similarity search with Chroma with distance.

        Args:
            query (str): Query text to search for.
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List[Tuple[Document, float]]: List of documents most similar to
            the query text and cosine distance in float for each.
            Lower score represents more similarity.
        N)rj   rn   ro   rq   r   r   )r^   r   embed_queryr&   )rb   rt   r   r   rq   rr   r   query_embeddings           r#   r   z#Chroma.similarity_search_with_score  s    ( #+-d- "G-	 
  GG #6BB5IIO-d- "1!2-	 
  G +7333r%   Callable[[float], float]c                    | j         r| j         S d}d}| j        j        }|r||v r||         }|dk    r| j        S |dk    r| j        S |dk    r| j        S t          d| d          )a8  
        The 'correct' relevance function
        may differ depending on a few things, including:
        - the distance / similarity metric used by the VectorStore
        - the scale of your embeddings (OpenAI's are unit normed. Many others are not!)
        - embedding dimensionality
        - etc.
        l2z
hnsw:spacecosineipzANo supported normalization function for distance metric of type: z=.Consider providing relevance_score_fn to Chroma constructor.)ra   r`   r.   _cosine_relevance_score_fn_euclidean_relevance_score_fn%_max_inner_product_relevance_score_fnr   )rb   distancedistance_keyr.   s       r#   _select_relevance_score_fnz!Chroma._select_relevance_score_fn  s     + 	433##, 	.00-Hx2255==O19O O O  r%   c                    | j         t          | j         d          st          d          | j                             |g          } | j        d|||d|}|S )a  Search for similar images based on the given image URI.

        Args:
            uri (str): URI of the image to search for.
            k (int, optional): Number of results to return. Defaults to DEFAULT_K.
            filter (Optional[Dict[str, str]], optional): Filter by metadata.
            **kwargs (Any): Additional arguments to pass to function.

        Returns:
            List of Images most similar to the provided image.
            Each element in list is a Langchain Document Object.
            The page content is b64 encoded image, metadata is default or
            as defined by user.

        Raises:
            ValueError: If the embedding function does not support image embeddings.
        Nr   4The embedding function must support image embedding.r   r   r   r   r   )r^   r   r   r   r   rb   rv   r   r   rr   image_embeddingr   s          r#   similarity_search_by_imagez!Chroma.similarity_search_by_image  s    0 #+7$m4
 4
+ STTT 2>>SE>JJ 3$2 
%
 
 	
 
 r%   c                    | j         t          | j         d          st          d          | j                             |g          } | j        d|||d|}|S )a!  Search for similar images based on the given image URI.

        Args:
            uri (str): URI of the image to search for.
            k (int, optional): Number of results to return.
            Defaults to DEFAULT_K.
            filter (Optional[Dict[str, str]], optional): Filter by metadata.
            **kwargs (Any): Additional arguments to pass to function.

        Returns:
            List[Tuple[Document, float]]: List of tuples containing documents similar
            to the query image and their similarity scores.
            0th element in each tuple is a Langchain Document Object.
            The page content is b64 encoded img, metadata is default or defined by user.

        Raises:
            ValueError: If the embedding function does not support image embeddings.
        Nr   r   r   r   r   )r^   r   r   r   r   r   s          r#   /similarity_search_by_image_with_relevance_scorez6Chroma.similarity_search_by_image_with_relevance_score  s    2 #+7$m4
 4
+ STTT 2>>SE>JJ I$H 
%
 
 	
 
 r%      g      ?fetch_klambda_multfloatc           	          | j         d||||g dd|}t          t          j        |t          j                  |d         d         ||          t          |          }	fdt          |	          D             }
|
S )	aH  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        )r2   r1   r3   ri   )rk   rn   ro   rq   include)dtyperi   r   )r   r   c                "    g | ]\  }}|v 	|S r   r   )r    irmmr_selecteds      r#   r$   zBChroma.max_marginal_relevance_search_by_vector.<locals>.<listcomp>f  s'    UUU$!Q1CTCTACTCTCTr%   r   )r   r   nparrayfloat32r(   r   )rb   r   r   r   r   r   rq   rr   r   
candidatesselected_resultsr   s              @r#   'max_marginal_relevance_search_by_vectorz.Chroma.max_marginal_relevance_search_by_vector9  s    8 *$) 
&)III
 
 
 
 2HYbj111L!!$#	
 
 
 &g..
UUUU)J*?*?UUUr%   c                    | j         t          d          | j                             |          }|                     ||||||          }	|	S )a?  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        NzBFor MMR search, you must specify an embedding function oncreation.)r   r   rq   )r^   r   r   r   )
rb   rt   r   r   r   r   rq   rr   r   docss
             r#   max_marginal_relevance_searchz$Chroma.max_marginal_relevance_searchi  sm    6 #+W   ,88??	;;#) < 
 
 r%   c                N    | j                             | j        j                   dS )zDelete the collection.N)rV   delete_collectionr`   rQ   rh   s    r#   r  zChroma.delete_collection  s$    &&t'7'<=====r%   Optional[OneOrMany[ID]]Optional[Where]limitOptional[int]offsetOptional[WhereDocument]r   Dict[str, Any]c                D    |||||d}|||d<    | j         j        di |S )aR  Gets the collection.

        Args:
            ids: The ids of the embeddings to get. Optional.
            where: A Where type dict used to filter results by.
                   E.g. `{"color" : "red", "price": 4.20}`. Optional.
            limit: The number of documents to return. Optional.
            offset: The offset to start returning results from.
                    Useful for paging results with limit. Optional.
            where_document: A WhereDocument type dict used to filter by the documents.
                            E.g. `{$contains: "hello"}`. Optional.
            include: A list of what to include in the results.
                     Can contain `"embeddings"`, `"metadatas"`, `"documents"`.
                     Ids are always included.
                     Defaults to `["metadatas", "documents"]`. Optional.
        )r   ro   r  r
  rq   Nr   r   )r`   get)rb   r   ro   r  r
  rq   r   rr   s           r#   r  z
Chroma.get  sM    4 ,
 
  'F9#t#--f---r%   z0.1.17zlSince Chroma 0.4.x the manual persistence method is no longer supported as docs are automatically persisted.r5   )r6   messager7   c                    | j         t          d          ddl}|j                            d          \  }}}t          |          dk    r.t          |          dk     r| j                                         dS dS dS )a+  Persist the collection.

        This can be used to explicitly persist the data to disk.
        It will also be called automatically when the object is destroyed.

        Since Chroma 0.4.x the manual persistence method is no longer
        supported as docs are automatically persisted.
        NzJYou must specify a persist_directory oncreation to persist the collection.r   rN   r   )rW   r   rR   rX   rY   rZ   rV   persist)rb   rR   rc   rd   r"   s        r#   r  zChroma.persist  s    " "*6   	 #.44S99uau::??s5zzA~~L  """"" ?~~r%   document_iddocumentr   c                2    |                      |g|g          S )zUpdate a document in the collection.

        Args:
            document_id (str): ID of the document to update.
            document (Document): Document to update.
        )update_documents)rb   r  r  s      r#   update_documentzChroma.update_document  s     $$k]XJ???r%   r1   c                   d |D             }d |D             }| j         t          d          | j                             |          }t          | j        j        d          st          | j        j        d          r[ddlm}  || j        j        ||||	          D ]8}| j                            |d         |d
         |d         |d                    9dS | j                            ||||           dS )zUpdate a document in the collection.

        Args:
            ids (List[str]): List of ids of the document to update.
            documents (List[Document]): List of documents to update.
        c                    g | ]	}|j         
S r   r-   r    r  s     r#   r$   z+Chroma.update_documents.<locals>.<listcomp>  s    @@@(%@@@r%   c                    g | ]	}|j         
S r   r.   r  s     r#   r$   z+Chroma.update_documents.<locals>.<listcomp>  s    @@@(H%@@@r%   Nz?For update, you must specify an embedding function on creation.get_max_batch_sizemax_batch_sizer   create_batches)apir   r2   r1   ri   r,      r/   )r   ri   r1   r2   )	r^   r   r   r   r`   rV   chromadb.utils.batch_utilsr   update)rb   r   r1   textr.   ri   r   batchs           r#   r  zChroma.update_documents  sn    A@i@@@@@i@@@#+Q   -==dCC
$ 
 
 	 $&6
 
	 BAAAAA'$,"%      ''a$Qx#Ah#Ah	 (      ##%"	 $     r%   clsType[Chroma]c
           
     |    | d||||||	d|
}|d |D             }t          |j        d          st          |j        d          r\ddlm}  ||j        |||          D ]@}|                    |d	         r|d	         ng |d
         r|d
         nd|d                    An|                    |||           |S )a  Create a Chroma vectorstore from a raw documents.

        If a persist_directory is specified, the collection will be persisted there.
        Otherwise, the data will be ephemeral in-memory.

        Args:
            texts (List[str]): List of texts to add to the collection.
            collection_name (str): Name of the collection to create.
            persist_directory (Optional[str]): Directory to persist the collection.
            embedding (Optional[Embeddings]): Embedding function. Defaults to None.
            metadatas (Optional[List[dict]]): List of metadatas. Defaults to None.
            ids (Optional[List[str]]): List of document IDs. Defaults to None.
            client_settings (Optional[chromadb.config.Settings]): Chroma client settings
            collection_metadata (Optional[Dict]): Collection configurations.
                                                  Defaults to None.

        Returns:
            Chroma: Chroma vectorstore.
        )r>   r?   rA   rC   rG   rE   Nc                N    g | ]"}t          t          j                              #S r   r   r   s     r#   r$   z%Chroma.from_texts.<locals>.<listcomp>;  r   r%   r  r  r   r  )r!  r   r2   r1   r"  r/   )r   r2   r   r   )r   rV   r#  r   r   )r'  r   r   r2   r   r>   rA   rC   rG   rE   rr   chroma_collectionr   r&  s                 r#   
from_textszChroma.from_texts  sP   B  C 
+(/+ 3
 
 
 
 ;44e444C% 
 
 	S %
 
	S BAAAAA'%-#	   
 
 "++&+Ah6%((B*/(<eAhha ,    
 ''eyc'RRR  r%   c	                `    d |D             }
d |D             } | j         d|
||||||||d	|	S )a  Create a Chroma vectorstore from a list of documents.

        If a persist_directory is specified, the collection will be persisted there.
        Otherwise, the data will be ephemeral in-memory.

        Args:
            collection_name (str): Name of the collection to create.
            persist_directory (Optional[str]): Directory to persist the collection.
            ids (Optional[List[str]]): List of document IDs. Defaults to None.
            documents (List[Document]): List of documents to add to the vectorstore.
            embedding (Optional[Embeddings]): Embedding function. Defaults to None.
            client_settings (Optional[chromadb.config.Settings]): Chroma client settings
            collection_metadata (Optional[Dict]): Collection configurations.
                                                  Defaults to None.

        Returns:
            Chroma: Chroma vectorstore.
        c                    g | ]	}|j         
S r   r  r    r!   s     r#   r$   z)Chroma.from_documents.<locals>.<listcomp>u  s    777c!777r%   c                    g | ]	}|j         
S r   r  r/  s     r#   r$   z)Chroma.from_documents.<locals>.<listcomp>v  s    777cS\777r%   )	r   r   r2   r   r>   rA   rC   rG   rE   r   )r,  )r'  r1   r   r   r>   rA   rC   rG   rE   rr   r   r2   s               r#   from_documentszChroma.from_documentsT  sp    B 87Y77777Y777	s~ 
+/+ 3
 
 
 
 	
r%   c                .     | j         j        dd|i| dS )zUDelete by vector IDs.

        Args:
            ids: List of ids to delete.
        r   Nr   )r`   delete)rb   r   rr   s      r#   r3  zChroma.delete  s+     	 22C2622222r%   c                4    | j                                         S )z0Count the number of documents in the collection.)r`   countrh   s    r#   __len__zChroma.__len__  s    %%'''r%   )r>   r<   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r   rK   )r   r@   )NNr   NN)rj   rl   rk   rm   rn   rZ   ro   rp   rq   rp   rr   r   r   r   )rv   r<   r   r<   )NN)
r   r   r2   r   r   rl   rr   r   r   r   )
r   r   r2   r   r   rl   rr   r   r   r   )
rt   r<   r   rZ   r   rp   rr   r   r   r   )r   r   r   rZ   r   rp   rq   rp   rr   r   r   r   )r   r   r   rZ   r   rp   rq   rp   rr   r   r   r)   )rt   r<   r   rZ   r   rp   rq   rp   rr   r   r   r)   )r   r   )
rv   r<   r   rZ   r   rp   rr   r   r   r   )
rv   r<   r   rZ   r   rp   rr   r   r   r)   )r   r   r   rZ   r   rZ   r   r   r   rp   rq   rp   rr   r   r   r   )rt   r<   r   rZ   r   rZ   r   r   r   rp   rq   rp   rr   r   r   r   )r   rK   )NNNNNN)r   r  ro   r  r  r	  r
  r	  rq   r  r   rl   r   r  )r  r<   r  r   r   rK   )r   r   r1   r   r   rK   )r'  r(  r   r   r   r@   r2   r   r   rl   r>   r<   rA   rB   rC   rD   rG   rH   rE   rF   rr   r   r   r:   )r'  r(  r1   r   r   r@   r   rl   r>   r<   rA   rB   rC   rD   rG   rH   rE   rF   rr   r   r   r:   rg   )r   rl   rr   r   r   rK   )r   rZ   )#__name__
__module____qualname____doc__r=   __annotations__re   propertyri   r   r   r   r   r   	DEFAULT_Kr   r   r   r   r   r   r   r   r  r  r  r   r  r  r  classmethodr,  r1  r3  r6  r   r%   r#   r:   r:   5   s          /:&9999  B37+/>B.2,0AE>> >> >> >> >>@ ( ( ( X( X122 ,08<*.37
 
 
 
 32
4G G G G +/#'	Q Q Q Q Ql +/#'	M M M M Md +/	3 3 3 3 32 +/37) ) ) ) )8 +/374 4 4 4 4B +/37&4 &4 &4 &4 &4P   F +/	) ) ) ) )\ +/	* * * * *^  +/37.  .  .  .  . f  +/37) ) ) ) )V> > > > (,!%# $26'+$. $. $. $. $.L Z=   # # # #*@ @ @ @* * * *X  +/*.#'A+/>B,0.2A! A! A! A! [A!F  +/#'A+/>B .2-
 -
 -
 -
 [-
^3 3 3 3 3( ( ( ( ( (r%   r:   )r   r   r   r   )r   r   r   r)   )*
__future__r   rz   loggingr   typingr   r   r   r   r   r	   r
   r   r   numpyr   langchain_core._apir   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   rR   rS   chromadb.api.typesr   r   r   r   	getLoggerloggerr=  r(   r&   r:   r   r%   r#   <module>rL     s   " " " " " "   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     * * * * * * - - - - - - 0 0 0 0 0 0 ) ) ) ) ) ) 3 3 3 3 3 3 M M M M M M GOOOFFFFFFFFFFFF					D D D D
 
 
 
 '5=VWWWX( X( X( X( X([ X( X( XWX( X( X(r%   