
    Ng                    ~    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e          ZdS )	    )annotationsN)AnyDictListLiteralOptionalSequenceUnion)CallbackManagerForRetrieverRun)Document)BaseRetrieverc                      e Zd ZU dZded<   	 ded<   	 ded<   	 ded	<   	 d!dZd"dZddd#dZeddddddd$d             Z	dS )%VespaRetrieverz`Vespa` retriever.r   appr   bodystrcontent_fieldzSequence[str]metadata_fieldsreturnList[Document]c                N   | j                             |          }t          |j                                      d          s't          d                    |j                            |j        d         }d|v r't          t          j        |d                             g }|j	        D ]yd         
                    | j        d          }| j        dk    r	d         }nfd| j        D             }d	         |d	<   |                    t          ||
                     z|S )N2z2Could not retrieve data from Vespa. Error code: {}rooterrorsfields *c                H    i | ]}|d                               |          S )r   )get).0mfchilds     j/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/retrievers/vespa_retriever.py
<dictcomp>z)VespaRetriever._query.<locals>.<dictcomp>+   s-    WWWBBh 3 3B 7 7WWW    id)page_contentmetadata)r   queryr   status_code
startswithRuntimeErrorformatjsondumpshitspopr   r   appendr   )selfr   responser   docsr'   r(   r"   s          @r#   _queryzVespaRetriever._query   s4   8>>$''8'((33C88 	DKK(    }V$ttz$x.99:::] 	P 	PE ?..t/A2FFL#s** ?WWWW$BVWWW"4[HTNKKlXNNNOOOOr%   r)   run_managerr   c               h    | j                                         }||d<   |                     |          S )Nr)   r   copyr6   )r3   r)   r7   r   s       r#   _get_relevant_documentsz&VespaRetriever._get_relevant_documents0   s0     y~~W{{4   r%   N)_filterr<   Optional[str]c                   | j                                         }|rd| nd}|d         |z   |d<   ||d<   |                     |          S )N and r   yqlr)   r9   )r3   r)   r<   r   s       r#   "get_relevant_documents_with_filterz1VespaRetriever.get_relevant_documents_with_filter7   sZ     y~~'.6#'###B5kG+UW{{4   r%    )kr   sourcesr<   r@   urlrC   Optional[int]"Union[Sequence[str], Literal['*']]rD   (Union[Sequence[str], Literal['*'], None]r@   kwargsc                  	 ddl m}	 n# t          $ r t          d          w xY w |	|          }
|                                }|r|s|rt	          d          |dk    rd}d|d<   n(d                    |gt          |pg           z             }t          |t                    rd                    |          nd}|rd	| nd
}d| d| d| }||d<   |r||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, r?   r   zselect z from sources z where userQuery()r@   r0   )r   r   r   r   )	vespa.applicationrK   ImportErrorr:   
ValueErrorjoinlist
isinstancer	   )clsrE   r   rC   r   rD   r<   r@   rI   rK   r   r   _fields_sourcess                 r#   from_paramszVespaRetriever.from_params@   su   @	/////// 	 	 	U  	 eCjj{{}} 	YG 	Yw 	Y  
 #%%")Y))]Od?;Pb6Q6Q$QRR-7-J-JStyy)))PSH+2:'g'''GXGXX8XXwXXCU 	DLs'+	
 
 
 	
s   	 #)r   r   r   r   )r)   r   r7   r   r   r   )r)   r   r<   r=   r   r   )rE   r   r   r   rC   rF   r   rG   rD   rH   r<   r=   r@   r=   rI   r   r   r   )
__name__
__module____qualname____doc____annotations__r6   r;   rA   classmethodrW   rB   r%   r#   r   r      s         HHH%JJJ$""""'   2! ! ! ! 7;! ! ! ! ! !   >@<@!%!=
 =
 =
 =
 =
 [=
 =
 =
r%   r   )
__future__r   r.   typingr   r   r   r   r   r	   r
   langchain_core.callbacksr   langchain_core.documentsr   langchain_core.retrieversr   r   rB   r%   r#   <module>rc      s    " " " " " "  F F F F F F F F F F F F F F F F F F C C C C C C - - - - - - 3 3 3 3 3 3s
 s
 s
 s
 s
] s
 s
 s
 s
 s
r%   