rasa-pro 3.11.4__py3-none-any.whl → 3.12.0__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.
- README.md +10 -13
- 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 +17 -11
- rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
- rasa/cli/arguments/data.py +2 -2
- rasa/cli/arguments/default_arguments.py +1 -1
- 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 +20 -3
- rasa/cli/dialogue_understanding_test.py +386 -0
- rasa/cli/evaluate.py +1 -1
- rasa/cli/export.py +6 -6
- rasa/cli/inspect.py +20 -1
- rasa/cli/interactive.py +4 -5
- rasa/cli/llm_fine_tuning.py +51 -16
- rasa/cli/markers.py +1 -2
- rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
- rasa/cli/project_templates/calm/config.yml +2 -2
- rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
- rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
- rasa/cli/project_templates/calm/domain/shared.yml +1 -4
- rasa/cli/project_templates/calm/endpoints.yml +2 -2
- rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
- rasa/cli/shell.py +5 -6
- 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/train.py +3 -0
- rasa/cli/utils.py +25 -5
- rasa/constants.py +0 -1
- rasa/core/__init__.py +0 -1
- rasa/core/actions/action.py +137 -208
- rasa/core/actions/action_handle_digressions.py +164 -0
- 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 +18 -6
- 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/custom_action_executor.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +1 -0
- rasa/core/actions/forms.py +22 -15
- 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 +7 -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 +80 -24
- rasa/core/channels/facebook.py +5 -5
- rasa/core/channels/hangouts.py +7 -8
- rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
- rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
- rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
- rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
- rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
- rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
- rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
- rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
- rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
- rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
- rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
- rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
- rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
- rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
- rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
- rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
- rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
- rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +11 -3
- rasa/core/channels/inspector/src/App.tsx +15 -2
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
- rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
- rasa/core/channels/inspector/yarn.lock +94 -99
- 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 +8 -28
- rasa/core/channels/studio_chat.py +212 -0
- rasa/core/channels/telegram.py +105 -55
- rasa/core/channels/twilio.py +3 -3
- rasa/core/channels/vier_cvg.py +2 -2
- rasa/core/channels/voice_ready/audiocodes.py +51 -32
- 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 +2 -2
- rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
- rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
- rasa/core/channels/voice_stream/asr/azure.py +16 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
- rasa/core/channels/voice_stream/audiocodes.py +292 -0
- rasa/core/channels/voice_stream/browser_audio.py +14 -7
- rasa/core/channels/voice_stream/call_state.py +6 -2
- rasa/core/channels/voice_stream/genesys.py +320 -0
- rasa/core/channels/voice_stream/tts/azure.py +13 -5
- rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
- 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 +12 -8
- rasa/core/channels/voice_stream/util.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +100 -56
- rasa/core/channels/webexteams.py +3 -4
- rasa/core/constants.py +2 -0
- 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 +12 -9
- rasa/core/nlg/__init__.py +1 -1
- rasa/core/nlg/callback.py +2 -3
- rasa/core/nlg/contextual_response_rephraser.py +82 -14
- rasa/core/nlg/generator.py +85 -17
- rasa/core/nlg/interpolator.py +4 -3
- rasa/core/nlg/response.py +9 -7
- rasa/core/nlg/summarize.py +1 -0
- rasa/core/nlg/translate.py +55 -0
- rasa/core/persistor.py +3 -3
- rasa/core/policies/ensemble.py +10 -9
- rasa/core/policies/enterprise_search_policy.py +87 -21
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
- rasa/core/policies/flow_policy.py +13 -14
- rasa/core/policies/flows/flow_executor.py +85 -55
- 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 +167 -74
- rasa/core/run.py +5 -4
- 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 +138 -49
- 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 +38 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
- rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/clarify_command.py +46 -4
- rasa/dialogue_understanding/commands/command.py +3 -2
- rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
- 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/handle_digressions_command.py +144 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/noop_command.py +2 -1
- rasa/dialogue_understanding/commands/prompt_command.py +94 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -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 +55 -16
- rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
- rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
- rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
- rasa/dialogue_understanding/commands/utils.py +126 -43
- rasa/dialogue_understanding/constants.py +2 -0
- rasa/dialogue_understanding/generator/__init__.py +2 -0
- rasa/dialogue_understanding/generator/command_generator.py +120 -79
- rasa/dialogue_understanding/generator/command_parser.py +245 -0
- rasa/dialogue_understanding/generator/constants.py +12 -4
- rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
- rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
- rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
- rasa/dialogue_understanding/generator/utils.py +76 -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 +7 -4
- rasa/dialogue_understanding/patterns/completed.py +1 -1
- rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
- rasa/dialogue_understanding/patterns/correction.py +17 -3
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
- rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
- 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/patterns/validate_slot.py +65 -0
- rasa/dialogue_understanding/processor/command_processor.py +193 -43
- 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 +56 -10
- rasa/dialogue_understanding/utils.py +164 -0
- rasa/dialogue_understanding_test/README.md +429 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_comparison.py +60 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
- rasa/dialogue_understanding_test/constants.py +22 -0
- rasa/dialogue_understanding_test/du_test_case.py +448 -0
- rasa/dialogue_understanding_test/du_test_result.py +390 -0
- rasa/dialogue_understanding_test/du_test_runner.py +322 -0
- rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
- rasa/dialogue_understanding_test/io.py +443 -0
- 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 +77 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
- rasa/e2e_test/assertions.py +202 -175
- rasa/e2e_test/assertions_schema.yml +6 -0
- rasa/e2e_test/constants.py +16 -1
- rasa/e2e_test/e2e_config.py +102 -41
- rasa/e2e_test/e2e_config_schema.yml +28 -10
- rasa/e2e_test/e2e_test_case.py +5 -5
- 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 +143 -38
- rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
- rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
- rasa/e2e_test/stub_custom_action.py +1 -1
- rasa/e2e_test/utils/generative_assertions.py +243 -0
- rasa/e2e_test/utils/io.py +123 -93
- rasa/e2e_test/utils/validation.py +101 -3
- rasa/engine/caching.py +5 -7
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +3 -2
- rasa/engine/language.py +182 -0
- rasa/engine/recipes/config_files/default_config.yml +4 -0
- rasa/engine/recipes/default_components.py +13 -15
- rasa/engine/recipes/default_recipe.py +65 -49
- rasa/engine/recipes/graph_recipe.py +10 -7
- 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 +6 -4
- rasa/engine/storage/resource.py +2 -1
- rasa/engine/storage/storage.py +8 -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 +36 -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 +19 -14
- rasa/jupyter.py +2 -2
- rasa/llm_fine_tuning/annotation_module.py +4 -4
- rasa/llm_fine_tuning/conversations.py +5 -33
- rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
- rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
- rasa/llm_fine_tuning/storage.py +3 -3
- rasa/llm_fine_tuning/train_test_split_module.py +27 -27
- rasa/llm_fine_tuning/utils.py +7 -0
- 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 +13 -10
- rasa/model_manager/socket_bridge.py +15 -9
- 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 -9
- rasa/model_service.py +5 -6
- rasa/model_testing.py +13 -15
- rasa/model_training.py +29 -29
- 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 +6 -3
- rasa/shared/constants.py +45 -18
- rasa/shared/core/command_payload_reader.py +15 -7
- rasa/shared/core/constants.py +34 -4
- rasa/shared/core/conversation.py +1 -2
- rasa/shared/core/domain.py +19 -20
- rasa/shared/core/events.py +60 -39
- rasa/shared/core/flows/__init__.py +0 -1
- rasa/shared/core/flows/constants.py +11 -0
- rasa/shared/core/flows/flow.py +107 -26
- rasa/shared/core/flows/flow_step.py +4 -3
- rasa/shared/core/flows/flow_step_links.py +1 -2
- rasa/shared/core/flows/flow_step_sequence.py +1 -1
- rasa/shared/core/flows/flows_list.py +3 -3
- rasa/shared/core/flows/flows_yaml_schema.json +69 -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 +1 -1
- rasa/shared/core/flows/steps/call.py +1 -1
- rasa/shared/core/flows/steps/collect.py +22 -40
- rasa/shared/core/flows/steps/internal.py +1 -1
- rasa/shared/core/flows/steps/link.py +1 -1
- rasa/shared/core/flows/steps/no_operation.py +2 -2
- rasa/shared/core/flows/steps/set_slots.py +1 -1
- rasa/shared/core/flows/utils.py +44 -4
- rasa/shared/core/flows/validation.py +4 -6
- rasa/shared/core/generator.py +20 -21
- rasa/shared/core/slot_mappings.py +360 -121
- rasa/shared/core/slots.py +163 -6
- rasa/shared/core/trackers.py +108 -33
- 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/importer.py +58 -2
- rasa/shared/importers/rasa.py +5 -6
- rasa/shared/importers/utils.py +1 -1
- rasa/shared/nlu/constants.py +9 -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 +19 -11
- 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_entra_id_config.py +541 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
- rasa/shared/providers/_configs/client_config.py +3 -1
- rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
- rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
- rasa/shared/providers/_configs/model_group_config.py +8 -5
- rasa/shared/providers/_configs/oauth_config.py +33 -0
- rasa/shared/providers/_configs/openai_client_config.py +14 -12
- rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
- 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/constants.py +6 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
- rasa/shared/providers/embedding/embedding_client.py +1 -1
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
- rasa/shared/providers/llm/_base_litellm_client.py +43 -18
- rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
- rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
- rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
- rasa/shared/providers/llm/llm_client.py +24 -8
- rasa/shared/providers/llm/llm_response.py +61 -2
- rasa/shared/providers/llm/openai_llm_client.py +11 -5
- rasa/shared/providers/llm/rasa_llm_client.py +17 -14
- rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
- rasa/shared/providers/mappings.py +18 -19
- rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
- rasa/shared/providers/router/router_client.py +3 -1
- rasa/shared/utils/cli.py +1 -1
- rasa/shared/utils/common.py +15 -1
- rasa/shared/utils/constants.py +3 -0
- 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 +100 -18
- rasa/shared/utils/pykwalify_extensions.py +25 -1
- rasa/shared/utils/schemas/domain.yml +26 -1
- rasa/shared/utils/schemas/events.py +1 -1
- rasa/shared/utils/yaml.py +24 -20
- 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 +21 -5
- rasa/telemetry.py +127 -48
- rasa/tracing/config.py +5 -3
- rasa/tracing/constants.py +12 -0
- rasa/tracing/instrumentation/attribute_extractors.py +92 -14
- rasa/tracing/instrumentation/instrumentation.py +61 -5
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
- rasa/tracing/instrumentation/metrics.py +52 -11
- rasa/tracing/metric_instrument_provider.py +54 -14
- rasa/utils/common.py +12 -24
- 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 +594 -115
- rasa/version.py +1 -1
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
- rasa_pro-3.12.0.dist-info/RECORD +829 -0
- rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
- rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
- rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
- rasa_pro-3.11.4.dist-info/RECORD +0 -779
- /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
rasa/shared/core/constants.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from enum import Enum
|
|
3
4
|
|
|
4
5
|
import rasa.shared.constants as constants
|
|
5
6
|
|
|
6
|
-
|
|
7
7
|
DEFAULT_CATEGORICAL_SLOT_VALUE = "__other__"
|
|
8
8
|
|
|
9
9
|
USER_INTENT_RESTART = "restart"
|
|
@@ -13,6 +13,7 @@ USER_INTENT_SESSION_START = "session_start"
|
|
|
13
13
|
USER_INTENT_SESSION_END = "session_end"
|
|
14
14
|
USER_INTENT_SILENCE_TIMEOUT = "silence_timeout"
|
|
15
15
|
SESSION_START_METADATA_SLOT = "session_started_metadata"
|
|
16
|
+
LANGUAGE_SLOT = "language"
|
|
16
17
|
|
|
17
18
|
DEFAULT_INTENTS = [
|
|
18
19
|
USER_INTENT_RESTART,
|
|
@@ -51,6 +52,11 @@ ACTION_TRIGGER_CHITCHAT = "action_trigger_chitchat"
|
|
|
51
52
|
ACTION_RESET_ROUTING = "action_reset_routing"
|
|
52
53
|
ACTION_HANGUP = "action_hangup"
|
|
53
54
|
ACTION_REPEAT_BOT_MESSAGES = "action_repeat_bot_messages"
|
|
55
|
+
ACTION_BLOCK_DIGRESSION = "action_block_digression"
|
|
56
|
+
ACTION_CONTINUE_DIGRESSION = "action_continue_digression"
|
|
57
|
+
|
|
58
|
+
ACTION_METADATA_EXECUTION_SUCCESS = "execution_success"
|
|
59
|
+
ACTION_METADATA_EXECUTION_ERROR_MESSAGE = "execution_error_message"
|
|
54
60
|
|
|
55
61
|
|
|
56
62
|
DEFAULT_ACTION_NAMES = [
|
|
@@ -78,6 +84,8 @@ DEFAULT_ACTION_NAMES = [
|
|
|
78
84
|
ACTION_RESET_ROUTING,
|
|
79
85
|
ACTION_HANGUP,
|
|
80
86
|
ACTION_REPEAT_BOT_MESSAGES,
|
|
87
|
+
ACTION_BLOCK_DIGRESSION,
|
|
88
|
+
ACTION_CONTINUE_DIGRESSION,
|
|
81
89
|
]
|
|
82
90
|
|
|
83
91
|
ACTION_SHOULD_SEND_DOMAIN = "send_domain"
|
|
@@ -134,7 +142,11 @@ DEFAULT_SLOT_NAMES = {
|
|
|
134
142
|
|
|
135
143
|
SLOT_MAPPINGS = "mappings"
|
|
136
144
|
MAPPING_CONDITIONS = "conditions"
|
|
137
|
-
|
|
145
|
+
KEY_MAPPING_TYPE = "type"
|
|
146
|
+
KEY_ALLOW_NLU_CORRECTION = "allow_nlu_correction"
|
|
147
|
+
KEY_ACTION = "action"
|
|
148
|
+
KEY_RUN_ACTION_EVERY_TURN = "run_action_every_turn"
|
|
149
|
+
KEY_COEXISTENCE_SYSTEM = "coexistence_system"
|
|
138
150
|
|
|
139
151
|
|
|
140
152
|
class SlotMappingType(Enum):
|
|
@@ -145,7 +157,7 @@ class SlotMappingType(Enum):
|
|
|
145
157
|
FROM_TRIGGER_INTENT = "from_trigger_intent"
|
|
146
158
|
FROM_TEXT = "from_text"
|
|
147
159
|
FROM_LLM = "from_llm"
|
|
148
|
-
|
|
160
|
+
CONTROLLED = "controlled"
|
|
149
161
|
|
|
150
162
|
def __str__(self) -> str:
|
|
151
163
|
"""Returns the string representation that should be used in config files."""
|
|
@@ -153,7 +165,21 @@ class SlotMappingType(Enum):
|
|
|
153
165
|
|
|
154
166
|
def is_predefined_type(self) -> bool:
|
|
155
167
|
"""Returns True if the mapping type is NLU-predefined."""
|
|
156
|
-
return not (
|
|
168
|
+
return not (
|
|
169
|
+
self == SlotMappingType.CONTROLLED or self == SlotMappingType.FROM_LLM
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class SetSlotExtractor(Enum):
|
|
174
|
+
"""The extractors that can set a slot."""
|
|
175
|
+
|
|
176
|
+
LLM = "LLM"
|
|
177
|
+
COMMAND_PAYLOAD_READER = "CommandPayloadReader"
|
|
178
|
+
NLU = "NLU"
|
|
179
|
+
CUSTOM = "CUSTOM"
|
|
180
|
+
|
|
181
|
+
def __str__(self) -> str:
|
|
182
|
+
return self.value
|
|
157
183
|
|
|
158
184
|
|
|
159
185
|
# the keys for `State` (USER, PREVIOUS_ACTION, SLOTS, ACTIVE_LOOP)
|
|
@@ -178,3 +204,7 @@ POLICY_NAME_RULE = "RulePolicy"
|
|
|
178
204
|
CLASSIFIER_NAME_FALLBACK = "FallbackClassifier"
|
|
179
205
|
|
|
180
206
|
POLICIES_THAT_EXTRACT_ENTITIES = {"TEDPolicy"}
|
|
207
|
+
|
|
208
|
+
# digression constants
|
|
209
|
+
KEY_ASK_CONFIRM_DIGRESSIONS = "ask_confirm_digressions"
|
|
210
|
+
KEY_BLOCK_DIGRESSIONS = "block_digressions"
|
rasa/shared/core/conversation.py
CHANGED
rasa/shared/core/domain.py
CHANGED
|
@@ -46,14 +46,13 @@ from rasa.shared.constants import (
|
|
|
46
46
|
)
|
|
47
47
|
from rasa.shared.core.constants import (
|
|
48
48
|
ACTION_SHOULD_SEND_DOMAIN,
|
|
49
|
-
|
|
49
|
+
KEY_MAPPING_TYPE,
|
|
50
50
|
KNOWLEDGE_BASE_SLOT_NAMES,
|
|
51
|
-
MAPPING_CONDITIONS,
|
|
52
|
-
MAPPING_TYPE,
|
|
53
51
|
SLOT_MAPPINGS,
|
|
54
52
|
SlotMappingType,
|
|
55
53
|
)
|
|
56
54
|
from rasa.shared.core.events import SlotSet, UserUttered
|
|
55
|
+
from rasa.shared.core.flows.constants import KEY_TRANSLATION
|
|
57
56
|
from rasa.shared.core.slots import (
|
|
58
57
|
AnySlot,
|
|
59
58
|
CategoricalSlot,
|
|
@@ -119,6 +118,7 @@ RESPONSE_KEYS_TO_INTERPOLATE = [
|
|
|
119
118
|
KEY_RESPONSES_BUTTONS,
|
|
120
119
|
KEY_RESPONSES_ATTACHMENT,
|
|
121
120
|
KEY_RESPONSES_QUICK_REPLIES,
|
|
121
|
+
KEY_TRANSLATION,
|
|
122
122
|
]
|
|
123
123
|
|
|
124
124
|
ALL_DOMAIN_KEYS = [
|
|
@@ -290,8 +290,6 @@ class Domain:
|
|
|
290
290
|
responses = data.get(KEY_RESPONSES, {})
|
|
291
291
|
|
|
292
292
|
domain_slots = data.get(KEY_SLOTS, {})
|
|
293
|
-
if domain_slots:
|
|
294
|
-
rasa.shared.core.slot_mappings.validate_slot_mappings(domain_slots)
|
|
295
293
|
slots = cls.collect_slots(domain_slots)
|
|
296
294
|
domain_actions = data.get(KEY_ACTIONS, [])
|
|
297
295
|
actions = cls._collect_action_names(domain_actions)
|
|
@@ -596,7 +594,7 @@ class Domain:
|
|
|
596
594
|
),
|
|
597
595
|
)
|
|
598
596
|
slot_dict[slot_name][SLOT_MAPPINGS] = [
|
|
599
|
-
{
|
|
597
|
+
{KEY_MAPPING_TYPE: SlotMappingType.FROM_LLM.value}
|
|
600
598
|
]
|
|
601
599
|
|
|
602
600
|
slot = slot_class(slot_name, **slot_dict[slot_name])
|
|
@@ -1569,21 +1567,18 @@ class Domain:
|
|
|
1569
1567
|
matching_entities = []
|
|
1570
1568
|
|
|
1571
1569
|
for mapping in slot.mappings:
|
|
1572
|
-
mapping_conditions = mapping.
|
|
1573
|
-
if mapping
|
|
1570
|
+
mapping_conditions = mapping.conditions
|
|
1571
|
+
if mapping.type != SlotMappingType.FROM_ENTITY or (
|
|
1574
1572
|
mapping_conditions
|
|
1575
|
-
and mapping_conditions[0].
|
|
1573
|
+
and mapping_conditions[0].active_loop is not None
|
|
1576
1574
|
):
|
|
1577
1575
|
continue
|
|
1578
1576
|
|
|
1579
1577
|
for entity in entities:
|
|
1580
1578
|
if (
|
|
1581
|
-
entity.get(ENTITY_ATTRIBUTE_TYPE)
|
|
1582
|
-
|
|
1583
|
-
and entity.get(
|
|
1584
|
-
== mapping.get(ENTITY_ATTRIBUTE_ROLE)
|
|
1585
|
-
and entity.get(ENTITY_ATTRIBUTE_GROUP)
|
|
1586
|
-
== mapping.get(ENTITY_ATTRIBUTE_GROUP)
|
|
1579
|
+
entity.get(ENTITY_ATTRIBUTE_TYPE) == mapping.entity
|
|
1580
|
+
and entity.get(ENTITY_ATTRIBUTE_ROLE) == mapping.role
|
|
1581
|
+
and entity.get(ENTITY_ATTRIBUTE_GROUP) == mapping.group
|
|
1587
1582
|
):
|
|
1588
1583
|
matching_entities.append(entity.get("value"))
|
|
1589
1584
|
|
|
@@ -2015,19 +2010,19 @@ class Domain:
|
|
|
2015
2010
|
is the total number of mappings which have conditions attached.
|
|
2016
2011
|
"""
|
|
2017
2012
|
total_mappings = 0
|
|
2018
|
-
|
|
2013
|
+
controlled_mappings = 0
|
|
2019
2014
|
conditional_mappings = 0
|
|
2020
2015
|
|
|
2021
2016
|
for slot in self.slots:
|
|
2022
2017
|
total_mappings += len(slot.mappings)
|
|
2023
2018
|
for mapping in slot.mappings:
|
|
2024
|
-
if mapping
|
|
2025
|
-
|
|
2019
|
+
if mapping.type == SlotMappingType.CONTROLLED:
|
|
2020
|
+
controlled_mappings += 1
|
|
2026
2021
|
|
|
2027
|
-
if
|
|
2022
|
+
if mapping.conditions:
|
|
2028
2023
|
conditional_mappings += 1
|
|
2029
2024
|
|
|
2030
|
-
return
|
|
2025
|
+
return total_mappings, controlled_mappings, conditional_mappings
|
|
2031
2026
|
|
|
2032
2027
|
def does_custom_action_explicitly_need_domain(self, action_name: Text) -> bool:
|
|
2033
2028
|
"""Assert if action has explicitly stated that it needs domain.
|
|
@@ -2112,6 +2107,10 @@ class Domain:
|
|
|
2112
2107
|
|
|
2113
2108
|
return read_yaml(raw_yaml_content, expand_env_vars=cls.expand_env_vars)
|
|
2114
2109
|
|
|
2110
|
+
def remove_builtin_slots(self) -> None:
|
|
2111
|
+
"""Remove all builtin slots from the domain."""
|
|
2112
|
+
self.slots = [slot for slot in self.slots if not slot.is_builtin]
|
|
2113
|
+
|
|
2115
2114
|
|
|
2116
2115
|
def warn_about_duplicates_found_during_domain_merging(
|
|
2117
2116
|
duplicates: Dict[Text, List[Text]],
|
rasa/shared/core/events.py
CHANGED
|
@@ -2,68 +2,69 @@ import abc
|
|
|
2
2
|
import copy
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
-
import structlog
|
|
6
5
|
import re
|
|
7
|
-
from abc import ABC
|
|
8
|
-
|
|
9
|
-
import jsonpickle
|
|
10
6
|
import time
|
|
11
7
|
import uuid
|
|
12
|
-
from
|
|
8
|
+
from abc import ABC
|
|
13
9
|
from datetime import datetime
|
|
14
10
|
from typing import (
|
|
15
|
-
List,
|
|
16
|
-
Dict,
|
|
17
|
-
Text,
|
|
18
|
-
Any,
|
|
19
|
-
Type,
|
|
20
|
-
Optional,
|
|
21
11
|
TYPE_CHECKING,
|
|
12
|
+
Any,
|
|
13
|
+
Dict,
|
|
22
14
|
Iterable,
|
|
23
|
-
|
|
15
|
+
List,
|
|
16
|
+
Optional,
|
|
17
|
+
Text,
|
|
24
18
|
Tuple,
|
|
19
|
+
Type,
|
|
25
20
|
TypeVar,
|
|
21
|
+
Union,
|
|
22
|
+
cast,
|
|
26
23
|
)
|
|
27
24
|
|
|
25
|
+
import jsonpickle
|
|
26
|
+
import structlog
|
|
27
|
+
from dateutil import parser
|
|
28
|
+
|
|
28
29
|
import rasa.shared.utils.common
|
|
29
30
|
import rasa.shared.utils.io
|
|
30
|
-
from typing import Union
|
|
31
|
-
|
|
32
31
|
from rasa.shared.constants import DOCS_URL_TRAINING_DATA
|
|
33
32
|
from rasa.shared.core.constants import (
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
ACTION_LISTEN_NAME,
|
|
34
|
+
ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
|
|
35
|
+
ACTION_METADATA_EXECUTION_SUCCESS,
|
|
36
36
|
ACTION_NAME_SENDER_ID_CONNECTOR_STR,
|
|
37
|
+
ACTION_SESSION_START_NAME,
|
|
38
|
+
ENTITY_LABEL_SEPARATOR,
|
|
39
|
+
EXTERNAL_MESSAGE_PREFIX,
|
|
37
40
|
IS_EXTERNAL,
|
|
38
|
-
USE_TEXT_FOR_FEATURIZATION,
|
|
39
41
|
LOOP_INTERRUPTED,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
ACTION_LISTEN_NAME,
|
|
42
|
+
LOOP_NAME,
|
|
43
|
+
USE_TEXT_FOR_FEATURIZATION,
|
|
43
44
|
)
|
|
44
45
|
from rasa.shared.exceptions import UnsupportedFeatureException
|
|
45
46
|
from rasa.shared.nlu.constants import (
|
|
46
|
-
ENTITY_ATTRIBUTE_TYPE,
|
|
47
|
-
INTENT,
|
|
48
|
-
TEXT,
|
|
49
|
-
ENTITIES,
|
|
50
|
-
COMMANDS,
|
|
51
|
-
ENTITY_ATTRIBUTE_VALUE,
|
|
52
|
-
ACTION_TEXT,
|
|
53
47
|
ACTION_NAME,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
PREDICTED_CONFIDENCE_KEY,
|
|
58
|
-
INTENT_RANKING_KEY,
|
|
59
|
-
ENTITY_ATTRIBUTE_TEXT,
|
|
60
|
-
ENTITY_ATTRIBUTE_START,
|
|
48
|
+
ACTION_TEXT,
|
|
49
|
+
COMMANDS,
|
|
50
|
+
ENTITIES,
|
|
61
51
|
ENTITY_ATTRIBUTE_CONFIDENCE,
|
|
62
52
|
ENTITY_ATTRIBUTE_END,
|
|
53
|
+
ENTITY_ATTRIBUTE_GROUP,
|
|
54
|
+
ENTITY_ATTRIBUTE_ROLE,
|
|
55
|
+
ENTITY_ATTRIBUTE_START,
|
|
56
|
+
ENTITY_ATTRIBUTE_TEXT,
|
|
57
|
+
ENTITY_ATTRIBUTE_TYPE,
|
|
58
|
+
ENTITY_ATTRIBUTE_VALUE,
|
|
63
59
|
FULL_RETRIEVAL_INTENT_NAME_KEY,
|
|
60
|
+
INTENT,
|
|
61
|
+
INTENT_NAME_KEY,
|
|
62
|
+
INTENT_RANKING_KEY,
|
|
63
|
+
PREDICTED_CONFIDENCE_KEY,
|
|
64
|
+
PROMPTS,
|
|
65
|
+
TEXT,
|
|
64
66
|
)
|
|
65
67
|
|
|
66
|
-
|
|
67
68
|
if TYPE_CHECKING:
|
|
68
69
|
from typing_extensions import TypedDict
|
|
69
70
|
|
|
@@ -98,6 +99,7 @@ if TYPE_CHECKING:
|
|
|
98
99
|
ENTITIES: List[EntityPrediction],
|
|
99
100
|
"message_id": Optional[Text],
|
|
100
101
|
"metadata": Dict,
|
|
102
|
+
PROMPTS: Dict,
|
|
101
103
|
},
|
|
102
104
|
total=False,
|
|
103
105
|
)
|
|
@@ -147,8 +149,8 @@ def format_message(
|
|
|
147
149
|
Message with entities annotated inline, e.g.
|
|
148
150
|
`I am from [Berlin]{`"`entity`"`: `"`city`"`}`.
|
|
149
151
|
"""
|
|
150
|
-
from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataWriter
|
|
151
152
|
from rasa.shared.nlu.training_data import entities_parser
|
|
153
|
+
from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataWriter
|
|
152
154
|
|
|
153
155
|
message_from_md = entities_parser.parse_training_example(text, intent)
|
|
154
156
|
deserialised_entities = deserialise_entities(entities)
|
|
@@ -1030,6 +1032,7 @@ class SlotSet(Event):
|
|
|
1030
1032
|
value: Optional[Any] = None,
|
|
1031
1033
|
timestamp: Optional[float] = None,
|
|
1032
1034
|
metadata: Optional[Dict[Text, Any]] = None,
|
|
1035
|
+
filled_by: Optional[str] = None,
|
|
1033
1036
|
) -> None:
|
|
1034
1037
|
"""Creates event to set slot.
|
|
1035
1038
|
|
|
@@ -1041,6 +1044,7 @@ class SlotSet(Event):
|
|
|
1041
1044
|
"""
|
|
1042
1045
|
self.key = key
|
|
1043
1046
|
self.value = value
|
|
1047
|
+
self._filled_by = filled_by
|
|
1044
1048
|
super().__init__(timestamp, metadata)
|
|
1045
1049
|
|
|
1046
1050
|
def __repr__(self) -> Text:
|
|
@@ -1058,6 +1062,14 @@ class SlotSet(Event):
|
|
|
1058
1062
|
|
|
1059
1063
|
return (self.key, self.value) == (other.key, other.value)
|
|
1060
1064
|
|
|
1065
|
+
@property
|
|
1066
|
+
def filled_by(self) -> Optional[str]:
|
|
1067
|
+
return self._filled_by
|
|
1068
|
+
|
|
1069
|
+
@filled_by.setter
|
|
1070
|
+
def filled_by(self, value: str) -> None:
|
|
1071
|
+
self._filled_by = value
|
|
1072
|
+
|
|
1061
1073
|
def as_story_string(self) -> Text:
|
|
1062
1074
|
"""Returns text representation of event."""
|
|
1063
1075
|
props = json.dumps({self.key: self.value}, ensure_ascii=False)
|
|
@@ -1079,7 +1091,7 @@ class SlotSet(Event):
|
|
|
1079
1091
|
def as_dict(self) -> Dict[Text, Any]:
|
|
1080
1092
|
"""Returns serialized event."""
|
|
1081
1093
|
d = super().as_dict()
|
|
1082
|
-
d.update({"name": self.key, "value": self.value})
|
|
1094
|
+
d.update({"name": self.key, "value": self.value, "filled_by": self.filled_by})
|
|
1083
1095
|
return d
|
|
1084
1096
|
|
|
1085
1097
|
@classmethod
|
|
@@ -1090,13 +1102,14 @@ class SlotSet(Event):
|
|
|
1090
1102
|
parameters.get("value"),
|
|
1091
1103
|
parameters.get("timestamp"),
|
|
1092
1104
|
parameters.get("metadata"),
|
|
1105
|
+
filled_by=parameters.get("filled_by"),
|
|
1093
1106
|
)
|
|
1094
1107
|
except KeyError as e:
|
|
1095
1108
|
raise ValueError(f"Failed to parse set slot event. {e}")
|
|
1096
1109
|
|
|
1097
1110
|
def apply_to(self, tracker: "DialogueStateTracker") -> None:
|
|
1098
1111
|
"""Applies event to current conversation state."""
|
|
1099
|
-
tracker._set_slot(self.key, self.value)
|
|
1112
|
+
tracker._set_slot(self.key, self.value, self.filled_by)
|
|
1100
1113
|
|
|
1101
1114
|
|
|
1102
1115
|
class Restarted(AlwaysEqualEventMixin):
|
|
@@ -1704,7 +1717,15 @@ class ActionExecuted(Event):
|
|
|
1704
1717
|
super().__init__(timestamp, metadata)
|
|
1705
1718
|
|
|
1706
1719
|
def __members__(self) -> Tuple[Optional[Text], Optional[Text], Text]:
|
|
1707
|
-
|
|
1720
|
+
items_to_ignore = [
|
|
1721
|
+
ACTION_METADATA_EXECUTION_SUCCESS,
|
|
1722
|
+
ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
|
|
1723
|
+
]
|
|
1724
|
+
meta_no_nones = {
|
|
1725
|
+
k: v
|
|
1726
|
+
for k, v in self.metadata.items()
|
|
1727
|
+
if v is not None and k not in items_to_ignore
|
|
1728
|
+
}
|
|
1708
1729
|
return (self.action_name, self.action_text, jsonpickle.encode(meta_no_nones))
|
|
1709
1730
|
|
|
1710
1731
|
def __repr__(self) -> Text:
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
KEY_ID = "id"
|
|
2
|
+
KEY_STEPS = "steps"
|
|
3
|
+
KEY_NAME = "name"
|
|
4
|
+
KEY_DESCRIPTION = "description"
|
|
5
|
+
KEY_IF = "if"
|
|
6
|
+
KEY_ALWAYS_INCLUDE_IN_PROMPT = "always_include_in_prompt"
|
|
7
|
+
KEY_NLU_TRIGGER = "nlu_trigger"
|
|
8
|
+
KEY_FILE_PATH = "file_path"
|
|
9
|
+
KEY_PERSISTED_SLOTS = "persisted_slots"
|
|
10
|
+
KEY_RUN_PATTERN_COMPLETED = "run_pattern_completed"
|
|
11
|
+
KEY_TRANSLATION = "translation"
|
rasa/shared/core/flows/flow.py
CHANGED
|
@@ -4,40 +4,70 @@ import copy
|
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
5
|
from functools import cached_property
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Any, Dict, List, Optional, Set, Text, Union
|
|
8
8
|
|
|
9
9
|
import structlog
|
|
10
|
+
from pydantic import BaseModel
|
|
10
11
|
from pypred import Predicate
|
|
11
12
|
|
|
12
13
|
import rasa.shared.utils.io
|
|
14
|
+
from rasa.engine.language import Language
|
|
13
15
|
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
14
|
-
from rasa.shared.core.
|
|
16
|
+
from rasa.shared.core.constants import (
|
|
17
|
+
KEY_ASK_CONFIRM_DIGRESSIONS,
|
|
18
|
+
KEY_BLOCK_DIGRESSIONS,
|
|
19
|
+
)
|
|
20
|
+
from rasa.shared.core.flows.constants import (
|
|
21
|
+
KEY_ALWAYS_INCLUDE_IN_PROMPT,
|
|
22
|
+
KEY_DESCRIPTION,
|
|
23
|
+
KEY_FILE_PATH,
|
|
24
|
+
KEY_ID,
|
|
25
|
+
KEY_IF,
|
|
26
|
+
KEY_NAME,
|
|
27
|
+
KEY_NLU_TRIGGER,
|
|
28
|
+
KEY_PERSISTED_SLOTS,
|
|
29
|
+
KEY_RUN_PATTERN_COMPLETED,
|
|
30
|
+
KEY_STEPS,
|
|
31
|
+
KEY_TRANSLATION,
|
|
32
|
+
)
|
|
33
|
+
from rasa.shared.core.flows.flow_path import FlowPath, FlowPathsList, PathNode
|
|
15
34
|
from rasa.shared.core.flows.flow_step import FlowStep
|
|
16
35
|
from rasa.shared.core.flows.flow_step_links import (
|
|
36
|
+
ElseFlowStepLink,
|
|
17
37
|
FlowStepLink,
|
|
18
|
-
StaticFlowStepLink,
|
|
19
38
|
IfFlowStepLink,
|
|
20
|
-
|
|
39
|
+
StaticFlowStepLink,
|
|
21
40
|
)
|
|
22
41
|
from rasa.shared.core.flows.flow_step_sequence import FlowStepSequence
|
|
23
42
|
from rasa.shared.core.flows.nlu_trigger import NLUTriggers
|
|
24
43
|
from rasa.shared.core.flows.steps import (
|
|
44
|
+
ActionFlowStep,
|
|
25
45
|
CollectInformationFlowStep,
|
|
26
46
|
EndFlowStep,
|
|
27
47
|
StartFlowStep,
|
|
28
|
-
ActionFlowStep,
|
|
29
48
|
)
|
|
30
49
|
from rasa.shared.core.flows.steps.constants import (
|
|
31
50
|
CONTINUE_STEP_PREFIX,
|
|
32
|
-
START_STEP,
|
|
33
51
|
END_STEP,
|
|
52
|
+
START_STEP,
|
|
34
53
|
)
|
|
35
54
|
from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
|
|
55
|
+
from rasa.shared.core.flows.utils import extract_digression_prop
|
|
36
56
|
from rasa.shared.core.slots import Slot
|
|
37
57
|
|
|
38
58
|
structlogger = structlog.get_logger()
|
|
39
59
|
|
|
40
60
|
|
|
61
|
+
class FlowLanguageTranslation(BaseModel):
|
|
62
|
+
"""Represents the translation of the flow properties in a specific language."""
|
|
63
|
+
|
|
64
|
+
name: str
|
|
65
|
+
"""The human-readable name of the flow."""
|
|
66
|
+
|
|
67
|
+
class Config:
|
|
68
|
+
extra = "ignore"
|
|
69
|
+
|
|
70
|
+
|
|
41
71
|
@dataclass
|
|
42
72
|
class Flow:
|
|
43
73
|
"""Represents the configuration of a flow."""
|
|
@@ -48,6 +78,8 @@ class Flow:
|
|
|
48
78
|
"""The human-readable name of the flow."""
|
|
49
79
|
description: Optional[Text] = None
|
|
50
80
|
"""The description of the flow."""
|
|
81
|
+
translation: Dict[Text, FlowLanguageTranslation] = field(default_factory=dict)
|
|
82
|
+
"""The translation of the flow properties in different languages."""
|
|
51
83
|
guard_condition: Optional[Text] = None
|
|
52
84
|
"""The condition that needs to be fulfilled for the flow to be startable."""
|
|
53
85
|
step_sequence: FlowStepSequence = field(default_factory=FlowStepSequence.empty)
|
|
@@ -62,6 +94,12 @@ class Flow:
|
|
|
62
94
|
"""The path to the file where the flow is stored."""
|
|
63
95
|
persisted_slots: List[str] = field(default_factory=list)
|
|
64
96
|
"""The list of slots that should be persisted after the flow ends."""
|
|
97
|
+
ask_confirm_digressions: List[str] = field(default_factory=list)
|
|
98
|
+
"""The flow ids for which the assistant should ask for confirmation."""
|
|
99
|
+
block_digressions: List[str] = field(default_factory=list)
|
|
100
|
+
"""The flow ids that the assistant should block from digressing to."""
|
|
101
|
+
run_pattern_completed: bool = True
|
|
102
|
+
"""Whether the pattern_completed flow should be run after the flow ends."""
|
|
65
103
|
|
|
66
104
|
@staticmethod
|
|
67
105
|
def from_json(
|
|
@@ -79,6 +117,8 @@ class Flow:
|
|
|
79
117
|
Returns:
|
|
80
118
|
A Flow object.
|
|
81
119
|
"""
|
|
120
|
+
from rasa.shared.core.flows.utils import extract_translations
|
|
121
|
+
|
|
82
122
|
step_sequence = FlowStepSequence.from_json(flow_id, data.get("steps"))
|
|
83
123
|
nlu_triggers = NLUTriggers.from_json(data.get("nlu_trigger"))
|
|
84
124
|
|
|
@@ -87,17 +127,25 @@ class Flow:
|
|
|
87
127
|
|
|
88
128
|
return Flow(
|
|
89
129
|
id=flow_id,
|
|
90
|
-
custom_name=data.get(
|
|
91
|
-
description=data.get(
|
|
92
|
-
always_include_in_prompt=data.get(
|
|
93
|
-
# str or bool are permitted in the flow schema but internally we want a str
|
|
94
|
-
guard_condition=str(data[
|
|
130
|
+
custom_name=data.get(KEY_NAME),
|
|
131
|
+
description=data.get(KEY_DESCRIPTION),
|
|
132
|
+
always_include_in_prompt=data.get(KEY_ALWAYS_INCLUDE_IN_PROMPT),
|
|
133
|
+
# str or bool are permitted in the flow schema, but internally we want a str
|
|
134
|
+
guard_condition=str(data[KEY_IF]) if KEY_IF in data else None,
|
|
95
135
|
step_sequence=Flow.resolve_default_ids(step_sequence),
|
|
96
136
|
nlu_triggers=nlu_triggers,
|
|
97
137
|
# If we are reading the flows in after training the file_path is part of
|
|
98
138
|
# data. When the model is trained, take the provided file_path.
|
|
99
|
-
file_path=data.get(
|
|
100
|
-
persisted_slots=data.get(
|
|
139
|
+
file_path=data.get(KEY_FILE_PATH) if KEY_FILE_PATH in data else file_path,
|
|
140
|
+
persisted_slots=data.get(KEY_PERSISTED_SLOTS, []),
|
|
141
|
+
ask_confirm_digressions=extract_digression_prop(
|
|
142
|
+
KEY_ASK_CONFIRM_DIGRESSIONS, data
|
|
143
|
+
),
|
|
144
|
+
block_digressions=extract_digression_prop(KEY_BLOCK_DIGRESSIONS, data),
|
|
145
|
+
run_pattern_completed=data.get(KEY_RUN_PATTERN_COMPLETED, True),
|
|
146
|
+
translation=extract_translations(
|
|
147
|
+
translation_data=data.get(KEY_TRANSLATION, {})
|
|
148
|
+
),
|
|
101
149
|
)
|
|
102
150
|
|
|
103
151
|
def get_full_name(self) -> str:
|
|
@@ -155,29 +203,62 @@ class Flow:
|
|
|
155
203
|
The Flow object as serialized data.
|
|
156
204
|
"""
|
|
157
205
|
data: Dict[Text, Any] = {
|
|
158
|
-
|
|
159
|
-
|
|
206
|
+
KEY_ID: self.id,
|
|
207
|
+
KEY_STEPS: self.step_sequence.as_json(),
|
|
160
208
|
}
|
|
161
209
|
if self.custom_name is not None:
|
|
162
|
-
data[
|
|
210
|
+
data[KEY_NAME] = self.custom_name
|
|
163
211
|
if self.description is not None:
|
|
164
|
-
data[
|
|
212
|
+
data[KEY_DESCRIPTION] = self.description
|
|
165
213
|
if self.guard_condition is not None:
|
|
166
|
-
data[
|
|
214
|
+
data[KEY_IF] = self.guard_condition
|
|
167
215
|
if self.always_include_in_prompt is not None:
|
|
168
|
-
data[
|
|
216
|
+
data[KEY_ALWAYS_INCLUDE_IN_PROMPT] = self.always_include_in_prompt
|
|
169
217
|
if self.nlu_triggers:
|
|
170
|
-
data[
|
|
218
|
+
data[KEY_NLU_TRIGGER] = self.nlu_triggers.as_json()
|
|
171
219
|
if self.file_path:
|
|
172
|
-
data[
|
|
220
|
+
data[KEY_FILE_PATH] = self.file_path
|
|
173
221
|
if self.persisted_slots:
|
|
174
|
-
data[
|
|
222
|
+
data[KEY_PERSISTED_SLOTS] = self.persisted_slots
|
|
223
|
+
if self.ask_confirm_digressions:
|
|
224
|
+
data[KEY_ASK_CONFIRM_DIGRESSIONS] = self.ask_confirm_digressions
|
|
225
|
+
if self.block_digressions:
|
|
226
|
+
data[KEY_BLOCK_DIGRESSIONS] = self.block_digressions
|
|
227
|
+
if self.run_pattern_completed is not None:
|
|
228
|
+
data["run_pattern_completed"] = self.run_pattern_completed
|
|
229
|
+
if self.translation:
|
|
230
|
+
data[KEY_TRANSLATION] = {
|
|
231
|
+
language_code: translation.dict()
|
|
232
|
+
for language_code, translation in self.translation.items()
|
|
233
|
+
}
|
|
175
234
|
|
|
176
235
|
return data
|
|
177
236
|
|
|
178
|
-
def
|
|
179
|
-
"""Returns the
|
|
180
|
-
|
|
237
|
+
def localized_name(self, language: Optional[Language] = None) -> Optional[Text]:
|
|
238
|
+
"""Returns the language specific flow name or None.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
language: Preferred language code.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
Flow name in the specified language or None.
|
|
245
|
+
"""
|
|
246
|
+
language_code = language.code if language else None
|
|
247
|
+
translation = self.translation.get(language_code)
|
|
248
|
+
return translation.name if translation else None
|
|
249
|
+
|
|
250
|
+
def readable_name(self, language: Optional[Language] = None) -> str:
|
|
251
|
+
"""
|
|
252
|
+
Returns the flow's name in the specified language if available; otherwise
|
|
253
|
+
falls back to the flow's name, and finally the flow's ID.
|
|
254
|
+
|
|
255
|
+
Args:
|
|
256
|
+
language: Preferred language code.
|
|
257
|
+
|
|
258
|
+
Returns:
|
|
259
|
+
string: the localized name, the default name, or the flow's ID.
|
|
260
|
+
"""
|
|
261
|
+
return self.localized_name(language) or self.name or self.id
|
|
181
262
|
|
|
182
263
|
def step_by_id(self, step_id: Optional[Text]) -> Optional[FlowStep]:
|
|
183
264
|
"""Returns the step with the given id."""
|
|
@@ -371,7 +452,7 @@ class Flow:
|
|
|
371
452
|
True if dynamic literals are present, False otherwise.
|
|
372
453
|
"""
|
|
373
454
|
from pypred import ast
|
|
374
|
-
from pypred.tiler import
|
|
455
|
+
from pypred.tiler import SimplePattern, tile
|
|
375
456
|
|
|
376
457
|
if not self.guard_condition:
|
|
377
458
|
return False
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
3
2
|
|
|
4
3
|
from dataclasses import dataclass
|
|
5
4
|
from typing import (
|
|
5
|
+
TYPE_CHECKING,
|
|
6
6
|
Any,
|
|
7
7
|
Dict,
|
|
8
8
|
Generator,
|
|
@@ -10,6 +10,7 @@ from typing import (
|
|
|
10
10
|
Set,
|
|
11
11
|
Text,
|
|
12
12
|
)
|
|
13
|
+
|
|
13
14
|
import structlog
|
|
14
15
|
|
|
15
16
|
from rasa.shared.exceptions import RasaException
|
|
@@ -32,11 +33,11 @@ def step_from_json(flow_id: Text, data: Dict[Text, Any]) -> FlowStep:
|
|
|
32
33
|
"""
|
|
33
34
|
from rasa.shared.core.flows.steps import (
|
|
34
35
|
ActionFlowStep,
|
|
36
|
+
CallFlowStep,
|
|
35
37
|
CollectInformationFlowStep,
|
|
36
38
|
LinkFlowStep,
|
|
37
|
-
SetSlotsFlowStep,
|
|
38
39
|
NoOperationFlowStep,
|
|
39
|
-
|
|
40
|
+
SetSlotsFlowStep,
|
|
40
41
|
)
|
|
41
42
|
|
|
42
43
|
if "action" in data:
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
3
2
|
|
|
4
3
|
from dataclasses import dataclass
|
|
5
|
-
from typing import
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Text, Union
|
|
6
5
|
|
|
7
6
|
from rasa.shared.core.flows.flow_step import FlowStep
|
|
8
7
|
|