示例#1
0
def gourmet_response(vars):
    try:
        state_utils.set_confidence(vars, confidence=CONF_MIDDLE)
        state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_PROMPT)
        response = "It seems you're a gourmet! What meal do you like?"
        state_utils.add_acknowledgement_to_response_parts(vars)
        return response
    except Exception as exc:
        logger.exception(exc)
        sentry_sdk.capture_exception(exc)
        return error_response(vars)
示例#2
0
文件: nlg.py 项目: deepmipt/deepy
def comment_on_user_experience_and_ask_if_user_wants_to_know_how_to_response(
        vars):
    uttr_text = state_utils.get_last_human_utterance(vars).get("text", "")
    experience_comment, time_detected = common_nlg.compose_experience_comment(
        uttr_text)
    do_you_want_how_to = tell_how_to(vars, must_continue=time_detected)
    state_utils.add_acknowledgement_to_response_parts(vars)
    return (
        experience_comment +
        " During one of my hacks into Minecraft I discovered a secret trick. "
        + do_you_want_how_to)
示例#3
0
def tell_about_healthy_gaming_and_ask_what_sport_user_likes_response(vars):
    response = (
        "You are very sensible person. There are several simple rules which help people stay healthy while "
        "playing video games and using computer in general. The first is to give your eyes rest regularly. "
        "You can use reminders for that. The second rule is to follow break schedule. And the last rule is "
        "to exercise regularly. By the way, what sport do you like?")
    state_utils.add_acknowledgement_to_response_parts(vars)
    state_utils.set_confidence(vars, confidence=common_nlg.CONF_1)
    state_utils.set_can_continue(vars,
                                 continue_flag=common_constants.MUST_CONTINUE)
    gaming_memory.mark_current_bot_utterance_as_link_to_other_skill(vars)
    return response
示例#4
0
def cuisine_fact_response(vars):
    cuisine_fact = ""
    try:
        state_utils.set_confidence(vars, confidence=CONF_MIDDLE)
        last_utt = state_utils.get_last_human_utterance(vars)
        last_utt_lower = last_utt["text"].lower()
        conceptnet_flag, food_item = check_conceptnet(vars)
        if any([w.pos_ == "ADJ" for w in spacy_nlp(last_utt_lower)]):
            for cuisine in list(CUISINES_FACTS.keys()):
                if cuisine in last_utt_lower:
                    cuisine_fact = CUISINES_FACTS.get(cuisine, "")
                    state_utils.save_to_shared_memory(vars, cuisine=cuisine)
                    state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                    return cuisine_fact
            if not cuisine_fact:
                state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                response = "You have such a refined taste in food! "
                "I haven't tried it yet. What do you recommend to start with?"
                state_utils.add_acknowledgement_to_response_parts(vars)
                return response
        elif conceptnet_flag:
            entity_linking = last_utt["annotations"].get("entity_linking", [])
            if entity_linking:
                _facts = entity_linking[0].get("entity_pages", [])
                if _facts:
                    state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                    response = f"You're a gourmet! I know about {food_item} that {_facts[0]}"
                    state_utils.add_acknowledgement_to_response_parts(vars)
                    return response
                else:
                    return ""
            else:
                state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                return (
                    "My favorite cuisine is French. I'm just in love "
                    "with pastry, especially with profiteroles! How about you?"
                )
        else:
            state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
            return (
                "My favorite cuisine is French. I'm just in love "
                "with pastry, especially with profiteroles! How about you?"
            )
    except Exception as exc:
        logger.exception(exc)
        sentry_sdk.capture_exception(exc)
        return error_response(vars)
