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
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
9
|
+
from rasa.dialogue_understanding.patterns.cannot_handle import (
|
|
10
|
+
CannotHandlePatternFlowStackFrame,
|
|
11
|
+
)
|
|
12
|
+
from rasa.dialogue_understanding.patterns.handle_digressions import (
|
|
13
|
+
HandleDigressionsPatternFlowStackFrame,
|
|
14
|
+
)
|
|
15
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
16
|
+
top_flow_frame,
|
|
17
|
+
)
|
|
18
|
+
from rasa.shared.core.events import Event
|
|
19
|
+
from rasa.shared.core.flows import FlowsList
|
|
20
|
+
from rasa.shared.core.flows.steps import CollectInformationFlowStep
|
|
21
|
+
from rasa.shared.core.flows.utils import ALL_LABEL
|
|
22
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
23
|
+
from rasa.shared.nlu.constants import HANDLE_DIGRESSIONS_COMMAND
|
|
24
|
+
|
|
25
|
+
structlogger = structlog.get_logger()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class HandleDigressionsCommand(Command):
|
|
30
|
+
"""A command to handle digressions during an active flow."""
|
|
31
|
+
|
|
32
|
+
flow: str
|
|
33
|
+
"""The interrupting flow."""
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def command(cls) -> str:
|
|
37
|
+
"""Returns the command type."""
|
|
38
|
+
return HANDLE_DIGRESSIONS_COMMAND
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def from_dict(cls, data: Dict[str, Any]) -> HandleDigressionsCommand:
|
|
42
|
+
"""Converts the dictionary to a command.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
The converted dictionary.
|
|
46
|
+
"""
|
|
47
|
+
try:
|
|
48
|
+
return HandleDigressionsCommand(flow=data["flow"])
|
|
49
|
+
except KeyError as e:
|
|
50
|
+
raise ValueError(
|
|
51
|
+
f"Missing parameter '{e}' while parsing HandleDigressionsCommand."
|
|
52
|
+
) from e
|
|
53
|
+
|
|
54
|
+
def run_command_on_tracker(
|
|
55
|
+
self,
|
|
56
|
+
tracker: DialogueStateTracker,
|
|
57
|
+
all_flows: FlowsList,
|
|
58
|
+
original_tracker: DialogueStateTracker,
|
|
59
|
+
) -> List[Event]:
|
|
60
|
+
"""Runs the command on the tracker.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
tracker: The tracker to run the command on.
|
|
64
|
+
all_flows: All flows in the assistant.
|
|
65
|
+
original_tracker: The tracker before any command was executed.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
The events to apply to the tracker.
|
|
69
|
+
"""
|
|
70
|
+
stack = tracker.stack
|
|
71
|
+
original_stack = original_tracker.stack
|
|
72
|
+
|
|
73
|
+
if self.flow not in all_flows.flow_ids:
|
|
74
|
+
structlogger.debug(
|
|
75
|
+
"command_executor.push_cannot_handle.start_invalid_flow_id",
|
|
76
|
+
command=self,
|
|
77
|
+
)
|
|
78
|
+
stack.push(CannotHandlePatternFlowStackFrame())
|
|
79
|
+
return tracker.create_stack_updated_events(stack)
|
|
80
|
+
|
|
81
|
+
# this allows to include called user flows in the stack search
|
|
82
|
+
latest_user_frame = top_flow_frame(original_stack, ignore_call_frames=False)
|
|
83
|
+
|
|
84
|
+
if latest_user_frame is None:
|
|
85
|
+
structlogger.debug(
|
|
86
|
+
"command_executor.skip_command.no_top_flow", command=self
|
|
87
|
+
)
|
|
88
|
+
return []
|
|
89
|
+
|
|
90
|
+
original_top_flow = latest_user_frame.flow(all_flows)
|
|
91
|
+
current_step = original_top_flow.step_by_id(latest_user_frame.step_id)
|
|
92
|
+
if not isinstance(current_step, CollectInformationFlowStep):
|
|
93
|
+
structlogger.debug(
|
|
94
|
+
"command_executor.skip_command.not_at_a_collect_step", command=self
|
|
95
|
+
)
|
|
96
|
+
return []
|
|
97
|
+
|
|
98
|
+
ask_confirm_digressions = set(
|
|
99
|
+
current_step.ask_confirm_digressions
|
|
100
|
+
+ original_top_flow.ask_confirm_digressions
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
block_digressions = set(
|
|
104
|
+
current_step.block_digressions + original_top_flow.block_digressions
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
if block_digressions:
|
|
108
|
+
if ALL_LABEL in block_digressions:
|
|
109
|
+
block_digressions.remove(ALL_LABEL)
|
|
110
|
+
block_digressions.add(self.flow)
|
|
111
|
+
|
|
112
|
+
if ask_confirm_digressions:
|
|
113
|
+
if ALL_LABEL in ask_confirm_digressions:
|
|
114
|
+
ask_confirm_digressions.remove(ALL_LABEL)
|
|
115
|
+
ask_confirm_digressions.add(self.flow)
|
|
116
|
+
|
|
117
|
+
structlogger.debug(
|
|
118
|
+
"command_executor.push_handle_digressions",
|
|
119
|
+
interrupting_flow_id=self.flow,
|
|
120
|
+
interrupted_flow_id=original_top_flow.id,
|
|
121
|
+
interrupted_step_id=current_step.id,
|
|
122
|
+
ask_confirm_digressions=ask_confirm_digressions,
|
|
123
|
+
block_digressions=block_digressions,
|
|
124
|
+
)
|
|
125
|
+
stack.push(
|
|
126
|
+
HandleDigressionsPatternFlowStackFrame(
|
|
127
|
+
interrupting_flow_id=self.flow,
|
|
128
|
+
interrupted_flow_id=original_top_flow.id,
|
|
129
|
+
interrupted_step_id=current_step.id,
|
|
130
|
+
ask_confirm_digressions=ask_confirm_digressions,
|
|
131
|
+
block_digressions=block_digressions,
|
|
132
|
+
)
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
return tracker.create_stack_updated_events(stack)
|
|
136
|
+
|
|
137
|
+
def __hash__(self) -> int:
|
|
138
|
+
return hash(self.flow)
|
|
139
|
+
|
|
140
|
+
def __eq__(self, other: object) -> bool:
|
|
141
|
+
if not isinstance(other, HandleDigressionsCommand):
|
|
142
|
+
return False
|
|
143
|
+
|
|
144
|
+
return other.flow == self.flow
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from typing import Any, Dict, List
|
|
5
6
|
|
|
6
7
|
import structlog
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
10
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
11
|
+
CommandSyntaxManager,
|
|
12
|
+
CommandSyntaxVersion,
|
|
13
|
+
)
|
|
8
14
|
from rasa.dialogue_understanding.patterns.human_handoff import (
|
|
9
15
|
HumanHandoffPatternFlowStackFrame,
|
|
10
16
|
)
|
|
@@ -60,7 +66,31 @@ class HumanHandoffCommand(Command):
|
|
|
60
66
|
return hash(self.command())
|
|
61
67
|
|
|
62
68
|
def __eq__(self, other: object) -> bool:
|
|
63
|
-
|
|
64
|
-
|
|
69
|
+
return isinstance(other, HumanHandoffCommand)
|
|
70
|
+
|
|
71
|
+
def to_dsl(self) -> str:
|
|
72
|
+
"""Converts the command to a DSL string."""
|
|
73
|
+
mapper = {
|
|
74
|
+
CommandSyntaxVersion.v1: "HumanHandoff()",
|
|
75
|
+
CommandSyntaxVersion.v2: "hand over",
|
|
76
|
+
}
|
|
77
|
+
return mapper.get(
|
|
78
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
79
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
80
|
+
)
|
|
65
81
|
|
|
66
|
-
|
|
82
|
+
@classmethod
|
|
83
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> HumanHandoffCommand:
|
|
84
|
+
"""Converts the DSL string to a command."""
|
|
85
|
+
return HumanHandoffCommand()
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def regex_pattern() -> str:
|
|
89
|
+
mapper = {
|
|
90
|
+
CommandSyntaxVersion.v1: r"HumanHandoff\(\)",
|
|
91
|
+
CommandSyntaxVersion.v2: r"""^[\s\W\d]*hand over['"`]*$""",
|
|
92
|
+
}
|
|
93
|
+
return mapper.get(
|
|
94
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
95
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
96
|
+
)
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from typing import Any, Dict, List
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
8
|
+
CommandSyntaxManager,
|
|
9
|
+
CommandSyntaxVersion,
|
|
10
|
+
)
|
|
11
|
+
from rasa.dialogue_understanding.commands.free_form_answer_command import (
|
|
12
|
+
FreeFormAnswerCommand,
|
|
13
|
+
)
|
|
6
14
|
from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
|
|
7
15
|
from rasa.shared.core.events import Event
|
|
8
16
|
from rasa.shared.core.flows import FlowsList
|
|
@@ -51,7 +59,31 @@ class KnowledgeAnswerCommand(FreeFormAnswerCommand):
|
|
|
51
59
|
return hash(self.command())
|
|
52
60
|
|
|
53
61
|
def __eq__(self, other: object) -> bool:
|
|
54
|
-
|
|
55
|
-
|
|
62
|
+
return isinstance(other, KnowledgeAnswerCommand)
|
|
63
|
+
|
|
64
|
+
def to_dsl(self) -> str:
|
|
65
|
+
"""Converts the command to a DSL string."""
|
|
66
|
+
mapper = {
|
|
67
|
+
CommandSyntaxVersion.v1: "SearchAndReply()",
|
|
68
|
+
CommandSyntaxVersion.v2: "provide info",
|
|
69
|
+
}
|
|
70
|
+
return mapper.get(
|
|
71
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
72
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> KnowledgeAnswerCommand:
|
|
77
|
+
"""Converts the DSL string to a command."""
|
|
78
|
+
return KnowledgeAnswerCommand()
|
|
56
79
|
|
|
57
|
-
|
|
80
|
+
@staticmethod
|
|
81
|
+
def regex_pattern() -> str:
|
|
82
|
+
mapper = {
|
|
83
|
+
CommandSyntaxVersion.v1: r"SearchAndReply\(\)",
|
|
84
|
+
CommandSyntaxVersion.v2: r"""^[\s\W\d]*provide info['"`]*$""",
|
|
85
|
+
}
|
|
86
|
+
return mapper.get(
|
|
87
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
88
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
89
|
+
)
|
|
@@ -2,7 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Any, Dict, List
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
6
7
|
from rasa.shared.core.events import Event
|
|
7
8
|
from rasa.shared.core.flows import FlowsList
|
|
8
9
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
|
|
5
|
+
|
|
6
|
+
from rasa.shared.core.events import Event
|
|
7
|
+
from rasa.shared.core.flows import FlowsList
|
|
8
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@runtime_checkable
|
|
12
|
+
class PromptCommand(Protocol):
|
|
13
|
+
"""
|
|
14
|
+
A protocol for commands predicted by the LLM model and incorporated into the prompt.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
@classmethod
|
|
18
|
+
def command(cls) -> str:
|
|
19
|
+
"""
|
|
20
|
+
Returns the command name.
|
|
21
|
+
|
|
22
|
+
This class method should be implemented to return the name of the command.
|
|
23
|
+
"""
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def from_dict(cls, data: Dict[str, Any]) -> PromptCommand:
|
|
28
|
+
"""
|
|
29
|
+
Converts the dictionary to a command.
|
|
30
|
+
|
|
31
|
+
This class method should be implemented to create a command instance from the
|
|
32
|
+
given dictionary.
|
|
33
|
+
"""
|
|
34
|
+
...
|
|
35
|
+
|
|
36
|
+
def run_command_on_tracker(
|
|
37
|
+
self,
|
|
38
|
+
tracker: DialogueStateTracker,
|
|
39
|
+
all_flows: FlowsList,
|
|
40
|
+
original_tracker: DialogueStateTracker,
|
|
41
|
+
) -> List[Event]:
|
|
42
|
+
"""
|
|
43
|
+
Runs the command on the tracker.
|
|
44
|
+
|
|
45
|
+
This method should be implemented to execute the command on the given tracker.
|
|
46
|
+
"""
|
|
47
|
+
...
|
|
48
|
+
|
|
49
|
+
def __hash__(self) -> int:
|
|
50
|
+
"""
|
|
51
|
+
Returns the hash of the command.
|
|
52
|
+
|
|
53
|
+
This method should be implemented to return the hash of the command.
|
|
54
|
+
Useful for comparing commands and storing them in sets.
|
|
55
|
+
"""
|
|
56
|
+
...
|
|
57
|
+
|
|
58
|
+
def __eq__(self, other: object) -> bool:
|
|
59
|
+
"""
|
|
60
|
+
Compares the command with another object.
|
|
61
|
+
|
|
62
|
+
This method should be implemented to compare the command with another object.
|
|
63
|
+
"""
|
|
64
|
+
...
|
|
65
|
+
|
|
66
|
+
def to_dsl(self) -> str:
|
|
67
|
+
"""
|
|
68
|
+
Converts the command to a DSL string.
|
|
69
|
+
|
|
70
|
+
This method should be implemented to convert the command to a DSL string.
|
|
71
|
+
A DSL string is a string representation of the command that is used in the
|
|
72
|
+
prompt.
|
|
73
|
+
"""
|
|
74
|
+
...
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> Optional[PromptCommand]:
|
|
78
|
+
"""
|
|
79
|
+
Converts the regex match to a command.
|
|
80
|
+
|
|
81
|
+
This class method should be implemented to create a command instance from the
|
|
82
|
+
given DSL string.
|
|
83
|
+
"""
|
|
84
|
+
...
|
|
85
|
+
|
|
86
|
+
@staticmethod
|
|
87
|
+
def regex_pattern() -> str:
|
|
88
|
+
"""
|
|
89
|
+
Returns the regex pattern for the command.
|
|
90
|
+
|
|
91
|
+
This method should be implemented to return the regex pattern that matches the
|
|
92
|
+
command in the prompt.
|
|
93
|
+
"""
|
|
94
|
+
...
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from typing import Any, Dict, List
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
8
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
9
|
+
CommandSyntaxManager,
|
|
10
|
+
CommandSyntaxVersion,
|
|
11
|
+
)
|
|
6
12
|
from rasa.dialogue_understanding.patterns.repeat import (
|
|
7
13
|
RepeatBotMessagesPatternFlowStackFrame,
|
|
8
14
|
)
|
|
@@ -54,7 +60,31 @@ class RepeatBotMessagesCommand(Command):
|
|
|
54
60
|
return hash(self.command())
|
|
55
61
|
|
|
56
62
|
def __eq__(self, other: object) -> bool:
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
return isinstance(other, RepeatBotMessagesCommand)
|
|
64
|
+
|
|
65
|
+
def to_dsl(self) -> str:
|
|
66
|
+
"""Converts the command to a DSL string."""
|
|
67
|
+
mapper = {
|
|
68
|
+
CommandSyntaxVersion.v1: "RepeatLastBotMessages()",
|
|
69
|
+
CommandSyntaxVersion.v2: "repeat message",
|
|
70
|
+
}
|
|
71
|
+
return mapper.get(
|
|
72
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
73
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> RepeatBotMessagesCommand:
|
|
78
|
+
"""Converts the DSL string to a command."""
|
|
79
|
+
return RepeatBotMessagesCommand()
|
|
59
80
|
|
|
60
|
-
|
|
81
|
+
@staticmethod
|
|
82
|
+
def regex_pattern() -> str:
|
|
83
|
+
mapper = {
|
|
84
|
+
CommandSyntaxVersion.v1: r"RepeatLastBotMessages\(\)",
|
|
85
|
+
CommandSyntaxVersion.v2: r"""^[\s\W\d]*repeat message['"`]*$""",
|
|
86
|
+
}
|
|
87
|
+
return mapper.get(
|
|
88
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
89
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
90
|
+
)
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Any, Dict, List
|
|
5
5
|
|
|
6
|
-
from rasa.dialogue_understanding.commands import Command
|
|
6
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
7
7
|
from rasa.dialogue_understanding.patterns.restart import RestartPatternFlowStackFrame
|
|
8
8
|
from rasa.shared.core.events import Event
|
|
9
9
|
from rasa.shared.core.flows import FlowsList
|
|
@@ -52,7 +52,4 @@ class RestartCommand(Command):
|
|
|
52
52
|
return hash(self.command())
|
|
53
53
|
|
|
54
54
|
def __eq__(self, other: object) -> bool:
|
|
55
|
-
|
|
56
|
-
return False
|
|
57
|
-
|
|
58
|
-
return True
|
|
55
|
+
return isinstance(other, RestartCommand)
|
|
@@ -2,7 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Any, Dict, List
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
6
7
|
from rasa.shared.core.events import Event, SessionEnded
|
|
7
8
|
from rasa.shared.core.flows import FlowsList
|
|
8
9
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -55,7 +56,4 @@ class SessionEndCommand(Command):
|
|
|
55
56
|
return hash(self.command())
|
|
56
57
|
|
|
57
58
|
def __eq__(self, other: object) -> bool:
|
|
58
|
-
|
|
59
|
-
return False
|
|
60
|
-
|
|
61
|
-
return True
|
|
59
|
+
return isinstance(other, SessionEndCommand)
|
|
@@ -2,7 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Any, Dict, List
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
6
7
|
from rasa.dialogue_understanding.patterns.session_start import (
|
|
7
8
|
SessionStartPatternFlowStackFrame,
|
|
8
9
|
)
|
|
@@ -53,7 +54,4 @@ class SessionStartCommand(Command):
|
|
|
53
54
|
return hash(self.command())
|
|
54
55
|
|
|
55
56
|
def __eq__(self, other: object) -> bool:
|
|
56
|
-
|
|
57
|
-
return False
|
|
58
|
-
|
|
59
|
-
return True
|
|
57
|
+
return isinstance(other, SessionStartCommand)
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from dataclasses import dataclass
|
|
4
|
-
from enum import Enum
|
|
5
5
|
from typing import Any, Dict, List
|
|
6
6
|
|
|
7
7
|
import structlog
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
10
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
11
|
+
CommandSyntaxManager,
|
|
12
|
+
CommandSyntaxVersion,
|
|
13
|
+
)
|
|
14
|
+
from rasa.dialogue_understanding.commands.utils import (
|
|
15
|
+
clean_extracted_value,
|
|
16
|
+
get_nullable_slot_value,
|
|
17
|
+
)
|
|
9
18
|
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
10
19
|
CollectInformationPatternFlowStackFrame,
|
|
11
20
|
)
|
|
@@ -13,6 +22,7 @@ from rasa.dialogue_understanding.stack.utils import (
|
|
|
13
22
|
get_collect_steps_excluding_ask_before_filling_for_active_flow,
|
|
14
23
|
)
|
|
15
24
|
from rasa.shared.constants import ROUTE_TO_CALM_SLOT
|
|
25
|
+
from rasa.shared.core.constants import SetSlotExtractor
|
|
16
26
|
from rasa.shared.core.events import Event, SlotSet
|
|
17
27
|
from rasa.shared.core.flows import FlowsList
|
|
18
28
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
@@ -21,17 +31,6 @@ from rasa.shared.nlu.constants import SET_SLOT_COMMAND
|
|
|
21
31
|
structlogger = structlog.get_logger()
|
|
22
32
|
|
|
23
33
|
|
|
24
|
-
class SetSlotExtractor(Enum):
|
|
25
|
-
"""The extractors that can set a slot."""
|
|
26
|
-
|
|
27
|
-
LLM = "LLM"
|
|
28
|
-
COMMAND_PAYLOAD_READER = "CommandPayloadReader"
|
|
29
|
-
NLU = "NLU"
|
|
30
|
-
|
|
31
|
-
def __str__(self) -> str:
|
|
32
|
-
return self.value
|
|
33
|
-
|
|
34
|
-
|
|
35
34
|
def get_flows_predicted_to_start_from_tracker(
|
|
36
35
|
tracker: DialogueStateTracker,
|
|
37
36
|
) -> List[str]:
|
|
@@ -44,8 +43,8 @@ def get_flows_predicted_to_start_from_tracker(
|
|
|
44
43
|
The flows that are predicted to start from the current state.
|
|
45
44
|
"""
|
|
46
45
|
from rasa.dialogue_understanding.processor.command_processor import (
|
|
47
|
-
get_commands_from_tracker,
|
|
48
46
|
filter_start_flow_commands,
|
|
47
|
+
get_commands_from_tracker,
|
|
49
48
|
)
|
|
50
49
|
|
|
51
50
|
commands = get_commands_from_tracker(tracker)
|
|
@@ -127,10 +126,12 @@ class SetSlotCommand(Command):
|
|
|
127
126
|
if (
|
|
128
127
|
self.name not in slots_of_active_flow
|
|
129
128
|
and self.name != ROUTE_TO_CALM_SLOT
|
|
129
|
+
and not slot.is_builtin
|
|
130
130
|
and self.extractor
|
|
131
131
|
in {
|
|
132
132
|
SetSlotExtractor.LLM.value,
|
|
133
133
|
SetSlotExtractor.COMMAND_PAYLOAD_READER.value,
|
|
134
|
+
SetSlotExtractor.NLU.value,
|
|
134
135
|
}
|
|
135
136
|
):
|
|
136
137
|
# Get the other predicted flows from the most recent message on the tracker.
|
|
@@ -148,7 +149,9 @@ class SetSlotCommand(Command):
|
|
|
148
149
|
return []
|
|
149
150
|
|
|
150
151
|
structlogger.debug("command_executor.set_slot", command=self)
|
|
151
|
-
return [
|
|
152
|
+
return [
|
|
153
|
+
SlotSet(self.name, slot.coerce_value(self.value), filled_by=self.extractor)
|
|
154
|
+
]
|
|
152
155
|
|
|
153
156
|
def __hash__(self) -> int:
|
|
154
157
|
return hash(self.value) + hash(self.name)
|
|
@@ -157,4 +160,40 @@ class SetSlotCommand(Command):
|
|
|
157
160
|
if not isinstance(other, SetSlotCommand):
|
|
158
161
|
return False
|
|
159
162
|
|
|
160
|
-
return
|
|
163
|
+
return (
|
|
164
|
+
str(other.value).lower() == str(self.value).lower()
|
|
165
|
+
and other.name == self.name
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
def to_dsl(self) -> str:
|
|
169
|
+
"""Converts the command to a DSL string."""
|
|
170
|
+
mapper = {
|
|
171
|
+
CommandSyntaxVersion.v1: f"SetSlot({self.name}, {self.value})",
|
|
172
|
+
CommandSyntaxVersion.v2: f"set slot {self.name} {self.value}",
|
|
173
|
+
}
|
|
174
|
+
return mapper.get(
|
|
175
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
176
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
@classmethod
|
|
180
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> SetSlotCommand:
|
|
181
|
+
"""Converts the DSL string to a command."""
|
|
182
|
+
slot_name = str(match.group(1).strip())
|
|
183
|
+
slot_value = clean_extracted_value(match.group(2))
|
|
184
|
+
return SetSlotCommand(name=slot_name, value=get_nullable_slot_value(slot_value))
|
|
185
|
+
|
|
186
|
+
@staticmethod
|
|
187
|
+
def regex_pattern() -> str:
|
|
188
|
+
mapper = {
|
|
189
|
+
CommandSyntaxVersion.v1: (
|
|
190
|
+
r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
|
|
191
|
+
),
|
|
192
|
+
CommandSyntaxVersion.v2: (
|
|
193
|
+
r"""^[\s\W\d]*set slot ['"`]?([a-zA-Z_][a-zA-Z0-9_-]*)['"`]? ['"`]?(.+?)['"`]*$""" # noqa: E501
|
|
194
|
+
),
|
|
195
|
+
}
|
|
196
|
+
return mapper.get(
|
|
197
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
198
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
199
|
+
)
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from typing import Any, Dict, List
|
|
5
6
|
|
|
6
7
|
import structlog
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
10
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
11
|
+
CommandSyntaxManager,
|
|
12
|
+
CommandSyntaxVersion,
|
|
13
|
+
)
|
|
8
14
|
from rasa.dialogue_understanding.patterns.skip_question import (
|
|
9
15
|
SkipQuestionPatternFlowStackFrame,
|
|
10
16
|
)
|
|
@@ -69,7 +75,31 @@ class SkipQuestionCommand(Command):
|
|
|
69
75
|
return hash(self.command())
|
|
70
76
|
|
|
71
77
|
def __eq__(self, other: object) -> bool:
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
return isinstance(other, SkipQuestionCommand)
|
|
79
|
+
|
|
80
|
+
def to_dsl(self) -> str:
|
|
81
|
+
"""Converts the command to a DSL string."""
|
|
82
|
+
mapper = {
|
|
83
|
+
CommandSyntaxVersion.v1: "SkipQuestion()",
|
|
84
|
+
CommandSyntaxVersion.v2: "skip question",
|
|
85
|
+
}
|
|
86
|
+
return mapper.get(
|
|
87
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
88
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> SkipQuestionCommand:
|
|
93
|
+
"""Converts the DSL string to a command."""
|
|
94
|
+
return SkipQuestionCommand()
|
|
74
95
|
|
|
75
|
-
|
|
96
|
+
@staticmethod
|
|
97
|
+
def regex_pattern() -> str:
|
|
98
|
+
mapper = {
|
|
99
|
+
CommandSyntaxVersion.v1: r"SkipQuestion\(\)",
|
|
100
|
+
CommandSyntaxVersion.v2: r"""^[\s\W\d]*skip question['"`]*$""",
|
|
101
|
+
}
|
|
102
|
+
return mapper.get(
|
|
103
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
104
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
105
|
+
)
|