o
    Zh;&                     @  sp   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 deZdS )	    )annotations)AnyDictIterableListOptionalTupleTypeUnion)Document)
Embeddings)VectorStoreVectorStoreRetrieverc                      s   e Zd ZdZ					dCdDddZ		dEdFddZdGdHddZ	dIdJd#d$Z	dIdKd&d'Z	dIdLd*d+Z		dIdMd.d/Z
	dIdNd0d1Z		2	3dOdPd7d8Z		2	3dOdQd9d:Ze		dEdRd>d?ZdS fdAdBZ  ZS )T
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                 C  sl   zddl m} W n ty   td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)Z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    r'   ]/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/vespa.py__init__+   s"   

zVespaStore.__init__textsIterable[str]	metadatasOptional[List[dict]]idskwargs	List[str]c                 K  s  d}| j dur| j t|}|du rdd t|D }g }t|D ]G\}}i }	| jdur2||	| j< | jdurB|durB|| |	| j< |dur_| jdur_| jD ]}
|
|| v r^|| |
 |	|
< qN||| |	d q"| j	|}|D ]}t
|jdstd|j d|jd  qr|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                 S  s   g | ]\}}t |d   qS )   )str).0i_r'   r'   r(   
<listcomp>c       z(VespaStore.add_texts.<locals>.<listcomp>)idfields2z-Could not add document to Vespa. Error code: . Message: message)r!   Zembed_documentslist	enumerater"   r#   r%   appendr    Z
feed_batchr2   status_code
startswithRuntimeErrorjson)r&   r*   r,   r.   r/   Z
embeddingsbatchr4   textr9   Zmetadata_fieldresultsresultr'   r'   r(   	add_textsJ   s<   



zVespaStore.add_textsOptional[bool]c                 K  s<   |d u rdS dd |D }| j |}tdd |D dkS )NFc                 S  s   g | ]}d |iqS )r8   r'   )r3   r8   r'   r'   r(   r6          z%VespaStore.delete.<locals>.<listcomp>c                 S  s   g | ]}|j d krdndqS )   r   r1   )r@   r3   rr'   r'   r(   r6      r7   r   )r    Zdelete_batchsum)r&   r.   r/   rD   rG   r'   r'   r(   delete|   s
   zVespaStore.delete   query_embeddingList[float]kintr   c                 K  s   |}| 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7 }
|
d| d| d7 }
|d urO|
d| 7 }
d|
d| d|d|d|i}|S )NZ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&   rQ   rS   r/   r]   Zdoc_embedding_fieldZinput_embedding_fieldZranking_functionrV   rW   r\   queryr'   r'   r(   _create_query   s$   zVespaStore._create_queryList[Tuple[Document, float]]c              
   K  sh  d|v r	|d }n
| j ||fi |}z	| jj|d}W n$ ty@ } ztd|jd d d  d|jd d d  d}~ww t|jd	sWtd
|j d|j	d  |j	d }d|v rmddl	}t|
|d |du sv|jdu rxg S g }	|jD ]4}
|
d | j }|
d }d|
d i}| jdur| jD ]}|
d |||< qt||d}|	||f q}|	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.
        Zcustom_query)bodyz$Could not retrieve data from Vespa: r   summaryz	. Error: r<   Nr:   z0Could not retrieve data from Vespa. Error code: r;   rooterrorsr9   Z	relevancer8   )page_contentmetadata)r_   r    r^   	ExceptionrB   argsr2   r@   rA   rC   dumpsr]   r"   r%   getr   r?   )r&   rQ   rS   r/   r^   responseerc   rC   docschildre   Zscorerf   fielddocr'   r'   r(   &similarity_search_by_vector_with_score   sP   




z1VespaStore.similarity_search_by_vector_with_score	embeddingList[Document]c                 K  "   | j ||fi |}dd |D S )Nc                 S     g | ]}|d  qS r   r'   rL   r'   r'   r(   r6      rJ   z:VespaStore.similarity_search_by_vector.<locals>.<listcomp>)rq   )r&   rr   rS   r/   rF   r'   r'   r(   similarity_search_by_vector      z&VespaStore.similarity_search_by_vectorr^   r2   c                 K  s.   g }| j d ur| j |}| j||fi |S N)r!   Zembed_queryrq   )r&   r^   rS   r/   Z	query_embr'   r'   r(   similarity_search_with_score   s   
z'VespaStore.similarity_search_with_scorec                 K  rt   )Nc                 S  ru   rv   r'   rL   r'   r'   r(   r6      rJ   z0VespaStore.similarity_search.<locals>.<listcomp>)rz   )r&   r^   rS   r/   rF   r'   r'   r(   similarity_search   rx   zVespaStore.similarity_search         ?fetch_klambda_multfloatc                 K     t d)NzMMR search not implementedNotImplementedError)r&   r^   rS   r~   r   r/   r'   r'   r(   max_marginal_relevance_search      z(VespaStore.max_marginal_relevance_searchc                 K  r   )Nz$MMR search by vector not implementedr   )r&   rr   rS   r~   r   r/   r'   r'   r(   'max_marginal_relevance_search_by_vector   r   z2VespaStore.max_marginal_relevance_search_by_vectorclsType[VespaStore]r   c                 K  s&   | dd|i|}|j |||d |S )Nr   )r*   r,   r.   r'   )rH   )r   r*   rr   r,   r.   r/   Zvespar'   r'   r(   
from_texts   s   	zVespaStore.from_textsr   c                   s   t  jdi |S )Nr'   )superas_retriever)r&   r/   	__class__r'   r(   r   
  s   zVespaStore.as_retriever)NNNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )NN)
r*   r+   r,   r-   r.   r   r/   r   r   r0   ry   )r.   r   r/   r   r   rI   )rP   )rQ   rR   rS   rT   r/   r   r   r   )rQ   rR   rS   rT   r/   r   r   r`   )rr   rR   rS   rT   r/   r   r   rs   )r^   r2   rS   rT   r/   r   r   r`   )r^   r2   rS   rT   r/   r   r   rs   )rP   r|   r}   )r^   r2   rS   rT   r~   rT   r   r   r/   r   r   rs   )rr   rR   rS   rT   r~   rT   r   r   r/   r   r   rs   )r   r   r*   r0   rr   r   r,   r-   r.   r   r/   r   r   r   )r/   r   r   r   )__name__
__module____qualname____doc__r)   rH   rO   r_   rq   rw   rz   r{   r   r   classmethodr   r   __classcell__r'   r'   r   r(   r   
   sF    #"29		
r   N)
__future__r   typingr   r   r   r   r   r   r	   r
   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr   r   r   r'   r'   r'   r(   <module>   s    (