
    Ng9&                    ~    d dl m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mZ d dlmZmZ  G d de          ZdS )	    )annotations)AnyDictIterableListOptionalTupleTypeUnion)Document)
Embeddings)VectorStoreVectorStoreRetrieverc                       e Zd ZdZ	 	 	 	 	 d7d8dZ	 	 d9d:dZd;d<dZ	 d=d>d Z	 d=d?d"Z	 d=d@d%Z		 d=dAd(Z
	 d=dBd)Z	 	 	 dCdDd/Z	 	 	 dCdEd0Ze	 	 d9dFd4            ZdG fd6Z xZS )H
VespaStorea  
    `Vespa` vector store.

    To use, you should have the python client library ``pyvespa`` installed.

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import VespaStore
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            from vespa.application import Vespa

            # Create a vespa client dependent upon your application,
            # e.g. either connecting to Vespa Cloud or a local deployment
            # such as Docker. Please refer to the PyVespa documentation on
            # how to initialize the client.

            vespa_app = Vespa(url="...", port=..., application_package=...)

            # You need to instruct LangChain on which fields to use for embeddings
            vespa_config = dict(
                page_content_field="text",
                embedding_field="embedding",
                input_field="query_embedding",
                metadata_fields=["date", "rating", "author"]
            )

            embedding_function = OpenAIEmbeddings()
            vectorstore = VespaStore(vespa_app, embedding_function, **vespa_config)

    Nappr   embedding_functionOptional[Embeddings]page_content_fieldOptional[str]embedding_fieldinput_fieldmetadata_fieldsOptional[List[str]]returnNonec                   	 ddl m} n# t          $ r t          d          w xY wt          ||          st	          dt          |                     || _        || _        || _        || _	        || _
        || _        dS )z3
        Initialize with a PyVespa client.
        r   )VespazTCould not import Vespa python package. Please install it with `pip install pyvespa`.z:app should be an instance of vespa.application.Vespa, got N)vespa.applicationr   ImportError
isinstance
ValueErrortype
_vespa_app_embedding_function_page_content_field_embedding_field_input_field_metadata_fields)selfr   r   r   r   r   r   r   s           b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/vespa.py__init__zVespaStore.__init__+   s    	/////// 	 	 	@  	
 #u%% 	XTRUYYXX   #5 #5  /' /s   	 #textsIterable[str]	metadatasOptional[List[dict]]idskwargs	List[str]c                   d}| j         '| j                             t          |                    }|d t          |          D             }g }t          |          D ]}\  }}i }	| j        
||	| j        <   | j        |||         |	| j        <   |,| j        %| j        D ]}
|
||         v r||         |
         |	|
<   |                    ||         |	d           ~| j        	                    |          }|D ]N}t          |j                                      d          s%t          d|j         d|j        d                    O|S )a  
        Add texts to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of ids associated with the texts.
            kwargs: vectorstore specific parameters

        Returns:
            List of ids from adding the texts into the vectorstore.
        Nc                :    g | ]\  }}t          |d z              S )   )str).0i_s      r+   
<listcomp>z(VespaStore.add_texts.<locals>.<listcomp>c   s(    >>>TQ3!A#x==>>>    )idfields2z-Could not add document to Vespa. Error code: . Message: message)r%   embed_documentslist	enumerater&   r'   r)   appendr$   
feed_batchr7   status_code
startswithRuntimeErrorjson)r*   r-   r/   r1   r2   
embeddingsbatchr9   textr>   metadata_fieldresultsresults                r+   	add_textszVespaStore.add_textsJ   s   ( 
#/1AA$u++NNJ;>>Yu-=-=>>>C '' 
	; 
	;GAt9;F'337t/0$0Z5K0:1t,-$)>)J&*&; N NN%1551:1n1M~.LLA&99::::/,,U33 	 	F*++66s;; "9#)#59 9 &I 69 9   
r<   Optional[bool]c                    |dS d |D             }| j                             |          }t          d |D                       dk    S )NFc                    g | ]}d |iS )r=    )r8   r=   s     r+   r;   z%VespaStore.delete.<locals>.<listcomp>   s    ***$***r<   c                ,    g | ]}|j         d k    rdndS )   r   r6   )rG   r8   rs     r+   r;   z%VespaStore.delete.<locals>.<listcomp>   s(    EEE#--AA1EEEr<   r   )r$   delete_batchsum)r*   r1   r2   rL   rP   s        r+   deletezVespaStore.delete|   sV    ;5**c***--e44EEfEEEFF!KKr<      query_embeddingList[float]kintr   c                    |}| j         }| j        }d|v r|d         nd}d|v r|d         nd }d|v r|d         nd}	|	rdnd}	d}
|
d	| d
|	 dz  }
|
d| d| dz  }
||
d| z  }
d|
d| d|d|d|i}|S )NrankingdefaultfilterapproximateFtruefalsezselect * from sources * where z{targetHits: z, approximate: }znearestNeighbor(z, )z and yqlzinput.query(hits)r'   r(   )r*   r^   r`   r2   rl   doc_embedding_fieldinput_embedding_fieldranking_functionre   rf   rk   querys               r+   _create_queryzVespaStore._create_query   s    "3 $ 109V0C0C6),,%-%7%7!!T/</F/Ff]++E +8ff.DDD[DDDDQ"5QQ9NQQQQ#6###C 330333_'D	
 r<   List[Tuple[Document, float]]c                Z   d|v r	|d         }n | j         ||fi |}	 | j                            |          }nU# t          $ rH}t	          d|j        d         d         d          d|j        d         d         d                    d}~ww xY wt          |j                                      d	          s%t	          d
