Source code for langchain_community.utilities.merriam_webster
"""Util that calls Merriam-Webster."""importjsonfromtypingimportDict,Iterator,List,Optionalfromurllib.parseimportquoteimportrequestsfromlangchain_core.pydantic_v1importBaseModel,root_validatorfromlangchain_core.utilsimportget_from_dict_or_envMERRIAM_WEBSTER_API_URL=("https://www.dictionaryapi.com/api/v3/references/collegiate/json")MERRIAM_WEBSTER_TIMEOUT=5000
[docs]classMerriamWebsterAPIWrapper(BaseModel):"""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 """merriam_webster_api_key:Optional[str]=NoneclassConfig:extra="forbid"@root_validator(pre=True)defvalidate_environment(cls,values:Dict)->Dict:"""Validate that api key exists in environment."""merriam_webster_api_key=get_from_dict_or_env(values,"merriam_webster_api_key","MERRIAM_WEBSTER_API_KEY")values["merriam_webster_api_key"]=merriam_webster_api_keyreturnvalues
[docs]defrun(self,query:str)->str:"""Run query through Merriam-Webster API and return a formatted result."""quoted_query=quote(query)request_url=(f"{MERRIAM_WEBSTER_API_URL}/{quoted_query}"f"?key={self.merriam_webster_api_key}")response=requests.get(request_url,timeout=MERRIAM_WEBSTER_TIMEOUT)ifresponse.status_code!=200:returnresponse.textreturnself._format_response(query,response)
def_format_response(self,query:str,response:requests.Response)->str:content=json.loads(response.content)ifnotcontent:returnf"No Merriam-Webster definition was found for query '{query}'."ifisinstance(content[0],str):result=f"No Merriam-Webster definition was found for query '{query}'.\n"iflen(content)>1:alternatives=[f"{i+1}. {content[i]}"foriinrange(len(content))]result+="You can try one of the following alternative queries:\n\n"result+="\n".join(alternatives)else:result+=f"Did you mean '{content[0]}'?"else:result=self._format_definitions(query,content)returnresultdef_format_definitions(self,query:str,definitions:List[Dict])->str:formatted_definitions:List[str]=[]fordefinitionindefinitions:formatted_definitions.extend(self._format_definition(definition))iflen(formatted_definitions)==1:returnf"Definition of '{query}':\n"f"{formatted_definitions[0]}"result=f"Definitions of '{query}':\n\n"fori,formatted_definitioninenumerate(formatted_definitions,1):result+=f"{i}. {formatted_definition}\n"returnresultdef_format_definition(self,definition:Dict)->Iterator[str]:if"hwi"indefinition:headword=definition["hwi"]["hw"].replace("*","-")else:headword=definition["meta"]["id"].split(":")[0]if"fl"indefinition:functional_label=definition["fl"]if"shortdef"indefinition:forshort_defindefinition["shortdef"]:yieldf"{headword}, {functional_label}: {short_def}"else:yieldf"{headword}, {functional_label}"