o
    ȳg'                     @   s   d Z ddlZddlmZmZmZmZmZ ddlZddl	Z	ddl
mZ ddlmZ ddlmZmZmZ ddlmZ dZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZdS )zUtil that calls you.com Search API.

In order to set this up, follow instructions at:
https://documentation.you.com/quickstart
    N)AnyDictListLiteralOptionalDocumentget_from_dict_or_env)	BaseModelFieldmodel_validator)Selfzhttps://api.ydc-index.ioc                   @   sZ   e Zd ZU dZeddZeed< eddZeed< eddZ	eed< ed	dZ
eed
< dS )YouHitMetadataz%Metadata on a single hit from you.comzThe title of the resultdescriptiontitlezThe url of the resulturlz$Thumbnail associated with the resultthumbnail_urlzDetails about the resultr   N)__name__
__module____qualname____doc__r   r   str__annotations__r   r   r    r   r   ]/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/langchain_community/utilities/you.pyr      s   
 r   c                   @   (   e Zd ZU dZeddZee ed< dS )YouHitz>A single hit from you.com, which may contain multiple snippetszOne or snippets of textr   snippetsN)	r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   
 r   c                   @   r   )YouAPIOutputzOutput from you.com API.z-A list of dictionaries containing the resultsr   hitsN)	r   r   r   r   r   r!   r   r   r   r   r   r   r   r    #   s
   
 r    c                   @   s,   e Zd ZU dZeddZeed< eed< dS )YouDocumentzOutput of parsing one snippet.zOne snippet of textr   page_contentmetadataN)	r   r   r   r   r   r#   r   r   r   r   r   r   r   r"   +   s   
 r"   c                   @   s  e Zd ZU dZdZee ed< dZe	d ed< dZ
ee ed< dZee	d  ed	< dZee ed
< dZee ed< dZee ed< dZee ed< dZee ed< dZee ed< dZee ed< eddededefddZedddefddZedddefddZdededefddZd edee fd!d"Z dededefd#d$Z!dededee fd%d&Z"dededefd'd(Z#dededee fd)d*Z$dS )+YouSearchAPIWrapperaf  Wrapper for you.com Search and News API.

    To connect to the You.com api requires an API key which
    you can get at https://api.you.com.
    You can check out the docs at https://documentation.you.com/api-reference/.

    You need to set the environment variable `YDC_API_KEY` for retriever to operate.

    Attributes
    ----------
    ydc_api_key: str, optional
        you.com api key, if YDC_API_KEY is not set in the environment
    endpoint_type: str, optional
        you.com endpoints: search, news, rag;
        `web` and `snippet` alias `search`
        `rag` returns `{'message': 'Forbidden'}`
        @todo `news` endpoint
    num_web_results: int, optional
        The max number of web results to return, must be under 20.
        This is mapped to the `count` query parameter for the News API.
    safesearch: str, optional
        Safesearch settings, one of off, moderate, strict, defaults to moderate
    country: str, optional
        Country code, ex: 'US' for United States, see api docs for list
    search_lang: str, optional
        (News API) Language codes, ex: 'en' for English, see api docs for list
    ui_lang: str, optional
        (News API) User interface language for the response, ex: 'en' for English,
                   see api docs for list
    spellcheck: bool, optional
        (News API) Whether to spell check query or not, defaults to True
    k: int, optional
        max number of Documents to return using `results()`
    n_hits: int, optional, deprecated
        Alias for num_web_results
    n_snippets_per_hit: int, optional
        limit the number of snippets returned per hit
    Nydc_api_keysearch)r'   newsragsnippetendpoint_typenum_web_results)offmoderatestrict
safesearchcountrysearch_langui_lang
spellcheckkn_snippets_per_hitn_hitsbefore)modevaluesreturnc                 C   s   t |dd}||d< |S )z,Validate that api key exists in environment.r&   YDC_API_KEYr	   )clsr:   r&   r   r   r   validate_environmentn   s   z(YouSearchAPIWrapper.validate_environmentafterc                 C   s^   | j dkrd}|D ]}t| |rtd| d| j  dt q	| j dvr-| jr-tdt | S )Nr(   )r2   r3   r4   zNews API-specific field 'z' is set but `endpoint_type="z"`. This will have no effect.r'   r*   zGField 'n_snippets_per_hit' only has effect on `endpoint_type="search"`.)r+   getattrwarningswarnUserWarningr6   )selfnews_api_fieldsfieldr   r   r   !warn_if_set_fields_have_no_effectw   s$   


