
    Ng                         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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                       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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                 2    t          |dd          }||d<   |S )z,Validate that api key exists in environment.r   MERRIAM_WEBSTER_API_KEYr	   )clsr   r   s      i/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/utilities/merriam_webster.pyvalidate_environmentz-MerriamWebsterAPIWrapper.validate_environment#   s0     #7-/H#
 #
 -D()    queryc                     t          |          }t           d| d| j         }t          j        |t
                    }|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responses        r   runzMerriamWebsterAPIWrapper.run.   s    U|| ' 3 3 3 303 3 	
 <5LMMM3&&= $$UH555r   r,   c                    t          j        |j                  sd| dS t          d         t                    rod| d}t                    dk    rFfdt          t                              D             }|dz  }|d                    |          z  }n&|d	d          d
z  }n|                     |          }|S )Nz3No Merriam-Webster definition was found for query 'z'.r   z'.
   c                 0    g | ]}|d z    d|          S )r/   .  ).0icontents     r   
<listcomp>z=MerriamWebsterAPIWrapper._format_response.<locals>.<listcomp>G   s/    VVVQ1q5 8 8GAJ 8 8VVVr   z7You can try one of the following alternative queries:


zDid you mean 'z'?)	jsonloadsr5   
isinstancestrlenrangejoin_format_definitions)r)   r   r,   resultalternativesr5   s        @r   r(   z)MerriamWebsterAPIWrapper._format_response>   s    *X-.. 	SRRRRRgaj#&& 		>V5VVVF7||aVVVV%GBUBUVVVUU$))L111971:9999--eW==Fr   definitionsc                     g }|D ]*}|                     |                     |                     +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':

r1   r7   )extend_format_definitionr<   	enumerate)r)   r   rB   formatted_definitions
definitionr@   r4   formatted_definitions           r   r?   z,MerriamWebsterAPIWrapper._format_definitionsQ   s    +-% 	N 	NJ!(()@)@)L)LMMMM$%%**NUNN4I!4LNNN1E111'01F'J'J 	7 	7#A#6626666FFr   rH   c              #   
  K   d|v r#|d         d                              dd          }n'|d         d                             d          d         }d	|v r|d	         }d
|v r|d
         D ]}| d| d| V  d S | d| V  d S )Nhwihw*-metaid:r   flshortdefz, z: )replacesplit)r)   rH   headwordfunctional_label	short_defs        r   rE   z+MerriamWebsterAPIWrapper._format_definition_   s      J!%(.66sC@@HH!&)$/55c::1=H:)$/##'
3 E E	!DD%5DDDDDDDDE E 33!13333333r   )__name__
__module____qualname____doc__r   r   r;   __annotations__r   model_configr   classmethodr   r   r   r-   r#   Responser(   r   r?   r   rE   r2   r   r   r   r      s7        	 	 .2Xc]111:  L _(###$ 3    [ $#6 6 6 6 6 6 c X5F 3    & 4: #    4T 4hsm 4 4 4 4 4 4r   r   )r\   r8   typingr   r   r   r   r   urllib.parser   r#   langchain_core.utilsr
   pydanticr   r   r   r"   r%   r   r2   r   r   <module>re      s    & &  6 6 6 6 6 6 6 6 6 6 6 6 6 6        5 5 5 5 5 5 ; ; ; ; ; ; ; ; ; ; F   [4 [4 [4 [4 [4y [4 [4 [4 [4 [4r   