
    dh'                         S r SSKrSSKJrJrJrJrJr  SSKrSSK	r	SSK
Jr  SSKJr  SSKJrJrJr  SSKJr  Sr " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)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                   r    \ rS rSr% Sr\" SS9r\\S'   \" SS9r	\\S'   \" SS9r
\\S	'   \" S
S9r\\S'   Srg)YouHitMetadata   z%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____firstlineno____doc__r   r   str__annotations__r   r   r   __static_attributes__r       Y/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/utilities/you.pyr   r      sE    /#<=E3=!89C9+QRM3R)CDKDr    r   c                   6    \ rS rSr% Sr\" SS9r\\   \	S'   Sr
g)YouHit   z>A single hit from you.com, which may contain multiple snippetszOne or snippets of textr   snippetsr   N)r   r   r   r   r   r   r%   r   r   r   r   r   r    r!   r#   r#      s    H,EFHd3iFr    r#   c                   6    \ rS rSr% Sr\" SS9r\\   \	S'   Sr
g)YouAPIOutput#   zOutput from you.com API.z-A list of dictionaries containing the resultsr   hitsr   N)r   r   r   r   r   r   r)   r   r#   r   r   r   r    r!   r'   r'   #   s    "CD$v, r    r'   c                   :    \ rS rSr% Sr\" SS9r\\S'   \	\S'   Sr
g)	YouDocument+   zOutput of parsing one snippet.zOne snippet of textr   page_contentmetadatar   N)r   r   r   r   r   r   r-   r   r   r   r   r   r    r!   r+   r+   +   s    (*?@L#@r    r+   c                      \ rS rSr% SrSr\\   \S'   Sr	\
S   \S'   Sr\\   \S'   Sr\\
S	      \S
'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   \" SS9\S\S\4S j5       5       r\" SS9S\4S j5       r\" SS9S\4S j5       rS\S\S\4S jrS\S\\    4S jr!S\S\S\4S jr"S\S\S\\    4S  jr#S\S\S\4S! jr$S\S\S\\    4S" jr%S#r&g)$YouSearchAPIWrapper2   a  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)r3   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                 (    [        USS5      nX!S'   U$ )z,Validate that api key exists in environment.r2   YDC_API_KEYr	   )clsrF   r2   s      r!   validate_environment(YouSearchAPIWrapper.validate_environmentn   s     +6=-P +}r    afterc                 0   U R                   S:w  aI  SnU HA  n[        X5      (       d  M  [        R                  " SU SU R                    S3[        5        MC     U R                   S;  a,  U R
                  (       a  [        R                  " S[        5        U $ )Nr4   )r>   r?   r@   zNews API-specific field 'z' is set but `endpoint_type="z"`. This will have no effect.r3   r6   zGField 'n_snippets_per_hit' only has effect on `endpoint_type="search"`.)r7   getattrwarningswarnUserWarningrB   )selfnews_api_fieldsfields      r!   !warn_if_set_fields_have_no_effect5YouSearchAPIWrapper.warn_if_set_fields_have_no_effectw   s    'FO(4''MM7w ?//3/A/A.B C88 $ ) %::&&4   r    c                 x    U R                   S:X  a)  [        R                  " SU R                    S3[        5        U $ )Nr%   z`endpoint_type="z7"` is deprecated. Use `endpoint_type="search"` instead.)r7   rQ   rR   DeprecationWarning)rT   s    r!   %warn_if_deprecated_endpoints_are_used9YouSearchAPIWrapper.warn_if_deprecated_endpoints_are_used   s@    +MM&t'9'9&: ;< < # r    querykwargsc                    U R                   U R                  S.UEnU R                  S;   a  UR                  UU R                  S9  OKU R                  S:X  a;  UR                  UU R                  U R
                  U R                  U R                  S9  UR                  5        VVs0 sH  u  pEUc  M
  XE_M     nnnU$ s  snnf )zb
Parse parameters required for different You.com APIs.

Args:
    query: The query to search for.
)r<   r=   rO   )r]   r8   r4   )qcountr>   r?   r@   )	r<   r=   r7   updater8   r>   r?   r@   items)rT   r]   r^   paramsrA   vs         r!   _generate_params$YouSearchAPIWrapper._generate_params   s     //||
 
 !66MM $ 4 4   6)MM** ,,??   $*<<>C>41Q$!$>C Ds   %B<1B<raw_search_resultsc                 n   U R                   S:X  aA  US   S   nU R                  b  USU R                   nU Vs/ sH  n[        US   US9PM     sn$ / nUS    H  nU R                  =(       d    [	        UR                  S5      5      nUR                  S5      SU  H  nUR                  [        UUR                  S5      UR                  S	5      UR                  S
5      UR                  S5      S.S95        U R                  c  Ml  [	        U5      U R                  :  d  M  Us  s  $    M     U$ s  snf )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
r4   resultsNr   )r-   r.   r)   r%   r   r   r   )r   r   r   r   )r7   rA   r   rB   lengetappend)rT   rh   news_resultsresultdocshitrB   r6   s           r!   _parse_results"YouSearchAPIWrapper._parse_results   s2    '-f5i@Lvv!+Hdff5 +*F f]&;fM* 
 %f-C!%!8!8!TC