示例#5
0
文件: nlg.py 项目: deepmipt/deepy
def ask_user_when_he_started_to_play_minecraft_response(
        vars, candidate_game_id_is_already_set):
    shared_memory_ops.set_current_igdb_game_id_if_game_for_discussion_is_identified(
        vars, candidate_game_id_is_already_set)
    response = (
        "Perfect taste! Minecraft is the best game ever! I dived into the game right after I was created. "
        "And what about you? When did you start to play Minecraft?")
    human_uttr = state_utils.get_last_human_utterance(vars)
    bot_text = state_utils.get_last_bot_utterance(vars).get("text", "")
    state_utils.add_acknowledgement_to_response_parts(vars)
    flags_set = False
    if not if_chat_about_particular_topic(
            human_uttr, compiled_pattern=re.compile("minecraft", flags=re.I)):
        flags_set, response = common_nlg.maybe_set_confidence_and_continue_based_on_previous_bot_phrase(
            vars, bot_text, response)
        logger.info(f"flags_set: {flags_set}")
    if not flags_set:
        state_utils.set_confidence(vars, confidence=common_nlg.CONF_1)
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.MUST_CONTINUE)
    return response
示例#6
0
文件: nlg.py 项目: deepmipt/deepy
def praise_user_achievement_in_minecraft_and_try_to_link_to_harry_potter_response(
        vars):
    disliked_skills = state_utils.get_disliked_skills(vars)
    used_linkto_phrases_ids = shared_memory_ops.get_used_linkto_phrase_ids(
        vars)
    logger.info(
        "(praise_user_achievement_in_minecraft_and_try_to_link_to_harry_potter_response)"
        f"LINKTO_RESPONSES_TO_LINKTO_IDS: {shared_memory_ops.LINKTO_RESPONSES_TO_LINKTO_IDS}"
    )
    book_link_to_id = shared_memory_ops.LINKTO_RESPONSES_TO_LINKTO_IDS[
        common_gaming.special_links_to_books["Harry Potter"][0]]
    movie_link_to_id = shared_memory_ops.LINKTO_RESPONSES_TO_LINKTO_IDS[
        common_gaming.special_links_to_movies["Harry Potter"][0]]
    if "movie_skill" not in disliked_skills and movie_link_to_id not in used_linkto_phrases_ids:
        response = "Sounds cool! " + common_gaming.special_links_to_movies[
            "Harry Potter"][0]
        shared_memory_ops.add_used_linkto_to_shared_memory(
            vars, common_gaming.special_links_to_movies["Harry Potter"][0])
    elif "dff_book_skill" not in disliked_skills and book_link_to_id not in used_linkto_phrases_ids:
        response = "Sounds cool! " + common_gaming.special_links_to_books[
            "Harry Potter"][0]
        shared_memory_ops.add_used_linkto_to_shared_memory(
            vars, common_gaming.special_links_to_books["Harry Potter"][0])
    else:
        response = ""
    if response:
        state_utils.set_confidence(
            vars, confidence=common_nlg.CONF_09_DONT_UNDERSTAND_DONE)
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    else:
        state_utils.set_confidence(vars, confidence=common_nlg.CONF_0)
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    shared_memory_ops.mark_current_bot_utterance_as_link_to_other_skill(vars)
    state_utils.add_acknowledgement_to_response_parts(vars)
    return response
