U
    h                     @  sp   d dl mZ d dlZd dl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 G dd deZdS )	    )annotationsN)AnyDictListLiteralOptionalSequenceUnion)CallbackManagerForRetrieverRun)Document)BaseRetrieverc                   @  s   e Zd ZU dZded< ded< ded< ded	< dd
dddZddd
dddZddddd
dddZeddddddddddddddd d	ddZ	dS ) VespaRetrieverz`Vespa` retriever.r   appr   bodystrcontent_fieldzSequence[str]metadata_fieldszList[Document])r   returnc                   s   | j |}t|jds,td|j|jd }d|krPtt|d g }|j	D ]\  d 
| jd}| jdkr d }n fdd	| jD } d
 |d
< |t||d qZ|S )N2z2Could not retrieve data from Vespa. Error code: {}rooterrorsfields *c                   s   i | ]}| d   |qS )r   )get).0Zmfchild R/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/retrievers/vespa_retriever.py
<dictcomp>+   s      z)VespaRetriever._query.<locals>.<dictcomp>id)page_contentmetadata)r   queryr   status_code
startswithRuntimeErrorformatjsondumpshitspopr   r   appendr   )selfr   responser   Zdocsr"   r#   r   r   r   _query   s&    



zVespaRetriever._queryr
   )r$   run_managerr   c                C  s   | j  }||d< | |S )Nr$   r   copyr0   )r.   r$   r1   r   r   r   r   _get_relevant_documents0   s    
z&VespaRetriever._get_relevant_documentsN)_filterzOptional[str])r$   r5   r   c                C  s>   | j  }|rd| nd}|d | |d< ||d< | |S )N and r   yqlr$   r2   )r.   r$   r5   r   r   r   r   "get_relevant_documents_with_filter7   s
    
z1VespaRetriever.get_relevant_documents_with_filterr   )kr   sourcesr5   r7   zOptional[int]z"Union[Sequence[str], Literal['*']]z(Union[Sequence[str], Literal['*'], None])	urlr   r9   r   r:   r5   r7   kwargsr   c                K  s   zddl m}	 W n tk
r,   tdY nX |	|}
| }|rT|sJ|rTtdnn|dkrjd}d|d< nd|gt|pzg  }t|trd|nd}|rd	| nd
}d| d| d| }||d< |r||d< | |
|||dS )a  Instantiate retriever from params.

        Args:
            url (str): Vespa app URL.
            content_field (str): Field in results to return as Document page_content.
            k (Optional[int]): Number of Documents to return. Defaults to None.
            metadata_fields(Sequence[str] or "*"): Fields in results to include in
                document metadata. Defaults to empty tuple ().
            sources (Sequence[str] or "*" or None): Sources to retrieve
                from. Defaults to None.
            _filter (Optional[str]): Document filter condition expressed in YQL.
                Defaults to None.
            yql (Optional[str]): Full YQL query to be used. Should not be specified
                if _filter or sources are specified. Defaults to None.
            kwargs (Any): Keyword arguments added to query body.

        Returns:
            VespaRetriever: Instantiated VespaRetriever.
        r   )VespazCpyvespa is not installed, please install with `pip install pyvespa`zKyql should only be specified if both sources and _filter are not specified.r   shortsummaryz, r6   r   zselect z from sources z where userQuery()r7   r+   )r   r   r   r   )	Zvespa.applicationr=   ImportErrorr3   
ValueErrorjoinlist
isinstancer   )clsr;   r   r9   r   r:   r5   r7   r<   r=   r   r   _fieldsZ_sourcesr   r   r   from_params@   s8     

zVespaRetriever.from_params)
__name__
__module____qualname____doc____annotations__r0   r4   r8   classmethodrG   r   r   r   r   r      s    
	r   )
__future__r   r)   typingr   r   r   r   r   r   r	   Zlangchain_core.callbacksr
   Zlangchain_core.documentsr   Zlangchain_core.retrieversr   r   r   r   r   r   <module>   s   $