[docs]classChatGPTPluginRetriever(BaseRetriever):"""`ChatGPT plugin` retriever."""url:str"""URL of the ChatGPT plugin."""bearer_token:str"""Bearer token for the ChatGPT plugin."""top_k:int=3"""Number of documents to return."""filter:Optional[dict]=None"""Filter to apply to the results."""aiosession:Optional[aiohttp.ClientSession]=None"""Aiohttp session to use for requests."""model_config=ConfigDict(arbitrary_types_allowed=True,)def_get_relevant_documents(self,query:str,*,run_manager:CallbackManagerForRetrieverRun)->List[Document]:url,json,headers=self._create_request(query)response=requests.post(url,json=json,headers=headers)results=response.json()["results"][0]["results"]docs=[]fordinresults:content=d.pop("text")metadata=d.pop("metadata",d)ifmetadata.get("source_id"):metadata["source"]=metadata.pop("source_id")docs.append(Document(page_content=content,metadata=metadata))returndocsasyncdef_aget_relevant_documents(self,query:str,*,run_manager:AsyncCallbackManagerForRetrieverRun)->List[Document]:url,json,headers=self._create_request(query)ifnotself.aiosession:asyncwithaiohttp.ClientSession()assession:asyncwithsession.post(url,headers=headers,json=json)asresponse:res=awaitresponse.json()else:asyncwithself.aiosession.post(url,headers=headers,json=json)asresponse:res=awaitresponse.json()results=res["results"][0]["results"]docs=[]fordinresults:content=d.pop("text")metadata=d.pop("metadata",d)ifmetadata.get("source_id"):metadata["source"]=metadata.pop("source_id")docs.append(Document(page_content=content,metadata=metadata))returndocsdef_create_request(self,query:str)->tuple[str,dict,dict]:url=f"{self.url}/query"json={"queries":[{"query":query,"filter":self.filter,"top_k":self.top_k,}]}headers={"Content-Type":"application/json","Authorization":f"Bearer {self.bearer_token}",}returnurl,json,headers