async def get_config_via_legacy_route(bf_url, project_id): from rasa.utils.endpoints import EndpointConfig import aiohttp response = {} base_url = f"{bf_url}/project/{project_id}" for endpoint in ["credentials", "endpoints"]: server = EndpointConfig(url=f"{base_url}/{endpoint}") async with server.session() as session: params = server.combine_parameters() url = server.url @auto_retry async def load(): try: return await session.request( "GET", url, timeout=DEFAULT_REQUEST_TIMEOUT, params=params) except aiohttp.ClientError: return None data = await load() response[endpoint] = await data.json() return response
async def _pull_model_and_fingerprint( model_server: EndpointConfig, fingerprint: Optional[Text]) -> Optional[Tuple[Text, Text]]: """Queries the model server. Returns the temporary model directory and value of the response's <ETag> header which contains the model hash. Returns `None` if no new model is found. """ headers = {"If-None-Match": fingerprint} logger.debug("Requesting model from server {}...".format(model_server.url)) async with model_server.session() as session: try: set_log_level() params = model_server.combine_parameters() async with session.request( "GET", model_server.url, timeout=DEFAULT_REQUEST_TIMEOUT, headers=headers, params=params, ) as resp: if resp.status in [204, 304]: logger.debug("Model server returned {} status code, " "indicating that no new model is available. " "Current fingerprint: {}" "".format(resp.status, fingerprint)) return None elif resp.status == 404: logger.debug( "Model server could not find a model at the requested " "endpoint '{}'. It's possible that no model has been " "trained, or that the requested tag hasn't been " "assigned.".format(model_server.url)) return None elif resp.status != 200: logger.debug( "Tried to fetch model from server, but server response " "status code is {}. We'll retry later..." "".format(resp.status)) return None model_directory = tempfile.mkdtemp() rasa.utils.io.unarchive(await resp.read(), model_directory) logger.debug("Unzipped model to '{}'".format( os.path.abspath(model_directory))) # get the new fingerprint new_fingerprint = resp.headers.get("ETag") # return new tmp model directory and new fingerprint return model_directory, new_fingerprint except aiohttp.ClientError as e: logger.debug("Tried to fetch model from server, but " "couldn't reach server. We'll retry later... " "Error: {}.".format(e)) return None
async def load_from_remote( server: EndpointConfig, name: Text, temp_file=True ) -> Union[Text, Dict]: """Returns and object or a file from an endpoint """ logger.debug("Requesting {} from server {}...".format(name, server.url)) async with server.session() as session: params = server.combine_parameters() url = server.url tries = 1; resp = None while not resp or resp.status != 200: if tries == 1 or tries % 5000 == 0: logger.debug('Trying to fetch {} from server (retry #{})'.format(name, str(tries))) resp = await load(session, params, url) tries += 1 json = await resp.json() if temp_file is True: with tempfile.NamedTemporaryFile(mode='w', delete=False) as yamlfile: yaml.dump(json, yamlfile) return yamlfile.name else: return json
async def _pull_model_and_fingerprint( model_server: EndpointConfig, model_directory: Text, fingerprint: Optional[Text]) -> Optional[Text]: """Queries the model server and returns the value of the response's <ETag> header which contains the model hash. """ headers = {"If-None-Match": fingerprint} logger.debug("Requesting model from server {}...".format(model_server.url)) async with model_server.session() as session: try: params = model_server.combine_parameters() async with session.request( "GET", model_server.url, timeout=DEFAULT_REQUEST_TIMEOUT, headers=headers, params=params, ) as resp: if resp.status in [204, 304]: logger.debug("Model server returned {} status code, " "indicating that no new model is available. " "Current fingerprint: {}" "".format(resp.status, fingerprint)) return resp.headers.get("ETag") elif resp.status == 404: logger.debug( "Model server didn't find a model for our request. " "Probably no one did train a model for the project " "and tag combination yet.") return None elif resp.status != 200: logger.warning( "Tried to fetch model from server, but server response " "status code is {}. We'll retry later..." "".format(resp.status)) return None rasa.utils.io.unarchive(await resp.read(), model_directory) logger.debug("Unzipped model to '{}'".format( os.path.abspath(model_directory))) # get the new fingerprint return resp.headers.get("ETag") except aiohttp.ClientError as e: logger.info("Tried to fetch model from server, but " "couldn't reach server. We'll retry later... " "Error: {}.".format(e)) return None
async def load_from_remote(server: EndpointConfig, name: Text, temp_file=True) -> Union[Text, Dict]: """Returns and object or a file from an endpoint """ logger.debug("Requesting {} from server {}...".format(name, server.url)) async with server.session() as session: try: set_log_level() params = server.combine_parameters() async with session.request( "GET", server.url, timeout=DEFAULT_REQUEST_TIMEOUT, params=params, ) as resp: if resp.status in [204, 304]: logger.debug( "Model server returned {} status code, indicating " "that no new {} are available.".format( resp.status, name)) return None elif resp.status == 404: logger.warning( "Tried to fetch {} from server but got a 404 response". format(name)) raise requests.exceptions.InvalidURL(server.url) elif resp.status != 200: logger.warning( "Tried to fetch {} from server, but server response " "status code is {}." "".format(name, resp.status)) raise requests.exceptions.InvalidURL(server.url) if temp_file is True: with tempfile.NamedTemporaryFile(mode='w', delete=False) as yamlfile: yaml.dump(await resp.json(), yamlfile) return yamlfile.name else: return await resp.json() except aiohttp.ClientError as e: logger.warning( "Tried to fetch rules from server, but couldn't reach " "server. We'll retry later... Error: {}." "".format(e)) raise requests.exceptions.InvalidURL(server.url)
async def _pull_model_and_fingerprint(model_server: EndpointConfig, fingerprint: Optional[Text], model_directory: Text) -> Optional[Text]: """Queries the model server. Args: model_server: Model server endpoint information. fingerprint: Current model fingerprint. model_directory: Directory where to download model to. Returns: Value of the response's <ETag> header which contains the model hash. Returns `None` if no new model is found. """ headers = {"If-None-Match": fingerprint} logger.debug(f"Requesting model from server {model_server.url}...") async with model_server.session() as session: try: params = model_server.combine_parameters() async with session.request( "GET", model_server.url, timeout=DEFAULT_REQUEST_TIMEOUT, headers=headers, params=params, ) as resp: if resp.status in [204, 304]: logger.debug("Model server returned {} status code, " "indicating that no new model is available. " "Current fingerprint: {}" "".format(resp.status, fingerprint)) return None elif resp.status == 404: logger.debug( "Model server could not find a model at the requested " "endpoint '{}'. It's possible that no model has been " "trained, or that the requested tag hasn't been " "assigned.".format(model_server.url)) return None elif resp.status != 200: logger.debug( "Tried to fetch model from server, but server response " "status code is {}. We'll retry later..." "".format(resp.status)) return None model_path = Path(model_directory) / resp.headers.get( "filename", "model.tar.gz") with open(model_path, "wb") as file: file.write(await resp.read()) logger.debug("Saved model to '{}'".format( os.path.abspath(model_path))) # return the new fingerprint return resp.headers.get("ETag") except aiohttp.ClientError as e: logger.debug("Tried to fetch model from server, but " "couldn't reach server. We'll retry later... " "Error: {}.".format(e)) return None