rasa-pro 3.12.0.dev1__py3-none-any.whl → 3.12.0.dev3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/__main__.py +7 -7
- rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
- rasa/anonymization/anonymization_pipeline.py +3 -3
- rasa/anonymization/anonymization_rule_executor.py +1 -1
- rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
- rasa/cli/arguments/data.py +2 -2
- rasa/cli/arguments/evaluate.py +2 -1
- rasa/cli/arguments/interactive.py +1 -1
- rasa/cli/arguments/run.py +1 -1
- rasa/cli/arguments/test.py +7 -5
- rasa/cli/arguments/train.py +3 -3
- rasa/cli/arguments/visualize.py +2 -2
- rasa/cli/arguments/x.py +1 -0
- rasa/cli/data.py +4 -3
- rasa/cli/dialogue_understanding_test.py +116 -18
- rasa/cli/evaluate.py +1 -1
- rasa/cli/export.py +6 -6
- rasa/cli/interactive.py +4 -5
- rasa/cli/llm_fine_tuning.py +5 -5
- rasa/cli/markers.py +1 -2
- rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
- rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
- rasa/cli/shell.py +2 -3
- rasa/cli/studio/download.py +1 -2
- rasa/cli/studio/studio.py +2 -3
- rasa/cli/studio/train.py +0 -1
- rasa/cli/telemetry.py +2 -2
- rasa/cli/test.py +11 -11
- rasa/cli/utils.py +7 -5
- rasa/core/__init__.py +0 -1
- rasa/core/actions/action.py +42 -21
- rasa/core/actions/action_hangup.py +1 -1
- rasa/core/actions/action_repeat_bot_messages.py +2 -2
- rasa/core/actions/action_run_slot_rejections.py +2 -2
- rasa/core/actions/action_trigger_chitchat.py +1 -1
- rasa/core/actions/action_trigger_flow.py +5 -5
- rasa/core/actions/action_trigger_search.py +1 -1
- rasa/core/actions/forms.py +14 -12
- rasa/core/actions/http_custom_action_executor.py +8 -1
- rasa/core/actions/loops.py +3 -3
- rasa/core/actions/two_stage_fallback.py +13 -13
- rasa/core/auth_retry_tracker_store.py +1 -2
- rasa/core/brokers/broker.py +2 -1
- rasa/core/brokers/file.py +1 -1
- rasa/core/brokers/kafka.py +8 -8
- rasa/core/brokers/pika.py +8 -9
- rasa/core/brokers/sql.py +4 -3
- rasa/core/channels/__init__.py +3 -0
- rasa/core/channels/botframework.py +2 -2
- rasa/core/channels/callback.py +4 -4
- rasa/core/channels/channel.py +11 -11
- rasa/core/channels/console.py +0 -1
- rasa/core/channels/development_inspector.py +6 -6
- rasa/core/channels/facebook.py +5 -5
- rasa/core/channels/hangouts.py +7 -8
- rasa/core/channels/inspector/dist/assets/{arc-861ddd57.js → arc-632a63ec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-921f02db.js → c4Diagram-d0fbc5ce-081e0df4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-b436c4f8.js → classDiagram-936ed81e-3df0afc2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-511a23cb.js → classDiagram-v2-c3cb15f1-8c5ed31e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-62fc7601-89c73b31.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-f1878e0a.js → edges-f2ad444c-4fc48c3e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9d236eb7-907e0440.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-201c5bbc.js → flowDb-1972c806-9ec53a3c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-f904ae41.js → flowDiagram-7ea5b25a-41da787a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-1813da66.js → flowchart-elk-definition-abe16c3d-ce370633.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-872af172.js → ganttDiagram-9b5ea136-90a36523.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-34a0af5a.js → gitGraphDiagram-99d0ae7c-41e1aa3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-42ba3e3d.js → index-2c4b9a3b-e6f2af62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-e793d777.js} +3 -3
- rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-736b4530-8ceba4db.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-df861f2b-960d3809.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-89e6403a.js → layout-498807d8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-eeccc4e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-f5b1d2bc.js → linear-8a078617.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-82cb74fa.js → mindmap-definition-beec6740-396d17dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-dbbf0591-dc9b5e1b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-4d7f4fd6-a08cba6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-6fc4c22a-87242b9e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-caee5554.js → sankeyDiagram-8f13d901-53f6f391.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-2935f8db.js → sequenceDiagram-b655622a-715c9c20.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-8f5d9693.js → stateDiagram-59f0c015-2e8fb31f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-d565d1de.js → stateDiagram-v2-2b26beab-7e2d2aa0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-080da4f6-75ad421d.js → styles-080da4f6-4420cea6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-7e764226.js → styles-3dcbcfbf-28676cf4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-9c745c82-cef936a6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-4019d1bf.js → svgDrawCommon-4835440b-151251e9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-5b62e21b-0d39bdb2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-2b33534f-a03fa445.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +3 -1
- rasa/core/channels/inspector/index.html +2 -0
- rasa/core/channels/inspector/src/App.tsx +1 -4
- rasa/core/channels/mattermost.py +4 -4
- rasa/core/channels/rasa_chat.py +4 -4
- rasa/core/channels/rest.py +11 -12
- rasa/core/channels/rocketchat.py +4 -3
- rasa/core/channels/slack.py +6 -5
- rasa/core/channels/socketio.py +7 -28
- rasa/core/channels/studio_chat.py +193 -0
- rasa/core/channels/telegram.py +73 -41
- rasa/core/channels/twilio.py +3 -3
- rasa/core/channels/vier_cvg.py +2 -2
- rasa/core/channels/voice_ready/audiocodes.py +8 -8
- rasa/core/channels/voice_ready/jambonz.py +5 -5
- rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
- rasa/core/channels/voice_ready/twilio_voice.py +9 -8
- rasa/core/channels/voice_ready/utils.py +1 -1
- rasa/core/channels/voice_stream/asr/asr_engine.py +2 -2
- rasa/core/channels/voice_stream/asr/azure.py +2 -2
- rasa/core/channels/voice_stream/asr/deepgram.py +57 -16
- rasa/core/channels/voice_stream/browser_audio.py +9 -6
- rasa/core/channels/voice_stream/call_state.py +2 -1
- rasa/core/channels/voice_stream/tts/azure.py +1 -2
- rasa/core/channels/voice_stream/tts/cartesia.py +5 -4
- rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
- rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +10 -7
- rasa/core/channels/voice_stream/util.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +15 -15
- rasa/core/channels/webexteams.py +3 -4
- rasa/core/evaluation/marker.py +7 -6
- rasa/core/evaluation/marker_base.py +15 -16
- rasa/core/evaluation/marker_stats.py +3 -4
- rasa/core/evaluation/marker_tracker_loader.py +5 -4
- rasa/core/exporter.py +4 -4
- rasa/core/featurizers/precomputation.py +8 -8
- rasa/core/featurizers/single_state_featurizer.py +7 -7
- rasa/core/featurizers/tracker_featurizers.py +13 -13
- rasa/core/http_interpreter.py +3 -4
- rasa/core/information_retrieval/__init__.py +1 -1
- rasa/core/information_retrieval/faiss.py +4 -4
- rasa/core/information_retrieval/information_retrieval.py +2 -2
- rasa/core/information_retrieval/milvus.py +3 -3
- rasa/core/information_retrieval/qdrant.py +3 -3
- rasa/core/jobs.py +1 -0
- rasa/core/lock.py +2 -3
- rasa/core/lock_store.py +3 -3
- rasa/core/migrate.py +11 -8
- rasa/core/nlg/__init__.py +1 -1
- rasa/core/nlg/callback.py +2 -3
- rasa/core/nlg/contextual_response_rephraser.py +63 -13
- rasa/core/nlg/generator.py +2 -2
- rasa/core/nlg/interpolator.py +4 -3
- rasa/core/nlg/response.py +3 -4
- rasa/core/nlg/summarize.py +1 -0
- rasa/core/persistor.py +3 -3
- rasa/core/policies/ensemble.py +10 -9
- rasa/core/policies/enterprise_search_policy.py +86 -21
- rasa/core/policies/flow_policy.py +13 -14
- rasa/core/policies/flows/flow_executor.py +35 -11
- rasa/core/policies/intentless_policy.py +6 -7
- rasa/core/policies/memoization.py +22 -20
- rasa/core/policies/policy.py +24 -22
- rasa/core/policies/rule_policy.py +37 -36
- rasa/core/policies/ted_policy.py +87 -85
- rasa/core/policies/unexpected_intent_policy.py +77 -75
- rasa/core/processor.py +96 -65
- rasa/core/run.py +1 -1
- rasa/core/secrets_manager/endpoints.py +2 -3
- rasa/core/secrets_manager/factory.py +2 -3
- rasa/core/secrets_manager/secret_manager.py +2 -3
- rasa/core/secrets_manager/vault.py +2 -2
- rasa/core/test.py +30 -30
- rasa/core/tracker_store.py +15 -15
- rasa/core/train.py +1 -1
- rasa/core/training/__init__.py +2 -2
- rasa/core/training/converters/responses_prefix_converter.py +1 -2
- rasa/core/training/interactive.py +13 -13
- rasa/core/training/story_conflict.py +4 -5
- rasa/core/training/training.py +3 -5
- rasa/core/utils.py +5 -5
- rasa/core/visualize.py +1 -1
- rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
- rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
- rasa/dialogue_understanding/commands/__init__.py +22 -22
- rasa/dialogue_understanding/commands/can_not_handle_command.py +20 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +18 -7
- rasa/dialogue_understanding/commands/change_flow_command.py +18 -2
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +18 -4
- rasa/dialogue_understanding/commands/clarify_command.py +19 -3
- rasa/dialogue_understanding/commands/command.py +19 -3
- rasa/dialogue_understanding/commands/correct_slots_command.py +3 -3
- rasa/dialogue_understanding/commands/error_command.py +1 -1
- rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
- rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
- rasa/dialogue_understanding/commands/human_handoff_command.py +16 -4
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +18 -4
- rasa/dialogue_understanding/commands/noop_command.py +2 -1
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +16 -4
- rasa/dialogue_understanding/commands/restart_command.py +2 -5
- rasa/dialogue_understanding/commands/session_end_command.py +3 -5
- rasa/dialogue_understanding/commands/session_start_command.py +3 -5
- rasa/dialogue_understanding/commands/set_slot_command.py +27 -3
- rasa/dialogue_understanding/commands/skip_question_command.py +16 -4
- rasa/dialogue_understanding/commands/start_flow_command.py +17 -2
- rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
- rasa/dialogue_understanding/commands/utils.py +64 -45
- rasa/dialogue_understanding/constants.py +1 -0
- rasa/dialogue_understanding/generator/command_generator.py +2 -119
- rasa/dialogue_understanding/generator/command_parser.py +201 -0
- rasa/dialogue_understanding/generator/constants.py +2 -2
- rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +11 -57
- rasa/dialogue_understanding/generator/llm_command_generator.py +2 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +67 -120
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +8 -10
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +32 -93
- rasa/dialogue_understanding/generator/utils.py +45 -0
- rasa/dialogue_understanding/patterns/cancel.py +2 -1
- rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
- rasa/dialogue_understanding/patterns/chitchat.py +1 -1
- rasa/dialogue_understanding/patterns/clarify.py +2 -1
- rasa/dialogue_understanding/patterns/code_change.py +2 -0
- rasa/dialogue_understanding/patterns/collect_information.py +6 -3
- rasa/dialogue_understanding/patterns/completed.py +1 -1
- rasa/dialogue_understanding/patterns/continue_interrupted.py +10 -1
- rasa/dialogue_understanding/patterns/correction.py +4 -2
- rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
- rasa/dialogue_understanding/patterns/internal_error.py +1 -0
- rasa/dialogue_understanding/patterns/search.py +1 -1
- rasa/dialogue_understanding/patterns/session_start.py +1 -1
- rasa/dialogue_understanding/patterns/skip_question.py +1 -0
- rasa/dialogue_understanding/patterns/user_silence.py +1 -1
- rasa/dialogue_understanding/processor/command_processor.py +13 -9
- rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
- rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
- rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
- rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
- rasa/dialogue_understanding/stack/utils.py +8 -4
- rasa/dialogue_understanding/utils.py +121 -2
- rasa/dialogue_understanding_test/README.md +379 -0
- rasa/dialogue_understanding_test/command_comparison.py +60 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +110 -4
- rasa/dialogue_understanding_test/constants.py +6 -1
- rasa/dialogue_understanding_test/du_test_case.py +252 -38
- rasa/dialogue_understanding_test/du_test_result.py +281 -2
- rasa/dialogue_understanding_test/du_test_runner.py +239 -10
- rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
- rasa/dialogue_understanding_test/io.py +338 -20
- rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
- rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
- rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
- rasa/dialogue_understanding_test/utils.py +70 -0
- rasa/dialogue_understanding_test/validation.py +59 -4
- rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
- rasa/e2e_test/assertions.py +1 -1
- rasa/e2e_test/e2e_config.py +1 -1
- rasa/e2e_test/e2e_test_case.py +3 -4
- rasa/e2e_test/e2e_test_converter.py +2 -3
- rasa/e2e_test/e2e_test_coverage_report.py +6 -6
- rasa/e2e_test/e2e_test_result.py +1 -1
- rasa/e2e_test/e2e_test_runner.py +134 -31
- rasa/e2e_test/stub_custom_action.py +1 -1
- rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
- rasa/e2e_test/utils/io.py +132 -65
- rasa/e2e_test/utils/validation.py +1 -1
- rasa/engine/caching.py +5 -7
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +2 -2
- rasa/engine/recipes/default_components.py +13 -15
- rasa/engine/recipes/recipe.py +2 -2
- rasa/engine/runner/dask.py +2 -2
- rasa/engine/runner/interface.py +1 -0
- rasa/engine/storage/local_model_storage.py +5 -4
- rasa/engine/storage/resource.py +2 -1
- rasa/engine/storage/storage.py +5 -3
- rasa/engine/training/components.py +2 -1
- rasa/engine/training/fingerprinting.py +4 -2
- rasa/engine/training/graph_trainer.py +4 -4
- rasa/engine/training/hooks.py +2 -2
- rasa/engine/validation.py +34 -33
- rasa/exceptions.py +3 -2
- rasa/graph_components/converters/nlu_message_converter.py +3 -3
- rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
- rasa/graph_components/providers/domain_provider.py +3 -2
- rasa/graph_components/providers/flows_provider.py +2 -3
- rasa/graph_components/providers/forms_provider.py +4 -4
- rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
- rasa/graph_components/providers/responses_provider.py +4 -4
- rasa/graph_components/providers/rule_only_provider.py +3 -2
- rasa/graph_components/providers/story_graph_provider.py +8 -8
- rasa/graph_components/providers/training_tracker_provider.py +3 -2
- rasa/graph_components/validators/default_recipe_validator.py +16 -16
- rasa/graph_components/validators/finetuning_validator.py +10 -8
- rasa/hooks.py +18 -12
- rasa/jupyter.py +2 -2
- rasa/llm_fine_tuning/annotation_module.py +4 -4
- rasa/llm_fine_tuning/conversations.py +6 -6
- rasa/llm_fine_tuning/llm_data_preparation_module.py +1 -1
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +1 -1
- rasa/llm_fine_tuning/paraphrasing_module.py +1 -1
- rasa/llm_fine_tuning/storage.py +3 -3
- rasa/markers/marker.py +2 -3
- rasa/markers/marker_base.py +1 -2
- rasa/markers/upload.py +2 -2
- rasa/markers/validate.py +2 -3
- rasa/model.py +3 -5
- rasa/model_manager/config.py +1 -1
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +6 -6
- rasa/model_manager/socket_bridge.py +8 -3
- rasa/model_manager/studio_jwt_auth.py +1 -0
- rasa/model_manager/trainer_service.py +9 -7
- rasa/model_manager/utils.py +1 -1
- rasa/model_manager/warm_rasa_process.py +14 -8
- rasa/model_service.py +5 -6
- rasa/model_testing.py +13 -15
- rasa/nlu/classifiers/diet_classifier.py +72 -73
- rasa/nlu/classifiers/fallback_classifier.py +9 -8
- rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
- rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
- rasa/nlu/classifiers/regex_message_handler.py +3 -2
- rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
- rasa/nlu/convert.py +2 -2
- rasa/nlu/emulators/dialogflow.py +3 -3
- rasa/nlu/emulators/luis.py +5 -5
- rasa/nlu/emulators/no_emulator.py +1 -0
- rasa/nlu/emulators/wit.py +4 -4
- rasa/nlu/extractors/crf_entity_extractor.py +11 -11
- rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
- rasa/nlu/extractors/entity_synonyms.py +10 -9
- rasa/nlu/extractors/extractor.py +16 -16
- rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
- rasa/nlu/extractors/regex_entity_extractor.py +11 -10
- rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
- rasa/nlu/featurizers/featurizer.py +5 -4
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
- rasa/nlu/model.py +0 -1
- rasa/nlu/selectors/response_selector.py +67 -68
- rasa/nlu/test.py +38 -38
- rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
- rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
- rasa/nlu/tokenizers/tokenizer.py +6 -7
- rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
- rasa/nlu/utils/bilou_utils.py +7 -7
- rasa/nlu/utils/hugging_face/registry.py +22 -22
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
- rasa/nlu/utils/mitie_utils.py +2 -1
- rasa/nlu/utils/pattern_utils.py +1 -1
- rasa/nlu/utils/spacy_utils.py +3 -3
- rasa/plugin.py +12 -1
- rasa/server.py +37 -1
- rasa/shared/constants.py +22 -2
- rasa/shared/core/command_payload_reader.py +15 -7
- rasa/shared/core/constants.py +4 -1
- rasa/shared/core/conversation.py +1 -2
- rasa/shared/core/events.py +47 -37
- rasa/shared/core/flows/__init__.py +0 -1
- rasa/shared/core/flows/flow.py +11 -11
- rasa/shared/core/flows/flow_step.py +19 -13
- rasa/shared/core/flows/flow_step_links.py +21 -14
- rasa/shared/core/flows/flow_step_sequence.py +6 -4
- rasa/shared/core/flows/flows_list.py +3 -3
- rasa/shared/core/flows/nlu_trigger.py +1 -1
- rasa/shared/core/flows/steps/__init__.py +2 -2
- rasa/shared/core/flows/steps/action.py +4 -3
- rasa/shared/core/flows/steps/call.py +4 -4
- rasa/shared/core/flows/steps/collect.py +7 -4
- rasa/shared/core/flows/steps/continuation.py +3 -1
- rasa/shared/core/flows/steps/end.py +3 -1
- rasa/shared/core/flows/steps/internal.py +3 -2
- rasa/shared/core/flows/steps/link.py +6 -4
- rasa/shared/core/flows/steps/no_operation.py +7 -5
- rasa/shared/core/flows/steps/set_slots.py +4 -3
- rasa/shared/core/flows/steps/start.py +3 -1
- rasa/shared/core/flows/utils.py +1 -0
- rasa/shared/core/flows/validation.py +3 -5
- rasa/shared/core/generator.py +20 -21
- rasa/shared/core/slot_mappings.py +15 -15
- rasa/shared/core/slots.py +3 -3
- rasa/shared/core/trackers.py +31 -31
- rasa/shared/core/training_data/loading.py +1 -1
- rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
- rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
- rasa/shared/core/training_data/structures.py +11 -12
- rasa/shared/core/training_data/visualization.py +10 -10
- rasa/shared/data.py +6 -6
- rasa/shared/engine/caching.py +0 -1
- rasa/shared/exceptions.py +2 -2
- rasa/shared/importers/rasa.py +5 -6
- rasa/shared/importers/utils.py +1 -1
- rasa/shared/nlu/constants.py +3 -0
- rasa/shared/nlu/training_data/entities_parser.py +6 -6
- rasa/shared/nlu/training_data/features.py +3 -3
- rasa/shared/nlu/training_data/formats/__init__.py +1 -1
- rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
- rasa/shared/nlu/training_data/formats/luis.py +7 -8
- rasa/shared/nlu/training_data/formats/rasa.py +4 -5
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
- rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
- rasa/shared/nlu/training_data/formats/wit.py +3 -4
- rasa/shared/nlu/training_data/loading.py +4 -4
- rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
- rasa/shared/nlu/training_data/message.py +13 -14
- rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +1 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
- rasa/shared/nlu/training_data/training_data.py +12 -13
- rasa/shared/nlu/training_data/util.py +11 -10
- rasa/shared/providers/_configs/azure_openai_client_config.py +3 -497
- rasa/shared/providers/_configs/client_config.py +1 -3
- rasa/shared/providers/_configs/default_litellm_client_config.py +1 -3
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -3
- rasa/shared/providers/_configs/litellm_router_client_config.py +1 -3
- rasa/shared/providers/_configs/model_group_config.py +2 -7
- rasa/shared/providers/_configs/openai_client_config.py +1 -3
- rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -3
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -3
- rasa/shared/providers/_configs/utils.py +1 -0
- rasa/shared/providers/_ssl_verification_utils.py +5 -6
- rasa/shared/providers/_utils.py +5 -5
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +3 -28
- rasa/shared/providers/embedding/embedding_client.py +1 -1
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +1 -3
- rasa/shared/providers/llm/_base_litellm_client.py +1 -3
- rasa/shared/providers/llm/azure_openai_llm_client.py +25 -81
- rasa/shared/providers/llm/default_litellm_llm_client.py +1 -3
- rasa/shared/providers/llm/litellm_router_llm_client.py +2 -21
- rasa/shared/providers/llm/llm_client.py +1 -3
- rasa/shared/providers/llm/llm_response.py +41 -2
- rasa/shared/providers/llm/openai_llm_client.py +3 -9
- rasa/shared/providers/llm/rasa_llm_client.py +6 -20
- rasa/shared/providers/llm/self_hosted_llm_client.py +3 -9
- rasa/shared/providers/mappings.py +18 -19
- rasa/shared/providers/router/_base_litellm_router_client.py +1 -3
- rasa/shared/providers/router/router_client.py +1 -3
- rasa/shared/utils/cli.py +1 -1
- rasa/shared/utils/common.py +1 -1
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
- rasa/shared/utils/health_check/health_check.py +3 -3
- rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
- rasa/shared/utils/io.py +1 -1
- rasa/shared/utils/llm.py +5 -9
- rasa/shared/utils/pykwalify_extensions.py +1 -1
- rasa/shared/utils/schemas/events.py +1 -1
- rasa/shared/utils/yaml.py +29 -26
- rasa/studio/auth.py +3 -3
- rasa/studio/config.py +1 -2
- rasa/studio/data_handler.py +3 -3
- rasa/studio/download.py +1 -1
- rasa/studio/results_logger.py +3 -3
- rasa/studio/upload.py +2 -0
- rasa/telemetry.py +31 -0
- rasa/tracing/config.py +3 -3
- rasa/tracing/instrumentation/attribute_extractors.py +2 -0
- rasa/tracing/instrumentation/instrumentation.py +4 -4
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
- rasa/tracing/instrumentation/metrics.py +11 -11
- rasa/tracing/metric_instrument_provider.py +14 -14
- rasa/utils/common.py +12 -9
- rasa/utils/endpoints.py +1 -1
- rasa/utils/io.py +7 -7
- rasa/utils/licensing.py +3 -4
- rasa/utils/log_utils.py +7 -6
- rasa/utils/ml_utils.py +1 -0
- rasa/utils/plotting.py +3 -3
- rasa/utils/sanic_error_handler.py +1 -1
- rasa/utils/tensorflow/callback.py +2 -2
- rasa/utils/tensorflow/crf.py +2 -2
- rasa/utils/tensorflow/data_generator.py +5 -5
- rasa/utils/tensorflow/environment.py +3 -3
- rasa/utils/tensorflow/feature_array.py +2 -3
- rasa/utils/tensorflow/layers.py +18 -12
- rasa/utils/tensorflow/layers_utils.py +2 -1
- rasa/utils/tensorflow/metrics.py +2 -2
- rasa/utils/tensorflow/model_data.py +7 -7
- rasa/utils/tensorflow/model_data_utils.py +10 -9
- rasa/utils/tensorflow/models.py +31 -32
- rasa/utils/tensorflow/rasa_layers.py +20 -19
- rasa/utils/tensorflow/types.py +2 -1
- rasa/utils/train_utils.py +23 -21
- rasa/utils/url_tools.py +1 -1
- rasa/validator.py +17 -1
- rasa/version.py +1 -1
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/METADATA +8 -9
- rasa_pro-3.12.0.dev3.dist-info/RECORD +800 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
- rasa/shared/providers/constants.py +0 -7
- rasa_pro-3.12.0.dev1.dist-info/RECORD +0 -790
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/entry_points.txt +0 -0
rasa/e2e_test/e2e_test_runner.py
CHANGED
|
@@ -5,7 +5,7 @@ import difflib
|
|
|
5
5
|
from asyncio import CancelledError
|
|
6
6
|
from collections import defaultdict
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any, DefaultDict, Dict, List, Optional, Text, Tuple, Union
|
|
8
|
+
from typing import Any, Callable, DefaultDict, Dict, List, Optional, Text, Tuple, Union
|
|
9
9
|
from urllib.parse import urlparse
|
|
10
10
|
|
|
11
11
|
import requests
|
|
@@ -18,6 +18,7 @@ from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
|
|
|
18
18
|
from rasa.core.exceptions import AgentNotReady
|
|
19
19
|
from rasa.core.persistor import StorageType
|
|
20
20
|
from rasa.core.utils import AvailableEndpoints
|
|
21
|
+
from rasa.dialogue_understanding_test.du_test_case import DialogueUnderstandingTestCase
|
|
21
22
|
from rasa.e2e_test.constants import TEST_CASE_NAME, TEST_FILE_NAME
|
|
22
23
|
from rasa.e2e_test.e2e_config import create_llm_judge_config
|
|
23
24
|
from rasa.e2e_test.e2e_test_case import (
|
|
@@ -123,11 +124,11 @@ class E2ETestRunner:
|
|
|
123
124
|
collector: Output channel.
|
|
124
125
|
steps: List of steps to run.
|
|
125
126
|
sender_id: The test case name with added timestamp suffix.
|
|
126
|
-
test_case_metadata: Metadata of test case.
|
|
127
|
+
test_case_metadata: Metadata of the test case.
|
|
127
128
|
input_metadata: List of metadata.
|
|
128
129
|
|
|
129
130
|
Returns:
|
|
130
|
-
Test turns: {turn_sequence (int)
|
|
131
|
+
Test turns: {turn_sequence (int): TestStep or ActualStepOutput}.
|
|
131
132
|
"""
|
|
132
133
|
turns: TEST_TURNS_TYPE = {}
|
|
133
134
|
event_cursor = 0
|
|
@@ -151,9 +152,23 @@ class E2ETestRunner:
|
|
|
151
152
|
event_cursor,
|
|
152
153
|
)
|
|
153
154
|
|
|
155
|
+
# This variable tracks the position of the last user step.
|
|
156
|
+
# We use it to determine from which turn onward we should check
|
|
157
|
+
# for failures in case of the fail-fast logic.
|
|
158
|
+
last_user_step_position = 0
|
|
154
159
|
for position, step in enumerate(steps):
|
|
155
160
|
if step.actor != "user":
|
|
156
161
|
turns[position] = step
|
|
162
|
+
|
|
163
|
+
# Check for failures after each bot step
|
|
164
|
+
try:
|
|
165
|
+
self.fail_fast_check(
|
|
166
|
+
test_turns=turns,
|
|
167
|
+
last_user_step_position=last_user_step_position,
|
|
168
|
+
)
|
|
169
|
+
except RasaException:
|
|
170
|
+
break
|
|
171
|
+
|
|
157
172
|
continue
|
|
158
173
|
elif not step.text:
|
|
159
174
|
rasa.shared.utils.io.raise_warning(
|
|
@@ -163,6 +178,8 @@ class E2ETestRunner:
|
|
|
163
178
|
UserWarning,
|
|
164
179
|
)
|
|
165
180
|
continue
|
|
181
|
+
# Update to the current position because we have a valid user step
|
|
182
|
+
last_user_step_position = position
|
|
166
183
|
|
|
167
184
|
metadata = test_case_metadata.metadata if test_case_metadata else {}
|
|
168
185
|
|
|
@@ -202,6 +219,26 @@ class E2ETestRunner:
|
|
|
202
219
|
)
|
|
203
220
|
return turns
|
|
204
221
|
|
|
222
|
+
def fail_fast_check(
|
|
223
|
+
self, test_turns: TEST_TURNS_TYPE, last_user_step_position: int
|
|
224
|
+
) -> None:
|
|
225
|
+
"""Checks whether there are any test failures in 'test_turns'.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
test_turns (TEST_TURNS_TYPE): The transcript of test cases and events.
|
|
229
|
+
last_user_step_position (int): The start position in the test turns.
|
|
230
|
+
|
|
231
|
+
Raises:
|
|
232
|
+
RasaException if a failure is found.
|
|
233
|
+
"""
|
|
234
|
+
failures_found = self.find_test_failures(
|
|
235
|
+
test_turns=test_turns,
|
|
236
|
+
test_case=None,
|
|
237
|
+
last_user_step_position=last_user_step_position,
|
|
238
|
+
)
|
|
239
|
+
if failures_found:
|
|
240
|
+
raise RasaException("Test failure found. Aborting early.")
|
|
241
|
+
|
|
205
242
|
@staticmethod
|
|
206
243
|
def merge_metadata(
|
|
207
244
|
sender_id: Text,
|
|
@@ -754,13 +791,15 @@ class E2ETestRunner:
|
|
|
754
791
|
def find_test_failures(
|
|
755
792
|
cls,
|
|
756
793
|
test_turns: TEST_TURNS_TYPE,
|
|
757
|
-
test_case: TestCase,
|
|
794
|
+
test_case: Optional[TestCase],
|
|
795
|
+
last_user_step_position: int = 0,
|
|
758
796
|
) -> List[Tuple[TestFailure, int]]:
|
|
759
797
|
"""Finds the test failures in the transcript.
|
|
760
798
|
|
|
761
799
|
Args:
|
|
762
|
-
test_turns: The transcript of test cases and events.
|
|
763
|
-
test_case: The test case.
|
|
800
|
+
test_turns (TEST_TURNS_TYPE): The transcript of test cases and events.
|
|
801
|
+
test_case (Optional[TestCase]): The test case.
|
|
802
|
+
last_user_step_position (int): The start position in the test turns.
|
|
764
803
|
|
|
765
804
|
Returns:
|
|
766
805
|
The test failures or an empty list if there is no test failure.
|
|
@@ -769,9 +808,10 @@ class E2ETestRunner:
|
|
|
769
808
|
# with a user step
|
|
770
809
|
latest_response: ActualStepOutput = test_turns[-1] # type: ignore[assignment]
|
|
771
810
|
failures = []
|
|
772
|
-
position = 0
|
|
773
811
|
match = None
|
|
774
|
-
for position in range(len(test_turns) - 1):
|
|
812
|
+
for position in range(last_user_step_position, len(test_turns) - 1):
|
|
813
|
+
if position not in test_turns:
|
|
814
|
+
continue
|
|
775
815
|
turn_value = test_turns[position]
|
|
776
816
|
if isinstance(turn_value, ActualStepOutput):
|
|
777
817
|
latest_response = turn_value
|
|
@@ -924,19 +964,11 @@ class E2ETestRunner:
|
|
|
924
964
|
).name
|
|
925
965
|
self.agent.endpoints.action.kwargs[TEST_CASE_NAME] = test_case_name
|
|
926
966
|
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
sender_id, input_fixtures, input_metadata, test_case
|
|
967
|
+
sender_id = self.generate_sender_id(test_case.name)
|
|
968
|
+
_, test_result = await self._process_test_case(
|
|
969
|
+
test_case, sender_id, input_fixtures, input_metadata
|
|
931
970
|
)
|
|
932
971
|
|
|
933
|
-
if not test_case.uses_assertions():
|
|
934
|
-
test_result = self.generate_test_result(test_turns, test_case)
|
|
935
|
-
else:
|
|
936
|
-
test_result = await self.run_assertions(
|
|
937
|
-
sender_id, test_case, input_metadata
|
|
938
|
-
)
|
|
939
|
-
|
|
940
972
|
results.append(test_result)
|
|
941
973
|
|
|
942
974
|
coverage = kwargs.get("coverage", False)
|
|
@@ -983,6 +1015,32 @@ class E2ETestRunner:
|
|
|
983
1015
|
input_metadata,
|
|
984
1016
|
)
|
|
985
1017
|
|
|
1018
|
+
@staticmethod
|
|
1019
|
+
def generate_sender_id(test_case_name: str) -> str:
|
|
1020
|
+
# add timestamp suffix to ensure sender_id is unique
|
|
1021
|
+
return f"{test_case_name}_{datetime.datetime.now()}"
|
|
1022
|
+
|
|
1023
|
+
async def _process_test_case(
|
|
1024
|
+
self,
|
|
1025
|
+
test_case: TestCase,
|
|
1026
|
+
sender_id: str,
|
|
1027
|
+
input_fixtures: List[Fixture],
|
|
1028
|
+
input_metadata: Optional[List[Metadata]],
|
|
1029
|
+
) -> Tuple[TEST_TURNS_TYPE, TestResult]:
|
|
1030
|
+
"""Runs a single test case and returns the test turns and result."""
|
|
1031
|
+
test_turns = await self._run_test_case(
|
|
1032
|
+
sender_id, input_fixtures, input_metadata, test_case
|
|
1033
|
+
)
|
|
1034
|
+
|
|
1035
|
+
if not test_case.uses_assertions():
|
|
1036
|
+
test_result = self.generate_test_result(test_turns, test_case)
|
|
1037
|
+
else:
|
|
1038
|
+
test_result = await self.run_assertions(
|
|
1039
|
+
sender_id, test_case, input_metadata
|
|
1040
|
+
)
|
|
1041
|
+
|
|
1042
|
+
return test_turns, test_result
|
|
1043
|
+
|
|
986
1044
|
async def run_tests_for_fine_tuning(
|
|
987
1045
|
self,
|
|
988
1046
|
input_test_cases: List[TestCase],
|
|
@@ -1008,20 +1066,12 @@ class E2ETestRunner:
|
|
|
1008
1066
|
|
|
1009
1067
|
for i in tqdm(range(len(input_test_cases))):
|
|
1010
1068
|
test_case = input_test_cases[i]
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
test_turns = await self.
|
|
1014
|
-
sender_id, input_fixtures, input_metadata
|
|
1069
|
+
sender_id = self.generate_sender_id(test_case.name)
|
|
1070
|
+
|
|
1071
|
+
test_turns, test_result = await self._process_test_case(
|
|
1072
|
+
test_case, sender_id, input_fixtures, input_metadata
|
|
1015
1073
|
)
|
|
1016
1074
|
|
|
1017
|
-
# check if the e2e test is passing, only convert passing e2e tests into
|
|
1018
|
-
# conversations
|
|
1019
|
-
if not test_case.uses_assertions():
|
|
1020
|
-
test_result = self.generate_test_result(test_turns, test_case)
|
|
1021
|
-
else:
|
|
1022
|
-
test_result = await self.run_assertions(
|
|
1023
|
-
sender_id, test_case, input_metadata
|
|
1024
|
-
)
|
|
1025
1075
|
if not test_result.pass_status:
|
|
1026
1076
|
structlogger.warning(
|
|
1027
1077
|
"annotation_module.skip_test_case.failing_e2e_test",
|
|
@@ -1040,6 +1090,59 @@ class E2ETestRunner:
|
|
|
1040
1090
|
|
|
1041
1091
|
return conversations
|
|
1042
1092
|
|
|
1093
|
+
async def run_tests_to_convert_tests_to_du_tests(
|
|
1094
|
+
self,
|
|
1095
|
+
input_test_cases: List[TestCase],
|
|
1096
|
+
input_fixtures: List[Fixture],
|
|
1097
|
+
input_metadata: Optional[List[Metadata]],
|
|
1098
|
+
converting_method: Callable[
|
|
1099
|
+
[TEST_TURNS_TYPE, TestCase, bool, bool],
|
|
1100
|
+
Optional[DialogueUnderstandingTestCase],
|
|
1101
|
+
],
|
|
1102
|
+
) -> Tuple[
|
|
1103
|
+
List[DialogueUnderstandingTestCase], List[DialogueUnderstandingTestCase]
|
|
1104
|
+
]:
|
|
1105
|
+
"""Runs the test cases to convert them into dialogue understanding tests.
|
|
1106
|
+
|
|
1107
|
+
Converts test cases into dialogue understanding test cases.
|
|
1108
|
+
|
|
1109
|
+
Args:
|
|
1110
|
+
input_test_cases: Input test cases.
|
|
1111
|
+
input_fixtures: Input fixtures.
|
|
1112
|
+
input_metadata: Input metadata.
|
|
1113
|
+
converting_method: The method to convert the e2e test case into a
|
|
1114
|
+
dialogue understanding test case.
|
|
1115
|
+
|
|
1116
|
+
Returns:
|
|
1117
|
+
List of ready dialogue understanding test cases and list of
|
|
1118
|
+
dialogue understanding test cases to review.
|
|
1119
|
+
"""
|
|
1120
|
+
ready_du_test_cases = []
|
|
1121
|
+
to_review_du_test_cases = []
|
|
1122
|
+
|
|
1123
|
+
for i in tqdm(range(len(input_test_cases))):
|
|
1124
|
+
test_case = input_test_cases[i]
|
|
1125
|
+
sender_id = self.generate_sender_id(test_case.name)
|
|
1126
|
+
|
|
1127
|
+
test_turns, test_result = await self._process_test_case(
|
|
1128
|
+
test_case, sender_id, input_fixtures, input_metadata
|
|
1129
|
+
)
|
|
1130
|
+
|
|
1131
|
+
du_test_case = converting_method(
|
|
1132
|
+
test_turns,
|
|
1133
|
+
test_case,
|
|
1134
|
+
test_case.uses_assertions(),
|
|
1135
|
+
test_result.pass_status,
|
|
1136
|
+
)
|
|
1137
|
+
|
|
1138
|
+
if du_test_case:
|
|
1139
|
+
if test_result.pass_status:
|
|
1140
|
+
ready_du_test_cases.append(du_test_case)
|
|
1141
|
+
else:
|
|
1142
|
+
to_review_du_test_cases.append(du_test_case)
|
|
1143
|
+
|
|
1144
|
+
return ready_du_test_cases, to_review_du_test_cases
|
|
1145
|
+
|
|
1043
1146
|
@staticmethod
|
|
1044
1147
|
def _action_server_is_reachable(
|
|
1045
1148
|
endpoints: AvailableEndpoints, module: str = "e2e_test_runner"
|
|
@@ -45,7 +45,7 @@ class E2ETestYAMLWriter:
|
|
|
45
45
|
|
|
46
46
|
yaml_data = ruamel.yaml.safe_load(tests)
|
|
47
47
|
|
|
48
|
-
test_cases_yaml =
|
|
48
|
+
test_cases_yaml = {KEY_TEST_CASES: yaml_data}
|
|
49
49
|
with open(output_file, "w") as outfile:
|
|
50
50
|
yaml = ruamel.yaml.YAML()
|
|
51
51
|
yaml.dump(test_cases_yaml, outfile)
|
rasa/e2e_test/utils/io.py
CHANGED
|
@@ -6,7 +6,7 @@ import sys
|
|
|
6
6
|
from functools import lru_cache
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from textwrap import dedent
|
|
9
|
-
from typing import Any, Dict, Generator, List, Optional,
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Tuple, Union
|
|
10
10
|
|
|
11
11
|
import matplotlib.pyplot as plt
|
|
12
12
|
import pandas as pd
|
|
@@ -27,7 +27,11 @@ from rasa.e2e_test.constants import (
|
|
|
27
27
|
STATUS_PASSED,
|
|
28
28
|
STUB_CUSTOM_ACTION_NAME_SEPARATOR,
|
|
29
29
|
)
|
|
30
|
-
from rasa.e2e_test.e2e_test_case import Fixture, Metadata,
|
|
30
|
+
from rasa.e2e_test.e2e_test_case import Fixture, Metadata, TestCase, TestSuite
|
|
31
|
+
from rasa.e2e_test.stub_custom_action import (
|
|
32
|
+
StubCustomAction,
|
|
33
|
+
get_stub_custom_action_key,
|
|
34
|
+
)
|
|
31
35
|
from rasa.e2e_test.utils.validation import (
|
|
32
36
|
read_e2e_test_schema,
|
|
33
37
|
validate_path_to_test_cases,
|
|
@@ -41,8 +45,8 @@ from rasa.shared.utils.yaml import (
|
|
|
41
45
|
from rasa.utils.beta import BetaNotEnabledException, ensure_beta_feature_is_enabled
|
|
42
46
|
|
|
43
47
|
if TYPE_CHECKING:
|
|
44
|
-
from rasa.e2e_test.e2e_test_result import TestResult
|
|
45
48
|
from rasa.e2e_test.aggregate_test_stats_calculator import AccuracyCalculation
|
|
49
|
+
from rasa.e2e_test.e2e_test_result import TestResult
|
|
46
50
|
|
|
47
51
|
|
|
48
52
|
RASA_PRO_BETA_E2E_ASSERTIONS_ENV_VAR_NAME = "RASA_PRO_BETA_E2E_ASSERTIONS"
|
|
@@ -274,7 +278,7 @@ def split_into_passed_failed(
|
|
|
274
278
|
return passed_cases, failed_cases
|
|
275
279
|
|
|
276
280
|
|
|
277
|
-
def has_test_case_with_assertions(test_cases: List[
|
|
281
|
+
def has_test_case_with_assertions(test_cases: List[TestCase]) -> bool:
|
|
278
282
|
"""Check if the test cases contain assertions."""
|
|
279
283
|
try:
|
|
280
284
|
next(test_case for test_case in test_cases if test_case.uses_assertions())
|
|
@@ -318,6 +322,104 @@ def is_test_case_file(file_path: Union[str, Path]) -> bool:
|
|
|
318
322
|
)
|
|
319
323
|
|
|
320
324
|
|
|
325
|
+
def extract_test_cases(
|
|
326
|
+
test_file_content: dict,
|
|
327
|
+
test_case_name: str,
|
|
328
|
+
test_file: str,
|
|
329
|
+
) -> List[TestCase]:
|
|
330
|
+
"""Extract test cases from the test file content.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
test_file_content: Content of the test file.
|
|
334
|
+
test_case_name: Name of the test case to extract.
|
|
335
|
+
test_file: Path to the test file.
|
|
336
|
+
|
|
337
|
+
Returns:
|
|
338
|
+
List of test cases.
|
|
339
|
+
"""
|
|
340
|
+
test_cases_content = test_file_content.get(KEY_TEST_CASES) or []
|
|
341
|
+
if test_case_name:
|
|
342
|
+
return [
|
|
343
|
+
TestCase.from_dict(test_case_dict, file=test_file)
|
|
344
|
+
for test_case_dict in test_cases_content
|
|
345
|
+
if test_case_name == test_case_dict.get(KEY_TEST_CASE)
|
|
346
|
+
]
|
|
347
|
+
return [
|
|
348
|
+
TestCase.from_dict(test_case_dict, file=test_file)
|
|
349
|
+
for test_case_dict in test_cases_content
|
|
350
|
+
]
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def extract_fixtures(
|
|
354
|
+
test_file_content: dict, existing_fixtures: Dict[str, Fixture]
|
|
355
|
+
) -> Dict[str, Fixture]:
|
|
356
|
+
"""Extract fixtures from the test file content.
|
|
357
|
+
|
|
358
|
+
Args:
|
|
359
|
+
test_file_content: Content of the test file.
|
|
360
|
+
existing_fixtures: Existing fixtures.
|
|
361
|
+
|
|
362
|
+
Returns:
|
|
363
|
+
Dict of fixtures.
|
|
364
|
+
"""
|
|
365
|
+
fixtures_content = test_file_content.get(KEY_FIXTURES) or []
|
|
366
|
+
_fixtures = {}
|
|
367
|
+
for fixture in fixtures_content:
|
|
368
|
+
fixture_obj = Fixture.from_dict(fixture_dict=fixture)
|
|
369
|
+
if existing_fixtures.get(fixture_obj.name) is None:
|
|
370
|
+
_fixtures[fixture_obj.name] = fixture_obj
|
|
371
|
+
return _fixtures
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def extract_metadata(
|
|
375
|
+
test_file_content: dict, existing_metadata: Dict[str, Metadata]
|
|
376
|
+
) -> Dict[str, Metadata]:
|
|
377
|
+
"""Extract metadata from the test file content.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
test_file_content: Content of the test file.
|
|
381
|
+
existing_metadata: Existing metadata.
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
Dict of metadata.
|
|
385
|
+
"""
|
|
386
|
+
metadata_contents = test_file_content.get(KEY_METADATA) or []
|
|
387
|
+
_metadata = {}
|
|
388
|
+
for metadata_content in metadata_contents:
|
|
389
|
+
metadata_obj = Metadata.from_dict(metadata_dict=metadata_content)
|
|
390
|
+
if existing_metadata.get(metadata_obj.name) is None:
|
|
391
|
+
_metadata[metadata_obj.name] = metadata_obj
|
|
392
|
+
return _metadata
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def extract_stub_custom_actions(
|
|
396
|
+
test_file_content: dict, test_file: str
|
|
397
|
+
) -> Dict[str, StubCustomAction]:
|
|
398
|
+
"""Extract stub custom actions from the test file content.
|
|
399
|
+
|
|
400
|
+
Args:
|
|
401
|
+
test_file_content: Content of the test file.
|
|
402
|
+
test_file: Path to the test file.
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
Dict of stub custom actions.
|
|
406
|
+
"""
|
|
407
|
+
stub_custom_actions_contents = test_file_content.get(KEY_STUB_CUSTOM_ACTIONS) or {}
|
|
408
|
+
_stub_custom_actions = {}
|
|
409
|
+
for action_name, stub_data in stub_custom_actions_contents.items():
|
|
410
|
+
if STUB_CUSTOM_ACTION_NAME_SEPARATOR in action_name:
|
|
411
|
+
stub_custom_action_key = action_name
|
|
412
|
+
else:
|
|
413
|
+
test_file_name = Path(test_file).name
|
|
414
|
+
stub_custom_action_key = get_stub_custom_action_key(
|
|
415
|
+
test_file_name, action_name
|
|
416
|
+
)
|
|
417
|
+
_stub_custom_actions[stub_custom_action_key] = StubCustomAction.from_dict(
|
|
418
|
+
action_name=action_name, stub_data=stub_data
|
|
419
|
+
)
|
|
420
|
+
return _stub_custom_actions
|
|
421
|
+
|
|
422
|
+
|
|
321
423
|
def read_test_cases(path: str) -> TestSuite:
|
|
322
424
|
"""Read test cases from the given path.
|
|
323
425
|
|
|
@@ -327,92 +429,46 @@ def read_test_cases(path: str) -> TestSuite:
|
|
|
327
429
|
Returns:
|
|
328
430
|
TestSuite.
|
|
329
431
|
"""
|
|
330
|
-
|
|
331
|
-
StubCustomAction,
|
|
332
|
-
get_stub_custom_action_key,
|
|
333
|
-
)
|
|
334
|
-
|
|
432
|
+
# Extract test case path and name
|
|
335
433
|
path, test_case_name = extract_test_case_from_path(path)
|
|
336
434
|
validate_path_to_test_cases(path)
|
|
337
435
|
|
|
436
|
+
# Load test files and schema
|
|
338
437
|
test_files = rasa.shared.data.get_data_files([path], is_test_case_file)
|
|
339
438
|
e2e_test_schema = read_e2e_test_schema()
|
|
340
439
|
|
|
440
|
+
# Initialize containers
|
|
341
441
|
input_test_cases = []
|
|
342
442
|
fixtures: Dict[str, Fixture] = {}
|
|
343
443
|
metadata: Dict[str, Metadata] = {}
|
|
344
444
|
stub_custom_actions: Dict[str, StubCustomAction] = {}
|
|
345
|
-
|
|
346
445
|
beta_flag_verified = False
|
|
347
446
|
|
|
447
|
+
# Process each test file
|
|
348
448
|
for test_file in test_files:
|
|
349
449
|
test_file_content = parse_raw_yaml(Path(test_file).read_text(encoding="utf-8"))
|
|
350
450
|
|
|
451
|
+
# Validate YAML content using the provided function
|
|
351
452
|
validate_yaml_data_using_schema_with_assertions(
|
|
352
453
|
yaml_data=test_file_content, schema_content=e2e_test_schema
|
|
353
454
|
)
|
|
354
455
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
]
|
|
363
|
-
else:
|
|
364
|
-
test_cases = [
|
|
365
|
-
TestCase.from_dict(test_case_dict, file=test_file)
|
|
366
|
-
for test_case_dict in test_cases_content
|
|
367
|
-
]
|
|
456
|
+
# Parse test cases, fixtures, metadata, and stub custom actions
|
|
457
|
+
test_cases = extract_test_cases(test_file_content, test_case_name, test_file)
|
|
458
|
+
fixtures.update(extract_fixtures(test_file_content, fixtures))
|
|
459
|
+
metadata.update(extract_metadata(test_file_content, metadata))
|
|
460
|
+
stub_custom_actions.update(
|
|
461
|
+
extract_stub_custom_actions(test_file_content, test_file)
|
|
462
|
+
)
|
|
368
463
|
|
|
369
464
|
beta_flag_verified = verify_beta_feature_flag_for_assertions(
|
|
370
465
|
test_cases, beta_flag_verified
|
|
371
466
|
)
|
|
372
|
-
|
|
373
467
|
input_test_cases.extend(test_cases)
|
|
374
|
-
fixtures_content = test_file_content.get(KEY_FIXTURES) or []
|
|
375
|
-
for fixture in fixtures_content:
|
|
376
|
-
fixture_obj = Fixture.from_dict(fixture_dict=fixture)
|
|
377
|
-
|
|
378
|
-
# avoid adding duplicates from across multiple files
|
|
379
|
-
if fixtures.get(fixture_obj.name) is None:
|
|
380
|
-
fixtures[fixture_obj.name] = fixture_obj
|
|
381
|
-
|
|
382
|
-
metadata_contents = test_file_content.get(KEY_METADATA) or []
|
|
383
|
-
for metadata_content in metadata_contents:
|
|
384
|
-
metadata_obj = Metadata.from_dict(metadata_dict=metadata_content)
|
|
385
|
-
|
|
386
|
-
# avoid adding duplicates from across multiple files
|
|
387
|
-
if metadata.get(metadata_obj.name) is None:
|
|
388
|
-
metadata[metadata_obj.name] = metadata_obj
|
|
389
|
-
|
|
390
|
-
stub_custom_actions_contents = (
|
|
391
|
-
test_file_content.get(KEY_STUB_CUSTOM_ACTIONS) or {}
|
|
392
|
-
)
|
|
393
|
-
|
|
394
|
-
for action_name, stub_data in stub_custom_actions_contents.items():
|
|
395
|
-
if STUB_CUSTOM_ACTION_NAME_SEPARATOR in action_name:
|
|
396
|
-
stub_custom_action_key = action_name
|
|
397
|
-
else:
|
|
398
|
-
test_file_name = Path(test_file).name
|
|
399
|
-
stub_custom_action_key = get_stub_custom_action_key(
|
|
400
|
-
test_file_name, action_name
|
|
401
|
-
)
|
|
402
|
-
stub_custom_actions[stub_custom_action_key] = StubCustomAction.from_dict(
|
|
403
|
-
action_name=action_name,
|
|
404
|
-
stub_data=stub_data,
|
|
405
|
-
)
|
|
406
468
|
|
|
407
469
|
validate_test_case(test_case_name, input_test_cases, fixtures, metadata)
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
ensure_beta_feature_is_enabled(
|
|
411
|
-
"enabling stubs for custom actions",
|
|
412
|
-
RASA_PRO_BETA_STUB_CUSTOM_ACTION_ENV_VAR_NAME,
|
|
413
|
-
)
|
|
414
|
-
except BetaNotEnabledException as exc:
|
|
415
|
-
rasa.shared.utils.cli.print_error_and_exit(str(exc))
|
|
470
|
+
if stub_custom_actions:
|
|
471
|
+
check_beta_feature_flag_for_custom_actions_stubs()
|
|
416
472
|
|
|
417
473
|
return TestSuite(
|
|
418
474
|
input_test_cases,
|
|
@@ -422,8 +478,19 @@ def read_test_cases(path: str) -> TestSuite:
|
|
|
422
478
|
)
|
|
423
479
|
|
|
424
480
|
|
|
481
|
+
def check_beta_feature_flag_for_custom_actions_stubs() -> None:
|
|
482
|
+
"""Check the beta feature flag for custom actions stub and exit if not enabled."""
|
|
483
|
+
try:
|
|
484
|
+
ensure_beta_feature_is_enabled(
|
|
485
|
+
"enabling stubs for custom actions",
|
|
486
|
+
RASA_PRO_BETA_STUB_CUSTOM_ACTION_ENV_VAR_NAME,
|
|
487
|
+
)
|
|
488
|
+
except BetaNotEnabledException as exc:
|
|
489
|
+
rasa.shared.utils.cli.print_error_and_exit(str(exc))
|
|
490
|
+
|
|
491
|
+
|
|
425
492
|
def verify_beta_feature_flag_for_assertions(
|
|
426
|
-
test_cases: List[
|
|
493
|
+
test_cases: List[TestCase], beta_flag_verified: bool
|
|
427
494
|
) -> bool:
|
|
428
495
|
"""Verify the beta feature flag for assertions."""
|
|
429
496
|
if beta_flag_verified:
|
rasa/engine/caching.py
CHANGED
|
@@ -5,27 +5,25 @@ import logging
|
|
|
5
5
|
import shutil
|
|
6
6
|
from datetime import datetime
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import
|
|
8
|
+
from typing import Any, List, Optional, Text, Tuple
|
|
9
9
|
|
|
10
|
+
import sqlalchemy as sa
|
|
11
|
+
import sqlalchemy.orm
|
|
10
12
|
from packaging import version
|
|
11
13
|
from sqlalchemy.engine import URL
|
|
12
|
-
|
|
13
14
|
from sqlalchemy.exc import OperationalError
|
|
14
15
|
from typing_extensions import Protocol, runtime_checkable
|
|
15
16
|
|
|
16
17
|
import rasa
|
|
17
18
|
import rasa.model
|
|
18
|
-
import rasa.utils.common
|
|
19
19
|
import rasa.shared.utils.common
|
|
20
|
+
import rasa.utils.common
|
|
20
21
|
from rasa.constants import MINIMUM_COMPATIBLE_VERSION
|
|
21
|
-
import sqlalchemy as sa
|
|
22
|
-
import sqlalchemy.orm
|
|
23
|
-
|
|
24
22
|
from rasa.engine.storage.storage import ModelStorage
|
|
25
23
|
from rasa.shared.engine.caching import (
|
|
24
|
+
get_cache_database_name,
|
|
26
25
|
get_local_cache_location,
|
|
27
26
|
get_max_cache_size,
|
|
28
|
-
get_cache_database_name,
|
|
29
27
|
)
|
|
30
28
|
|
|
31
29
|
logger = logging.getLogger(__name__)
|
rasa/engine/constants.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from typing import List, Optional
|
|
2
2
|
|
|
3
3
|
from rasa.core.channels import UserMessage
|
|
4
|
+
from rasa.core.utils import AvailableEndpoints
|
|
4
5
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
5
6
|
from rasa.shared.importers.importer import TrainingDataImporter
|
|
6
|
-
from rasa.core.utils import AvailableEndpoints
|
|
7
7
|
|
|
8
8
|
PLACEHOLDER_IMPORTER = "__importer__"
|
|
9
9
|
PLACEHOLDER_MESSAGE = "__message__"
|
rasa/engine/graph.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
3
4
|
import dataclasses
|
|
4
5
|
from abc import ABC, abstractmethod
|
|
5
6
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import Any, Callable, Dict, List, Optional, Text,
|
|
7
|
+
from typing import Any, Callable, Dict, List, Optional, Text, Tuple, Type, Union
|
|
7
8
|
|
|
8
9
|
import structlog
|
|
9
|
-
import asyncio
|
|
10
10
|
|
|
11
11
|
import rasa.shared.utils.common
|
|
12
12
|
import rasa.utils.common
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
from rasa.core.policies.enterprise_search_policy import EnterpriseSearchPolicy
|
|
2
2
|
from rasa.core.policies.flow_policy import FlowPolicy
|
|
3
|
+
from rasa.core.policies.intentless_policy import IntentlessPolicy
|
|
4
|
+
from rasa.core.policies.memoization import AugmentedMemoizationPolicy, MemoizationPolicy
|
|
5
|
+
from rasa.core.policies.rule_policy import RulePolicy
|
|
6
|
+
from rasa.core.policies.ted_policy import TEDPolicy
|
|
7
|
+
from rasa.core.policies.unexpected_intent_policy import UnexpecTEDIntentPolicy
|
|
3
8
|
from rasa.dialogue_understanding.coexistence.intent_based_router import (
|
|
4
9
|
IntentBasedRouter,
|
|
5
10
|
)
|
|
6
11
|
from rasa.dialogue_understanding.coexistence.llm_based_router import LLMBasedRouter
|
|
7
|
-
from rasa.
|
|
12
|
+
from rasa.dialogue_understanding.generator import (
|
|
13
|
+
LLMCommandGenerator,
|
|
14
|
+
)
|
|
8
15
|
from rasa.dialogue_understanding.generator.nlu_command_adapter import NLUCommandAdapter
|
|
9
16
|
from rasa.nlu.classifiers.diet_classifier import DIETClassifier
|
|
10
17
|
from rasa.nlu.classifiers.fallback_classifier import FallbackClassifier
|
|
11
18
|
from rasa.nlu.classifiers.keyword_intent_classifier import KeywordIntentClassifier
|
|
12
|
-
from rasa.dialogue_understanding.generator import (
|
|
13
|
-
LLMCommandGenerator,
|
|
14
|
-
)
|
|
15
19
|
from rasa.nlu.classifiers.logistic_regression_classifier import (
|
|
16
20
|
LogisticRegressionClassifier,
|
|
17
21
|
)
|
|
@@ -21,18 +25,18 @@ from rasa.nlu.extractors.crf_entity_extractor import CRFEntityExtractor
|
|
|
21
25
|
from rasa.nlu.extractors.duckling_entity_extractor import DucklingEntityExtractor
|
|
22
26
|
from rasa.nlu.extractors.entity_synonyms import EntitySynonymMapper
|
|
23
27
|
from rasa.nlu.extractors.mitie_entity_extractor import MitieEntityExtractor
|
|
24
|
-
from rasa.nlu.extractors.spacy_entity_extractor import SpacyEntityExtractor
|
|
25
28
|
from rasa.nlu.extractors.regex_entity_extractor import RegexEntityExtractor
|
|
26
|
-
from rasa.nlu.
|
|
27
|
-
LexicalSyntacticFeaturizer,
|
|
28
|
-
)
|
|
29
|
+
from rasa.nlu.extractors.spacy_entity_extractor import SpacyEntityExtractor
|
|
29
30
|
from rasa.nlu.featurizers.dense_featurizer.convert_featurizer import ConveRTFeaturizer
|
|
31
|
+
from rasa.nlu.featurizers.dense_featurizer.lm_featurizer import LanguageModelFeaturizer
|
|
30
32
|
from rasa.nlu.featurizers.dense_featurizer.mitie_featurizer import MitieFeaturizer
|
|
31
33
|
from rasa.nlu.featurizers.dense_featurizer.spacy_featurizer import SpacyFeaturizer
|
|
32
34
|
from rasa.nlu.featurizers.sparse_featurizer.count_vectors_featurizer import (
|
|
33
35
|
CountVectorsFeaturizer,
|
|
34
36
|
)
|
|
35
|
-
from rasa.nlu.featurizers.
|
|
37
|
+
from rasa.nlu.featurizers.sparse_featurizer.lexical_syntactic_featurizer import (
|
|
38
|
+
LexicalSyntacticFeaturizer,
|
|
39
|
+
)
|
|
36
40
|
from rasa.nlu.featurizers.sparse_featurizer.regex_featurizer import RegexFeaturizer
|
|
37
41
|
from rasa.nlu.selectors.response_selector import ResponseSelector
|
|
38
42
|
from rasa.nlu.tokenizers.jieba_tokenizer import JiebaTokenizer
|
|
@@ -42,12 +46,6 @@ from rasa.nlu.tokenizers.whitespace_tokenizer import WhitespaceTokenizer
|
|
|
42
46
|
from rasa.nlu.utils.mitie_utils import MitieNLP
|
|
43
47
|
from rasa.nlu.utils.spacy_utils import SpacyNLP
|
|
44
48
|
|
|
45
|
-
|
|
46
|
-
from rasa.core.policies.ted_policy import TEDPolicy
|
|
47
|
-
from rasa.core.policies.memoization import MemoizationPolicy, AugmentedMemoizationPolicy
|
|
48
|
-
from rasa.core.policies.rule_policy import RulePolicy
|
|
49
|
-
from rasa.core.policies.unexpected_intent_policy import UnexpecTEDIntentPolicy
|
|
50
|
-
|
|
51
49
|
DEFAULT_COMPONENTS = [
|
|
52
50
|
# Message Classifiers
|
|
53
51
|
DIETClassifier,
|