@S<T77:./B0BC%,#&775>-0WW_-E%(WWW%5+.77=+A	"
 66%#d)tvv*=K D .  -s   D2c                    SU R                   =(       d    S0nU R                  " U40 UD6nU R                  S:X  a  SU l        [        R                  " [
         SU R                   3UUS9nUR                  5         UR                  5       $ )zsRun query through you.com Search and return hits.

Args:
    query: The query to search for.
Returns: YouAPIOutput
	X-API-Key r6   r3   /)rd   headers)r2   rf   r7   requestsrl   YOU_API_URLraise_for_statusjson)rT   r]   r^   rx   rd   responses         r!   raw_resultsYouSearchAPIWrapper.raw_results   s      0 0 6B7&&u77 *!)D<<m1T//01

 	!!#}}r    c           
          U R                   " U40 UR                  5        VVs0 sH  u  p4Uc  M
  X4_M     snnD6nU R                  U5      $ s  snnf )zCRun query through you.com Search and parses results into Documents.)r~   rc   rr   )rT   r]   r^   keyvaluerh   s         r!   rj   YouSearchAPIWrapper.results   sW     "--
,2LLNPNjcezszNP
 ""#566 Qs
   AAc                   #    SU R                   =(       d    S0nU R                  " U40 UD6nU R                  S:X  a  SU l        [        R                  " 5        ISh  vN nUR                  [         SU R                   3UUS9 ISh  vN nUR                  S:X  a<  UR                  5       I Sh  vN nUsSSS5      ISh  vN   sSSS5      ISh  vN   $ [        S	UR                   S
UR                   35      e N Nw NQ NA N2! , ISh  vN  (       d  f       O= fSSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f7f)z7Get results from the you.com Search API asynchronously.ru   rv   r6   r3   Nrw   )r   rd   rx      zError z: )r2   rf   r7   aiohttpClientSessionrl   rz   statusr|   	Exceptionreason)rT   r]   r^   rx   rd   sessionresrj   s           r!   raw_results_async%YouSearchAPIWrapper.raw_results_async  s&      0 0 6B7&&u77 *!)D((**g{{"m1T%7%7$89 #   ::$$'HHJ.G"   +** $fSZZL3::,$GHH + / +   +*****s   AED E!)D6
DD6$D
2D3D
8D6DD6	EDE%D
 ED6D
D6E
D!	DD!	D6$E/D20E6E<D?=E	Ec           
         #    U R                   " U40 UR                  5        VVs0 sH  u  p4Uc  M
  X4_M     snnD6I S h  vN nU R                  U5      $ s  snnf  N7f)N)r   rc   rr   )rT   r]   r^   r   r   raw_search_results_asyncs         r!   results_async!YouSearchAPIWrapper.results_async!  sd     
 *.)?)?*
,2LLNPNjcezszNP*
 $
  ""#;<< Q$
s    #AAA	A AA)r7   )'r   r   r   r   r   r2   r   r   r   r7   r   r8   intr<   r=   r>   r?   r@   boolrA   rB   rC   r   classmethodr   r   rK   r   rW   r[   rf   r   r   rr   r~   rj   r   r   r   r   r    r!   r0   r0   2   s   %N "&K#% BJM7=>I &*OXc])AEJ!<=>E!GXc]! "&K#%!GXc]!!%J%Ax}(,, FHSM (#$ 3   $ '"4  #0 '"	t 	 #	c S T >$ $$x. $L  
	277 7 
h	7II I 
	I4	=	= 	= 
h		=r    r0   )r   rQ   typingr   r   r   r   r   r   ry   langchain_core.documentsr   langchain_core.utilsr
   pydanticr   r   r   typing_extensionsr   rz   r   r#   r'   r+   r0   r   r    r!   <module>r      sq     5 5   - 5 6 6 "(EY EG^ G9 ) x=) x=r    