
    hK                    
   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 d dl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 erd dlZdd
Z	 	 d	 	 	 	 	 	 	 ddZddZddZ eddd       G d de             Z y)    )annotationsN)TYPE_CHECKINGAnyCallableDictIterableListOptionalTuple)uuid4)
deprecated)Document)
Embeddings)VectorStore)maximal_marginal_relevancec                    | |dgdgdS )Ntext)namedataType)class
properties )
index_nametext_keys     g/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/weaviate.py_default_schemar      s#     !#H
     c                2   	 dd l }| xs t        j                  j	                  d      } |xs t        j                  j	                  d      }|r|j
                  j                  |      nd } |j                  d| |d|S # t        $ r t        d      w xY w)Nr   _Could not import weaviate python  package. Please install it with `pip install weaviate-client`WEAVIATE_URLWEAVIATE_API_KEY)api_key)urlauth_client_secretr   )weaviateImportErrorosenvirongetauth
AuthApiKeyClient)r#   r"   kwargsr%   r*   s        r   _create_weaviate_clientr.   )   s    

 
//C;(:;G8?8==##G#4TD8??FstFvFF  
C
 	

s   B Bc                >    dddt        j                  |       z   z  z
  S )N   )npexp)vals    r   _default_score_normalizerr4   ;   s    qAsO$$$r   c                Z    t        | t        j                        r| j                         S | S N)
isinstancedatetime	isoformat)values    r   _json_serializabler;   ?   s$    %**+  Lr   z0.3.18z1.0z&langchain_weaviate.WeaviateVectorStore)sinceremovalalternative_importc                     e Zd ZdZddedf	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       ZddZ	 d	 	 	 	 	 	 	 ddZ		 d	 	 	 	 	 	 	 ddZ
	 d	 	 	 	 	 	 	 dd	Z	 d	 	 	 	 	 	 	 dd
Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZe	 dddddddded	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zdd dZy)!Weaviatea  `Weaviate` vector store.

    To use, you should have the ``weaviate-client`` python package installed.

    Example:
        .. code-block:: python

            import weaviate
            from langchain_community.vectorstores import Weaviate

            client = weaviate.Client(url=os.environ["WEAVIATE_URL"], ...)
            weaviate = Weaviate(client, index_name, text_key)

    NTc                L   	 ddl }t        ||j                        st	        dt        |             || _        || _        || _        || _	        | j                  g| _
        || _        || _        || j                  j                  |       yy# t        $ r t        d      w xY w)z Initialize with Weaviate client.r   Nz_Could not import weaviate python package. Please install it with `pip install weaviate-client`.z5client should be an instance of weaviate.Client, got )r%   r&   r7   r,   
ValueErrortype_client_index_name
_embedding	_text_key_query_attrsrelevance_score_fn_by_textextend)	selfclientr   r   	embedding
attributesrI   by_textr%   s	            r   __init__zWeaviate.__init__Z   s    	 &(//2GV~V  %#!!^^,"4!$$Z0 "!  	H 	s   B B#c                    | j                   S r6   )rF   rL   s    r   
embeddingszWeaviate.embeddings|   s    r   c                >    | j                   r| j                   S t        S r6   )rI   r4   rS   s    r   _select_relevance_score_fnz#Weaviate._select_relevance_score_fn   s'     && ##	
 +	