|j         d|j	        d                    |j	        d         }d|v r,ddl	}t	          |
                    |d                             ||j        g S g }	|j        D ]~}
|
d         | j                 }|
d         }d|
d         i}| j        (| j        D ] }|
d                             |          ||<   !t          ||          }|	                    ||f           |	S )a  
        Performs similarity search from a embeddings vector.

        Args:
            query_embedding: Embeddings vector to search for.
            k: Number of results to return.
            custom_query: Use this custom query instead default query (kwargs)
            kwargs: other vector store specific parameters

        Returns:
            List of ids from adding the texts into the vectorstore.
        custom_query)bodyz$Could not retrieve data from Vespa: r   summaryz	. Error: rA   Nr?   z0Could not retrieve data from Vespa. Error code: r@   rooterrorsr>   	relevancer=   )page_contentmetadata)rq   r$   rp   	ExceptionrI   argsr7   rG   rH   rJ   dumpsrl   r&   r)   getr   rE   )r*   r^   r`   r2   rp   responseerw   rJ   docschildrz   scorer{   fielddocs                   r+   &similarity_search_by_vector_with_scorez1VespaStore.similarity_search_by_vector_with_score   s    V##>*EE&D&DDVDDE	,,%,88HH 	 	 	46!9Q<	*4 4&)A,y14 4  	 8'((33C88 	7'37 7$M)47 7   }V$tKKKtzz$x.99:::x}4I] 	& 	&E ?4+CDL+&EeDk*H$0!2 A AE&+Ho&9&9%&@&@HUOOxHHHCKKe%%%%s   : 
BABB	embeddingList[Document]c                8     | j         ||fi |}d |D             S )Nc                    g | ]
}|d          S r   rU   rX   s     r+   r;   z:VespaStore.similarity_search_by_vector.<locals>.<listcomp>       &&&!&&&r<   )r   )r*   r   r`   r2   rO   s        r+   similarity_search_by_vectorz&VespaStore.similarity_search_by_vector   s4     >$=iUUfUU&&g&&&&r<   rp   r7   c                f    g }| j         | j                             |          } | j        ||fi |S N)r%   embed_queryr   )r*   rp   r`   r2   	query_embs        r+   similarity_search_with_scorez'VespaStore.similarity_search_with_score   sE     	#/0<<UCCI:t:9aRR6RRRr<   c                8     | j         ||fi |}d |D             S )Nc                    g | ]
}|d          S r   rU   rX   s     r+   r;   z0VespaStore.similarity_search.<locals>.<listcomp>   r   r<   )r   )r*   rp   r`   r2   rO   s        r+   similarity_searchzVespaStore.similarity_search   s4     4$3E1GGGG&&g&&&&r<            ?fetch_klambda_multfloatc                     t          d          )NzMMR search not implementedNotImplementedError)r*   rp   r`   r   r   r2   s         r+   max_marginal_relevance_searchz(VespaStore.max_marginal_relevance_search   s     "">???r<   c                     t          d          )Nz$MMR search by vector not implementedr   )r*   r   r`   r   r   r2   s         r+   'max_marginal_relevance_search_by_vectorz2VespaStore.max_marginal_relevance_search_by_vector   s     ""HIIIr<   clsType[VespaStore]r   c                J     | dd|i|}|                     |||           |S )Nr   )r-   r/   r1   rU   )rQ   )r   r-   r   r/   r1   r2   vespas          r+   
from_textszVespaStore.from_texts   s;     ;;y;F;;eycBBBr<   r   c                6     t                      j        di |S )NrU   )superas_retriever)r*   r2   	__class__s     r+   r   zVespaStore.as_retriever
  s     #uww#--f---r<   )NNNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )NN)
r-   r.   r/   r0   r1   r   r2   r   r   r3   r   )r1   r   r2   r   r   rR   )r]   )r^   r_   r`   ra   r2   r   r   r   )r^   r_   r`   ra   r2   r   r   rr   )r   r_   r`   ra   r2   r   r   r   )rp   r7   r`   ra   r2   r   r   rr   )rp   r7   r`   ra   r2   r   r   r   )r]   r   r   )rp   r7   r`   ra   r   ra   r   r   r2   r   r   r   )r   r_   r`   ra   r   ra   r   r   r2   r   r   r   )r   r   r-   r3   r   r   r/   r0   r1   r   r2   r   r   r   )r2   r   r   r   )__name__
__module____qualname____doc__r,   rQ   r\   rq   r   r   r   r   r   r   classmethodr   r   __classcell__)r   s   @r+   r   r   
   s        F 48,0)-%)/30 0 0 0 0D +/#'	0 0 0 0 0dL L L L L 67    6 676 6 6 6 6r 01' ' ' ' ' $%S S S S S $%' ' ' ' '  @ @ @ @ @  J J J J J 
 +/#'
 
 
 
 [
. . . . . . . . . .r<   r   N)
__future__r   typingr   r   r   r   r   r	   r
   r   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   r   r   rU   r<   r+   <module>r      s    " " " " " " J J J J J J J J J J J J J J J J J J J J - - - - - - 0 0 0 0 0 0 I I I I I I I IA. A. A. A. A. A. A. A. A. A.r<   