U
    h                     @   s   d dl mZmZmZmZ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mZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ edddZG dd deZee dddZG dd deZdS )    )AnyDictListOptionalType)
BaseLoader)Document)
Embeddings)BaseLanguageModel)	BaseModelField)VectorStore)RecursiveCharacterTextSplitterTextSplitter)RetrievalQAWithSourcesChain)RetrievalQA)returnc                   C   s   t dddS )Ni  r   )
chunk_sizeZchunk_overlap)r    r   r   A/tmp/pip-unpacked-wheel-bo69hh5q/langchain/indexes/vectorstore.py_get_default_text_splitter   s    r   c                   @   s   e Zd ZU dZeed< G dd dZdeee	 ee
eef  eedddZdeee	 ee
eef  eedd	d
Zdeee	 ee
eef  eedddZdeee	 ee
eef  eedddZdS )VectorStoreIndexWrapperz-Wrapper around a vectorstore for easy access.vectorstorec                   @   s   e Zd ZdZdZdS )zVectorStoreIndexWrapper.ConfigTforbidN__name__
__module____qualname__Zarbitrary_types_allowedextrar   r   r   r   Config   s   r   N)questionllmretriever_kwargskwargsr   c                 K   sN   |dkrt d|pi }tj|fd| jjf |i|}||j|i|j S zQuery the vectorstore.NThis API has been changed to require an LLM. Please provide an llm to use for querying the vectorstore.
For example,
from langchain_openai import OpenAI
llm = OpenAI(temperature=0)	retriever)NotImplementedErrorr   from_chain_typer   as_retrieverinvoke	input_key
output_keyselfr    r!   r"   r#   chainr   r   r   query   s    zVectorStoreIndexWrapper.queryc                    sT   |dkrt d|pi }tj|fd| jjf |i|}||j|iI dH |j S r$   )r'   r   r(   r   r)   ainvoker+   r,   r-   r   r   r   aquery2   s    zVectorStoreIndexWrapper.aqueryc                 K   sH   |dkrt d|pi }tj|fd| jjf |i|}||j|iS z+Query the vectorstore and get back sources.Nr%   r&   )r'   r   r(   r   r)   r*   question_keyr-   r   r   r   query_with_sourcesH   s    z*VectorStoreIndexWrapper.query_with_sourcesc                    sN   |dkrt d|pi }tj|fd| jjf |i|}||j|iI dH S r3   )r'   r   r(   r   r)   r1   r4   r-   r   r   r   aquery_with_sources^   s    z+VectorStoreIndexWrapper.aquery_with_sources)NN)NN)NN)NN)r   r   r   __doc__r   __annotations__r   strr   r
   r   r   r0   r2   dictr5   r6   r   r   r   r   r      sN   
        r   c                  C   sD   ddl } zddlm} W n tk
r4   tdY nX | d |S )zGet the InMemoryVectorStore.r   N)InMemoryVectorStorezBPlease install langchain-community to use the InMemoryVectorStore.zUsing InMemoryVectorStore as the default vectorstore.This memory store won't persist data. You should explicitlyspecify a vectorstore when using VectorstoreIndexCreator)warningsZ)langchain_community.vectorstores.inmemoryr;   ImportErrorwarn)r<   r;   r   r   r   _get_in_memory_vectorstoreu   s    
r?   c                   @   s   e Zd ZU dZeedZee e	d< e
e	d< eedZee	d< eedZee	d< G dd dZee ed	d
dZee ed	ddZee edddZee edddZdS )VectorstoreIndexCreatorzLogic for creating indexes.)default_factoryvectorstore_cls	embeddingtext_splittervectorstore_kwargsc                   @   s   e Zd ZdZdZdS )zVectorstoreIndexCreator.ConfigTr   Nr   r   r   r   r   r      s   r   )loadersr   c                 C   s&   g }|D ]}| |  q| |S )(Create a vectorstore index from loaders.)extendloadfrom_documents)r.   rF   docsloaderr   r   r   from_loaders   s    z$VectorstoreIndexCreator.from_loadersc                    s@   g }|D ]&}|  2 z3 dH W }|| q6 q| |I dH S )rG   N)Z
alazy_loadappendafrom_documents)r.   rF   rK   rL   docr   r   r   afrom_loaders   s
    z%VectorstoreIndexCreator.afrom_loaders)	documentsr   c                 C   s,   | j |}| jj|| jf| j}t|dS )*Create a vectorstore index from documents.r   )rD   split_documentsrB   rJ   rC   rE   r   r.   rR   Zsub_docsr   r   r   r   rJ      s     z&VectorstoreIndexCreator.from_documentsc                    s2   | j |}| jj|| jf| jI dH }t|dS )rS   NrT   )rD   rU   rB   rO   rC   rE   r   rV   r   r   r   rO      s     
z'VectorstoreIndexCreator.afrom_documentsN)r   r   r   r7   r   r?   rB   r   r   r8   r	   r   rD   r   r:   rE   r   r   r   r   rM   rQ   r   rJ   rO   r   r   r   r   r@      s   
	r@   N)typingr   r   r   r   r   Zlangchain_core.document_loadersr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.language_modelsr
   Zlangchain_core.pydantic_v1r   r   Zlangchain_core.vectorstoresr   Zlangchain_text_splittersr   r   Z*langchain.chains.qa_with_sources.retrievalr   Z"langchain.chains.retrieval_qa.baser   r   r   r?   r@   r   r   r   r   <module>   s   b