a
    bg                     @  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|v 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).0mfchild |/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/retrievers/vespa_retriever.py
<dictcomp>+       z)VespaRetriever._query.<locals>.<dictcomp>id)page_contentmetadata)r   queryr   status_code
startswithRuntimeErrorformatjsondumpshitspopr   r   appendr   )selfr   responser   docsr$   r%   r   r   r    _query   s&    



zVespaRetriever._queryr
   )r&   run_managerr   c                C  s   | j  }||d< | |S )Nr&   r   copyr3   )r0   r&   r4   r   r   r   r    _get_relevant_documents0   s    
z&VespaRetriever._get_relevant_documentsN)_filterzOptional[str])r&   r8   r   c                C  s>   | j  }|rd| nd}|d | |d< ||d< | |S )N and r   yqlr&   r5   )r0   r&   r8   r   r   r   r    "get_relevant_documents_with_filter7   s
    
z1VespaRetriever.get_relevant_documents_with_filterr   )kr   sourcesr8   r:   zOptional[int]z"Union[Sequence[str], Literal['*']]z(Union[Sequence[str], Literal['*'], None])	urlr   r<   r   r=   r8   r:   kwargsr   c                K  s   zddl m}	 W n ty*   tdY n0 |	|}
| }|rR|sH|rRtdnn|dkrhd}d|d< nd|gt|pxg  }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, r9   r   zselect z from sources z where userQuery()r:   r-   )r   r   r   r   )	Zvespa.applicationr@   ImportErrorr6   
ValueErrorjoinlist
isinstancer   )clsr>   r   r<   r   r=   r8   r:   r?   r@   r   r   _fieldsZ_sourcesr   r   r    from_params@   s8     

zVespaRetriever.from_params)
__name__
__module____qualname____doc____annotations__r3   r7   r;   classmethodrJ   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   $