コード例 #1
0
ファイル: botfront.py プロジェクト: zqqq/rasa-for-botfront
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
コード例 #2
0
ファイル: agent.py プロジェクト: zeroesones/rasa
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
コード例 #3
0
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
コード例 #4
0
ファイル: agent.py プロジェクト: wangy1986/rasa
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
コード例 #5
0
ファイル: utils.py プロジェクト: meelement/rasa-for-botfront
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)
コード例 #6
0
ファイル: agent.py プロジェクト: spawn08/rasa
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