From a02371ae952bfe50f9b0ccf6ed1d532f36317ae3 Mon Sep 17 00:00:00 2001 From: Francelle Sarayan Date: Tue, 14 Apr 2026 12:17:23 +0800 Subject: [PATCH 1/4] feat: initialize rasa research project and setup baseline training data --- actions/__init__.py | 0 actions/actions.py | 27 ++++++++++++ config.yml | 50 +++++++++++++++++++++ credentials.yml | 33 ++++++++++++++ domain.yml | 34 +++++++++++++++ endpoints.yml | 42 ++++++++++++++++++ research_data/nlu.yml | 91 +++++++++++++++++++++++++++++++++++++++ research_data/rules.yml | 13 ++++++ research_data/stories.yml | 30 +++++++++++++ tests/test_stories.yml | 91 +++++++++++++++++++++++++++++++++++++++ 10 files changed, 411 insertions(+) create mode 100644 actions/__init__.py create mode 100644 actions/actions.py create mode 100644 config.yml create mode 100644 credentials.yml create mode 100644 domain.yml create mode 100644 endpoints.yml create mode 100644 research_data/nlu.yml create mode 100644 research_data/rules.yml create mode 100644 research_data/stories.yml create mode 100644 tests/test_stories.yml diff --git a/actions/__init__.py b/actions/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/actions/actions.py b/actions/actions.py new file mode 100644 index 000000000000..8bf1f757f851 --- /dev/null +++ b/actions/actions.py @@ -0,0 +1,27 @@ +# This files contains your custom actions which can be used to run +# custom Python code. +# +# See this guide on how to implement these action: +# https://rasa.com/docs/rasa/custom-actions + + +# This is a simple example for a custom action which utters "Hello World!" + +# from typing import Any, Text, Dict, List +# +# from rasa_sdk import Action, Tracker +# from rasa_sdk.executor import CollectingDispatcher +# +# +# class ActionHelloWorld(Action): +# +# def name(self) -> Text: +# return "action_hello_world" +# +# def run(self, dispatcher: CollectingDispatcher, +# tracker: Tracker, +# domain: Dict[Text, Any]) -> List[Dict[Text, Any]]: +# +# dispatcher.utter_message(text="Hello World!") +# +# return [] diff --git a/config.yml b/config.yml new file mode 100644 index 000000000000..18f3540c7ea1 --- /dev/null +++ b/config.yml @@ -0,0 +1,50 @@ +# The config recipe. +# https://rasa.com/docs/rasa/model-configuration/ +recipe: default.v1 + +# The assistant project unique identifier +# This default value must be replaced with a unique assistant name within your deployment +assistant_id: 20260414-120228-frosty-HUD + +# Configuration for Rasa NLU. +# https://rasa.com/docs/rasa/nlu/components/ +language: en + +pipeline: null +# # No configuration for the NLU pipeline was provided. The following default pipeline was used to train your model. +# # If you'd like to customize it, uncomment and adjust the pipeline. +# # See https://rasa.com/docs/rasa/tuning-your-model for more information. +# - name: WhitespaceTokenizer +# - name: RegexFeaturizer +# - name: LexicalSyntacticFeaturizer +# - name: CountVectorsFeaturizer +# - name: CountVectorsFeaturizer +# analyzer: char_wb +# min_ngram: 1 +# max_ngram: 4 +# - name: DIETClassifier +# epochs: 100 +# constrain_similarities: true +# - name: EntitySynonymMapper +# - name: ResponseSelector +# epochs: 100 +# constrain_similarities: true +# - name: FallbackClassifier +# threshold: 0.3 +# ambiguity_threshold: 0.1 + +# Configuration for Rasa Core. +# https://rasa.com/docs/rasa/core/policies/ +policies: null +# # No configuration for policies was provided. The following default policies were used to train your model. +# # If you'd like to customize them, uncomment and adjust the policies. +# # See https://rasa.com/docs/rasa/policies for more information. +# - name: MemoizationPolicy +# - name: RulePolicy +# - name: UnexpecTEDIntentPolicy +# max_history: 5 +# epochs: 100 +# - name: TEDPolicy +# max_history: 5 +# epochs: 100 +# constrain_similarities: true diff --git a/credentials.yml b/credentials.yml new file mode 100644 index 000000000000..e9f12911e3cf --- /dev/null +++ b/credentials.yml @@ -0,0 +1,33 @@ +# This file contains the credentials for the voice & chat platforms +# which your bot is using. +# https://rasa.com/docs/rasa/messaging-and-voice-channels + +rest: +# # you don't need to provide anything here - this channel doesn't +# # require any credentials + + +#facebook: +# verify: "" +# secret: "" +# page-access-token: "" + +#slack: +# slack_token: "" +# slack_channel: "" +# slack_signing_secret: "" + +#socketio: +# user_message_evt: +# bot_message_evt: +# session_persistence: + +#mattermost: +# url: "https:///api/v4" +# token: "" +# webhook_url: "" + +# This entry is needed if you are using Rasa Enterprise. The entry represents credentials +# for the Rasa Enterprise "channel", i.e. Talk to your bot and Share with guest testers. +rasa: + url: "http://localhost:5002/api" diff --git a/domain.yml b/domain.yml new file mode 100644 index 000000000000..932195fe3877 --- /dev/null +++ b/domain.yml @@ -0,0 +1,34 @@ +version: "3.1" + +intents: + - greet + - goodbye + - affirm + - deny + - mood_great + - mood_unhappy + - bot_challenge + +responses: + utter_greet: + - text: "Hey! How are you?" + + utter_cheer_up: + - text: "Here is something to cheer you up:" + image: "https://i.imgur.com/nGF1K8f.jpg" + + utter_did_that_help: + - text: "Did that help you?" + + utter_happy: + - text: "Great, carry on!" + + utter_goodbye: + - text: "Bye" + + utter_iamabot: + - text: "I am a bot, powered by Rasa." + +session_config: + session_expiration_time: 60 + carry_over_slots_to_new_session: true diff --git a/endpoints.yml b/endpoints.yml new file mode 100644 index 000000000000..1128e1d53e27 --- /dev/null +++ b/endpoints.yml @@ -0,0 +1,42 @@ +# This file contains the different endpoints your bot can use. + +# Server where the models are pulled from. +# https://rasa.com/docs/rasa/model-storage#fetching-models-from-a-server + +#models: +# url: http://my-server.com/models/default_core@latest +# wait_time_between_pulls: 10 # [optional](default: 100) + +# Server which runs your custom actions. +# https://rasa.com/docs/rasa/custom-actions + +#action_endpoint: +# url: "http://localhost:5055/webhook" + +# Tracker store which is used to store the conversations. +# By default the conversations are stored in memory. +# https://rasa.com/docs/rasa/tracker-stores + +#tracker_store: +# type: redis +# url: +# port: +# db: +# password: +# use_ssl: + +#tracker_store: +# type: mongod +# url: +# db: +# username: +# password: + +# Event broker which all conversation events should be streamed to. +# https://rasa.com/docs/rasa/event-brokers + +#event_broker: +# url: localhost +# username: username +# password: password +# queue: queue diff --git a/research_data/nlu.yml b/research_data/nlu.yml new file mode 100644 index 000000000000..2f6c3f8c7d3e --- /dev/null +++ b/research_data/nlu.yml @@ -0,0 +1,91 @@ +version: "3.1" + +nlu: +- intent: greet + examples: | + - hey + - hello + - hi + - hello there + - good morning + - good evening + - moin + - hey there + - let's go + - hey dude + - goodmorning + - goodevening + - good afternoon + +- intent: goodbye + examples: | + - cu + - good by + - cee you later + - good night + - bye + - goodbye + - have a nice day + - see you around + - bye bye + - see you later + +- intent: affirm + examples: | + - yes + - y + - indeed + - of course + - that sounds good + - correct + +- intent: deny + examples: | + - no + - n + - never + - I don't think so + - don't like that + - no way + - not really + +- intent: mood_great + examples: | + - perfect + - great + - amazing + - feeling like a king + - wonderful + - I am feeling very good + - I am great + - I am amazing + - I am going to save the world + - super stoked + - extremely good + - so so perfect + - so good + - so perfect + +- intent: mood_unhappy + examples: | + - my day was horrible + - I am sad + - I don't feel very well + - I am disappointed + - super sad + - I'm so sad + - sad + - very sad + - unhappy + - not good + - not very good + - extremly sad + - so saad + - so sad + +- intent: bot_challenge + examples: | + - are you a bot? + - are you a human? + - am I talking to a bot? + - am I talking to a human? diff --git a/research_data/rules.yml b/research_data/rules.yml new file mode 100644 index 000000000000..a9987ee2a3fb --- /dev/null +++ b/research_data/rules.yml @@ -0,0 +1,13 @@ +version: "3.1" + +rules: + +- rule: Say goodbye anytime the user says goodbye + steps: + - intent: goodbye + - action: utter_goodbye + +- rule: Say 'I am a bot' anytime the user challenges + steps: + - intent: bot_challenge + - action: utter_iamabot diff --git a/research_data/stories.yml b/research_data/stories.yml new file mode 100644 index 000000000000..6ff78ee20864 --- /dev/null +++ b/research_data/stories.yml @@ -0,0 +1,30 @@ +version: "3.1" + +stories: + +- story: happy path + steps: + - intent: greet + - action: utter_greet + - intent: mood_great + - action: utter_happy + +- story: sad path 1 + steps: + - intent: greet + - action: utter_greet + - intent: mood_unhappy + - action: utter_cheer_up + - action: utter_did_that_help + - intent: affirm + - action: utter_happy + +- story: sad path 2 + steps: + - intent: greet + - action: utter_greet + - intent: mood_unhappy + - action: utter_cheer_up + - action: utter_did_that_help + - intent: deny + - action: utter_goodbye diff --git a/tests/test_stories.yml b/tests/test_stories.yml new file mode 100644 index 000000000000..d46e39b3ea06 --- /dev/null +++ b/tests/test_stories.yml @@ -0,0 +1,91 @@ +#### This file contains tests to evaluate that your bot behaves as expected. +#### If you want to learn more, please see the docs: https://rasa.com/docs/rasa/testing-your-assistant + +stories: +- story: happy path 1 + steps: + - user: | + hello there! + intent: greet + - action: utter_greet + - user: | + amazing + intent: mood_great + - action: utter_happy + +- story: happy path 2 + steps: + - user: | + hello there! + intent: greet + - action: utter_greet + - user: | + amazing + intent: mood_great + - action: utter_happy + - user: | + bye-bye! + intent: goodbye + - action: utter_goodbye + +- story: sad path 1 + steps: + - user: | + hello + intent: greet + - action: utter_greet + - user: | + not good + intent: mood_unhappy + - action: utter_cheer_up + - action: utter_did_that_help + - user: | + yes + intent: affirm + - action: utter_happy + +- story: sad path 2 + steps: + - user: | + hello + intent: greet + - action: utter_greet + - user: | + not good + intent: mood_unhappy + - action: utter_cheer_up + - action: utter_did_that_help + - user: | + not really + intent: deny + - action: utter_goodbye + +- story: sad path 3 + steps: + - user: | + hi + intent: greet + - action: utter_greet + - user: | + very terrible + intent: mood_unhappy + - action: utter_cheer_up + - action: utter_did_that_help + - user: | + no + intent: deny + - action: utter_goodbye + +- story: say goodbye + steps: + - user: | + bye-bye! + intent: goodbye + - action: utter_goodbye + +- story: bot challenge + steps: + - user: | + are you a bot? + intent: bot_challenge + - action: utter_iamabot From ac7ee862628f808198f6205a0a8771fe61c5f31e Mon Sep 17 00:00:00 2001 From: Francelle Sarayan Date: Fri, 24 Apr 2026 00:39:56 +0800 Subject: [PATCH 2/4] Tried to manually create responses and slot --- data/rasa_yaml_examples/nlu.yml | 19 ++++++++++++------- data/test_domains/duplicate_responses.yml | 3 +-- data/test_domains/empty_response_format.yml | 2 +- domain.yml | 12 ++++++++++++ 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/data/rasa_yaml_examples/nlu.yml b/data/rasa_yaml_examples/nlu.yml index 25d182652b44..ae890b16a0ed 100644 --- a/data/rasa_yaml_examples/nlu.yml +++ b/data/rasa_yaml_examples/nlu.yml @@ -1,10 +1,15 @@ +version: "3.1" + nlu: - intent: estimate_emissions - # Arbitrary metadata - metadata: - author: Some example metadata! - key: value - # Multiline examples, each line is a separate training example. examples: | - how much CO2 will that use? - how much carbon will a one way flight from [new york]{"entity": "city", "role": "from"} to california produce? + - how much CO2 will that use? + - how much carbon will a one way flight from [new york]{"entity": "city", "role": "from"} to [california]{"entity": "city", "role": "to"} produce? + +- intent: give_name + examples: | + - my name is lors + - I am Francelle + - call me Lorraine + - I'm Sam + - my name is [lors](name) \ No newline at end of file diff --git a/data/test_domains/duplicate_responses.yml b/data/test_domains/duplicate_responses.yml index 3d0fbe10cb5b..31e9d4dc6f6e 100644 --- a/data/test_domains/duplicate_responses.yml +++ b/data/test_domains/duplicate_responses.yml @@ -19,5 +19,4 @@ responses: - text: goodbye :( utter_default: - text: default message - utter_greet: - - text: hey there! + diff --git a/data/test_domains/empty_response_format.yml b/data/test_domains/empty_response_format.yml index f843a2318d66..7a3d3bcf9d4e 100644 --- a/data/test_domains/empty_response_format.yml +++ b/data/test_domains/empty_response_format.yml @@ -13,7 +13,7 @@ entities: - name responses: - utter_greet: + utter_goodbye: - text: goodbye :( utter_default: diff --git a/domain.yml b/domain.yml index 932195fe3877..145fe9fd0c46 100644 --- a/domain.yml +++ b/domain.yml @@ -8,11 +8,23 @@ intents: - mood_great - mood_unhappy - bot_challenge + - give_name +slots: + user_name: # This is the "bucket" in the bot's memory + type: text + influence_conversation: true + mappings: + - type: from_text # AUTOMATION: This captures everything you type + intent: give_name # ...but only when you are introducing yourself responses: utter_greet: - text: "Hey! How are you?" + # Add this so the bot can actually use the name it stored + utter_greet_with_name: + - text: "Nice to meet you, {user_name}!" + utter_cheer_up: - text: "Here is something to cheer you up:" image: "https://i.imgur.com/nGF1K8f.jpg" From 8c6f48ab48423f423896a17da2ebf52f60c04ee3 Mon Sep 17 00:00:00 2001 From: Francelle Sarayan Date: Wed, 20 May 2026 18:27:00 +0800 Subject: [PATCH 3/4] fix: resolve cross-directory python dependency conflicts and align absolute path arguments for clangd indexing AFTER 3 AIDWIAWSUDAWUNWEFDDDDDAYSS!!! --- cxx_tracker.py | 27 +++++++++++ data/rules.yml | 6 +++ data/stories.yml | 8 ++++ .../models/.gitkeep | 0 domain.yml | 4 +- endpoints.yml | 43 +----------------- fast_tracker.cp310-win_amd64.pyd | Bin 0 -> 184832 bytes load_test.py | 43 ++++++++++++++++++ setup.py | 12 +++++ {data/test => test}/config_embedding_test.yml | 0 .../demo-rasa-composite-entities.yml | 0 {data/test => test}/demo-rasa-lookup-ents.yml | 0 .../demo-rasa-more-ents-and-multiplied.yml | 0 {data/test => test}/demo-rasa-no-ents.yml | 0 {data/test => test}/demo-rasa-noents.json | 0 {data/test => test}/demo-rasa-small.json | 0 {data/test => test}/demo-rasa-zh.json | 0 .../dialogflow_en_converted_to_rasa.json | 0 .../dialogflow_es_converted_to_rasa.json | 0 .../demo-rasa-intents-1.yml | 0 .../demo-rasa-intents-2.yml | 0 .../demo-rasa-intents-3.yml | 0 .../test => test}/hf_transformers_models.txt | 0 {data/test => test}/incorrect_nlu_format.yml | 0 .../lookup_tables/lookup_table.json | 0 .../lookup_tables/lookup_table.yml | 0 {data/test => test}/lookup_tables/plates.txt | 0 .../test => test}/luis_converted_to_rasa.json | 0 {data/test => test}/many_intents.yml | 0 {data/test => test}/md_converted_to_json.json | 0 .../multiple_files_json/demo-rasa-affirm.json | 0 .../demo-rasa-chitchat.json | 0 .../demo-rasa-goodbye.json | 0 .../multiple_files_json/demo-rasa-greet.json | 0 .../demo-rasa-restaurant_search.json | 0 .../overlapping_regex_entities.yml | 0 .../simple_retrieval_intent_nlu.yml | 0 .../stories_default_retrieval_intents.yml | 0 {data/test => test}/synonyms_only.yml | 0 .../test_integration/data/nlu.yml | 0 .../test_integration/data/rules.yml | 0 .../test_integration/data/stories.yml | 0 .../test => test}/test_integration/domain.yml | 0 .../test_integration_err/data/nlu.yml | 0 .../test_integration_err/data/rules.yml | 0 .../test_integration_err/data/stories.yml | 0 .../test_integration_err/domain.yml | 0 ...raining_data_containing_special_chars.json | 0 .../test => test}/wit_converted_to_rasa.json | 0 .../config.yml | 0 .../data/nlu.yml | 0 .../data/stories.yml | 0 .../domain.yml | 0 .../tests/test_stories.yml | 0 .../custom_graph_components/nlu_dense.py | 0 .../nlu_meta_fallback.py | 0 .../nlu_meta_intent_featurizer.py | 0 .../custom_graph_components/nlu_sparse.py | 0 .../custom_slots.py | 0 .../graph_component_interface.py | 0 .../nlu_component_skeleton.py | 0 .../registered_component.py | 0 .../config_crf_custom_features.yml | 0 .../config_crf_no_pattern_feature.yml | 0 .../config_crf_no_regex.yml | 0 .../config_crf_no_synonyms.yml | 0 .../config_default_assistant_id_value.yml | 0 .../config_defaults.yml | 0 ...fig_embedding_intent_response_selector.yml | 0 .../config_empty_en.yml | 0 .../config_empty_en_after_dumping.yml | 0 .../config_empty_en_after_dumping_core.yml | 0 .../config_empty_en_after_dumping_nlu.yml | 0 .../config_empty_fr.yml | 0 .../config_empty_fr_after_dumping.yml | 0 .../config_language_only.yml | 0 .../config_no_assistant_id.yml | 0 .../config_no_assistant_id_with_comments.yml | 0 .../config_pipeline_empty.yml | 0 .../config_pipeline_missing.yml | 0 .../config_policies_empty.yml | 0 .../config_policies_missing.yml | 0 .../config_pretrained_embeddings_convert.yml | 0 .../config_pretrained_embeddings_mitie.yml | 0 .../config_pretrained_embeddings_mitie_2.yml | 0 ...onfig_pretrained_embeddings_mitie_diet.yml | 0 .../config_pretrained_embeddings_mitie_zh.yml | 0 .../config_pretrained_embeddings_spacy.yml | 0 .../config_pretrained_embeddings_spacy_de.yml | 0 ...g_pretrained_embeddings_spacy_duckling.yml | 0 .../config_response_selector_minimal.yml | 0 .../config_spacy_entity_extractor.yml | 0 .../config_supervised_embeddings.yml | 0 .../config_supervised_embeddings_duckling.yml | 0 .../config_ted_policy_model_checkpointing.yml | 0 ...l_checkpointing_zero_eval_num_examples.yml | 0 ...el_checkpointing_zero_every_num_epochs.yml | 0 ...nfig_ted_policy_no_model_checkpointing.yml | 0 .../config_train_server_json.yml | 0 .../config_train_server_md.yml | 0 .../config_unique_assistant_id.yml | 0 ...onfig_with_comment_between_suggestions.yml | 0 .../config_with_comments.yml | 0 .../config_with_comments_after_dumping.yml | 0 .../embedding_random_seed.yaml | 0 .../example_config.yaml | 0 .../graph_config.yml | 0 .../graph_config_short.yml | 0 .../keyword_classifier_config.yml | 0 .../max_hist_config.yml | 0 .../no_max_hist_config.yml | 0 .../stack_config.yml | 0 .../test_moodbot_config_no_assistant_id.yml | 0 .../config.yml | 0 .../domain.yml | 0 .../nlu.yml | 0 .../stories.yml | 0 {data/test_e2ebot => test_e2ebot}/config.yml | 0 .../test_e2ebot => test_e2ebot}/data/nlu.yml | 0 .../data/stories.yml | 0 {data/test_e2ebot => test_e2ebot}/domain.yml | 0 .../tests/test_stories.yml | 0 ...st_stories_with_unknown_bot_utterances.yml | 0 .../__init__.py | 0 .../cert.pem | 0 .../custom_tracker_endpoints.yml | 0 .../endpoints_redis.yml | 0 .../endpoints_sql.yml | 0 .../kafka_invalid_sasl_mechanism.yml | 0 .../kafka_invalid_security_protocol.yml | 0 .../kafka_plaintext_endpoint.yml | 0 .../kafka_plaintext_endpoint_no_url.yml | 0 .../kafka_sasl_plaintext_endpoint.yml | 0 .../event_brokers/kafka_sasl_ssl_endpoint.yml | 0 .../event_brokers/kafka_ssl_endpoint.yml | 0 .../event_brokers/pika_endpoint.yml | 0 .../event_brokers/sql_endpoint.yml | 0 .../example_endpoints.yml | 0 .../model_endpoint.yml | 0 .../test_end_to_end_story.yml | 0 .../test_end_to_end_trips_circuit_breaker.yml | 0 .../test_form_end_to_end_stories.yml | 0 .../test_stories_trip_circuit_breaker.yml | 0 .../test_story_unknown_entity.yml | 0 .../conditional_response_variations.yml | 0 .../custom_slot_domain.yml | 0 .../default.yml | 0 .../default_retrieval_intents.yml | 0 .../default_unfeaturized_entities.yml | 0 .../default_with_mapping.yml | 0 .../default_with_slots.yml | 0 .../domain_with_categorical_slot.yml | 0 .../duplicate_actions.yml | 0 .../duplicate_entities.yml | 0 .../duplicate_intents.yml | 0 .../duplicate_responses.yml | 0 .../empty_response_format.yml | 0 .../form.yml | 0 .../initial_slot_values_greet_and_goodbye.yml | 0 .../invalid_format.yml | 0 ...n_validate_files_with_active_loop_null.yml | 0 .../missing_chitchat_response.yml | 0 .../missing_text_for_templates.yml | 0 .../mixed_retrieval_intents.yml | 0 .../people_form.yml | 0 .../query_form.yml | 0 .../response_selector_responses_in_domain.yml | 0 .../restaurant_form.yml | 0 .../selectors.yml | 0 .../simple_retrieval_intent.yml | 0 .../config.yml | 0 .../data/nlu.yml | 0 .../data/responses.yml | 0 .../data/stories.yml | 0 .../domain.yml | 0 .../domain_invalid.yml | 0 .../domain_valid.yml | 0 .../game_1.yml | 0 .../game_2.yml | 0 .../game_3.yml | 0 .../domain_pt1.yml | 0 .../skill_1_domain/domain_pt2.yml | 0 .../skill_2_domain/domain_pt3.yml | 0 .../skill_2_subdirectory/domain_pt4.yml | 0 .../test_domain_from_multiple_files/drum.yml | 0 .../last_month.yml | 0 .../main_menu.yml | 0 .../selection.yml | 0 .../small_talk.yml | 0 .../tomorrow.yml | 0 .../wallets.yml | 0 .../test_domain_with_duplicates/domain1.yml | 0 .../test_domain_with_duplicates/domain2.yml | 0 .../configuration.yml | 0 .../intents.yml | 0 .../responses.yml | 0 .../domain1.yml | 0 .../domain2.yml | 0 .../travel_form.yml | 0 .../valid_actions.yml | 0 .../wrong_custom_response_format.yml | 0 .../wrong_response_format.yml | 0 .../config.yml | 0 .../domain.yml | 0 .../nlu.yml | 0 .../stories.yml | 0 .../config.yml | 0 .../domain.yml | 0 .../nlu.yml | 0 .../stories.yml | 0 .../iter1/nlg_training_data.yml | 0 .../iter1/training_data.yml | 0 .../iter2/training_data.yml | 0 .../test_invalid_format_value_in_config.yml | 0 .../test_invalid_handler_key_in_config.yml | 0 ...test_invalid_value_for_level_in_config.yml | 0 .../test_logging_config.yml | 0 ...st_missing_required_key_invalid_config.yml | 0 .../test_non_existent_handler_id.yml | 0 .../training_data.yml | 0 .../test_moodbot => test_moodbot}/config.yml | 0 .../credentials.yml | 0 .../data/nlu.yml | 0 .../data/rules.yml | 0 .../data/stories.yml | 0 .../test_moodbot => test_moodbot}/domain.yml | 0 .../unexpected_intent_policy_config.yml | 0 .../config.yml | 0 .../data/GreetBot/data/nlu.yml | 0 .../data/GreetBot/data/stories.yml | 0 .../data/GreetBot/domain.yml | 0 .../data/MoodBot/config.yml | 0 .../data/MoodBot/data/nlu.yml | 0 .../data/MoodBot/data/stories.yml | 0 .../data/MoodBot/domain.yml | 0 .../data/nlu.yml | 0 .../data/stories.yml | 0 .../domain.yml | 0 .../stories_part_1.yml | 0 .../stories_part_2.yml | 0 .../nlu.yml | 0 .../config.yml | 0 .../projects/ChitchatBot/data/nlu.yml | 0 .../projects/ChitchatBot/data/rules.yml | 0 .../projects/ChitchatBot/domain.yml | 0 .../projects/GreetBot/data/nlu.yml | 0 .../projects/GreetBot/data/rules.yml | 0 .../projects/GreetBot/domain.yml | 0 .../domain_with_response_ids.yml | 0 ...u_validate_files_with_active_loop_null.yml | 0 .../domain_with_only_responses.yml | 0 .../nlu_no_responses.yml | 0 .../nlu_with_unicode.yml | 0 .../sara_nlu_data.yml | 0 .../nlu.yml | 0 .../rules.yml | 0 .../stories.yml | 0 .../__init__.py | 0 .../config.yml | 0 .../data/nlu.yml | 0 .../data/rules.yml | 0 .../domain.yml | 0 .../tests/test_stories.yml | 0 .../default.yml | 0 .../responses_utter_rasa.yml | 0 .../config.yml | 0 .../data/nlu.yml | 0 .../data/rules.yml | 0 .../data/stories.yml | 0 .../domain.yml | 0 .../test_selectors => test_selectors}/nlu.yml | 0 .../config.yml | 0 .../data/nlu.yml | 0 .../data/stories.yml | 0 .../domain.yml | 0 .../naughty_strings.json | 0 .../tracker_moodbot.json | 0 .../tracker_moodbot_with_new_utterances.json | 0 .../data/nlu.yml | 0 .../data/stories.yml | 0 .../domain.yml | 0 .../intent_with_leading_slash.yml | 0 .../wrong_yaml.yml | 0 .../non_test_full_retrieval_intent_story.yml | 0 .../rules_greet_and_goodbye.yml | 0 .../rules_missing_intent.yml | 0 .../rules_with_stories_sorted.yaml | 0 .../rules_without_stories.yml | 0 .../rules_without_stories_and_wrong_names.yml | 0 .../simple_story_with_only_end.yml | 0 .../stories.yml | 0 .../stories_and_rules.yml | 0 .../stories_checkpoint_after_or.yml | 0 .../stories_conflicting_1.yml | 0 .../stories_conflicting_2.yml | 0 .../stories_conflicting_3.yml | 0 .../stories_conflicting_4.yml | 0 .../stories_conflicting_5.yml | 0 .../stories_conflicting_6.yml | 0 .../stories_conflicting_at_1.yml | 0 .../stories_defaultdomain.yml | 0 .../stories_e2e.yml | 0 .../stories_form.yml | 0 .../stories_hybrid_e2e.yml | 0 .../stories_missing_intent.yml | 0 .../stories_restart.yml | 0 .../stories_retrieval_intents.yml | 0 .../stories_simple.yml | 0 .../stories_unexpected_intent_unlearnable.yml | 0 .../stories_unfeaturized_entities.yml | 0 .../stories_unused_checkpoints.yml | 0 .../stories_with_cycle.yml | 0 .../stories_with_rules_conflicting.yml | 0 .../story_slot_different_types.yml | 0 .../story_with_or_and_entities.yml | 0 ...ory_with_or_and_entities_with_no_value.yml | 0 .../story_with_or_slot_was_set.yml | 0 .../story_with_slot_was_set.yml | 0 .../story_with_two_equal_or_statements.yml | 0 .../test_base_retrieval_intent_story.yml | 0 ...base_retrieval_intent_wrong_prediction.yml | 0 .../test_failed_entity_extraction_comment.yml | 0 .../test_full_retrieval_intent_story.yml | 0 ...full_retrieval_intent_wrong_prediction.yml | 0 ...ltiple_action_unlikely_intent_warnings.yml | 0 ...ction_with_correct_intent_wrong_entity.yml | 0 ...ction_with_wrong_intent_correct_entity.yml | 0 ...diction_with_wrong_intent_wrong_entity.yml | 0 .../test_stories_entity_annotations.yml | 0 tracker.cpp | 36 +++++++++++++++ 330 files changed, 136 insertions(+), 43 deletions(-) create mode 100644 cxx_tracker.py create mode 100644 data/rules.yml create mode 100644 data/stories.yml delete mode 100644 data/test_action_extract_slots_11333/models/.gitkeep create mode 100644 fast_tracker.cp310-win_amd64.pyd create mode 100644 load_test.py create mode 100644 setup.py rename {data/test => test}/config_embedding_test.yml (100%) rename {data/test => test}/demo-rasa-composite-entities.yml (100%) rename {data/test => test}/demo-rasa-lookup-ents.yml (100%) rename {data/test => test}/demo-rasa-more-ents-and-multiplied.yml (100%) rename {data/test => test}/demo-rasa-no-ents.yml (100%) rename {data/test => test}/demo-rasa-noents.json (100%) rename {data/test => test}/demo-rasa-small.json (100%) rename {data/test => test}/demo-rasa-zh.json (100%) rename {data/test => test}/dialogflow_en_converted_to_rasa.json (100%) rename {data/test => test}/dialogflow_es_converted_to_rasa.json (100%) rename {data/test => test}/duplicate_intents_yaml/demo-rasa-intents-1.yml (100%) rename {data/test => test}/duplicate_intents_yaml/demo-rasa-intents-2.yml (100%) rename {data/test => test}/duplicate_intents_yaml/demo-rasa-intents-3.yml (100%) rename {data/test => test}/hf_transformers_models.txt (100%) rename {data/test => test}/incorrect_nlu_format.yml (100%) rename {data/test => test}/lookup_tables/lookup_table.json (100%) rename {data/test => test}/lookup_tables/lookup_table.yml (100%) rename {data/test => test}/lookup_tables/plates.txt (100%) rename {data/test => test}/luis_converted_to_rasa.json (100%) rename {data/test => test}/many_intents.yml (100%) rename {data/test => test}/md_converted_to_json.json (100%) rename {data/test => test}/multiple_files_json/demo-rasa-affirm.json (100%) rename {data/test => test}/multiple_files_json/demo-rasa-chitchat.json (100%) rename {data/test => test}/multiple_files_json/demo-rasa-goodbye.json (100%) rename {data/test => test}/multiple_files_json/demo-rasa-greet.json (100%) rename {data/test => test}/multiple_files_json/demo-rasa-restaurant_search.json (100%) rename {data/test => test}/overlapping_regex_entities.yml (100%) rename {data/test => test}/simple_retrieval_intent_nlu.yml (100%) rename {data/test => test}/stories_default_retrieval_intents.yml (100%) rename {data/test => test}/synonyms_only.yml (100%) rename {data/test => test}/test_integration/data/nlu.yml (100%) rename {data/test => test}/test_integration/data/rules.yml (100%) rename {data/test => test}/test_integration/data/stories.yml (100%) rename {data/test => test}/test_integration/domain.yml (100%) rename {data/test => test}/test_integration_err/data/nlu.yml (100%) rename {data/test => test}/test_integration_err/data/rules.yml (100%) rename {data/test => test}/test_integration_err/data/stories.yml (100%) rename {data/test => test}/test_integration_err/domain.yml (100%) rename {data/test => test}/training_data_containing_special_chars.json (100%) rename {data/test => test}/wit_converted_to_rasa.json (100%) rename {data/test_action_extract_slots_11333 => test_action_extract_slots_11333}/config.yml (100%) rename {data/test_action_extract_slots_11333 => test_action_extract_slots_11333}/data/nlu.yml (100%) rename {data/test_action_extract_slots_11333 => test_action_extract_slots_11333}/data/stories.yml (100%) rename {data/test_action_extract_slots_11333 => test_action_extract_slots_11333}/domain.yml (100%) rename {data/test_action_extract_slots_11333 => test_action_extract_slots_11333}/tests/test_stories.yml (100%) rename {data/test_classes => test_classes}/custom_graph_components/nlu_dense.py (100%) rename {data/test_classes => test_classes}/custom_graph_components/nlu_meta_fallback.py (100%) rename {data/test_classes => test_classes}/custom_graph_components/nlu_meta_intent_featurizer.py (100%) rename {data/test_classes => test_classes}/custom_graph_components/nlu_sparse.py (100%) rename {data/test_classes => test_classes}/custom_slots.py (100%) rename {data/test_classes => test_classes}/graph_component_interface.py (100%) rename {data/test_classes => test_classes}/nlu_component_skeleton.py (100%) rename {data/test_classes => test_classes}/registered_component.py (100%) rename {data/test_config => test_config}/config_crf_custom_features.yml (100%) rename {data/test_config => test_config}/config_crf_no_pattern_feature.yml (100%) rename {data/test_config => test_config}/config_crf_no_regex.yml (100%) rename {data/test_config => test_config}/config_crf_no_synonyms.yml (100%) rename {data/test_config => test_config}/config_default_assistant_id_value.yml (100%) rename {data/test_config => test_config}/config_defaults.yml (100%) rename {data/test_config => test_config}/config_embedding_intent_response_selector.yml (100%) rename {data/test_config => test_config}/config_empty_en.yml (100%) rename {data/test_config => test_config}/config_empty_en_after_dumping.yml (100%) rename {data/test_config => test_config}/config_empty_en_after_dumping_core.yml (100%) rename {data/test_config => test_config}/config_empty_en_after_dumping_nlu.yml (100%) rename {data/test_config => test_config}/config_empty_fr.yml (100%) rename {data/test_config => test_config}/config_empty_fr_after_dumping.yml (100%) rename {data/test_config => test_config}/config_language_only.yml (100%) rename {data/test_config => test_config}/config_no_assistant_id.yml (100%) rename {data/test_config => test_config}/config_no_assistant_id_with_comments.yml (100%) rename {data/test_config => test_config}/config_pipeline_empty.yml (100%) rename {data/test_config => test_config}/config_pipeline_missing.yml (100%) rename {data/test_config => test_config}/config_policies_empty.yml (100%) rename {data/test_config => test_config}/config_policies_missing.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_convert.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_mitie.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_mitie_2.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_mitie_diet.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_mitie_zh.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_spacy.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_spacy_de.yml (100%) rename {data/test_config => test_config}/config_pretrained_embeddings_spacy_duckling.yml (100%) rename {data/test_config => test_config}/config_response_selector_minimal.yml (100%) rename {data/test_config => test_config}/config_spacy_entity_extractor.yml (100%) rename {data/test_config => test_config}/config_supervised_embeddings.yml (100%) rename {data/test_config => test_config}/config_supervised_embeddings_duckling.yml (100%) rename {data/test_config => test_config}/config_ted_policy_model_checkpointing.yml (100%) rename {data/test_config => test_config}/config_ted_policy_model_checkpointing_zero_eval_num_examples.yml (100%) rename {data/test_config => test_config}/config_ted_policy_model_checkpointing_zero_every_num_epochs.yml (100%) rename {data/test_config => test_config}/config_ted_policy_no_model_checkpointing.yml (100%) rename {data/test_config => test_config}/config_train_server_json.yml (100%) rename {data/test_config => test_config}/config_train_server_md.yml (100%) rename {data/test_config => test_config}/config_unique_assistant_id.yml (100%) rename {data/test_config => test_config}/config_with_comment_between_suggestions.yml (100%) rename {data/test_config => test_config}/config_with_comments.yml (100%) rename {data/test_config => test_config}/config_with_comments_after_dumping.yml (100%) rename {data/test_config => test_config}/embedding_random_seed.yaml (100%) rename {data/test_config => test_config}/example_config.yaml (100%) rename {data/test_config => test_config}/graph_config.yml (100%) rename {data/test_config => test_config}/graph_config_short.yml (100%) rename {data/test_config => test_config}/keyword_classifier_config.yml (100%) rename {data/test_config => test_config}/max_hist_config.yml (100%) rename {data/test_config => test_config}/no_max_hist_config.yml (100%) rename {data/test_config => test_config}/stack_config.yml (100%) rename {data/test_config => test_config}/test_moodbot_config_no_assistant_id.yml (100%) rename {data/test_custom_action_triggers_action_extract_slots => test_custom_action_triggers_action_extract_slots}/config.yml (100%) rename {data/test_custom_action_triggers_action_extract_slots => test_custom_action_triggers_action_extract_slots}/domain.yml (100%) rename {data/test_custom_action_triggers_action_extract_slots => test_custom_action_triggers_action_extract_slots}/nlu.yml (100%) rename {data/test_custom_action_triggers_action_extract_slots => test_custom_action_triggers_action_extract_slots}/stories.yml (100%) rename {data/test_e2ebot => test_e2ebot}/config.yml (100%) rename {data/test_e2ebot => test_e2ebot}/data/nlu.yml (100%) rename {data/test_e2ebot => test_e2ebot}/data/stories.yml (100%) rename {data/test_e2ebot => test_e2ebot}/domain.yml (100%) rename {data/test_e2ebot => test_e2ebot}/tests/test_stories.yml (100%) rename {data/test_e2ebot => test_e2ebot}/tests/test_stories_with_unknown_bot_utterances.yml (100%) rename {data/test_endpoints => test_endpoints}/__init__.py (100%) rename {data/test_endpoints => test_endpoints}/cert.pem (100%) rename {data/test_endpoints => test_endpoints}/custom_tracker_endpoints.yml (100%) rename {data/test_endpoints => test_endpoints}/endpoints_redis.yml (100%) rename {data/test_endpoints => test_endpoints}/endpoints_sql.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/kafka_invalid_sasl_mechanism.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/kafka_invalid_security_protocol.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/kafka_plaintext_endpoint.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/kafka_plaintext_endpoint_no_url.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/kafka_sasl_plaintext_endpoint.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/kafka_sasl_ssl_endpoint.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/kafka_ssl_endpoint.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/pika_endpoint.yml (100%) rename {data/test_endpoints => test_endpoints}/event_brokers/sql_endpoint.yml (100%) rename {data/test_endpoints => test_endpoints}/example_endpoints.yml (100%) rename {data/test_endpoints => test_endpoints}/model_endpoint.yml (100%) rename {data/test_evaluations => test_evaluations}/test_end_to_end_story.yml (100%) rename {data/test_evaluations => test_evaluations}/test_end_to_end_trips_circuit_breaker.yml (100%) rename {data/test_evaluations => test_evaluations}/test_form_end_to_end_stories.yml (100%) rename {data/test_evaluations => test_evaluations}/test_stories_trip_circuit_breaker.yml (100%) rename {data/test_evaluations => test_evaluations}/test_story_unknown_entity.yml (100%) rename {data/test_domains => test_files_backup}/conditional_response_variations.yml (100%) rename {data/test_domains => test_files_backup}/custom_slot_domain.yml (100%) rename {data/test_domains => test_files_backup}/default.yml (100%) rename {data/test_domains => test_files_backup}/default_retrieval_intents.yml (100%) rename {data/test_domains => test_files_backup}/default_unfeaturized_entities.yml (100%) rename {data/test_domains => test_files_backup}/default_with_mapping.yml (100%) rename {data/test_domains => test_files_backup}/default_with_slots.yml (100%) rename {data/test_domains => test_files_backup}/domain_with_categorical_slot.yml (100%) rename {data/test_domains => test_files_backup}/duplicate_actions.yml (100%) rename {data/test_domains => test_files_backup}/duplicate_entities.yml (100%) rename {data/test_domains => test_files_backup}/duplicate_intents.yml (100%) rename {data/test_domains => test_files_backup}/duplicate_responses.yml (100%) rename {data/test_domains => test_files_backup}/empty_response_format.yml (100%) rename {data/test_domains => test_files_backup}/form.yml (100%) rename {data/test_domains => test_files_backup}/initial_slot_values_greet_and_goodbye.yml (100%) rename {data/test_domains => test_files_backup}/invalid_format.yml (100%) rename {data/test_domains => test_files_backup}/minimal_domain_validate_files_with_active_loop_null.yml (100%) rename {data/test_domains => test_files_backup}/missing_chitchat_response.yml (100%) rename {data/test_domains => test_files_backup}/missing_text_for_templates.yml (100%) rename {data/test_domains => test_files_backup}/mixed_retrieval_intents.yml (100%) rename {data/test_domains => test_files_backup}/people_form.yml (100%) rename {data/test_domains => test_files_backup}/query_form.yml (100%) rename {data/test_domains => test_files_backup}/response_selector_responses_in_domain.yml (100%) rename {data/test_domains => test_files_backup}/restaurant_form.yml (100%) rename {data/test_domains => test_files_backup}/selectors.yml (100%) rename {data/test_domains => test_files_backup}/simple_retrieval_intent.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_files_with_no_session_config_and_custom_session_config/config.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_files_with_no_session_config_and_custom_session_config/data/nlu.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_files_with_no_session_config_and_custom_session_config/data/responses.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_files_with_no_session_config_and_custom_session_config/data/stories.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_files_with_no_session_config_and_custom_session_config/domain.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory/domain_invalid.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory/domain_valid.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory_for_entities/game_1.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory_for_entities/game_2.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory_for_entities/game_3.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory_tree/domain_pt1.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory_tree/skill_1_domain/domain_pt2.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory_tree/skill_2_domain/domain_pt3.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_directory_tree/skill_2_domain/skill_2_subdirectory/domain_pt4.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_multiple_files/drum.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_multiple_files/last_month.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_multiple_files/main_menu.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_multiple_files/selection.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_multiple_files/small_talk.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_multiple_files/tomorrow.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_from_multiple_files/wallets.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_with_duplicates/domain1.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_with_duplicates/domain2.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_with_separate_session_config/configuration.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_with_separate_session_config/intents.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_with_separate_session_config/responses.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_without_duplicates/domain1.yml (100%) rename {data/test_domains => test_files_backup}/test_domain_without_duplicates/domain2.yml (100%) rename {data/test_domains => test_files_backup}/travel_form.yml (100%) rename {data/test_domains => test_files_backup}/valid_actions.yml (100%) rename {data/test_domains => test_files_backup}/wrong_custom_response_format.yml (100%) rename {data/test_domains => test_files_backup}/wrong_response_format.yml (100%) rename {data/test_from_trigger_intent_with_mapping_conditions => test_from_trigger_intent_with_mapping_conditions}/config.yml (100%) rename {data/test_from_trigger_intent_with_mapping_conditions => test_from_trigger_intent_with_mapping_conditions}/domain.yml (100%) rename {data/test_from_trigger_intent_with_mapping_conditions => test_from_trigger_intent_with_mapping_conditions}/nlu.yml (100%) rename {data/test_from_trigger_intent_with_mapping_conditions => test_from_trigger_intent_with_mapping_conditions}/stories.yml (100%) rename {data/test_from_trigger_intent_with_no_mapping_conditions => test_from_trigger_intent_with_no_mapping_conditions}/config.yml (100%) rename {data/test_from_trigger_intent_with_no_mapping_conditions => test_from_trigger_intent_with_no_mapping_conditions}/domain.yml (100%) rename {data/test_from_trigger_intent_with_no_mapping_conditions => test_from_trigger_intent_with_no_mapping_conditions}/nlu.yml (100%) rename {data/test_from_trigger_intent_with_no_mapping_conditions => test_from_trigger_intent_with_no_mapping_conditions}/stories.yml (100%) rename {data/test_incremental_training => test_incremental_training}/iter1/nlg_training_data.yml (100%) rename {data/test_incremental_training => test_incremental_training}/iter1/training_data.yml (100%) rename {data/test_incremental_training => test_incremental_training}/iter2/training_data.yml (100%) rename {data/test_logging_config_files => test_logging_config_files}/test_invalid_format_value_in_config.yml (100%) rename {data/test_logging_config_files => test_logging_config_files}/test_invalid_handler_key_in_config.yml (100%) rename {data/test_logging_config_files => test_logging_config_files}/test_invalid_value_for_level_in_config.yml (100%) rename {data/test_logging_config_files => test_logging_config_files}/test_logging_config.yml (100%) rename {data/test_logging_config_files => test_logging_config_files}/test_missing_required_key_invalid_config.yml (100%) rename {data/test_logging_config_files => test_logging_config_files}/test_non_existent_handler_id.yml (100%) rename {data/test_mixed_yaml_training_data => test_mixed_yaml_training_data}/training_data.yml (100%) rename {data/test_moodbot => test_moodbot}/config.yml (100%) rename {data/test_moodbot => test_moodbot}/credentials.yml (100%) rename {data/test_moodbot => test_moodbot}/data/nlu.yml (100%) rename {data/test_moodbot => test_moodbot}/data/rules.yml (100%) rename {data/test_moodbot => test_moodbot}/data/stories.yml (100%) rename {data/test_moodbot => test_moodbot}/domain.yml (100%) rename {data/test_moodbot => test_moodbot}/unexpected_intent_policy_config.yml (100%) rename {data/test_multi_domain => test_multi_domain}/config.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/GreetBot/data/nlu.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/GreetBot/data/stories.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/GreetBot/domain.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/MoodBot/config.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/MoodBot/data/nlu.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/MoodBot/data/stories.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/MoodBot/domain.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/nlu.yml (100%) rename {data/test_multi_domain => test_multi_domain}/data/stories.yml (100%) rename {data/test_multi_domain => test_multi_domain}/domain.yml (100%) rename {data/test_multifile_yaml_stories => test_multifile_yaml_stories}/stories_part_1.yml (100%) rename {data/test_multifile_yaml_stories => test_multifile_yaml_stories}/stories_part_2.yml (100%) rename {data/test_multiline_intent_examples_yaml => test_multiline_intent_examples_yaml}/nlu.yml (100%) rename {data/test_multiproject => test_multiproject}/config.yml (100%) rename {data/test_multiproject => test_multiproject}/projects/ChitchatBot/data/nlu.yml (100%) rename {data/test_multiproject => test_multiproject}/projects/ChitchatBot/data/rules.yml (100%) rename {data/test_multiproject => test_multiproject}/projects/ChitchatBot/domain.yml (100%) rename {data/test_multiproject => test_multiproject}/projects/GreetBot/data/nlu.yml (100%) rename {data/test_multiproject => test_multiproject}/projects/GreetBot/data/rules.yml (100%) rename {data/test_multiproject => test_multiproject}/projects/GreetBot/domain.yml (100%) rename {data/test_nlg => test_nlg}/domain_with_response_ids.yml (100%) rename {data/test_nlu => test_nlu}/test_nlu_validate_files_with_active_loop_null.yml (100%) rename {data/test_nlu_no_responses => test_nlu_no_responses}/domain_with_only_responses.yml (100%) rename {data/test_nlu_no_responses => test_nlu_no_responses}/nlu_no_responses.yml (100%) rename {data/test_nlu_no_responses => test_nlu_no_responses}/nlu_with_unicode.yml (100%) rename {data/test_nlu_no_responses => test_nlu_no_responses}/sara_nlu_data.yml (100%) rename {data/test_number_nlu_examples => test_number_nlu_examples}/nlu.yml (100%) rename {data/test_number_nlu_examples => test_number_nlu_examples}/rules.yml (100%) rename {data/test_number_nlu_examples => test_number_nlu_examples}/stories.yml (100%) rename {data/test_response_selector_bot => test_response_selector_bot}/__init__.py (100%) rename {data/test_response_selector_bot => test_response_selector_bot}/config.yml (100%) rename {data/test_response_selector_bot => test_response_selector_bot}/data/nlu.yml (100%) rename {data/test_response_selector_bot => test_response_selector_bot}/data/rules.yml (100%) rename {data/test_response_selector_bot => test_response_selector_bot}/domain.yml (100%) rename {data/test_response_selector_bot => test_response_selector_bot}/tests/test_stories.yml (100%) rename {data/test_responses => test_responses}/default.yml (100%) rename {data/test_responses => test_responses}/responses_utter_rasa.yml (100%) rename {data/test_restaurantbot => test_restaurantbot}/config.yml (100%) rename {data/test_restaurantbot => test_restaurantbot}/data/nlu.yml (100%) rename {data/test_restaurantbot => test_restaurantbot}/data/rules.yml (100%) rename {data/test_restaurantbot => test_restaurantbot}/data/stories.yml (100%) rename {data/test_restaurantbot => test_restaurantbot}/domain.yml (100%) rename {data/test_selectors => test_selectors}/nlu.yml (100%) rename {data/test_spacybot => test_spacybot}/config.yml (100%) rename {data/test_spacybot => test_spacybot}/data/nlu.yml (100%) rename {data/test_spacybot => test_spacybot}/data/stories.yml (100%) rename {data/test_spacybot => test_spacybot}/domain.yml (100%) rename {data/test_tokenizers => test_tokenizers}/naughty_strings.json (100%) rename {data/test_trackers => test_trackers}/tracker_moodbot.json (100%) rename {data/test_trackers => test_trackers}/tracker_moodbot_with_new_utterances.json (100%) rename {data/test_validation => test_validation}/data/nlu.yml (100%) rename {data/test_validation => test_validation}/data/stories.yml (100%) rename {data/test_validation => test_validation}/domain.yml (100%) rename {data/test_wrong_yaml_stories => test_wrong_yaml_stories}/intent_with_leading_slash.yml (100%) rename {data/test_wrong_yaml_stories => test_wrong_yaml_stories}/wrong_yaml.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/non_test_full_retrieval_intent_story.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/rules_greet_and_goodbye.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/rules_missing_intent.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/rules_with_stories_sorted.yaml (100%) rename {data/test_yaml_stories => test_yaml_stories}/rules_without_stories.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/rules_without_stories_and_wrong_names.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/simple_story_with_only_end.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_and_rules.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_checkpoint_after_or.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_conflicting_1.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_conflicting_2.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_conflicting_3.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_conflicting_4.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_conflicting_5.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_conflicting_6.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_conflicting_at_1.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_defaultdomain.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_e2e.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_form.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_hybrid_e2e.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_missing_intent.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_restart.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_retrieval_intents.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_simple.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_unexpected_intent_unlearnable.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_unfeaturized_entities.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_unused_checkpoints.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_with_cycle.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/stories_with_rules_conflicting.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/story_slot_different_types.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/story_with_or_and_entities.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/story_with_or_and_entities_with_no_value.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/story_with_or_slot_was_set.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/story_with_slot_was_set.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/story_with_two_equal_or_statements.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_base_retrieval_intent_story.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_base_retrieval_intent_wrong_prediction.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_failed_entity_extraction_comment.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_full_retrieval_intent_story.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_full_retrieval_intent_wrong_prediction.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_multiple_action_unlikely_intent_warnings.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_prediction_with_correct_intent_wrong_entity.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_prediction_with_wrong_intent_correct_entity.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_prediction_with_wrong_intent_wrong_entity.yml (100%) rename {data/test_yaml_stories => test_yaml_stories}/test_stories_entity_annotations.yml (100%) create mode 100644 tracker.cpp diff --git a/cxx_tracker.py b/cxx_tracker.py new file mode 100644 index 000000000000..ba255ee798dd --- /dev/null +++ b/cxx_tracker.py @@ -0,0 +1,27 @@ +import json +from rasa.core.tracker_store import InMemoryTrackerStore +from rasa.shared.core.trackers import DialogueStateTracker +import fast_tracker + +class CppTrackerStore(InMemoryTrackerStore): + def __init__(self, domain, event_broker=None, **kwargs): + # Trick Rasa by initializing its native memory store to bypass the broken wrapper + super().__init__(domain, event_broker, **kwargs) + self.engine = fast_tracker.CppTrackerEngine() + print("🤖 [SYSTEM INFO] Core Engine initialized using C++ Hijack.") + + async def save(self, tracker, timeout=None): + serializable = tracker.current_state() + state_json = json.dumps(serializable) + print(f"⚡ [C++ WRITE] Routing dialogue state for '{tracker.sender_id}' to C++ layer.") + self.engine.save(tracker.sender_id, state_json) + # We do NOT call super().save() because we don't want Python storing the data! + + async def retrieve(self, sender_id): + state_json = self.engine.retrieve(sender_id) + if not state_json: + return None + print(f"🔍 [C++ READ] Retrieving session state for '{sender_id}' from C++.") + return DialogueStateTracker.from_dict( + sender_id, json.loads(state_json), self.domain.slots + ) \ No newline at end of file diff --git a/data/rules.yml b/data/rules.yml new file mode 100644 index 000000000000..65926178907c --- /dev/null +++ b/data/rules.yml @@ -0,0 +1,6 @@ +version: "3.1" +rules: + - rule: Say goodbye anytime the user leaves + steps: + - intent: goodbye + - action: utter_goodbye diff --git a/data/stories.yml b/data/stories.yml new file mode 100644 index 000000000000..b5e99b99fa1e --- /dev/null +++ b/data/stories.yml @@ -0,0 +1,8 @@ +version: "3.1" +stories: + - story: capture session state path + steps: + - intent: greet + - action: utter_greet + - intent: give_name + - action: utter_greet_with_name diff --git a/data/test_action_extract_slots_11333/models/.gitkeep b/data/test_action_extract_slots_11333/models/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/domain.yml b/domain.yml index 145fe9fd0c46..58292d963d6c 100644 --- a/domain.yml +++ b/domain.yml @@ -19,7 +19,7 @@ slots: responses: utter_greet: - - text: "Hey! How are you?" + - text: "System online. Streaming conversation tracking inputs directly." # Add this so the bot can actually use the name it stored utter_greet_with_name: @@ -36,7 +36,7 @@ responses: - text: "Great, carry on!" utter_goodbye: - - text: "Bye" + - text: "Session terminated. Clearing cache." utter_iamabot: - text: "I am a bot, powered by Rasa." diff --git a/endpoints.yml b/endpoints.yml index 1128e1d53e27..1fab0b339e7c 100644 --- a/endpoints.yml +++ b/endpoints.yml @@ -1,42 +1,3 @@ -# This file contains the different endpoints your bot can use. +action_endpoint: + url: "http://localhost:5055/webhook" -# Server where the models are pulled from. -# https://rasa.com/docs/rasa/model-storage#fetching-models-from-a-server - -#models: -# url: http://my-server.com/models/default_core@latest -# wait_time_between_pulls: 10 # [optional](default: 100) - -# Server which runs your custom actions. -# https://rasa.com/docs/rasa/custom-actions - -#action_endpoint: -# url: "http://localhost:5055/webhook" - -# Tracker store which is used to store the conversations. -# By default the conversations are stored in memory. -# https://rasa.com/docs/rasa/tracker-stores - -#tracker_store: -# type: redis -# url: -# port: -# db: -# password: -# use_ssl: - -#tracker_store: -# type: mongod -# url: -# db: -# username: -# password: - -# Event broker which all conversation events should be streamed to. -# https://rasa.com/docs/rasa/event-brokers - -#event_broker: -# url: localhost -# username: username -# password: password -# queue: queue diff --git a/fast_tracker.cp310-win_amd64.pyd b/fast_tracker.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..7b54d64939f1af9de4e3926638b9fb030352c481 GIT binary patch literal 184832 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 PnyKS$e3 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 +#include +#include +#include + +namespace py = pybind11; + +class CppTrackerEngine { +private: + // Memory map replacing the standard slow database/JSON dictionary + std::unordered_map state_store; + mutable std::shared_mutex store_mutex; + +public: + void save(const std::string& sender_id, const std::string& state_json) { + std::unique_lock lock(store_mutex); + state_store[sender_id] = state_json; + } + + std::string retrieve(const std::string& sender_id) const { + std::shared_lock lock(store_mutex); + auto it = state_store.find(sender_id); + if (it != state_store.end()) { + return it->second; + } + return ""; + } +}; + +// Bindings to expose this C++ class directly to Python scripts +PYBIND11_MODULE(fast_tracker, m) { + py::class_(m, "CppTrackerEngine") + .def(py::init<>()) + .def("save", &CppTrackerEngine::save) + .def("retrieve", &CppTrackerEngine::retrieve); +} \ No newline at end of file From 4afc470d991573f4ecef5ccb5d6c34ac10e3a3b8 Mon Sep 17 00:00:00 2001 From: Francelle Sarayan Date: Wed, 20 May 2026 22:40:31 +0800 Subject: [PATCH 4/4] FIX: IT IS WORKING!! C++ Tracker Store Integration for Rasa Core --- cxx_tracker.py | 20 +++++++++++++------- endpoints.yml | 2 ++ load_test.py | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/cxx_tracker.py b/cxx_tracker.py index ba255ee798dd..0938a3351700 100644 --- a/cxx_tracker.py +++ b/cxx_tracker.py @@ -1,27 +1,33 @@ import json -from rasa.core.tracker_store import InMemoryTrackerStore +from rasa.core.tracker_store import TrackerStore from rasa.shared.core.trackers import DialogueStateTracker import fast_tracker -class CppTrackerStore(InMemoryTrackerStore): +class CppTrackerStore(TrackerStore): def __init__(self, domain, event_broker=None, **kwargs): - # Trick Rasa by initializing its native memory store to bypass the broken wrapper super().__init__(domain, event_broker, **kwargs) self.engine = fast_tracker.CppTrackerEngine() print("🤖 [SYSTEM INFO] Core Engine initialized using C++ Hijack.") async def save(self, tracker, timeout=None): - serializable = tracker.current_state() - state_json = json.dumps(serializable) + # Extract the serializable list of dictionaries representing tracker events + events_list = [e.as_dict() for e in tracker.events] + state_json = json.dumps(events_list) + print(f"⚡ [C++ WRITE] Routing dialogue state for '{tracker.sender_id}' to C++ layer.") self.engine.save(tracker.sender_id, state_json) - # We do NOT call super().save() because we don't want Python storing the data! async def retrieve(self, sender_id): state_json = self.engine.retrieve(sender_id) if not state_json: return None + print(f"🔍 [C++ READ] Retrieving session state for '{sender_id}' from C++.") + events_as_dict = json.loads(state_json) + + # Reconstruct the DialogueStateTracker by replaying the stored events return DialogueStateTracker.from_dict( - sender_id, json.loads(state_json), self.domain.slots + sender_id, + events_as_dict, + self.domain.slots ) \ No newline at end of file diff --git a/endpoints.yml b/endpoints.yml index 1fab0b339e7c..24de8a84cb48 100644 --- a/endpoints.yml +++ b/endpoints.yml @@ -1,3 +1,5 @@ action_endpoint: url: "http://localhost:5055/webhook" +tracker_store: + type: cxx_tracker.CppTrackerStore \ No newline at end of file diff --git a/load_test.py b/load_test.py index c80b93a3315d..0da01ad4d06d 100644 --- a/load_test.py +++ b/load_test.py @@ -21,7 +21,7 @@ async def send_message(session, user_id): return None async def main(): - print(f"🚀 Launching {TOTAL_REQUESTS} simultaneous requests straight to the C++ Tracker Store...") + print(f" Launching {TOTAL_REQUESTS} simultaneous requests straight to the C++ Tracker Store...") async with aiohttp.ClientSession() as session: start_time = time.time()