a
    bg                     @   s\   d Z ddlmZmZmZ ddlZddlmZ ddlm	Z	m
Z
mZmZ dZG dd de	ZdS )	zUtil that calls Bing Search.    )AnyDictListN)get_from_dict_or_env)	BaseModel
ConfigDictFieldmodel_validatorz*https://api.bing.microsoft.com/v7.0/searchc                   @   s   e Zd ZU dZeed< eed< dZeed< ee	dZ
e	ed< edd	Zeeee	 d
ddZeddeeedddZeedddZeeee dddZdS )BingSearchAPIWrapperz Wrapper for Bing Web Search API.bing_subscription_keybing_search_url
   k)default_factorysearch_kwargsZforbid)extra)search_termcountreturnc                 C   sX   d| j i}||ddd| j}tj| j||d}|  | }d|v rT|d d S g S )NzOcp-Apim-Subscription-KeyTHTML)qr   ZtextDecorationsZ
textFormat)headersparamsZwebPagesvalue)r   r   requestsgetr   raise_for_statusjson)selfr   r   r   r   responseZsearch_results r    w/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/utilities/bing_search.py_bing_search_results)   s$    
z)BingSearchAPIWrapper._bing_search_resultsbefore)mode)valuesr   c                 C   s0   t |dd}||d< t |ddtd}||d< |S )z9Validate that api key and endpoint exists in environment.r   ZBING_SUBSCRIPTION_KEYr   ZBING_SEARCH_URL)default)r   DEFAULT_BING_SEARCH_ENDPOINT)clsr%   r   r   r    r    r!   validate_environment=   s    z)BingSearchAPIWrapper.validate_environment)queryr   c                 C   sF   g }| j || jd}t|dkr$dS |D ]}||d  q(d|S )z.Run query through BingSearch and parse result.r   r   $No good Bing Search Result was foundsnippet )r"   r   lenappendjoin)r   r*   Zsnippetsresultsresultr    r    r!   runQ   s    zBingSearchAPIWrapper.run)r*   num_resultsr   c                 C   sX   g }| j ||d}t|dkr(ddigS |D ]&}|d |d |d d}|| q,|S )	a  Run query through BingSearch and return metadata.

        Args:
            query: The query to search for.
            num_results: The number of results to return.

        Returns:
            A list of dictionaries with the following keys:
                snippet - The description of the result.
                title - The title of the result.
                link - The link to the result.
        r+   r   Resultr,   r-   nameurl)r-   titlelink)r"   r/   r0   )r   r*   r5   Zmetadata_resultsr2   r3   Zmetadata_resultr    r    r!   r2   \   s    
zBingSearchAPIWrapper.resultsN)__name__
__module____qualname____doc__str__annotations__r   intr   dictr   r   Zmodel_configr   r"   r	   classmethodr   r   r)   r4   r2   r    r    r    r!   r
      s   
r
   )r>   typingr   r   r   r   Zlangchain_core.utilsr   Zpydanticr   r   r   r	   r'   r
   r    r    r    r!   <module>   s   