示例#7
0
def facts_response(vars, topic_config, wikihow_cache, wikipedia_cache):
    shared_memory = state_utils.get_shared_memory(vars)
    user_uttr = state_utils.get_last_human_utterance(vars)
    bot_uttr = state_utils.get_last_bot_utterance(vars)
    prev_active_skill = bot_uttr.get("active_skill", "")
    if prev_active_skill not in {"dff_wiki_skill", "dff_music_skill"}:
        delete_topic_info(vars)
    isyes = is_yes(user_uttr) or re.findall(CONTINUE_PATTERN,
                                            user_uttr["text"])
    response = ""
    cur_mode = shared_memory.get("cur_mode", "smalltalk")
    wikipedia_page = shared_memory.get("cur_wikipedia_page", "")
    wikihow_page = shared_memory.get("cur_wikihow_page", "")
    found_topic = shared_memory.get("special_topic", "")
    utt_can_continue = common_constants.CAN_CONTINUE_SCENARIO
    utt_conf = CONF_DICT["WIKI_TOPIC"]
    first_utt = False
    entity_substr = ""
    entity_types = []
    if not found_topic:
        found_topic, first_utt, utt_can_continue, utt_conf = check_switch(
            vars, topic_config)
    extract_and_save_entity(vars, topic_config, found_topic)
    extract_and_save_subtopic(vars, topic_config, found_topic)
    extract_and_save_wikipage(vars, True)
    if found_topic and cur_mode == "smalltalk":
        if "triggers" in topic_config[found_topic]:
            triggers = topic_config[found_topic]["triggers"]
            entity_substr, entity_types, wikipedia_page, wikihow_page = find_trigger(
                vars, triggers)
        facts = topic_config[found_topic].get("facts", {})
        if facts and not wikihow_page and not wikipedia_page:
            entity_substr = facts.get("entity_substr", "")
            entity_types = facts.get("entity_types", [])
            wikihow_page = facts.get("wikihow_page", "")
            wikipedia_page = facts.get("wikipedia_page", "")
            logger.info(f"wikipedia_page {wikipedia_page}")
        if not wikihow_page:
            wikihow_page = shared_memory.get("cur_wikihow_page", "")
        if wikihow_page:
            if wikihow_page in wikihow_cache:
                page_content = wikihow_cache[wikihow_page]
            else:
                page_content = get_wikihow_content(wikihow_page)
            wikihow_page_content_list = preprocess_wikihow_page(page_content)
            memory["wikihow_content"] = wikihow_page_content_list
            state_utils.save_to_shared_memory(vars,
                                              cur_wikihow_page=wikihow_page)
        if not wikipedia_page:
            wikipedia_page = shared_memory.get("cur_wikipedia_page", "")

        if wikipedia_page:
            if wikipedia_page in wikipedia_cache:
                page_content = wikipedia_cache[wikipedia_page].get(
                    "page_content", {})
            else:
                page_content, _ = get_page_content(wikipedia_page)
            if not entity_substr:
                entity_substr = wikipedia_page.lower()
            titles_info = topic_config[found_topic].get("titles_info", [])
            predefined_titles = []
            for titles_info_elem in titles_info:
                if wikipedia_page in titles_info_elem["pages"]:
                    predefined_titles = titles_info_elem["titles"]
                    break
            wikipedia_page_content_list = preprocess_wikipedia_page(
                entity_substr, entity_types, page_content, predefined_titles)
            memory["wikipedia_content"] = wikipedia_page_content_list
            state_utils.save_to_shared_memory(
                vars, cur_wikipedia_page=wikipedia_page)
        logger.info(
            f"wikihow_page {wikihow_page} wikipedia_page {wikipedia_page}")
    if found_topic:
        used_wikihow_nums_dict = shared_memory.get("used_wikihow_nums", {})
        used_wikihow_nums = used_wikihow_nums_dict.get(wikihow_page, [])
        used_wikipedia_nums_dict = shared_memory.get("used_wikipedia_nums", {})
        used_wikipedia_nums = used_wikipedia_nums_dict.get(wikipedia_page, [])
        wikihow_page_content_list = memory.get("wikihow_content", [])
        wikipedia_page_content_list = memory.get("wikipedia_content", [])
        logger.info(
            f"response, used_wikihow_nums {used_wikihow_nums} used_wikipedia_nums {used_wikipedia_nums}"
        )
        logger.info(
            f"response, wikipedia_page_content_list {wikipedia_page_content_list[:3]} "
            f"wikihow_page_content_list {wikihow_page_content_list[:3]}")
        if wikihow_page and wikihow_page_content_list:
            for num, fact in enumerate(wikihow_page_content_list):
                if num not in used_wikihow_nums:
                    facts_str = fact.get("facts_str", "")
                    question = fact.get("question", "")
                    response = f"{facts_str} {question}".strip().replace(
                        "  ", " ")
                    used_wikihow_nums.append(num)
                    used_wikihow_nums_dict[wikihow_page] = used_wikihow_nums
                    state_utils.save_to_shared_memory(
                        vars, used_wikihow_nums=used_wikihow_nums_dict)
                    break
        if not response and wikipedia_page and wikipedia_page_content_list:
            for num, fact in enumerate(wikipedia_page_content_list):
                if num not in used_wikipedia_nums:
                    facts_str = fact.get("facts_str", "")
                    question = fact.get("question", "")
                    response = f"{facts_str} {question}".strip().replace(
                        "  ", " ")
                    used_wikipedia_nums.append(num)
                    used_wikipedia_nums_dict[
                        wikipedia_page] = used_wikipedia_nums
                    state_utils.save_to_shared_memory(
                        vars, used_wikipedia_nums=used_wikipedia_nums_dict)
                    break
        cur_mode = "facts"
        if len(wikihow_page_content_list) == len(used_wikihow_nums) and len(
                wikipedia_page_content_list) == len(used_wikipedia_nums):
            cur_mode = "smalltalk"
            if len(wikihow_page_content_list) == len(used_wikihow_nums):
                state_utils.save_to_shared_memory(vars, cur_wikihow_page="")
                memory["wikihow_content"] = []
            if len(wikipedia_page_content_list) == len(used_wikipedia_nums):
                state_utils.save_to_shared_memory(vars, cur_wikipedia_page="")
                memory["wikipedia_content"] = []

    answer = answer_users_question(vars, topic_config)
    response = f"{answer} {response}".strip().replace("  ", " ")
    if not shared_memory.get("special_topic", ""):
        found_topic, first_utt, utt_can_continue, utt_conf = check_switch(
            vars, topic_config)
        state_utils.save_to_shared_memory(vars, special_topic=found_topic)
    if response:
        state_utils.save_to_shared_memory(vars, cur_mode=cur_mode)
        state_utils.set_confidence(vars, confidence=utt_conf)
        if isyes or (first_utt and utt_can_continue == "must"):
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.MUST_CONTINUE)
        else:
            state_utils.set_can_continue(vars, continue_flag=utt_can_continue)
    else:
        state_utils.set_confidence(vars, confidence=CONF_DICT["UNDEFINED"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    state_utils.add_acknowledgement_to_response_parts(vars)
    return response
示例#8
0
def smalltalk_response(vars, topic_config):
    response = ""
    first_utt = False
    shared_memory = state_utils.get_shared_memory(vars)
    bot_uttr = state_utils.get_last_bot_utterance(vars)
    prev_active_skill = bot_uttr.get("active_skill", "")
    if prev_active_skill not in {"dff_wiki_skill", "dff_music_skill"}:
        delete_topic_info(vars)
    found_topic = shared_memory.get("special_topic", "")
    cur_mode = shared_memory.get("cur_mode", "smalltalk")
    isno = is_no(state_utils.get_last_human_utterance(vars))
    utt_can_continue = "can"
    utt_conf = 0.0
    if cur_mode == "facts" and isno:
        state_utils.save_to_shared_memory(vars, cur_wikihow_page="")
        state_utils.save_to_shared_memory(vars, cur_wikipedia_page="")
        memory["wikihow_content"] = []
        memory["wikipedia_content"] = []
    if not found_topic:
        found_topic, first_utt, utt_can_continue, utt_conf = check_switch(
            vars, topic_config)
    if found_topic:
        expected_entities = topic_config[found_topic].get(
            "expected_entities", {})
        if expected_entities:
            state_utils.save_to_shared_memory(
                vars, expected_entities=expected_entities)
        existing_subtopic_info = shared_memory.get("expected_subtopic_info",
                                                   [])
        expected_subtopic_info = topic_config[found_topic].get(
            "expected_subtopic_info", {})
        if expected_subtopic_info and not existing_subtopic_info and first_utt:
            state_utils.save_to_shared_memory(
                vars, expected_subtopic_info=expected_subtopic_info)

    extract_and_save_entity(vars, topic_config, found_topic)
    extract_and_save_subtopic(vars, topic_config, found_topic)
    available_utterances = shared_memory.get("available_utterances", [])
    logger.info(f"subtopics {shared_memory.get('subtopics', [])}")
    subtopics_to_delete = 0
    add_general_ackn = False
    if found_topic:
        used_utt_nums_dict = shared_memory.get("used_utt_nums", {})
        used_utt_nums = used_utt_nums_dict.get(found_topic, [])
        state_utils.save_to_shared_memory(vars, special_topic=found_topic)
        subtopics = shared_memory.get("subtopics", [])
        if subtopics:
            for i in range(len(subtopics) - 1, -1, -1):
                cur_subtopic = subtopics[i]
                for num, utt_info in enumerate(
                        topic_config[found_topic]["smalltalk"]):
                    utt_key = utt_info.get("key", "")
                    if num not in used_utt_nums and (
                            not available_utterances or
                        (available_utterances
                         and utt_key in available_utterances)):
                        if utt_info.get(
                                "subtopic",
                                "") == cur_subtopic and check_utt_cases(
                                    vars, utt_info):
                            response, used_utt_nums = make_smalltalk_response(
                                vars, topic_config, shared_memory, utt_info,
                                used_utt_nums, num)
                            if response:
                                add_general_ackn = utt_info.get(
                                    "add_general_ackn", False)
                                utt_can_continue = utt_info.get(
                                    "can_continue", "can")
                                utt_conf = utt_info.get("conf", utt_conf)
                                break
                if response:
                    used_utt_nums_dict[found_topic] = used_utt_nums
                    state_utils.save_to_shared_memory(
                        vars, used_utt_nums=used_utt_nums_dict)
                    if check_used_subtopic_utt(vars, topic_config,
                                               cur_subtopic):
                        subtopics_to_delete += 1
                    break
                else:
                    subtopics_to_delete += 1
        if not subtopics or not response:
            for num, utt_info in enumerate(
                    topic_config[found_topic]["smalltalk"]):
                utt_key = utt_info.get("key", "")
                if (num not in used_utt_nums
                        and check_utt_cases(vars, utt_info)
                        and not utt_info.get("subtopic", "")
                        and (not available_utterances or
                             (available_utterances
                              and utt_key in available_utterances))):
                    response, used_utt_nums = make_smalltalk_response(
                        vars, topic_config, shared_memory, utt_info,
                        used_utt_nums, num)
                    if response:
                        utt_can_continue = utt_info.get("can_continue", "can")
                        utt_conf = utt_info.get("conf", utt_conf)
                        add_general_ackn = utt_info.get(
                            "add_general_ackn", False)
                        used_utt_nums_dict[found_topic] = used_utt_nums
                        state_utils.save_to_shared_memory(
                            vars, used_utt_nums=used_utt_nums_dict)
                        break
        if subtopics_to_delete:
            for i in range(subtopics_to_delete):
                subtopics.pop()
            state_utils.save_to_shared_memory(vars, subtopics=subtopics)

        logger.info(
            f"used_utt_nums_dict {used_utt_nums_dict} used_utt_nums {used_utt_nums}"
        )
    acknowledgement = check_acknowledgements(vars, topic_config)
    answer = answer_users_question(vars, topic_config) or acknowledgement
    response = f"{answer} {response}".strip().replace("  ", " ")
    logger.info(f"response {response}")
    if response:
        state_utils.save_to_shared_memory(vars, cur_mode="smalltalk")
        if utt_conf > 0.0:
            state_utils.set_confidence(vars, confidence=utt_conf)
        else:
            state_utils.set_confidence(vars,
                                       confidence=CONF_DICT["WIKI_TOPIC"])
        if first_utt or utt_can_continue == "must":
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.MUST_CONTINUE)
        elif utt_can_continue == "prompt":
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.CAN_CONTINUE_PROMPT)
        else:
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.CAN_CONTINUE_SCENARIO)
    else:
        state_utils.set_confidence(vars, confidence=CONF_DICT["UNDEFINED"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    if not add_general_ackn:
        state_utils.add_acknowledgement_to_response_parts(vars)
    return response
示例#9
0
文件: nlg.py 项目: deepmipt/deepy
def ask_if_user_wants_to_know_how_to_response(vars, must_continue=True):
    state_utils.add_acknowledgement_to_response_parts(vars)
    return "I know another cool thing. " + tell_how_to(vars, must_continue)
示例#10
0
文件: science.py 项目: deepmipt/deepy
def request_science_topic_response(vars):
    try:
        # get_unused_topics
        science_topics_names = local_utils.get_unused_topics(vars)
        if not science_topics_names:
            state_utils.set_can_continue(vars, MUST_CONTINUE)
            state_utils.set_confidence(vars, confidence=CONF_100)
            next_index = state_utils.get_unrepeatable_index_from_rand_seq(
                vars,
                "nice_chat_acks",
                len(NICE_CHAT_ACKS),
                True,
            )
            ack = f"{NICE_CHAT_ACKS[next_index]}"
            body = (
                "Okay, There are many scientific topics that could be discussed, "
                "when I learn something new I will be ready to talk to you about it."
            )
            return " ".join([ack, body])
        science_topics_names = science_topics_names if science_topics_names else list(
            science_topics.keys())
        current_topic = random.sample(science_topics_names, 1)[0]
        local_utils.add_unused_topics(vars, current_topic)

        # save is_requested_topic_before
        shared_memory = state_utils.get_shared_memory(vars)
        is_requested_topic_before = shared_memory.get(
            "is_requested_topic_before")
        state_utils.save_to_shared_memory(vars,
                                          current_topic=current_topic,
                                          is_requested_topic_before=True)

        if is_requested_topic_before:
            next_index = state_utils.get_unrepeatable_index_from_rand_seq(
                vars,
                "nice_chat_acks",
                len(NICE_CHAT_ACKS),
                True,
            )
            ack = f"{NICE_CHAT_ACKS[next_index]}"
            body = f"So, maybe next? Do you wanna talk about {current_topic}?"
        else:
            ack = "I think people who are interested in science are special."
            body = f"I like to talk about a variety of scientific topics. Do you wanna talk about {current_topic}?"
        state_utils.add_acknowledgement_to_response_parts(vars)
        if linkto_yes(vars):
            state_utils.set_can_continue(vars, MUST_CONTINUE)
            state_utils.set_confidence(vars, confidence=CONF_100)
        elif if_chat_about_science_topic_pattern(vars):
            state_utils.set_can_continue(vars, CAN_CONTINUE_SCENARIO)
            state_utils.set_confidence(vars, confidence=CONF_95)
        elif is_mentioned_science_pattern(vars):
            state_utils.set_can_continue(vars, CAN_CONTINUE_SCENARIO)
            state_utils.set_confidence(vars, confidence=CONF_95)
        else:
            return error_response(vars)

        return " ".join([ack, body])
    except Exception as exc:
        logger.exception(exc)
        sentry_sdk.capture_exception(exc)
        return error_response(vars)
示例#11
0
def comment_on_user_experience_and_ask_if_user_recommends_game_response(vars):
    human_uttr = state_utils.get_last_human_utterance(vars)
    state_utils.add_acknowledgement_to_response_parts(vars)
    return common_nlg.compose_experience_comment(human_uttr.get(
        "text", ""))[0] + "  " + ask_advice(vars)
示例#12
0
def tell_about_what_bot_likes_and_ask_if_user_recommends_game_response(vars):
    state_utils.add_acknowledgement_to_response_parts(vars)
    return "Your gaming outlook is great! " + ask_advice(vars)
示例#13
0
def food_fact_response(vars):
    human_utt = state_utils.get_last_human_utterance(vars)
    annotations = human_utt["annotations"]
    human_utt_text = human_utt["text"].lower()
    bot_utt_text = state_utils.get_last_bot_utterance(vars)["text"]
    shared_memory = state_utils.get_shared_memory(vars)
    used_facts = shared_memory.get("used_facts", [])

    fact = ""
    facts = []
    entity = ""
    berry_name = ""

    linkto_check = any([linkto in bot_utt_text for linkto in link_to_skill2i_like_to_talk["dff_food_skill"]])
    black_list_check = any(list(annotations.get("badlisted_words", {}).values()))
    conceptnet_flag, food_item = check_conceptnet(vars)

    entities_facts = annotations.get("fact_retrieval", {}).get("topic_facts", [])
    for entity_facts in entities_facts:
        if entity_facts["entity_type"] in ["food", "fruit", "vegetable", "berry"]:
            if entity_facts["facts"]:
                facts = entity_facts["facts"][0].get("sentences", [])
                entity = entity_facts["entity_substr"]
            else:
                facts = []

    if not facts:
        facts = annotations.get("fact_random", [])

    if black_list_check:
        state_utils.set_can_continue(vars, continue_flag=CAN_NOT_CONTINUE)
        return error_response(vars)
    elif conceptnet_flag and all(["shower" not in human_utt_text, " mela" not in human_utt_text]):
        if "berry" in bot_utt_text.lower():
            berry_names = get_entities(state_utils.get_last_human_utterance(vars), only_named=False, with_labels=False)
            if berry_names:
                berry_name = berry_names[0]

            if all(["berr" not in human_utt_text, len(human_utt_text.split()) == 1, berry_name]):
                berry_name += "berry"
                fact = get_fact(berry_name, f"fact about {berry_name}")
                entity = berry_name
            elif berry_name:
                if facts and entity:
                    fact = random.choice([i for i in facts if i not in used_facts])
                    # facts[0]
                elif facts:
                    for facts_item in facts:
                        if all(
                            [
                                facts_item.get("entity_substr", "xxx") in food_item,
                                facts_item.get("fact", "") not in used_facts,
                            ]
                        ):
                            fact = facts_item.get("fact", "")
                            entity = facts_item.get("entity_substr", "")
                            break
                        else:
                            fact = ""
                            entity = ""
        else:
            if all([facts, entity, entity in food_item]):
                fact = random.choice([i for i in facts if i not in used_facts])
                # facts[0]
            elif facts and not entity:
                for facts_item in facts:
                    if all(
                        [
                            facts_item.get("entity_substr", "xxx") in food_item,
                            facts_item.get("fact", "") not in used_facts,
                        ]
                    ):
                        fact = facts_item.get("fact", "")
                        entity = facts_item.get("entity_substr", "")
                        break
                    else:
                        fact = ""
                        entity = ""
            else:
                fact = ""
                entity = ""
        acknowledgement = random.choice(FOOD_FACT_ACKNOWLEDGEMENTS).replace("ENTITY", entity.lower())
        state_utils.save_to_shared_memory(vars, used_facts=used_facts + [fact])

        try:
            if bot_persona_fav_food_check(vars) or len(state_utils.get_last_human_utterance(vars)["text"].split()) == 1:
                state_utils.set_confidence(vars, confidence=CONF_HIGH)
            else:
                state_utils.set_confidence(vars, confidence=CONF_MIDDLE)
            if bool(re.search(DONOTKNOW_LIKE_RE, human_utt_text)):
                state_utils.set_confidence(vars, confidence=CONF_MIDDLE)
                state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                return "Well, as for me, I am a fan of pizza despite I cannot eat as humans."
            elif any([dont_want_talk(vars), bool(re.search(NO_WORDS_RE, human_utt_text))]):
                state_utils.set_can_continue(vars, continue_flag=CAN_NOT_CONTINUE)
                return error_response(vars)
            elif (not fact) and conceptnet_flag:
                state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                return "Why do you like it?"
            elif not fact:
                state_utils.set_can_continue(vars, continue_flag=CAN_NOT_CONTINUE)
                return error_response(vars)
            elif fact and entity:
                state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                if len(used_facts):
                    return f"{fact} Do you want me to tell you more about {entity}?"
                else:
                    response = acknowledgement + f"{fact} Do you want to hear more about {entity}?"
                    state_utils.add_acknowledgement_to_response_parts(vars)
                    return response
            elif fact:
                state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                if len(used_facts):
                    return f"{fact} Do you want me to tell you more about {entity}?"
                else:
                    return f"Okay. {fact} I can share with you one more cool fact. Do you agree?"
            elif linkto_check:
                state_utils.set_confidence(vars, confidence=CONF_MIDDLE)
                state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
                return "Sorry. I didn't get what kind of food you have mentioned. Could you repeat it please?"
            else:
                state_utils.set_can_continue(vars, continue_flag=CAN_NOT_CONTINUE)
                return error_response(vars)
        except Exception as exc:
            logger.exception(exc)
            sentry_sdk.capture_exception(exc)
            return error_response(vars)
    elif linkto_check:
        state_utils.set_confidence(vars, confidence=CONF_MIDDLE)
        state_utils.set_can_continue(vars, continue_flag=CAN_CONTINUE_SCENARIO)
        return "Sorry. I didn't get what kind of food you have mentioned. Could you repeat it please?"
    else:
        state_utils.set_can_continue(vars, continue_flag=CAN_NOT_CONTINUE)
        return error_response(vars)