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
|
@@ -1,24 +1,30 @@
|
|
|
1
|
-
from typing import List, Optional,
|
|
1
|
+
from typing import Dict, List, Optional, Set, Type
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
from rasa.dialogue_understanding.commands import (
|
|
6
6
|
CancelFlowCommand,
|
|
7
|
+
CannotHandleCommand,
|
|
8
|
+
ChitChatAnswerCommand,
|
|
7
9
|
ClarifyCommand,
|
|
8
10
|
Command,
|
|
9
|
-
CorrectSlotsCommand,
|
|
10
11
|
CorrectedSlot,
|
|
12
|
+
CorrectSlotsCommand,
|
|
13
|
+
FreeFormAnswerCommand,
|
|
11
14
|
RepeatBotMessagesCommand,
|
|
12
15
|
SetSlotCommand,
|
|
13
16
|
StartFlowCommand,
|
|
14
|
-
FreeFormAnswerCommand,
|
|
15
|
-
ChitChatAnswerCommand,
|
|
16
|
-
CannotHandleCommand,
|
|
17
17
|
)
|
|
18
18
|
from rasa.dialogue_understanding.commands.handle_code_change_command import (
|
|
19
19
|
HandleCodeChangeCommand,
|
|
20
20
|
)
|
|
21
|
+
from rasa.dialogue_understanding.commands.handle_digressions_command import (
|
|
22
|
+
HandleDigressionsCommand,
|
|
23
|
+
)
|
|
21
24
|
from rasa.dialogue_understanding.commands.set_slot_command import SetSlotExtractor
|
|
25
|
+
from rasa.dialogue_understanding.commands.utils import (
|
|
26
|
+
create_validate_frames_from_slot_set_events,
|
|
27
|
+
)
|
|
22
28
|
from rasa.dialogue_understanding.patterns.chitchat import FLOW_PATTERN_CHITCHAT
|
|
23
29
|
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
24
30
|
CollectInformationPatternFlowStackFrame,
|
|
@@ -26,6 +32,9 @@ from rasa.dialogue_understanding.patterns.collect_information import (
|
|
|
26
32
|
from rasa.dialogue_understanding.patterns.correction import (
|
|
27
33
|
CorrectionPatternFlowStackFrame,
|
|
28
34
|
)
|
|
35
|
+
from rasa.dialogue_understanding.patterns.validate_slot import (
|
|
36
|
+
ValidateSlotPatternFlowStackFrame,
|
|
37
|
+
)
|
|
29
38
|
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
30
39
|
from rasa.dialogue_understanding.stack.frames import (
|
|
31
40
|
BaseFlowStackFrame,
|
|
@@ -33,19 +42,25 @@ from rasa.dialogue_understanding.stack.frames import (
|
|
|
33
42
|
from rasa.dialogue_understanding.stack.utils import (
|
|
34
43
|
filled_slots_for_active_flow,
|
|
35
44
|
top_flow_frame,
|
|
45
|
+
top_user_flow_frame,
|
|
36
46
|
)
|
|
37
47
|
from rasa.engine.graph import ExecutionContext
|
|
38
48
|
from rasa.shared.constants import (
|
|
39
|
-
ROUTE_TO_CALM_SLOT,
|
|
40
49
|
RASA_PATTERN_CANNOT_HANDLE_CHITCHAT,
|
|
50
|
+
ROUTE_TO_CALM_SLOT,
|
|
51
|
+
)
|
|
52
|
+
from rasa.shared.core.constants import (
|
|
53
|
+
ACTION_TRIGGER_CHITCHAT,
|
|
54
|
+
FLOW_HASHES_SLOT,
|
|
55
|
+
SlotMappingType,
|
|
41
56
|
)
|
|
42
|
-
from rasa.shared.core.constants import ACTION_TRIGGER_CHITCHAT, SlotMappingType
|
|
43
|
-
from rasa.shared.core.constants import FLOW_HASHES_SLOT
|
|
44
57
|
from rasa.shared.core.events import Event, SlotSet
|
|
45
58
|
from rasa.shared.core.flows import FlowsList
|
|
46
59
|
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
60
|
+
from rasa.shared.core.slot_mappings import SlotMapping
|
|
47
61
|
from rasa.shared.core.slots import Slot
|
|
48
62
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
63
|
+
from rasa.shared.core.training_data.structures import StoryGraph
|
|
49
64
|
from rasa.shared.nlu.constants import COMMANDS
|
|
50
65
|
|
|
51
66
|
structlogger = structlog.get_logger()
|
|
@@ -226,18 +241,51 @@ def execute_commands(
|
|
|
226
241
|
# and then pushing the commands onto the stack in the reversed order.
|
|
227
242
|
reversed_commands = list(reversed(commands))
|
|
228
243
|
|
|
244
|
+
# we need to keep track of the ValidateSlotPatternFlowStackFrame that
|
|
245
|
+
# should be pushed onto the stack before executing the StartFlowCommands.
|
|
246
|
+
# This is necessary to make sure that slots filled before the start of a
|
|
247
|
+
# flow can be immediately validated without waiting till the flow is started
|
|
248
|
+
# and completed.
|
|
249
|
+
stack_frames_to_follow_commands: List[ValidateSlotPatternFlowStackFrame] = []
|
|
250
|
+
|
|
229
251
|
validate_state_of_commands(commands)
|
|
230
252
|
|
|
231
253
|
for command in reversed_commands:
|
|
232
254
|
new_events = command.run_command_on_tracker(
|
|
233
255
|
tracker, all_flows, original_tracker
|
|
234
256
|
)
|
|
257
|
+
|
|
258
|
+
_, stack_frames_to_follow_commands = (
|
|
259
|
+
create_validate_frames_from_slot_set_events(
|
|
260
|
+
tracker, new_events, stack_frames_to_follow_commands
|
|
261
|
+
)
|
|
262
|
+
)
|
|
263
|
+
|
|
235
264
|
events.extend(new_events)
|
|
236
265
|
tracker.update_with_events(new_events)
|
|
237
266
|
|
|
267
|
+
new_events = push_stack_frames_to_follow_commands(
|
|
268
|
+
tracker, stack_frames_to_follow_commands
|
|
269
|
+
)
|
|
270
|
+
events.extend(new_events)
|
|
271
|
+
|
|
238
272
|
return remove_duplicated_set_slots(events)
|
|
239
273
|
|
|
240
274
|
|
|
275
|
+
def push_stack_frames_to_follow_commands(
|
|
276
|
+
tracker: DialogueStateTracker, stack_frames: List
|
|
277
|
+
) -> List[Event]:
|
|
278
|
+
"""Push stack frames to follow commands."""
|
|
279
|
+
new_events = []
|
|
280
|
+
|
|
281
|
+
for frame in stack_frames:
|
|
282
|
+
stack = tracker.stack
|
|
283
|
+
stack.push(frame)
|
|
284
|
+
new_events.extend(tracker.create_stack_updated_events(stack))
|
|
285
|
+
tracker.update_with_events(new_events)
|
|
286
|
+
return new_events
|
|
287
|
+
|
|
288
|
+
|
|
241
289
|
def remove_duplicated_set_slots(events: List[Event]) -> List[Event]:
|
|
242
290
|
"""Removes duplicated set slot events.
|
|
243
291
|
|
|
@@ -383,13 +431,29 @@ def clean_up_commands(
|
|
|
383
431
|
command=command,
|
|
384
432
|
)
|
|
385
433
|
|
|
386
|
-
elif isinstance(command, StartFlowCommand)
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
structlogger.debug(
|
|
390
|
-
"command_processor.clean_up_commands.skip_command_flow_already_active",
|
|
391
|
-
command=command,
|
|
434
|
+
elif isinstance(command, StartFlowCommand):
|
|
435
|
+
top_user_frame = top_user_flow_frame(
|
|
436
|
+
tracker.stack, ignore_call_and_link_frames=False
|
|
392
437
|
)
|
|
438
|
+
top_flow_id = top_user_frame.flow_id if top_user_frame else ""
|
|
439
|
+
|
|
440
|
+
if top_flow_id == command.flow:
|
|
441
|
+
# drop a start flow command if the starting flow is equal
|
|
442
|
+
# to the currently active flow
|
|
443
|
+
structlogger.debug(
|
|
444
|
+
"command_processor.clean_up_commands.skip_command_flow_already_active",
|
|
445
|
+
command=command,
|
|
446
|
+
)
|
|
447
|
+
continue
|
|
448
|
+
|
|
449
|
+
if should_add_handle_digressions_command(tracker, all_flows, top_flow_id):
|
|
450
|
+
clean_commands.append(HandleDigressionsCommand(flow=command.flow))
|
|
451
|
+
structlogger.debug(
|
|
452
|
+
"command_processor.clean_up_commands.push_handle_digressions",
|
|
453
|
+
command=command,
|
|
454
|
+
)
|
|
455
|
+
else:
|
|
456
|
+
clean_commands.append(command)
|
|
393
457
|
|
|
394
458
|
# handle chitchat command differently from other free-form answer commands
|
|
395
459
|
elif isinstance(command, ChitChatAnswerCommand):
|
|
@@ -523,13 +587,48 @@ def clean_up_slot_command(
|
|
|
523
587
|
)
|
|
524
588
|
return resulting_commands
|
|
525
589
|
|
|
526
|
-
if not should_slot_be_set(slot, command):
|
|
590
|
+
if not should_slot_be_set(slot, command, resulting_commands):
|
|
591
|
+
structlogger.debug(
|
|
592
|
+
"command_processor.clean_up_slot_command.skip_command.extractor_"
|
|
593
|
+
"does_not_match_slot_mapping",
|
|
594
|
+
extractor=command.extractor,
|
|
595
|
+
slot_name=slot.name,
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
# prevent adding a cannot handle command in case commands_so_far already
|
|
599
|
+
# contains a valid prior set slot command for the same slot whose current
|
|
600
|
+
# slot command was rejected by should_slot_be_set
|
|
601
|
+
slot_command_exists_already = any(
|
|
602
|
+
isinstance(command, SetSlotCommand) and command.name == slot.name
|
|
603
|
+
for command in resulting_commands
|
|
604
|
+
)
|
|
605
|
+
|
|
527
606
|
cannot_handle = CannotHandleCommand(reason=CANNOT_HANDLE_REASON)
|
|
528
|
-
if cannot_handle not in resulting_commands:
|
|
607
|
+
if not slot_command_exists_already and cannot_handle not in resulting_commands:
|
|
529
608
|
resulting_commands.append(cannot_handle)
|
|
530
609
|
|
|
531
610
|
return resulting_commands
|
|
532
611
|
|
|
612
|
+
if (
|
|
613
|
+
slot.filled_by == SetSlotExtractor.NLU.value
|
|
614
|
+
and command.extractor == SetSlotExtractor.LLM.value
|
|
615
|
+
):
|
|
616
|
+
allow_nlu_correction = any(
|
|
617
|
+
[
|
|
618
|
+
mapping.allow_nlu_correction is True
|
|
619
|
+
for mapping in slot.mappings
|
|
620
|
+
if mapping.type == SlotMappingType.FROM_LLM
|
|
621
|
+
]
|
|
622
|
+
)
|
|
623
|
+
|
|
624
|
+
if not allow_nlu_correction:
|
|
625
|
+
structlogger.debug(
|
|
626
|
+
"command_processor.clean_up_slot_command"
|
|
627
|
+
".skip_command.disallow_llm_correction_of_nlu_set_value",
|
|
628
|
+
command=command,
|
|
629
|
+
)
|
|
630
|
+
return resulting_commands
|
|
631
|
+
|
|
533
632
|
if command.name in slots_so_far and command.name != ROUTE_TO_CALM_SLOT:
|
|
534
633
|
current_collect_info = get_current_collect_step(stack, all_flows)
|
|
535
634
|
|
|
@@ -570,7 +669,7 @@ def clean_up_slot_command(
|
|
|
570
669
|
)
|
|
571
670
|
|
|
572
671
|
# Group all corrections into one command
|
|
573
|
-
corrected_slot = CorrectedSlot(command.name, command.value)
|
|
672
|
+
corrected_slot = CorrectedSlot(command.name, command.value, command.extractor)
|
|
574
673
|
for c in resulting_commands:
|
|
575
674
|
if isinstance(c, CorrectSlotsCommand):
|
|
576
675
|
c.corrected_slots.append(corrected_slot)
|
|
@@ -654,7 +753,9 @@ def clean_up_chitchat_command(
|
|
|
654
753
|
return resulting_commands
|
|
655
754
|
|
|
656
755
|
|
|
657
|
-
def should_slot_be_set(
|
|
756
|
+
def should_slot_be_set(
|
|
757
|
+
slot: Slot, command: SetSlotCommand, commands_so_far: Optional[List[Command]] = None
|
|
758
|
+
) -> bool:
|
|
658
759
|
"""Check if a slot should be set by a command."""
|
|
659
760
|
if command.extractor == SetSlotExtractor.COMMAND_PAYLOAD_READER.value:
|
|
660
761
|
# if the command is issued by the command payload reader, it means the slot
|
|
@@ -662,37 +763,61 @@ def should_slot_be_set(slot: Slot, command: SetSlotCommand) -> bool:
|
|
|
662
763
|
# we can always set it
|
|
663
764
|
return True
|
|
664
765
|
|
|
766
|
+
if commands_so_far is None:
|
|
767
|
+
commands_so_far = []
|
|
768
|
+
|
|
769
|
+
set_slot_commands_so_far = [
|
|
770
|
+
command
|
|
771
|
+
for command in commands_so_far
|
|
772
|
+
if isinstance(command, SetSlotCommand) and command.name == slot.name
|
|
773
|
+
]
|
|
774
|
+
|
|
665
775
|
slot_mappings = slot.mappings
|
|
666
776
|
|
|
667
|
-
if not
|
|
668
|
-
slot_mappings = [
|
|
777
|
+
if not slot.mappings:
|
|
778
|
+
slot_mappings = [SlotMapping(type=SlotMappingType.FROM_LLM)]
|
|
669
779
|
|
|
670
|
-
for mapping in slot_mappings
|
|
671
|
-
mapping_type = SlotMappingType(
|
|
672
|
-
mapping.get("type", SlotMappingType.FROM_LLM.value)
|
|
673
|
-
)
|
|
780
|
+
mapping_types = [mapping.type for mapping in slot_mappings]
|
|
674
781
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
782
|
+
slot_has_nlu_mapping = any(
|
|
783
|
+
[mapping_type.is_predefined_type() for mapping_type in mapping_types]
|
|
784
|
+
)
|
|
785
|
+
slot_has_llm_mapping = any(
|
|
786
|
+
[mapping_type == SlotMappingType.FROM_LLM for mapping_type in mapping_types]
|
|
787
|
+
)
|
|
788
|
+
slot_has_controlled_mapping = any(
|
|
789
|
+
[mapping_type == SlotMappingType.CONTROLLED for mapping_type in mapping_types]
|
|
790
|
+
)
|
|
791
|
+
|
|
792
|
+
if set_slot_commands_so_far and command.extractor == SetSlotExtractor.LLM.value:
|
|
793
|
+
# covers the following scenarios:
|
|
794
|
+
# scenario 1: NLU mapping extracts a value for slot_a → If LLM extracts a value for slot_a, it is discarded. # noqa: E501
|
|
795
|
+
# scenario 2: NLU mapping is unable to extract a value for slot_a → If LLM extracts a value for slot_a, it is accepted. # noqa: E501
|
|
796
|
+
command_has_nlu_extractor = any(
|
|
797
|
+
[
|
|
798
|
+
command.extractor == SetSlotExtractor.NLU.value
|
|
799
|
+
for command in set_slot_commands_so_far
|
|
800
|
+
]
|
|
682
801
|
)
|
|
802
|
+
return not command_has_nlu_extractor and slot_has_llm_mapping
|
|
683
803
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
804
|
+
if (
|
|
805
|
+
slot_has_nlu_mapping
|
|
806
|
+
and command.extractor == SetSlotExtractor.LLM.value
|
|
807
|
+
and not slot_has_llm_mapping
|
|
808
|
+
):
|
|
809
|
+
return False
|
|
688
810
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
811
|
+
if (
|
|
812
|
+
slot_has_llm_mapping
|
|
813
|
+
and command.extractor == SetSlotExtractor.NLU.value
|
|
814
|
+
and not slot_has_nlu_mapping
|
|
815
|
+
):
|
|
816
|
+
return False
|
|
817
|
+
|
|
818
|
+
if slot_has_controlled_mapping and not (
|
|
819
|
+
slot_has_nlu_mapping or slot_has_llm_mapping
|
|
820
|
+
):
|
|
696
821
|
return False
|
|
697
822
|
|
|
698
823
|
return True
|
|
@@ -718,3 +843,28 @@ def filter_cannot_handle_command_for_skipped_slots(
|
|
|
718
843
|
and CANNOT_HANDLE_REASON == command.reason
|
|
719
844
|
)
|
|
720
845
|
]
|
|
846
|
+
|
|
847
|
+
|
|
848
|
+
def should_add_handle_digressions_command(
|
|
849
|
+
tracker: DialogueStateTracker, all_flows: FlowsList, top_flow_id: str
|
|
850
|
+
) -> bool:
|
|
851
|
+
"""Check if a handle digressions command should be added to the commands.
|
|
852
|
+
|
|
853
|
+
The command should replace a StartFlow command only if we are at a collect step of
|
|
854
|
+
a flow and a new flow is predicted by the command generator to start.
|
|
855
|
+
"""
|
|
856
|
+
current_flow = all_flows.flow_by_id(top_flow_id)
|
|
857
|
+
current_flow_condition = current_flow and (
|
|
858
|
+
current_flow.ask_confirm_digressions or current_flow.block_digressions
|
|
859
|
+
)
|
|
860
|
+
|
|
861
|
+
collect_info = get_current_collect_step(tracker.stack, all_flows)
|
|
862
|
+
|
|
863
|
+
if collect_info and (
|
|
864
|
+
collect_info.ask_confirm_digressions
|
|
865
|
+
or collect_info.block_digressions
|
|
866
|
+
or current_flow_condition
|
|
867
|
+
):
|
|
868
|
+
return True
|
|
869
|
+
|
|
870
|
+
return False
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from typing import Any, Dict, List, Text
|
|
4
|
-
import rasa.dialogue_understanding.processor.command_processor
|
|
5
4
|
|
|
5
|
+
import rasa.dialogue_understanding.processor.command_processor
|
|
6
6
|
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
7
7
|
from rasa.engine.storage.resource import Resource
|
|
8
8
|
from rasa.engine.storage.storage import ModelStorage
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
import copy
|
|
3
2
|
|
|
3
|
+
import copy
|
|
4
|
+
import typing
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from typing import Any, Callable, Dict, List, Optional
|
|
6
|
-
|
|
7
|
-
import typing
|
|
7
|
+
|
|
8
8
|
import jsonpatch
|
|
9
|
+
import structlog
|
|
9
10
|
|
|
10
11
|
if typing.TYPE_CHECKING:
|
|
11
12
|
from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
from rasa.dialogue_understanding.stack.frames.chit_chat_frame import ChitChatStackFrame
|
|
1
2
|
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
2
3
|
DialogueStackFrame,
|
|
3
4
|
)
|
|
4
5
|
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
5
|
-
UserFlowStackFrame,
|
|
6
6
|
BaseFlowStackFrame,
|
|
7
|
+
UserFlowStackFrame,
|
|
7
8
|
)
|
|
8
9
|
from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
|
|
9
10
|
from rasa.dialogue_understanding.stack.frames.search_frame import SearchStackFrame
|
|
10
|
-
from rasa.dialogue_understanding.stack.frames.chit_chat_frame import ChitChatStackFrame
|
|
11
11
|
|
|
12
12
|
__all__ = [
|
|
13
13
|
"DialogueStackFrame",
|
|
@@ -2,7 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Any, Dict
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
7
|
+
DialogueStackFrame,
|
|
8
|
+
)
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
@dataclass
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import dataclasses
|
|
3
4
|
import inspect
|
|
4
5
|
from dataclasses import dataclass, field
|
|
5
|
-
import dataclasses
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from functools import lru_cache
|
|
8
8
|
from typing import Any, Dict, List, Tuple, Type
|
|
9
9
|
|
|
10
10
|
import structlog
|
|
11
|
-
from rasa.shared.exceptions import RasaException
|
|
12
11
|
|
|
13
12
|
import rasa.shared.utils.common
|
|
13
|
+
from rasa.shared.exceptions import RasaException
|
|
14
14
|
from rasa.shared.utils.io import random_string
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
structlogger = structlog.get_logger()
|
|
18
17
|
|
|
19
18
|
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from dataclasses import dataclass
|
|
3
4
|
from enum import Enum
|
|
4
5
|
from typing import Any, Dict, Optional
|
|
5
6
|
|
|
6
|
-
from rasa.dialogue_understanding.stack.frames import
|
|
7
|
-
|
|
7
|
+
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
8
|
+
DialogueStackFrame,
|
|
9
|
+
)
|
|
8
10
|
from rasa.shared.core.flows import Flow, FlowsList, FlowStep
|
|
11
|
+
from rasa.shared.core.flows.steps.constants import START_STEP
|
|
9
12
|
from rasa.shared.exceptions import RasaException
|
|
10
13
|
|
|
11
14
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
from dataclasses import dataclass
|
|
3
4
|
from typing import Any, Dict
|
|
4
5
|
|
|
5
|
-
from rasa.dialogue_understanding.stack.frames import
|
|
6
|
+
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
7
|
+
DialogueStackFrame,
|
|
8
|
+
)
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
@dataclass
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
from typing import List, Optional, Set, Tuple
|
|
2
1
|
import typing
|
|
2
|
+
from typing import List, Optional, Set, Tuple
|
|
3
|
+
|
|
3
4
|
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
4
5
|
CollectInformationPatternFlowStackFrame,
|
|
5
6
|
)
|
|
6
|
-
from rasa.dialogue_understanding.
|
|
7
|
+
from rasa.dialogue_understanding.patterns.continue_interrupted import (
|
|
8
|
+
ContinueInterruptedPatternFlowStackFrame,
|
|
9
|
+
)
|
|
7
10
|
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
8
|
-
from rasa.dialogue_understanding.stack.frames import
|
|
11
|
+
from rasa.dialogue_understanding.stack.frames import (
|
|
12
|
+
BaseFlowStackFrame,
|
|
13
|
+
UserFlowStackFrame,
|
|
14
|
+
)
|
|
9
15
|
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import FlowStackFrameType
|
|
10
16
|
from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
|
|
17
|
+
from rasa.shared.core.flows import FlowsList
|
|
11
18
|
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
12
19
|
from rasa.shared.core.flows.steps.constants import END_STEP
|
|
13
20
|
from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
|
|
14
|
-
from rasa.shared.core.flows import FlowsList
|
|
15
21
|
|
|
16
22
|
if typing.TYPE_CHECKING:
|
|
17
23
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -57,7 +63,9 @@ def top_flow_frame(
|
|
|
57
63
|
return None
|
|
58
64
|
|
|
59
65
|
|
|
60
|
-
def top_user_flow_frame(
|
|
66
|
+
def top_user_flow_frame(
|
|
67
|
+
dialogue_stack: DialogueStack, ignore_call_and_link_frames: bool = True
|
|
68
|
+
) -> Optional[UserFlowStackFrame]:
|
|
61
69
|
"""Returns the topmost user flow frame from the tracker.
|
|
62
70
|
|
|
63
71
|
User flows are flows that are created by developers of an assistant and
|
|
@@ -69,16 +77,19 @@ def top_user_flow_frame(dialogue_stack: DialogueStack) -> Optional[UserFlowStack
|
|
|
69
77
|
|
|
70
78
|
Args:
|
|
71
79
|
dialogue_stack: The dialogue stack to use.
|
|
80
|
+
ignore_call_and_link_frames: Whether to ignore user frames of type `call`
|
|
81
|
+
and `link`. By default, these frames are ignored.
|
|
72
82
|
|
|
73
83
|
Returns:
|
|
74
84
|
The topmost user flow frame from the tracker.
|
|
75
85
|
"""
|
|
76
86
|
for frame in reversed(dialogue_stack.frames):
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
87
|
+
if isinstance(frame, UserFlowStackFrame):
|
|
88
|
+
if ignore_call_and_link_frames and (
|
|
89
|
+
frame.frame_type == FlowStackFrameType.CALL
|
|
90
|
+
or frame.frame_type == FlowStackFrameType.LINK
|
|
91
|
+
):
|
|
92
|
+
continue
|
|
82
93
|
return frame
|
|
83
94
|
return None
|
|
84
95
|
|
|
@@ -210,3 +221,38 @@ def get_collect_steps_excluding_ask_before_filling_for_active_flow(
|
|
|
210
221
|
for step in active_flow.get_collect_steps()
|
|
211
222
|
if not step.ask_before_filling
|
|
212
223
|
)
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def remove_digression_from_stack(stack: DialogueStack, flow_id: str) -> DialogueStack:
|
|
227
|
+
"""Remove a specific flow frame from the stack and other frames that reference it.
|
|
228
|
+
|
|
229
|
+
The main use-case is to prevent duplicate digressions from being added to the stack.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
stack: The dialogue stack.
|
|
233
|
+
flow_id: The flow to remove.
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
The updated dialogue stack.
|
|
237
|
+
"""
|
|
238
|
+
updated_stack = stack.copy()
|
|
239
|
+
original_frames = updated_stack.frames[:]
|
|
240
|
+
found_digression_index = -1
|
|
241
|
+
for index, frame in enumerate(original_frames):
|
|
242
|
+
if isinstance(frame, BaseFlowStackFrame) and frame.flow_id == flow_id:
|
|
243
|
+
updated_stack.frames.pop(index)
|
|
244
|
+
found_digression_index = index
|
|
245
|
+
|
|
246
|
+
# we also need to remove the `ContinueInterruptedPatternFlowStackFrame`
|
|
247
|
+
elif (
|
|
248
|
+
isinstance(frame, ContinueInterruptedPatternFlowStackFrame)
|
|
249
|
+
and frame.previous_flow_name == flow_id
|
|
250
|
+
and found_digression_index + 1 == index
|
|
251
|
+
):
|
|
252
|
+
# we know that this frame is always added after the digressing flow frame
|
|
253
|
+
# that was blocked previously by action_block_digressions,
|
|
254
|
+
# so this check would occur after the digressing flow was popped.
|
|
255
|
+
# Therefore, we need to update the index dynamically before popping.
|
|
256
|
+
updated_stack.frames.pop(index - 1)
|
|
257
|
+
|
|
258
|
+
return updated_stack
|