o
    ȳg                     @   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_keyforbid)extrabefore)modevaluesreturnc                 C   s   t |dd}||d< |S )z,Validate that api key exists in environment.r   MERRIAM_WEBSTER_API_KEYr   )clsr   r    r   i/var/www/html/chatdoc2/venv/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   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(   result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+   r1   )extend_format_definitionr6   	enumerate)r%   r   r<   formatted_definitions
definitionr:   r-   formatted_definitionr   r   r   r9   Q   s   z,MerriamWebsterAPIWrapper._format_definitionsrA   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 )Nhwihw*-metaid:r   flshortdefz, z: )replacesplit)r%   rA   headwordfunctional_label	short_defr   r   r   r>   _   s   z+MerriamWebsterAPIWrapper._format_definition)__name__
__module____qualname____doc__r   r   r5   __annotations__r   model_configr   classmethodr   r   r   r)   r   Responser$   r   r9   r   r>   r   r   r   r   r      s   
 	r   )rT   r2   typingr   r   r   r   r   urllib.parser   r   langchain_core.utilsr	   pydanticr
   r   r   r   r!   r   r   r   r   r   <module>   s    