a
    bg9&                     @  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                
      s2  e Zd ZdZd;ddddddddd	d
Zd<ddddddddZd=ddddddZd>dddddddZd?dddddddZd@ddddd d!d"Z	dAd#dddd$d%d&Z
dBd#dddd$d'd(ZdCd#ddd+ddd,d-d.ZdDdddd+ddd/d0d1ZedEd2dd3dddd d4d5d6Zdd7d8 fd9d:Z  ZS )F
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)

    Nr   zOptional[Embeddings]zOptional[str]zOptional[List[str]]None)appembedding_functionpage_content_fieldembedding_fieldinput_fieldmetadata_fieldsreturnc                 C  sp   zddl m} W n ty*   tdY n0 t||sHt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$   t/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/vespa.py__init__+   s     

zVespaStore.__init__zIterable[str]zOptional[List[dict]]z	List[str])texts	metadatasidskwargsr   c                 K  s  d}| j dur| j t|}|du r8dd t|D }g }t|D ]\}}i }	| jdurd||	| j< | jdur|dur|| |	| j< |dur| jdur| jD ] }
|
|| v r|| |
 |	|
< q||| |	d qD| j	|}|D ]0}t
|jdstd|j d|jd  q|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_batchr,   status_code
startswithRuntimeErrorjson)r#   r'   r(   r)   r*   Z
embeddingsbatchr.   textr3   Zmetadata_fieldresultsresultr$   r$   r%   	add_textsJ   s8    



zVespaStore.add_textszOptional[bool])r)   r*   r   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 )r2   r$   )r-   r2   r$   r$   r%   r0      r1   z%VespaStore.delete.<locals>.<listcomp>c                 S  s   g | ]}|j d krdndqS )   r   r+   )r:   r-   rr$   r$   r%   r0      r1   r   )r   Zdelete_batchsum)r#   r)   r*   r>   rA   r$   r$   r%   delete|   s
    zVespaStore.delete   zList[float]intr   )query_embeddingkr*   r   c                 K  s   |}| j }| j}d|v r |d nd}d|v r4|d nd }d|v rH|d nd}	|	rTdnd}	d}
|
d	| d
|	 d7 }
|
d| d| d7 }
|d ur|
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#   rJ   rK   r*   rT   Zdoc_embedding_fieldZinput_embedding_fieldZranking_functionrM   rN   rS   queryr$   r$   r%   _create_query   s$    zVespaStore._create_queryzList[Tuple[Document, float]]c              
   K  sz  d|v r|d }n| j ||fi |}z| jj|d}W nT ty } z<td|jd d d  d|jd d d  W Y d}~n
d}~0 0 t|jd	std
|j d|j	d  |j	d }d|v rddl	}t|
|d |du s|jdu rg S g }	|jD ]n}
|
d | j }|
d }d|
d i}| jdurX| jD ]}|
d |||< q>t||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: r6   Nr4   z0Could not retrieve data from Vespa. Error code: r5   rooterrorsr3   Z	relevancer2   )page_contentmetadata)rV   r   rU   	Exceptionr<   argsr,   r:   r;   r=   dumpsrT   r   r"   getr   r9   )r#   rJ   rK   r*   rU   responseerY   r=   docschildr[   Zscorer\   fielddocr$   r$   r%   &similarity_search_by_vector_with_score   sL    



z1VespaStore.similarity_search_by_vector_with_scorezList[Document])	embeddingrK   r*   r   c                 K  s"   | j ||fi |}dd |D S )Nc                 S  s   g | ]}|d  qS r   r$   rD   r$   r$   r%   r0      r1   z:VespaStore.similarity_search_by_vector.<locals>.<listcomp>)rg   )r#   rh   rK   r*   r@   r$   r$   r%   similarity_search_by_vector   s    z&VespaStore.similarity_search_by_vectorr,   )rU   rK   r*   r   c                 K  s.   g }| j d ur| j |}| j||fi |S N)r   Zembed_queryrg   )r#   rU   rK   r*   Z	query_embr$   r$   r%   similarity_search_with_score   s    
z'VespaStore.similarity_search_with_scorec                 K  s"   | j ||fi |}dd |D S )Nc                 S  s   g | ]}|d  qS ri   r$   rD   r$   r$   r%   r0      r1   z0VespaStore.similarity_search.<locals>.<listcomp>)rl   )r#   rU   rK   r*   r@   r$   r$   r%   similarity_search   s    zVespaStore.similarity_search         ?float)rU   rK   fetch_klambda_multr*   r   c                 K  s   t dd S )NzMMR search not implementedNotImplementedError)r#   rU   rK   rq   rr   r*   r$   r$   r%   max_marginal_relevance_search   s    z(VespaStore.max_marginal_relevance_search)rh   rK   rq   rr   r*   r   c                 K  s   t dd S )Nz$MMR search by vector not implementedrs   )r#   rh   rK   rq   rr   r*   r$   r$   r%   'max_marginal_relevance_search_by_vector   s    z2VespaStore.max_marginal_relevance_search_by_vectorzType[VespaStore]r   )clsr'   rh   r(   r)   r*   r   c                 K  s&   | f d|i|}|j |||d |S )Nr   )r'   r(   r)   )rB   )rw   r'   rh   r(   r)   r*   Zvespar$   r$   r%   
from_texts   s    	zVespaStore.from_textsr   )r*   r   c                   s   t  jf i |S rk   )superas_retriever)r#   r*   	__class__r$   r%   rz   
  s    zVespaStore.as_retriever)NNNNN)NN)N)rH   )rH   )rH   )rH   )rH   )rH   rn   ro   )rH   rn   ro   )NN)__name__
__module____qualname____doc__r&   rB   rG   rV   rg   rj   rl   rm   ru   rv   classmethodrx   rz   __classcell__r$   r$   r{   r%   r   
   sD   #     "  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
   (