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/core/actions/action.py
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import logging
|
|
3
3
|
from functools import lru_cache
|
|
4
|
-
from typing import
|
|
5
|
-
TYPE_CHECKING,
|
|
6
|
-
Any,
|
|
7
|
-
Dict,
|
|
8
|
-
List,
|
|
9
|
-
Optional,
|
|
10
|
-
Set,
|
|
11
|
-
Text,
|
|
12
|
-
Tuple,
|
|
13
|
-
cast,
|
|
14
|
-
)
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, cast
|
|
15
5
|
|
|
16
6
|
from jsonschema import Draft202012Validator
|
|
17
7
|
|
|
@@ -29,11 +19,15 @@ from rasa.core.actions.e2e_stub_custom_action_executor import (
|
|
|
29
19
|
from rasa.core.actions.grpc_custom_action_executor import GRPCCustomActionExecutor
|
|
30
20
|
from rasa.core.actions.http_custom_action_executor import HTTPCustomActionExecutor
|
|
31
21
|
from rasa.core.constants import (
|
|
22
|
+
KEY_IS_CALM_SYSTEM,
|
|
23
|
+
KEY_IS_COEXISTENCE_ASSISTANT,
|
|
32
24
|
UTTER_SOURCE_METADATA_KEY,
|
|
33
25
|
)
|
|
26
|
+
from rasa.core.nlg.translate import get_translated_buttons, get_translated_text
|
|
34
27
|
from rasa.core.policies.policy import PolicyPrediction
|
|
35
28
|
from rasa.core.utils import add_bot_utterance_metadata
|
|
36
29
|
from rasa.e2e_test.constants import KEY_STUB_CUSTOM_ACTIONS
|
|
30
|
+
from rasa.engine.language import Language
|
|
37
31
|
from rasa.nlu.constants import (
|
|
38
32
|
RESPONSE_SELECTOR_DEFAULT_INTENT,
|
|
39
33
|
RESPONSE_SELECTOR_PREDICTION_KEY,
|
|
@@ -41,10 +35,17 @@ from rasa.nlu.constants import (
|
|
|
41
35
|
RESPONSE_SELECTOR_UTTER_ACTION_KEY,
|
|
42
36
|
)
|
|
43
37
|
from rasa.shared.constants import (
|
|
38
|
+
ATTACHMENT,
|
|
39
|
+
BUTTONS,
|
|
40
|
+
CUSTOM,
|
|
44
41
|
DEFAULT_NLU_FALLBACK_INTENT_NAME,
|
|
45
42
|
DOCS_BASE_URL,
|
|
43
|
+
ELEMENTS,
|
|
46
44
|
FLOW_PREFIX,
|
|
45
|
+
IMAGE,
|
|
46
|
+
QUICK_REPLIES,
|
|
47
47
|
ROUTE_TO_CALM_SLOT,
|
|
48
|
+
TEXT,
|
|
48
49
|
UTTER_PREFIX,
|
|
49
50
|
)
|
|
50
51
|
from rasa.shared.core.constants import (
|
|
@@ -55,19 +56,19 @@ from rasa.shared.core.constants import (
|
|
|
55
56
|
ACTION_DEFAULT_FALLBACK_NAME,
|
|
56
57
|
ACTION_EXTRACT_SLOTS,
|
|
57
58
|
ACTION_LISTEN_NAME,
|
|
59
|
+
ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
|
|
60
|
+
ACTION_METADATA_EXECUTION_SUCCESS,
|
|
58
61
|
ACTION_RESET_ROUTING,
|
|
59
62
|
ACTION_RESTART_NAME,
|
|
60
63
|
ACTION_REVERT_FALLBACK_EVENTS_NAME,
|
|
61
64
|
ACTION_SEND_TEXT_NAME,
|
|
62
65
|
ACTION_SESSION_START_NAME,
|
|
63
66
|
ACTION_UNLIKELY_INTENT_NAME,
|
|
64
|
-
ACTION_VALIDATE_SLOT_MAPPINGS,
|
|
65
67
|
DEFAULT_SLOT_NAMES,
|
|
66
68
|
KNOWLEDGE_BASE_SLOT_NAMES,
|
|
67
|
-
MAPPING_TYPE,
|
|
68
69
|
REQUESTED_SLOT,
|
|
69
70
|
USER_INTENT_OUT_OF_SCOPE,
|
|
70
|
-
|
|
71
|
+
SetSlotExtractor,
|
|
71
72
|
)
|
|
72
73
|
from rasa.shared.core.domain import Domain
|
|
73
74
|
from rasa.shared.core.events import (
|
|
@@ -83,19 +84,17 @@ from rasa.shared.core.events import (
|
|
|
83
84
|
UserUttered,
|
|
84
85
|
)
|
|
85
86
|
from rasa.shared.core.flows import FlowsList
|
|
87
|
+
from rasa.shared.core.flows.constants import KEY_TRANSLATION
|
|
86
88
|
from rasa.shared.core.slot_mappings import (
|
|
87
89
|
SlotFillingManager,
|
|
88
90
|
extract_slot_value,
|
|
89
91
|
)
|
|
90
92
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
91
93
|
from rasa.shared.exceptions import RasaException
|
|
92
|
-
from rasa.shared.nlu.constants import
|
|
93
|
-
INTENT_NAME_KEY,
|
|
94
|
-
INTENT_RANKING_KEY,
|
|
95
|
-
)
|
|
94
|
+
from rasa.shared.nlu.constants import INTENT_NAME_KEY, INTENT_RANKING_KEY
|
|
96
95
|
from rasa.shared.utils.io import raise_warning
|
|
97
96
|
from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
|
|
98
|
-
from rasa.utils.endpoints import
|
|
97
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
99
98
|
from rasa.utils.url_tools import UrlSchema, get_url_schema
|
|
100
99
|
|
|
101
100
|
if TYPE_CHECKING:
|
|
@@ -109,12 +108,16 @@ logger = logging.getLogger(__name__)
|
|
|
109
108
|
def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["Action"]:
|
|
110
109
|
"""List default actions."""
|
|
111
110
|
from rasa.core.actions.action_clean_stack import ActionCleanStack
|
|
111
|
+
from rasa.core.actions.action_handle_digressions import (
|
|
112
|
+
ActionBlockDigressions,
|
|
113
|
+
ActionContinueDigression,
|
|
114
|
+
)
|
|
115
|
+
from rasa.core.actions.action_hangup import ActionHangup
|
|
116
|
+
from rasa.core.actions.action_repeat_bot_messages import ActionRepeatBotMessages
|
|
112
117
|
from rasa.core.actions.action_run_slot_rejections import ActionRunSlotRejections
|
|
113
118
|
from rasa.core.actions.action_trigger_chitchat import ActionTriggerChitchat
|
|
114
119
|
from rasa.core.actions.action_trigger_search import ActionTriggerSearch
|
|
115
120
|
from rasa.core.actions.two_stage_fallback import TwoStageFallbackAction
|
|
116
|
-
from rasa.core.actions.action_hangup import ActionHangup
|
|
117
|
-
from rasa.core.actions.action_repeat_bot_messages import ActionRepeatBotMessages
|
|
118
121
|
from rasa.dialogue_understanding.patterns.cancel import ActionCancelFlow
|
|
119
122
|
from rasa.dialogue_understanding.patterns.clarify import ActionClarifyFlows
|
|
120
123
|
from rasa.dialogue_understanding.patterns.correction import ActionCorrectFlowSlot
|
|
@@ -143,6 +146,8 @@ def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["A
|
|
|
143
146
|
ActionResetRouting(),
|
|
144
147
|
ActionHangup(),
|
|
145
148
|
ActionRepeatBotMessages(),
|
|
149
|
+
ActionBlockDigressions(),
|
|
150
|
+
ActionContinueDigression(),
|
|
146
151
|
]
|
|
147
152
|
|
|
148
153
|
|
|
@@ -252,25 +257,36 @@ def action_for_name_or_text(
|
|
|
252
257
|
return RemoteAction(action_name_or_text, action_endpoint)
|
|
253
258
|
|
|
254
259
|
|
|
255
|
-
def create_bot_utterance(
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
# `.get` is intentional - no `pop` as we still need the image`
|
|
266
|
-
# property to set it in the following line)
|
|
267
|
-
"attachment": message.pop("attachment", None) or message.get("image", None),
|
|
268
|
-
"image": message.pop("image", None),
|
|
269
|
-
"custom": message.pop("custom", None),
|
|
270
|
-
},
|
|
271
|
-
metadata=message,
|
|
260
|
+
def create_bot_utterance(
|
|
261
|
+
message: Dict[Text, Any], language: Optional[Language] = None
|
|
262
|
+
) -> BotUttered:
|
|
263
|
+
"""Create BotUttered event from message with translation support."""
|
|
264
|
+
message_copy = copy.deepcopy(message)
|
|
265
|
+
|
|
266
|
+
text = get_translated_text(
|
|
267
|
+
text=message_copy.pop(TEXT, None),
|
|
268
|
+
translation=message_copy.pop(KEY_TRANSLATION, {}),
|
|
269
|
+
language=language,
|
|
272
270
|
)
|
|
273
|
-
|
|
271
|
+
|
|
272
|
+
buttons = get_translated_buttons(
|
|
273
|
+
buttons=message_copy.pop(BUTTONS, None), language=language
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
data = {
|
|
277
|
+
ELEMENTS: message_copy.pop(ELEMENTS, None),
|
|
278
|
+
QUICK_REPLIES: message_copy.pop(QUICK_REPLIES, None),
|
|
279
|
+
BUTTONS: buttons,
|
|
280
|
+
# for legacy / compatibility reasons we need to set the image
|
|
281
|
+
# to be the attachment if there is no other attachment (the
|
|
282
|
+
# `.get` is intentional - no `pop` as we still need the image`
|
|
283
|
+
# property to set it in the following line)
|
|
284
|
+
ATTACHMENT: message_copy.pop(ATTACHMENT, None) or message_copy.get(IMAGE, None),
|
|
285
|
+
IMAGE: message_copy.pop(IMAGE, None),
|
|
286
|
+
CUSTOM: message_copy.pop(CUSTOM, None),
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return BotUttered(text=text, data=data, metadata=message_copy)
|
|
274
290
|
|
|
275
291
|
|
|
276
292
|
class Action:
|
|
@@ -310,22 +326,30 @@ class Action:
|
|
|
310
326
|
return f"{self.__class__.__name__}('{self.name()}')"
|
|
311
327
|
|
|
312
328
|
def event_for_successful_execution(
|
|
313
|
-
self,
|
|
329
|
+
self,
|
|
330
|
+
prediction: PolicyPrediction,
|
|
331
|
+
was_successful: bool,
|
|
332
|
+
error_message: Optional[str],
|
|
314
333
|
) -> ActionExecuted:
|
|
315
334
|
"""Event which should be logged for the successful execution of this action.
|
|
316
335
|
|
|
317
336
|
Args:
|
|
318
337
|
prediction: Prediction which led to the execution of this event.
|
|
338
|
+
was_successful: Whether the action was executed successfully.
|
|
339
|
+
error_message: Error message if the action was not executed successfully.
|
|
319
340
|
|
|
320
341
|
Returns:
|
|
321
342
|
Event which should be logged onto the tracker.
|
|
322
343
|
"""
|
|
344
|
+
metadata = prediction.action_metadata or {}
|
|
345
|
+
metadata[ACTION_METADATA_EXECUTION_SUCCESS] = was_successful
|
|
346
|
+
metadata[ACTION_METADATA_EXECUTION_ERROR_MESSAGE] = error_message
|
|
323
347
|
return ActionExecuted(
|
|
324
348
|
self.name(),
|
|
325
349
|
prediction.policy_name,
|
|
326
350
|
prediction.max_confidence,
|
|
327
351
|
hide_rule_turn=prediction.hide_rule_turn,
|
|
328
|
-
metadata=
|
|
352
|
+
metadata=metadata,
|
|
329
353
|
)
|
|
330
354
|
|
|
331
355
|
|
|
@@ -375,7 +399,7 @@ class ActionBotResponse(Action):
|
|
|
375
399
|
message = add_bot_utterance_metadata(
|
|
376
400
|
message, self.utter_action, nlg, domain, tracker
|
|
377
401
|
)
|
|
378
|
-
return [create_bot_utterance(message)]
|
|
402
|
+
return [create_bot_utterance(message, tracker.current_language)]
|
|
379
403
|
|
|
380
404
|
def name(self) -> Text:
|
|
381
405
|
"""Returns action name."""
|
|
@@ -409,25 +433,34 @@ class ActionEndToEndResponse(Action):
|
|
|
409
433
|
) -> List[Event]:
|
|
410
434
|
"""Runs action (see parent class for full docstring)."""
|
|
411
435
|
message = {"text": self.action_text}
|
|
412
|
-
return [create_bot_utterance(message)]
|
|
436
|
+
return [create_bot_utterance(message, tracker.current_language)]
|
|
413
437
|
|
|
414
438
|
def event_for_successful_execution(
|
|
415
|
-
self,
|
|
439
|
+
self,
|
|
440
|
+
prediction: PolicyPrediction,
|
|
441
|
+
was_successful: bool,
|
|
442
|
+
error_message: Optional[str],
|
|
416
443
|
) -> ActionExecuted:
|
|
417
444
|
"""Event which should be logged for the successful execution of this action.
|
|
418
445
|
|
|
419
446
|
Args:
|
|
420
447
|
prediction: Prediction which led to the execution of this event.
|
|
448
|
+
was_successful: Whether the action was executed successfully.
|
|
449
|
+
error_message: Error message if the action was not executed successfully.
|
|
421
450
|
|
|
422
451
|
Returns:
|
|
423
452
|
Event which should be logged onto the tracker.
|
|
424
453
|
"""
|
|
454
|
+
metadata = prediction.action_metadata or {}
|
|
455
|
+
metadata[ACTION_METADATA_EXECUTION_SUCCESS] = was_successful
|
|
456
|
+
metadata[ACTION_METADATA_EXECUTION_ERROR_MESSAGE] = error_message
|
|
457
|
+
|
|
425
458
|
return ActionExecuted(
|
|
426
459
|
policy=prediction.policy_name,
|
|
427
460
|
confidence=prediction.max_confidence,
|
|
428
461
|
action_text=self.action_text,
|
|
429
462
|
hide_rule_turn=prediction.hide_rule_turn,
|
|
430
|
-
metadata=
|
|
463
|
+
metadata=metadata,
|
|
431
464
|
)
|
|
432
465
|
|
|
433
466
|
|
|
@@ -727,10 +760,7 @@ class ActionDeactivateLoop(Action):
|
|
|
727
760
|
|
|
728
761
|
|
|
729
762
|
class RemoteActionJSONValidator:
|
|
730
|
-
"""
|
|
731
|
-
A validator class for ensuring that the JSON response from a custom action executor
|
|
732
|
-
adheres to the expected schema.
|
|
733
|
-
"""
|
|
763
|
+
"""Check action responses for JSON schema validation."""
|
|
734
764
|
|
|
735
765
|
@staticmethod
|
|
736
766
|
def action_response_format_spec() -> Dict[Text, Any]:
|
|
@@ -753,8 +783,7 @@ class RemoteActionJSONValidator:
|
|
|
753
783
|
|
|
754
784
|
@classmethod
|
|
755
785
|
def validate(cls, result: Dict[Text, Any]) -> bool:
|
|
756
|
-
"""
|
|
757
|
-
Validate the given JSON result against the expected Action response schema.
|
|
786
|
+
"""Validate the given JSON result against the expected Action response schema.
|
|
758
787
|
|
|
759
788
|
This method uses a cached JSON schema validator to check if the provided result
|
|
760
789
|
conforms to the predefined schema.
|
|
@@ -781,15 +810,14 @@ class RemoteActionJSONValidator:
|
|
|
781
810
|
f". Failed to validate Action server response from API, "
|
|
782
811
|
f"make sure your response from the Action endpoint is valid. "
|
|
783
812
|
f"For more information about the format visit "
|
|
784
|
-
f"{DOCS_BASE_URL}/
|
|
813
|
+
f"{DOCS_BASE_URL}/action-server/actions"
|
|
785
814
|
)
|
|
786
815
|
raise e
|
|
787
816
|
|
|
788
817
|
@classmethod
|
|
789
818
|
@lru_cache(maxsize=1)
|
|
790
819
|
def get_action_response_validator(cls) -> Draft202012Validator:
|
|
791
|
-
"""
|
|
792
|
-
Retrieve a cached JSON schema validator for the Action response schema.
|
|
820
|
+
"""Retrieve a cached JSON schema validator for the Action response schema.
|
|
793
821
|
|
|
794
822
|
Returns:
|
|
795
823
|
Draft202012Validator: An instance of the JSON schema validator.
|
|
@@ -889,7 +917,7 @@ class RemoteAction(Action):
|
|
|
889
917
|
# Avoid overwriting `draft` values with empty values
|
|
890
918
|
response = {k: v for k, v in response.items() if v}
|
|
891
919
|
draft.update(response)
|
|
892
|
-
bot_messages.append(create_bot_utterance(draft))
|
|
920
|
+
bot_messages.append(create_bot_utterance(draft, tracker.current_language))
|
|
893
921
|
|
|
894
922
|
return bot_messages
|
|
895
923
|
|
|
@@ -919,7 +947,14 @@ class RemoteAction(Action):
|
|
|
919
947
|
)
|
|
920
948
|
|
|
921
949
|
events = rasa.shared.core.events.deserialise_events(events_json)
|
|
922
|
-
|
|
950
|
+
|
|
951
|
+
processed_events = []
|
|
952
|
+
for event in events:
|
|
953
|
+
if isinstance(event, SlotSet) and event.filled_by is None:
|
|
954
|
+
event.filled_by = SetSlotExtractor.CUSTOM.value
|
|
955
|
+
processed_events.append(event)
|
|
956
|
+
|
|
957
|
+
return cast(List[Event], bot_messages) + processed_events
|
|
923
958
|
|
|
924
959
|
def name(self) -> Text:
|
|
925
960
|
return self._name
|
|
@@ -1090,7 +1125,7 @@ class ActionDefaultAskAffirmation(Action):
|
|
|
1090
1125
|
"utter_action": self.name(),
|
|
1091
1126
|
}
|
|
1092
1127
|
|
|
1093
|
-
return [create_bot_utterance(message)]
|
|
1128
|
+
return [create_bot_utterance(message, tracker.current_language)]
|
|
1094
1129
|
|
|
1095
1130
|
|
|
1096
1131
|
class ActionDefaultAskRephrase(ActionBotResponse):
|
|
@@ -1123,7 +1158,7 @@ class ActionSendText(Action):
|
|
|
1123
1158
|
fallback = {"text": ""}
|
|
1124
1159
|
metadata_copy = copy.deepcopy(metadata) if metadata else {}
|
|
1125
1160
|
message = metadata_copy.get("message", fallback)
|
|
1126
|
-
return [create_bot_utterance(message)]
|
|
1161
|
+
return [create_bot_utterance(message, tracker.current_language)]
|
|
1127
1162
|
|
|
1128
1163
|
|
|
1129
1164
|
class ActionExtractSlots(Action):
|
|
@@ -1144,113 +1179,6 @@ class ActionExtractSlots(Action):
|
|
|
1144
1179
|
"""Returns action_extract_slots name."""
|
|
1145
1180
|
return ACTION_EXTRACT_SLOTS
|
|
1146
1181
|
|
|
1147
|
-
async def _run_custom_action(
|
|
1148
|
-
self,
|
|
1149
|
-
custom_action: Text,
|
|
1150
|
-
output_channel: "OutputChannel",
|
|
1151
|
-
nlg: "NaturalLanguageGenerator",
|
|
1152
|
-
tracker: "DialogueStateTracker",
|
|
1153
|
-
domain: "Domain",
|
|
1154
|
-
) -> List[Event]:
|
|
1155
|
-
slot_events: List[Event] = []
|
|
1156
|
-
remote_action = RemoteAction(custom_action, self._action_endpoint)
|
|
1157
|
-
disallowed_types = set()
|
|
1158
|
-
|
|
1159
|
-
try:
|
|
1160
|
-
custom_events = await remote_action.run(
|
|
1161
|
-
output_channel, nlg, tracker, domain
|
|
1162
|
-
)
|
|
1163
|
-
for event in custom_events:
|
|
1164
|
-
if isinstance(event, SlotSet):
|
|
1165
|
-
slot_events.append(event)
|
|
1166
|
-
elif isinstance(event, BotUttered):
|
|
1167
|
-
slot_events.append(event)
|
|
1168
|
-
else:
|
|
1169
|
-
disallowed_types.add(event.type_name)
|
|
1170
|
-
except (RasaException, ClientResponseError) as e:
|
|
1171
|
-
logger.warning(
|
|
1172
|
-
f"Failed to execute custom action '{custom_action}' "
|
|
1173
|
-
f"as a result of error '{e!s}'. The default action "
|
|
1174
|
-
f"'{self.name()}' failed to fill slots with custom "
|
|
1175
|
-
f"mappings."
|
|
1176
|
-
)
|
|
1177
|
-
|
|
1178
|
-
for type_name in disallowed_types:
|
|
1179
|
-
logger.info(
|
|
1180
|
-
f"Running custom action '{custom_action}' has resulted "
|
|
1181
|
-
f"in an event of type '{type_name}'. This is "
|
|
1182
|
-
f"disallowed and the tracker will not be "
|
|
1183
|
-
f"updated with this event."
|
|
1184
|
-
)
|
|
1185
|
-
|
|
1186
|
-
return slot_events
|
|
1187
|
-
|
|
1188
|
-
async def _execute_custom_action(
|
|
1189
|
-
self,
|
|
1190
|
-
mapping: Dict[Text, Any],
|
|
1191
|
-
executed_custom_actions: Set[Text],
|
|
1192
|
-
output_channel: "OutputChannel",
|
|
1193
|
-
nlg: "NaturalLanguageGenerator",
|
|
1194
|
-
tracker: "DialogueStateTracker",
|
|
1195
|
-
domain: "Domain",
|
|
1196
|
-
calm_custom_action_names: Optional[Set[str]] = None,
|
|
1197
|
-
) -> Tuple[List[Event], Set[Text]]:
|
|
1198
|
-
custom_action = mapping.get("action")
|
|
1199
|
-
|
|
1200
|
-
if not custom_action or custom_action in executed_custom_actions:
|
|
1201
|
-
return [], executed_custom_actions
|
|
1202
|
-
|
|
1203
|
-
if (
|
|
1204
|
-
calm_custom_action_names is not None
|
|
1205
|
-
and custom_action in calm_custom_action_names
|
|
1206
|
-
):
|
|
1207
|
-
return [], executed_custom_actions
|
|
1208
|
-
|
|
1209
|
-
slot_events = await self._run_custom_action(
|
|
1210
|
-
custom_action, output_channel, nlg, tracker, domain
|
|
1211
|
-
)
|
|
1212
|
-
|
|
1213
|
-
executed_custom_actions.add(custom_action)
|
|
1214
|
-
|
|
1215
|
-
return slot_events, executed_custom_actions
|
|
1216
|
-
|
|
1217
|
-
async def _execute_validation_action(
|
|
1218
|
-
self,
|
|
1219
|
-
extraction_events: List[Event],
|
|
1220
|
-
output_channel: "OutputChannel",
|
|
1221
|
-
nlg: "NaturalLanguageGenerator",
|
|
1222
|
-
tracker: "DialogueStateTracker",
|
|
1223
|
-
domain: "Domain",
|
|
1224
|
-
) -> List[Event]:
|
|
1225
|
-
slot_events: List[SlotSet] = [
|
|
1226
|
-
event for event in extraction_events if isinstance(event, SlotSet)
|
|
1227
|
-
]
|
|
1228
|
-
|
|
1229
|
-
slot_candidates = "\n".join([e.key for e in slot_events])
|
|
1230
|
-
logger.debug(f"Validating extracted slots: {slot_candidates}")
|
|
1231
|
-
|
|
1232
|
-
if ACTION_VALIDATE_SLOT_MAPPINGS not in domain.user_actions:
|
|
1233
|
-
return cast(List[Event], slot_events)
|
|
1234
|
-
|
|
1235
|
-
_tracker = DialogueStateTracker.from_events(
|
|
1236
|
-
tracker.sender_id,
|
|
1237
|
-
tracker.events_after_latest_restart() + cast(List[Event], slot_events),
|
|
1238
|
-
slots=domain.slots,
|
|
1239
|
-
)
|
|
1240
|
-
validate_events = await self._run_custom_action(
|
|
1241
|
-
ACTION_VALIDATE_SLOT_MAPPINGS, output_channel, nlg, _tracker, domain
|
|
1242
|
-
)
|
|
1243
|
-
validated_slot_names = [
|
|
1244
|
-
event.key for event in validate_events if isinstance(event, SlotSet)
|
|
1245
|
-
]
|
|
1246
|
-
|
|
1247
|
-
# If the custom action doesn't return a SlotSet event for an extracted slot
|
|
1248
|
-
# candidate we assume that it was valid. The custom action has to return a
|
|
1249
|
-
# SlotSet(slot_name, None) event to mark a Slot as invalid.
|
|
1250
|
-
return validate_events + [
|
|
1251
|
-
event for event in slot_events if event.key not in validated_slot_names
|
|
1252
|
-
]
|
|
1253
|
-
|
|
1254
1182
|
async def run(
|
|
1255
1183
|
self,
|
|
1256
1184
|
output_channel: "OutputChannel",
|
|
@@ -1261,58 +1189,59 @@ class ActionExtractSlots(Action):
|
|
|
1261
1189
|
) -> List[Event]:
|
|
1262
1190
|
"""Runs action. Please see parent class for the full docstring."""
|
|
1263
1191
|
slot_events: List[Event] = []
|
|
1264
|
-
executed_custom_actions: Set[Text] = set()
|
|
1265
|
-
|
|
1266
1192
|
user_slots = [
|
|
1267
1193
|
slot
|
|
1268
1194
|
for slot in domain.slots
|
|
1269
1195
|
if slot.name not in DEFAULT_SLOT_NAMES | KNOWLEDGE_BASE_SLOT_NAMES
|
|
1270
1196
|
]
|
|
1271
1197
|
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
if flows is not None:
|
|
1280
|
-
flows = FlowsList.from_json(flows)
|
|
1281
|
-
calm_slot_names = flows.available_slot_names()
|
|
1282
|
-
calm_custom_action_names = flows.available_custom_actions()
|
|
1283
|
-
|
|
1198
|
+
all_flows = metadata.get("all_flows") if metadata else None
|
|
1199
|
+
flows = FlowsList.from_json(all_flows) if all_flows else None
|
|
1200
|
+
calm_slot_names = flows.available_slot_names() if flows else set()
|
|
1201
|
+
is_calm_system = metadata.get(KEY_IS_CALM_SYSTEM) if metadata else False
|
|
1202
|
+
is_coexistence_bot = (
|
|
1203
|
+
metadata.get(KEY_IS_COEXISTENCE_ASSISTANT) if metadata else False
|
|
1204
|
+
)
|
|
1284
1205
|
slot_filling_manager = SlotFillingManager(
|
|
1285
|
-
domain,
|
|
1206
|
+
domain,
|
|
1207
|
+
tracker,
|
|
1208
|
+
action_endpoint=self._action_endpoint,
|
|
1286
1209
|
)
|
|
1287
1210
|
|
|
1288
1211
|
for slot in user_slots:
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
mapping_type = SlotMappingType(mapping.get(MAPPING_TYPE))
|
|
1298
|
-
should_fill_custom_slot = mapping_type == SlotMappingType.CUSTOM
|
|
1299
|
-
|
|
1300
|
-
if should_fill_custom_slot:
|
|
1301
|
-
(
|
|
1302
|
-
custom_evts,
|
|
1303
|
-
executed_custom_actions,
|
|
1304
|
-
) = await self._execute_custom_action(
|
|
1305
|
-
mapping,
|
|
1306
|
-
executed_custom_actions,
|
|
1307
|
-
output_channel,
|
|
1308
|
-
nlg,
|
|
1309
|
-
tracker,
|
|
1310
|
-
domain,
|
|
1311
|
-
calm_custom_action_names,
|
|
1212
|
+
# allows the action to set slots that are shared between
|
|
1213
|
+
# the NLU-based system and CALM system in a coexistence bot
|
|
1214
|
+
if is_coexistence_bot:
|
|
1215
|
+
should_fill_slot_in_coexistence = (
|
|
1216
|
+
slot_filling_manager.should_fill_slot_in_coexistence(
|
|
1217
|
+
is_calm_system=is_calm_system,
|
|
1218
|
+
slot=slot,
|
|
1219
|
+
calm_slot_names=calm_slot_names,
|
|
1312
1220
|
)
|
|
1313
|
-
|
|
1221
|
+
)
|
|
1222
|
+
if not should_fill_slot_in_coexistence:
|
|
1223
|
+
continue
|
|
1314
1224
|
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1225
|
+
if not is_calm_system:
|
|
1226
|
+
slot_value, is_extracted = extract_slot_value(
|
|
1227
|
+
slot, slot_filling_manager
|
|
1228
|
+
)
|
|
1229
|
+
if is_extracted:
|
|
1230
|
+
slot_events.append(SlotSet(slot.name, slot_value))
|
|
1231
|
+
|
|
1232
|
+
custom_events = await slot_filling_manager.run_action_at_every_turn(
|
|
1233
|
+
slot,
|
|
1234
|
+
output_channel,
|
|
1235
|
+
nlg,
|
|
1236
|
+
)
|
|
1237
|
+
slot_events.extend(custom_events)
|
|
1238
|
+
|
|
1239
|
+
if not is_calm_system:
|
|
1240
|
+
validated_events = await slot_filling_manager.execute_validation_action(
|
|
1241
|
+
slot_events,
|
|
1242
|
+
output_channel,
|
|
1243
|
+
nlg,
|
|
1244
|
+
)
|
|
1245
|
+
return validated_events
|
|
1246
|
+
|
|
1247
|
+
return slot_events
|