r   c                p   ddl m} g }d}| j                  r6t        |t              st	        |      }| j                  j                  |      }| j                  j                  5 }t        |      D ]  \  }}	| j                  |	i}
|)||   j                         D ]  \  }}t        |      |
|<     |t                     }d|v r	|d   |   }nd|v r|d   |   }|j                  |
| j                  ||r||   nd|j                  d             |j!                  |        	 ddd       |S # 1 sw Y   |S xY w)z4Upload texts with metadata (properties) to Weaviate.r   get_valid_uuidNuuidsidstenant)data_object
class_nameuuidvectorr\   )weaviate.utilrY   rF   r7   listembed_documentsrD   batch	enumeraterG   itemsr;   r   add_data_objectrE   r)   append)rL   texts	metadatasr-   rY   r[   rT   rd   ir   data_propertieskeyr3   _ids                 r   	add_textszWeaviate.add_texts   sH    	126
??eT*U88?J\\ 	 5$U+  4#'>>4"8($-aL$6$6$8 GS/A#/F,G %UW-f$ /!,Cf_ -*C%% /#//,6:a=D!::h/ &  

3/ 	 2 
3	 2 
s   #B=D++D5c                    | j                   r | j                  ||fi |S | j                  t        d      | j                  j	                  |      } | j
                  ||fi |S )Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.

        Returns:
            List of Documents most similar to the query.
        zC_embedding cannot be None for similarity_search when _by_text=False)rJ   similarity_search_by_textrF   rB   embed_querysimilarity_search_by_vector)rL   querykr-   rN   s        r   similarity_searchzWeaviate.similarity_search   sq     ==1411%EfEE& %  33E:I3433IqKFKKr   c                    d|gi}|j                  d      r|j                  d      |d<   | j                  j                  j                  | j                  | j                        }|j                  d      r |j                  |j                  d            }|j                  d      r |j                  |j                  d            }|j                  d      r |j                  |j                  d            }|j                  |      j                  |      j                         }d|v rt        d|d          g }|d	   d
   | j                     D ]9  }|j                  | j                        }	|j                  t        |	|             ; |S )rq   conceptssearch_distance	certaintywhere_filterr\   
additionalerrorsError during query: dataGetpage_contentmetadata)r)   rD   ru   rE   rH   
with_wherewith_tenantwith_additionalwith_near_text
with_limitdorB   poprG   rh   r   )
rL   ru   rv   r-   content	query_objresultdocsresr   s
             r   rr   z"Weaviate.similarity_search_by_text   sc    $.w"7::'(#)::.?#@GK LL&&**4+;+;T=N=NO	::n%!,,VZZ-GHI::h!--fjj.BCI::l#!11&**\2JKI))'2==a@CCEv3F84D3EFGG&>%()9)9: 	CC774>>*DKKdSAB	C r   c                   d|i}| j                   j                  j                  | j                  | j                        }|j                  d      r |j                  |j                  d            }|j                  d      r |j                  |j                  d            }|j                  d      r |j                  |j                  d            }|j                  |      j                  |      j                         }d|v rt        d|d          g }|d   d   | j                     D ]9  }|j                  | j                        }	|j                  t        |	|	             ; |S )
z:Look up similar documents by embedding vector in Weaviate.r`   r|   r\   r}   r~   r   r   r   r   )rD   ru   r)   rE   rH   r   r   r   with_near_vectorr   r   rB   r   rG   rh   r   )
rL   rN   rv   r-   r`   r   r   r   r   r   s
             r   rt   z$Weaviate.similarity_search_by_vector   s@    I&LL&&**4+;+;T=N=NO	::n%!,,VZZ-GHI::h!--fjj.BCI::l#!11&**\2JKI++F3>>qADDFv3F84D3EFGG&>%()9)9: 	CC774>>*DKKdSAB	C r   c                    | j                   | j                   j                  |      }nt        d       | j                  |f|||d|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.

        Returns:
            List of Documents selected by maximal marginal relevance.
        zCmax_marginal_relevance_search requires a suitable Embeddings object)rv   fetch_klambda_mult)rF   rs   rB   'max_marginal_relevance_search_by_vector)rL   ru   rv   r   r   r-   rN   s          r   max_marginal_relevance_searchz&Weaviate.max_marginal_relevance_search   s`    2 ??&33E:IU  <t;;
G
HN
 	
r   c                   d|i}| j                   j                  j                  | j                  | j                        }|j                  d      r |j                  |j                  d            }|j                  d      r |j                  |j                  d            }|j                  d      j                  |      j                  |      j                         }|d   d   | j                     }	|	D 
cg c]
  }
