U
    hk                     @   sp   d Z ddlZddlmZmZmZmZ ddlmZ ddl	Z	ddl
mZmZ ddlmZ dZdZG d	d
 d
eZdS )z Util that calls Merriam-Webster.    N)DictIteratorListOptional)quote)	BaseModelroot_validatorget_from_dict_or_envz?https://www.dictionaryapi.com/api/v3/references/collegiate/jsoni  c                   @   s   e Zd ZU dZdZee ed< G dd dZe	dde
e
dd	d
ZeedddZeejedddZeee
 edddZe
ee dddZdS )MerriamWebsterAPIWrapperaR  Wrapper for Merriam-Webster.

    Docs for using:

    1. Go to https://www.dictionaryapi.com/register/index and register an
       developer account with a key for the Collegiate Dictionary
    2. Get your API Key from https://www.dictionaryapi.com/account/my-keys
    3. Save your API Key into MERRIAM_WEBSTER_API_KEY env variable

    Nmerriam_webster_api_keyc                   @   s   e Zd ZdZdS )zMerriamWebsterAPIWrapper.ConfigZforbidN)__name__
__module____qualname__extra r   r   Q/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/utilities/merriam_webster.pyConfig   s   r   T)pre)valuesreturnc                 C   s   t |dd}||d< |S )z,Validate that api key exists in environment.r   ZMERRIAM_WEBSTER_API_KEYr	   )clsr   r   r   r   r   validate_environment"   s      z-MerriamWebsterAPIWrapper.validate_environment)queryr   c                 C   sH   t |}t d| d| j }tj|td}|jdkr<|jS | ||S )zDRun query through Merriam-Webster API and return a formatted result./z?key=)timeout   )	r   MERRIAM_WEBSTER_API_URLr   requestsgetMERRIAM_WEBSTER_TIMEOUTstatus_codetext_format_response)selfr   Zquoted_queryrequest_urlresponser   r   r   run,   s    
zMerriamWebsterAPIWrapper.run)r   r&   r   c                    s   t |j  sd| dS t d trd| d}t dkrt fddtt D }|d7 }|d	|7 }q|d
 d  d7 }n| | }|S )Nz3No Merriam-Webster definition was found for query 'z'.r   z'.
   c                    s"   g | ]}|d   d |  qS )r(   . r   ).0icontentr   r   
<listcomp>E   s     z=MerriamWebsterAPIWrapper._format_response.<locals>.<listcomp>z7You can try one of the following alternative queries:


zDid you mean 'z'?)	jsonloadsr-   
isinstancestrlenrangejoin_format_definitions)r$   r   r&   resultZalternativesr   r,   r   r#   <   s    z)MerriamWebsterAPIWrapper._format_response)r   definitionsr   c                 C   sv   g }|D ]}| | | qt|dkr>d| d|d  S d| d}t|dD ]\}}|| d| d7 }qT|S )	Nr(   zDefinition of 'z':
r   zDefinitions of 'z':

r)   r/   )extend_format_definitionr4   	enumerate)r$   r   r9   Zformatted_definitions
definitionr8   r+   Zformatted_definitionr   r   r   r7   O   s    z,MerriamWebsterAPIWrapper._format_definitions)r=   r   c                 c   s   d|kr|d d  dd}n|d d dd }d	|krD|d	 }d
|krr|d
 D ]}| d| d| V  qTn| d| V  d S )NZhwiZhw*-metaid:r   flZshortdefz, z: )replacesplit)r$   r=   ZheadwordZfunctional_labelZ	short_defr   r   r   r;   ]   s    z+MerriamWebsterAPIWrapper._format_definition)r   r   r   __doc__r   r   r3   __annotations__r   r   r   r   r'   r   Responser#   r   r7   r   r;   r   r   r   r   r      s   
	r   )rF   r0   typingr   r   r   r   urllib.parser   r   Zlangchain_core.pydantic_v1r   r   Zlangchain_core.utilsr
   r   r    r   r   r   r   r   <module>   s   