[docs]classAskNewsRetriever(BaseRetriever):"""AskNews retriever."""k:int=10offset:int=0start_timestamp:Optional[int]=Noneend_timestamp:Optional[int]=Nonemethod:Literal["nl","kw"]="nl"categories:List[Literal["All","Business","Crime","Politics","Science","Sports","Technology","Military","Health","Entertainment","Finance","Culture","Climate","Environment","World",]]=["All"]historical:bool=Falsesimilarity_score_threshold:float=0.5kwargs:Optional[Dict[str,Any]]={}client_id:Optional[str]=Noneclient_secret:Optional[str]=Nonedef_get_relevant_documents(self,query:str,*,run_manager:CallbackManagerForRetrieverRun)->List[Document]:"""Get documents relevant to a query. Args: query: String to find relevant documents for run_manager: The callbacks handler to use Returns: List of relevant documents """try:fromasknews_sdkimportAskNewsSDKexceptImportError:raiseImportError("AskNews python package not found. ""Please install it with `pip install asknews`.")an_client=AskNewsSDK(client_id=self.client_idoros.environ["ASKNEWS_CLIENT_ID"],client_secret=self.client_secretoros.environ["ASKNEWS_CLIENT_SECRET"],scopes=["news"],)response=an_client.news.search_news(query=query,n_articles=self.k,start_timestamp=self.start_timestamp,end_timestamp=self.end_timestamp,method=self.method,categories=self.categories,historical=self.historical,similarity_score_threshold=self.similarity_score_threshold,offset=self.offset,doc_start_delimiter="<doc>",doc_end_delimiter="</doc>",return_type="both",**self.kwargs,)returnself._extract_documents(response)asyncdef_aget_relevant_documents(self,query:str,*,run_manager:AsyncCallbackManagerForRetrieverRun)->List[Document]:"""Asynchronously get documents relevant to a query. Args: query: String to find relevant documents for run_manager: The callbacks handler to use Returns: List of relevant documents """try:fromasknews_sdkimportAsyncAskNewsSDKexceptImportError:raiseImportError("AskNews python package not found. ""Please install it with `pip install asknews`.")an_client=AsyncAskNewsSDK(client_id=self.client_idoros.environ["ASKNEWS_CLIENT_ID"],client_secret=self.client_secretoros.environ["ASKNEWS_CLIENT_SECRET"],scopes=["news"],)response=awaitan_client.news.search_news(query=query,n_articles=self.k,start_timestamp=self.start_timestamp,end_timestamp=self.end_timestamp,method=self.method,categories=self.categories,historical=self.historical,similarity_score_threshold=self.similarity_score_threshold,offset=self.offset,return_type="both",doc_start_delimiter="<doc>",doc_end_delimiter="</doc>",**self.kwargs,)returnself._extract_documents(response)def_extract_documents(self,response:Any)->List[Document]:"""Extract documents from an api response."""fromasknews_sdk.dto.newsimportSearchResponsesr:SearchResponse=responsematches=re.findall(r"<doc>(.*?)</doc>",sr.as_string,re.DOTALL)docs=[Document(page_content=matches[i].strip(),metadata={"title":sr.as_dicts[i].title,"source":str(sr.as_dicts[i].article_url)ifsr.as_dicts[i].article_urlelseNone,"images":sr.as_dicts[i].image_url,},)foriinrange(len(matches))]returndocs