a
    bg                     @   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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_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   {/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/utilities/merriam_webster.py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>G       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   Q   s    z,MerriamWebsterAPIWrapper._format_definitions)r=   r   c                 c   s   d|v r|d d  dd}n|d d dd }d	|v rD|d	 }d
|v 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)__name__
__module____qualname____doc__r   r   r3   __annotations__r   Zmodel_configr   classmethodr   r   r   r&   r   Responser"   r   r7   r   r;   r   r   r   r   r      s   
	r   )rI   r0   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   