|
d   d    }}
t        t        j                  |      |||      }g }|D ]U  }|	|   j                  | j                        }|	|   j                  d       |	|   }|j!                  t#        ||             W |S c c}
w )	a  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.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r`   r|   r\   r   r   _additional)rv   r   r   )rD   ru   r)   rE   rH   r   r   r   r   r   r   r   r1   arrayr   rG   rh   r   )rL   rN   rv   r   r   r-   r`   r   resultspayloadr   rT   mmr_selectedr   idxr   metas                    r   r   z0Weaviate.max_marginal_relevance_search_by_vector!  sn   2 I&LL&&**4+;+;T=N=NO	::n%!,,VZZ-GHI::h!--fjj.BCI%%h/f%Z RT	 	 &/%()9)9:DKL&f]+H5L
L1HHYqk
  	DC3<##DNN3DCL]+3<DKKdTBC		D
  Ms   7Fc                   | j                   t        d      d|gi}|j                  d      r|j                  d      |d<   | j                  j                  j                  | j
                  | j                        }|j                  d      r |j                  |j                  d            }|j                  d      r |j                  |j                  d            }| j                   j                  |      }| j                  sBd|i}|j                  |      j                  |      j                  d      j                         }n=|j                  |      j                  |      j                  d      j                         }d|v rt        d	|d          g }	|d
   d   | j
                     D ]W  }
|
j!                  | j"                        }t%        j&                  |
d   d   |      }|	j)                  t+        ||
      |f       Y |	S )z
        Return list of documents most similar to the query
        text and cosine distance in float for each.
        Lower score represents more similarity.
        z:_embedding cannot be None for similarity_search_with_scorery   rz   r{   r|   r\   r`   r~   r   r   r   r   r   )rF   rB   r)   rD   ru   rE   rH   r   r   rs   rJ   r   r   r   r   r   r   rG   r1   dotrh   r   )rL   ru   rv   r-   r   r   embedded_queryr`   r   docs_and_scoresr   r   scores                r   similarity_search_with_scorez%Weaviate.similarity_search_with_scoreU  s    ??"L  $.w"7::'(#)::.?#@GK LL&&**4+;+;T=N=NO	::n%!,,VZZ-GHI::h!--fjj.BCI44U;}}/F**62A *	  ((1A *	  v3F84D3EFGG&>%()9)9: 	WC774>>*DFF3}-h7HE""H$$Mu#UV	W r   r   F)rM   weaviate_urlweaviate_api_key
batch_sizer   r   rP   rI   c                  	 ddl m} |xs t        ||      }|r|j                  j                  |       |xs dt               j                   }t        ||	      }|j                  j                  |      s|j                  j                  |       |r|j                  |      nd}|rt        |d   j                               nd}d|v r|j                  d      }n/t!        t#        |            D cg c]  } |t                      }}|j                  5 }t%        |      D ]U  \  }}|	|i}|#||   j                         D ]  }||   |   ||<    ||   }|||d	}|||   |d
<    |j&                  di | W |j)                          ddd        | |||	f||||
d|S # t        $ r}t        d      |d}~ww xY wc c}w # 1 sw Y   ;xY w)av  Construct Weaviate wrapper from raw documents.

        This is a user-friendly interface that:
            1. Embeds documents.
            2. Creates a new index for the embeddings in the Weaviate instance.
            3. Adds the documents to the newly created Weaviate index.

        This is intended to be a quick way to get started.

        Args:
            texts: Texts to add to vector store.
            embedding: Text embedding model to use.
            metadatas: Metadata associated with each text.
            client: weaviate.Client to use.
            weaviate_url: The Weaviate URL. If using Weaviate Cloud Services get it
                from the ``Details`` tab. Can be passed in as a named param or by
                setting the environment variable ``WEAVIATE_URL``. Should not be
                specified if client is provided.
            weaviate_api_key: The Weaviate API key. If enabled and using Weaviate Cloud
                Services, get it from ``Details`` tab. Can be passed in as a named param
                or by setting the environment variable ``WEAVIATE_API_KEY``. Should
                not be specified if client is provided.
            batch_size: Size of batch operations.
            index_name: Index name.
            text_key: Key to use for uploading/retrieving text to/from vectorstore.
            by_text: Whether to search by text or by embedding.
            relevance_score_fn: Function for converting whatever distance function the
                vector store uses to a relevance score, which is a normalized similarity
                score (0 means dissimilar, 1 means similar).
            kwargs: Additional named parameters to pass to ``Weaviate.__init__()``.

        Example:
            .. code-block:: python

                from langchain_community.embeddings import OpenAIEmbeddings
                from langchain_community.vectorstores import Weaviate

                embeddings = OpenAIEmbeddings()
                weaviate = Weaviate.from_texts(
                    texts,
                    embeddings,
                    weaviate_url="http://localhost:8080"
                )
        r   rX   r   N)r#   r"   )r   
