
    h;&                    v    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y)	    )annotations)AnyDictIterableListOptionalTupleTypeUnion)Document)
Embeddings)VectorStoreVectorStoreRetrieverc                  |    e Zd Z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
	 d	 	 	 	 	 	 	 dd	Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd
Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZe	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zd fdZ xZS )
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)

    c                    	 ddl m} t        ||      st	        dt        |             || _        || _        || _        || _	        || _
        || _        y# t        $ r t        d      w xY w)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)selfappembedding_functionpage_content_fieldembedding_fieldinput_fieldmetadata_fieldsr   s           d/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/vespa.py__init__zVespaStore.__init__+   s    	/ #u%LTRUYKX  #5 #5  /' /  	@ 	s   A A+c                   d}| j                   $| j                   j                  t        |            }|*t        |      D cg c]  \  }}t	        |dz           }}}g }t        |      D ]  \  }}	i }
| j
                  |	|
| j
                  <   | j                  |||   |
| j                  <   |0| j                  $| j                  D ]  }|||   v s||   |   |
|<    |j                  ||   |
d        | j                  j                  |      }|D ]N  }t	        |j                        j                  d      r(t        d|j                   d|j                  d           |S c c}}w )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.
        N   )idfields2z-Could not add document to Vespa. Error code: . Message: message)r   embed_documentslist	enumeratestrr   r   r   appendr   
feed_batchstatus_code
startswithRuntimeErrorjson)r   texts	metadatasidskwargs
embeddingsi_batchtextr+   metadata_fieldresultsresults                 r&   	add_textszVespaStore.add_textsJ   s   ( 
##/11AA$u+NJ;/8/?@tq!3!a%?@C@ ' 
	;GAt9;F''337t//0$$0Z5K0:1t,,-$)>)>)J&*&;&; NN%151:1n1M~.N LLA&9:
	; //,,U3 	F**+66s;"##)#5#5"6 7  &I 679 	 
/ As   E*c                    |y|D cg c]  }d|i }}| j                   j                  |      }t        |D cg c]  }|j                  dk(  rdnd c}      dk(  S c c}w c c}w )NFr*      r   r)   )r   delete_batchsumr5   )r   r;   r<   r*   r@   rD   rs          r&   deletezVespaStore.delete|   sh    ;&)*$**--e4fE#-A14EF!KK +Es
   AA"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   query_embeddingkr<   rV   doc_embedding_fieldinput_embedding_fieldranking_functionrO   rP   rU   querys               r&   _create_queryzVespaStore._create_query   s     "33 $ 1 109V0C6),%-%7!T/</Ff]+E +f.v_[MDD!"5!6b9N8OqQQU6(##C 3013_'D	
     c                6   d|v r|d   }n | j                   ||fi |}	 | j                  j                  |      }t        |j                        j                  d	      s(t	        d
|j                   d|j                  d          |j                  d   }d|v r!ddl	}t	        |j                  |d               ||j                  g S g }	|j                  D ]t  }
|
d   | j                     }|
d   }d|
d   i}| j                  (| j                  D ]  }|
d   j                  |      ||<    t        ||      }|	j!                  ||f       v |	S # t        $ r<}t	        d|j
                  d   d   d    d|j
                  d   d   d          d}~ww xY w)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: r.   Nr,   z0Could not retrieve data from Vespa. Error code: r-   rooterrorsr+   	relevancer*   )page_contentmetadata)r]   r   r\   	Exceptionr7   argsr2   r5   r6   r8   dumpsrV   r   r   getr   r3   )r   rW   rX   r<   r\   responseerc   r8   docschildrf   scorerg   fielddocs                   r&   &similarity_search_by_vector_with_scorez1VespaStore.similarity_search_by_vector_with_score   s    V#>*E&D&&DVDE	,,%,8H 8''(33C8'334 5$MM)457  }}V$ttzz$x.9::x}}4I]] 	&E ?4+C+CDL+&EeDk*H$$0!22 AE&+Ho&9&9%&@HUOAxHCKKe%	& A  	666!9Q<	*+ ,&&)A,y124 	s   E 	F7FFc                Z     | j                   ||fi |}|D cg c]  }|d   	 c}S c c}w Nr   )rs   )r   	embeddingrX   r<   rC   rJ   s         r&   similarity_search_by_vectorz&VespaStore.similarity_search_by_vector   s5     >$==iUfU%&!&&&   (c                |    g }| j                   | j                   j                  |      } | j                  ||fi |S N)r   embed_queryrs   )r   r\   rX   r<   	query_embs        r&   similarity_search_with_scorez'VespaStore.similarity_search_with_score   sE     	##/00<<UCI:t::9aR6RRr^   c                Z     | j                   ||fi |}|D cg c]  }|d   	 c}S c c}w ru   )r}   )r   r\   rX   r<   rC   rJ   s         r&   similarity_searchzVespaStore.similarity_search   s5     4$33E1GG%&!&&&rx   c                    t        d      )NzMMR search not implementedNotImplementedError)r   r\   rX   fetch_klambda_multr<   s         r&   max_marginal_relevance_searchz(VespaStore.max_marginal_relevance_search   s     "">??r^   c                    t        d      )Nz$MMR search by vector not implementedr   )r   rv   rX   r   r   r<   s         r&   'max_marginal_relevance_search_by_vectorz2VespaStore.max_marginal_relevance_search_by_vector   s     ""HIIr^   c                B     | dd|i|}|j                  |||       |S )Nr!   )r9   r:   r;    )rE   )clsr9   rv   r:   r;   r<   vespas          r&   
from_textszVespaStore.from_texts   s-     ;y;F;eycBr^   c                "    t        |   di |S )Nr   )superas_retriever)r   r<   	__class__s     r&   r   zVespaStore.as_retriever
  s    w#-f--r^   )NNNNN)r    r   r!   zOptional[Embeddings]r"   Optional[str]r#   r   r$   r   r%   Optional[List[str]]returnNone)NN)
r9   zIterable[str]r:   Optional[List[dict]]r;   r   r<   r   r   	List[str]rz   )r;   r   r<   r   r   zOptional[bool])   )rW   List[float]rX   intr<   r   r   r   )rW   r   rX   r   r<   r   r   List[Tuple[Document, float]])rv   r   rX   r   r<   r   r   List[Document])r\   r2   rX   r   r<   r   r   r   )r\   r2   rX   r   r<   r   r   r   )r      g      ?)r\   r2   rX   r   r   r   r   floatr<   r   r   r   )rv   r   rX   r   r   r   r   r   r<   r   r   r   )r   zType[VespaStore]r9   r   rv   r   r:   r   r;   r   r<   r   r   r   )r<   r   r   r   )__name__
__module____qualname____doc__r'   rE   rK   r]   rs   rw   r}   r   r   r   classmethodr   r   __classcell__)r   s   @r&   r   r   
   s   F 48,0)-%)/300 10 *	0
 '0 #0 -0 
0D +/#'	00 (0 !	0
 0 
0dL 67*/2BE	6 676*6/26BE6	%6r 01'$'),'<?'	' $%SS S03S	%S $%'' '03'	'  @@ @ 	@
 @ @ 
@  JJ 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   r   r^   r&   <module>r      s(    " J J J - 0 IA. A.r^   