
    7|h                     ~    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
e      Zy)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                       e Zd ZU dZdZee   ed<    ed      Z	 e
d      eded	efd
              Zded	efdZdedej"                  d	efdZdedee   d	efdZded	ee   fdZy)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                 *    t        |dd      }||d<   |S )z,Validate that api key exists in environment.r   MERRIAM_WEBSTER_API_KEYr	   )clsr   r   s      l/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/utilities/merriam_webster.pyvalidate_environmentz-MerriamWebsterAPIWrapper.validate_environment#   s+     #7-/H#
 -D()    queryc                     t        |      }t         d| d| j                   }t        j                  |t
              }|j                  dk7  r|j                  S | j                  ||      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responses        r   runzMerriamWebsterAPIWrapper.run.   so    U| ''qD0013 	
 <<5LM3&== $$UH55r   r,   c                 z   t        j                  |j                        }|sd| dS t        |d   t              rid| d}t        |      dkD  rGt        t        |            D cg c]  }|dz    d||     }}|dz  }|dj                  |      z  }|S |d	|d    d
z  }|S | j                  ||      }|S c c}w )Nz3No Merriam-Webster definition was found for query 'z'.r   z'.
   . z7You can try one of the following alternative queries:


zDid you mean 'z'?)	jsonloadscontent
isinstancestrlenrangejoin_format_definitions)r)   r   r,   r4   resultialternativess          r   r(   z)MerriamWebsterAPIWrapper._format_response>   s    **X--.HrRRgaj#&J5'QUVF7|aBGGBUVQ1q5'GAJ< 8VVUU$))L11 	 N71:,b99  --eW=F  Ws   %B8definitionsc                     g }|D ]"  }|j                  | j                  |             $ t        |      dk(  rd| d|d    S d| d}t        |d      D ]  \  }}|| d| dz  } |S )	Nr/   zDefinition of 'z':
r   zDefinitions of 'z':

r0   r1   )extend_format_definitionr7   	enumerate)r)   r   r>   formatted_definitions
definitionr;   r<   formatted_definitions           r   r:   z,MerriamWebsterAPIWrapper._format_definitionsQ   s    +-% 	NJ!(()@)@)LM	N $%*$UG40Ea0H/IJJ#E7&1'01F'J 	7#A#223266F	7 r   rD   c              #      K   d|v r|d   d   j                  dd      }n|d   d   j                  d      d   }d	|v r|d	   }d
|v r|d
   D ]  }| d d|   y | d  y w)Nhwihw*-metaid:r   flshortdefz, z: )replacesplit)r)   rD   headwordfunctional_label	short_defs        r   rA   z+MerriamWebsterAPIWrapper._format_definition_   s     J!%(.66sC@H!&)$/55c:1=H:)$/#'
3 E	!
"%5$6bDDE Jb!1 233s   A&A()__name__
__module____qualname____doc__r   r   r6   __annotations__r   model_configr   classmethodr   r   r   r-   r#   Responser(   r   r:   r   rA    r   r   r   r      s    	 .2Xc]1L (#$ 3   $6 6 6 c X5F5F 3 & 4: # 4T 4hsm 4r   r   )rX   r2   typingr   r   r   r   r   urllib.parser   r#   langchain_core.utilsr
   pydanticr   r   r   r"   r%   r   r]   r   r   <module>rb      sA    &  6 6   5 ; ; F   [4y [4r   