o
    Zh                     @   sx   d Z ddlZddlmZmZmZmZmZ ddlm	Z	 ddl
Z
ddlmZ ddlmZmZmZ dZdZG d	d
 d
eZdS )z Util that calls Merriam-Webster.    N)AnyDictIteratorListOptional)quoteget_from_dict_or_env)	BaseModel
ConfigDictmodel_validatorz?https://www.dictionaryapi.com/api/v3/references/collegiate/jsoni  c                   @   s   e Zd ZU dZdZee ed< eddZ	e
ddeded	efd
dZded	efddZdedejd	efddZdedee d	efddZded	ee f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_keyZforbid)extrabefore)mode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   d/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/utilities/merriam_webster.pyvalidate_environment#   s
   z-MerriamWebsterAPIWrapper.validate_environmentqueryc                 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.runr%   c                    s   t |j  sd| dS t d trGd| d}t dkr; fddtt D }|d7 }|d	|7 }|S |d
 d  d7 }|S | | }|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>G   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definitionsc                 C   sv   g }|D ]
}| | | qt|dkrd| d|d  S d| d}t|dD ]\}}|| d| d7 }q*|S )	Nr'   zDefinition of 'z':
r   zDefinitions of 'z':

r(   r.   )extend_format_definitionr3   	enumerate)r#   r   r8   Zformatted_definitions
definitionr7   r*   Zformatted_definitionr   r   r   r6   Q   s   z,MerriamWebsterAPIWrapper._format_definitionsr<   c                 c   s    d|v r|d d  dd}n|d d dd }d	|v r#|d	 }d
|v r;|d
 D ]}| d| d| V  q+d S | 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)__name__
__module____qualname____doc__r   r   r2   __annotations__r   Zmodel_configr   classmethodr   r   r   r&   r   Responser"   r   r6   r   r:   r   r   r   r   r      s   
 	r   )rH   r/   typingr   r   r   r   r   urllib.parser   r   Zlangchain_core.utilsr	   Zpydanticr
   r   r   r   r   r   r   r   r   r   <module>   s    