LangChain_rZ   )r_   r]   r^   r`   )rN   rO   rI   rP   r   )ra   rY   r&   r.   rd   	configurer   hexr   schemaexistscreate_classrc   rb   keysr   rangelenre   rg   flush)clsri   rN   rj   rM   r   r   r   r   r   rP   rI   r-   rY   er   rT   rO   rZ   _rd   rk   r   rl   rm   rn   paramss                              r   
from_textszWeaviate.from_texts  s!   @	4  
2$
 LL""j"9=Z}#=
 X6}}##J/MM&&v.9BY..u5
2;T)A,++-.
 fJJw'E6;CJ6GH^EG,HEH\\ 	U$U+ 04d# ((|002 A/8|C/@,A Ah  #2",
 )'1!}F8$%%%//-00 KKM3	6 	
  !1	
 	
 		
q  	G 	6 I	 	s*   F& 5GA4G&	G /F;;G Gc                x    |t        d      |D ](  }| j                  j                  j                  |       * y)zUDelete by vector IDs.

        Args:
            ids: List of ids to delete.
        NzNo ids provided to delete.)r_   )rB   rD   r]   delete)rL   r[   r-   ids       r   r   zWeaviate.delete
  sA     ;9::  	5BLL$$+++4	5r   )rM   r   r   strr   r   rN   Optional[Embeddings]rO   Optional[List[str]]rI   "Optional[Callable[[float], float]]rP   bool)returnr   )r   zCallable[[float], float]r6   )ri   zIterable[str]rj   Optional[List[dict]]r-   r   r   	List[str])   )ru   r   rv   intr-   r   r   List[Document])rN   List[float]rv   r   r-   r   r   r   )r      g      ?)ru   r   rv   r   r   r   r   floatr-   r   r   r   )rN   r   rv   r   r   r   r   r   r-   r   r   r   )ru   r   rv   r   r-   r   r   zList[Tuple[Document, float]])ri   r   rN   r   rj   r   rM   zOptional[weaviate.Client]r   Optional[str]r   r   r   zOptional[int]r   r   r   r   rP   r   rI   r   r-   r   r   r@   )r[   r   r-   r   r   None)__name__
__module____qualname____doc__r4   rQ   propertyrT   rV   ro   rw   rr   rt   r   r   r   classmethodr   r   r   r   r   r@   r@   E   s   ( +/*. & 1 1  1 	 1
 ( 1 ( 1
 1  1D  
 +/)) () 	)
 
)X $%LL L03L	L0 $% 03	@ 01$),<?	0  "
"
 "
 	"

 "
 "
 
"
N  22 2 	2
 2 2 
2j $%.. .03.	%.` 
 +/	B
 -1&**.$($( &B
B
 B
 (	B
 *B
 $B
 (B
 "B
 "B
 B
 B

B
  !B
" 
#B
 B
H5r   r@   )r   r   r   r   r   r   )NN)r#   r   r"   r   r-   r   r   zweaviate.Client)r3   r   r   r   )r:   r   r   r   )!
__future__r   r8   r'   typingr   r   r   r   r   r	   r
   r   r_   r   numpyr1   langchain_core._apir   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r%   r   r.   r4   r;   r@   r   r   r   <module>r      s    "  		 	 	   * - 0 3 M	 !G	GG G 	G$% 
?
L5{ L5
L5r   