z5YouSearchAPIWrapper.warn_if_set_fields_have_no_effectc                 C   s$   | j dkrtd| j  dt | S )Nr   z`endpoint_type="z7"` is deprecated. Use `endpoint_type="search"` instead.)r+   rB   rC   DeprecationWarning)rE   r   r   r   %warn_if_deprecated_endpoints_are_used   s   
z9YouSearchAPIWrapper.warn_if_deprecated_endpoints_are_usedquerykwargsc                 K   sj   | j | jd|}| jdv r|j|| jd n| jdkr*|j|| j| j| j| jd dd | D }|S )z
        Parse parameters required for different You.com APIs.

        Args:
            query: The query to search for.
        )r0   r1   r@   )rK   r,   r(   )qcountr2   r3   r4   c                 S      i | ]\}}|d ur||qS Nr   ).0r5   vr   r   r   
<dictcomp>       z8YouSearchAPIWrapper._generate_params.<locals>.<dictcomp>)	r0   r1   r+   updater,   r2   r3   r4   items)rE   rK   rL   paramsr   r   r   _generate_params   s(   

z$YouSearchAPIWrapper._generate_paramsraw_search_resultsc                 C   s   | j dkr|d d }| jdur|d| j }dd |D S g }|d D ]D}| jp/t|d}|dd| D ].}|t||d|d	|d
|ddd | jdurgt|| jkrg|    S q9q$|S )z
        Extracts snippets from each hit and puts them in a Document
        Parameters:
            raw_search_results: A dict containing list of hits
        Returns:
            List[YouDocument]: A dictionary of parsed results
        r(   resultsNc                 S   s   g | ]
}t |d  |dqS )r   r#   r$   r   )rQ   resultr   r   r   
<listcomp>   s    z6YouSearchAPIWrapper._parse_results.<locals>.<listcomp>r!   r   r   r   r   r   )r   r   r   r   r[   )r+   r5   r6   lengetappendr   )rE   rY   news_resultsdocshitr6   r*   r   r   r   _parse_results   s4   


z"YouSearchAPIWrapper._parse_resultsc                 K   s\   d| j pdi}| j|fi |}| jdkrd| _tjt d| j ||d}|  | S )zRun query through you.com Search and return hits.

        Args:
            query: The query to search for.
        Returns: YouAPIOutput
        	X-API-Key r*   r'   /)rW   headers)r&   rX   r+   requestsr_   YOU_API_URLraise_for_statusjson)rE   rK   rL   rh   rW   responser   r   r   raw_results   s   
zYouSearchAPIWrapper.raw_resultsc                 K   s*   | j |fi dd | D }| |S )zCRun query through you.com Search and parses results into Documents.c                 S   rO   rP   r   rQ   keyvaluer   r   r   rS     rT   z/YouSearchAPIWrapper.results.<locals>.<dictcomp>)rn   rV   rd   )rE   rK   rL   rY   r   r   r   rZ      s   
zYouSearchAPIWrapper.resultsc              
      s  d| j pdi}| j|fi |}| jdkrd| _t 4 I dH X}|jt d| j ||d4 I dH /}|jdkrW| I dH }|W  d  I dH  W  d  I dH  S t	d	|j d
|j
 1 I dH siw   Y  W d  I dH  dS 1 I dH sw   Y  dS )z7Get results from the you.com Search API asynchronously.re   rf   r*   r'   Nrg   )r   rW   rh      zError z: )r&   rX   r+   aiohttpClientSessionr_   rj   statusrl   	Exceptionreason)rE   rK   rL   rh   rW   sessionresrZ   r   r   r   raw_results_async  s(   


.z%YouSearchAPIWrapper.raw_results_asyncc                    s2   | j |fi dd | D I d H }| |S )Nc                 S   rO   rP   r   ro   r   r   r   rS   )  rT   z5YouSearchAPIWrapper.results_async.<locals>.<dictcomp>)rz   rV   rd   )rE   rK   rL   raw_search_results_asyncr   r   r   results_async"  s   
z!YouSearchAPIWrapper.results_async)%r   r   r   r   r&   r   r   r   r+   r   r,   intr0   r1   r2   r3   r4   boolr5   r6   r7   r   classmethodr   r   r>   r   rH   rJ   rX   r   r   rd   rn   rZ   rz   r|   r   r   r   r   r%   2   sd   
 '&


r%   )r   rB   typingr   r   r   r   r   rs   ri   langchain_core.documentsr   langchain_core.utilsr
   pydanticr   r   r   typing_extensionsr   rj   r   r   r    r"   r%   r   r   r   r   <module>   s    	