rasa-pro 3.12.0.dev1__py3-none-any.whl → 3.12.0.dev3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/__main__.py +7 -7
- rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
- rasa/anonymization/anonymization_pipeline.py +3 -3
- rasa/anonymization/anonymization_rule_executor.py +1 -1
- rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
- rasa/cli/arguments/data.py +2 -2
- rasa/cli/arguments/evaluate.py +2 -1
- rasa/cli/arguments/interactive.py +1 -1
- rasa/cli/arguments/run.py +1 -1
- rasa/cli/arguments/test.py +7 -5
- rasa/cli/arguments/train.py +3 -3
- rasa/cli/arguments/visualize.py +2 -2
- rasa/cli/arguments/x.py +1 -0
- rasa/cli/data.py +4 -3
- rasa/cli/dialogue_understanding_test.py +116 -18
- rasa/cli/evaluate.py +1 -1
- rasa/cli/export.py +6 -6
- rasa/cli/interactive.py +4 -5
- rasa/cli/llm_fine_tuning.py +5 -5
- rasa/cli/markers.py +1 -2
- rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
- rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
- rasa/cli/shell.py +2 -3
- rasa/cli/studio/download.py +1 -2
- rasa/cli/studio/studio.py +2 -3
- rasa/cli/studio/train.py +0 -1
- rasa/cli/telemetry.py +2 -2
- rasa/cli/test.py +11 -11
- rasa/cli/utils.py +7 -5
- rasa/core/__init__.py +0 -1
- rasa/core/actions/action.py +42 -21
- rasa/core/actions/action_hangup.py +1 -1
- rasa/core/actions/action_repeat_bot_messages.py +2 -2
- rasa/core/actions/action_run_slot_rejections.py +2 -2
- rasa/core/actions/action_trigger_chitchat.py +1 -1
- rasa/core/actions/action_trigger_flow.py +5 -5
- rasa/core/actions/action_trigger_search.py +1 -1
- rasa/core/actions/forms.py +14 -12
- rasa/core/actions/http_custom_action_executor.py +8 -1
- rasa/core/actions/loops.py +3 -3
- rasa/core/actions/two_stage_fallback.py +13 -13
- rasa/core/auth_retry_tracker_store.py +1 -2
- rasa/core/brokers/broker.py +2 -1
- rasa/core/brokers/file.py +1 -1
- rasa/core/brokers/kafka.py +8 -8
- rasa/core/brokers/pika.py +8 -9
- rasa/core/brokers/sql.py +4 -3
- rasa/core/channels/__init__.py +3 -0
- rasa/core/channels/botframework.py +2 -2
- rasa/core/channels/callback.py +4 -4
- rasa/core/channels/channel.py +11 -11
- rasa/core/channels/console.py +0 -1
- rasa/core/channels/development_inspector.py +6 -6
- rasa/core/channels/facebook.py +5 -5
- rasa/core/channels/hangouts.py +7 -8
- rasa/core/channels/inspector/dist/assets/{arc-861ddd57.js → arc-632a63ec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-921f02db.js → c4Diagram-d0fbc5ce-081e0df4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-b436c4f8.js → classDiagram-936ed81e-3df0afc2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-511a23cb.js → classDiagram-v2-c3cb15f1-8c5ed31e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-62fc7601-89c73b31.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-f1878e0a.js → edges-f2ad444c-4fc48c3e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9d236eb7-907e0440.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-201c5bbc.js → flowDb-1972c806-9ec53a3c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-f904ae41.js → flowDiagram-7ea5b25a-41da787a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-1813da66.js → flowchart-elk-definition-abe16c3d-ce370633.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-872af172.js → ganttDiagram-9b5ea136-90a36523.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-34a0af5a.js → gitGraphDiagram-99d0ae7c-41e1aa3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-42ba3e3d.js → index-2c4b9a3b-e6f2af62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-e793d777.js} +3 -3
- rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-736b4530-8ceba4db.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-df861f2b-960d3809.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-89e6403a.js → layout-498807d8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-eeccc4e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-f5b1d2bc.js → linear-8a078617.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-82cb74fa.js → mindmap-definition-beec6740-396d17dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-dbbf0591-dc9b5e1b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-4d7f4fd6-a08cba6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-6fc4c22a-87242b9e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-caee5554.js → sankeyDiagram-8f13d901-53f6f391.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-2935f8db.js → sequenceDiagram-b655622a-715c9c20.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-8f5d9693.js → stateDiagram-59f0c015-2e8fb31f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-d565d1de.js → stateDiagram-v2-2b26beab-7e2d2aa0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-080da4f6-75ad421d.js → styles-080da4f6-4420cea6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-7e764226.js → styles-3dcbcfbf-28676cf4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-9c745c82-cef936a6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-4019d1bf.js → svgDrawCommon-4835440b-151251e9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-5b62e21b-0d39bdb2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-2b33534f-a03fa445.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +3 -1
- rasa/core/channels/inspector/index.html +2 -0
- rasa/core/channels/inspector/src/App.tsx +1 -4
- rasa/core/channels/mattermost.py +4 -4
- rasa/core/channels/rasa_chat.py +4 -4
- rasa/core/channels/rest.py +11 -12
- rasa/core/channels/rocketchat.py +4 -3
- rasa/core/channels/slack.py +6 -5
- rasa/core/channels/socketio.py +7 -28
- rasa/core/channels/studio_chat.py +193 -0
- rasa/core/channels/telegram.py +73 -41
- rasa/core/channels/twilio.py +3 -3
- rasa/core/channels/vier_cvg.py +2 -2
- rasa/core/channels/voice_ready/audiocodes.py +8 -8
- rasa/core/channels/voice_ready/jambonz.py +5 -5
- rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
- rasa/core/channels/voice_ready/twilio_voice.py +9 -8
- rasa/core/channels/voice_ready/utils.py +1 -1
- rasa/core/channels/voice_stream/asr/asr_engine.py +2 -2
- rasa/core/channels/voice_stream/asr/azure.py +2 -2
- rasa/core/channels/voice_stream/asr/deepgram.py +57 -16
- rasa/core/channels/voice_stream/browser_audio.py +9 -6
- rasa/core/channels/voice_stream/call_state.py +2 -1
- rasa/core/channels/voice_stream/tts/azure.py +1 -2
- rasa/core/channels/voice_stream/tts/cartesia.py +5 -4
- rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
- rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +10 -7
- rasa/core/channels/voice_stream/util.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +15 -15
- rasa/core/channels/webexteams.py +3 -4
- rasa/core/evaluation/marker.py +7 -6
- rasa/core/evaluation/marker_base.py +15 -16
- rasa/core/evaluation/marker_stats.py +3 -4
- rasa/core/evaluation/marker_tracker_loader.py +5 -4
- rasa/core/exporter.py +4 -4
- rasa/core/featurizers/precomputation.py +8 -8
- rasa/core/featurizers/single_state_featurizer.py +7 -7
- rasa/core/featurizers/tracker_featurizers.py +13 -13
- rasa/core/http_interpreter.py +3 -4
- rasa/core/information_retrieval/__init__.py +1 -1
- rasa/core/information_retrieval/faiss.py +4 -4
- rasa/core/information_retrieval/information_retrieval.py +2 -2
- rasa/core/information_retrieval/milvus.py +3 -3
- rasa/core/information_retrieval/qdrant.py +3 -3
- rasa/core/jobs.py +1 -0
- rasa/core/lock.py +2 -3
- rasa/core/lock_store.py +3 -3
- rasa/core/migrate.py +11 -8
- rasa/core/nlg/__init__.py +1 -1
- rasa/core/nlg/callback.py +2 -3
- rasa/core/nlg/contextual_response_rephraser.py +63 -13
- rasa/core/nlg/generator.py +2 -2
- rasa/core/nlg/interpolator.py +4 -3
- rasa/core/nlg/response.py +3 -4
- rasa/core/nlg/summarize.py +1 -0
- rasa/core/persistor.py +3 -3
- rasa/core/policies/ensemble.py +10 -9
- rasa/core/policies/enterprise_search_policy.py +86 -21
- rasa/core/policies/flow_policy.py +13 -14
- rasa/core/policies/flows/flow_executor.py +35 -11
- rasa/core/policies/intentless_policy.py +6 -7
- rasa/core/policies/memoization.py +22 -20
- rasa/core/policies/policy.py +24 -22
- rasa/core/policies/rule_policy.py +37 -36
- rasa/core/policies/ted_policy.py +87 -85
- rasa/core/policies/unexpected_intent_policy.py +77 -75
- rasa/core/processor.py +96 -65
- rasa/core/run.py +1 -1
- rasa/core/secrets_manager/endpoints.py +2 -3
- rasa/core/secrets_manager/factory.py +2 -3
- rasa/core/secrets_manager/secret_manager.py +2 -3
- rasa/core/secrets_manager/vault.py +2 -2
- rasa/core/test.py +30 -30
- rasa/core/tracker_store.py +15 -15
- rasa/core/train.py +1 -1
- rasa/core/training/__init__.py +2 -2
- rasa/core/training/converters/responses_prefix_converter.py +1 -2
- rasa/core/training/interactive.py +13 -13
- rasa/core/training/story_conflict.py +4 -5
- rasa/core/training/training.py +3 -5
- rasa/core/utils.py +5 -5
- rasa/core/visualize.py +1 -1
- rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
- rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
- rasa/dialogue_understanding/commands/__init__.py +22 -22
- rasa/dialogue_understanding/commands/can_not_handle_command.py +20 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +18 -7
- rasa/dialogue_understanding/commands/change_flow_command.py +18 -2
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +18 -4
- rasa/dialogue_understanding/commands/clarify_command.py +19 -3
- rasa/dialogue_understanding/commands/command.py +19 -3
- rasa/dialogue_understanding/commands/correct_slots_command.py +3 -3
- rasa/dialogue_understanding/commands/error_command.py +1 -1
- rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
- rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
- rasa/dialogue_understanding/commands/human_handoff_command.py +16 -4
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +18 -4
- rasa/dialogue_understanding/commands/noop_command.py +2 -1
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +16 -4
- rasa/dialogue_understanding/commands/restart_command.py +2 -5
- rasa/dialogue_understanding/commands/session_end_command.py +3 -5
- rasa/dialogue_understanding/commands/session_start_command.py +3 -5
- rasa/dialogue_understanding/commands/set_slot_command.py +27 -3
- rasa/dialogue_understanding/commands/skip_question_command.py +16 -4
- rasa/dialogue_understanding/commands/start_flow_command.py +17 -2
- rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
- rasa/dialogue_understanding/commands/utils.py +64 -45
- rasa/dialogue_understanding/constants.py +1 -0
- rasa/dialogue_understanding/generator/command_generator.py +2 -119
- rasa/dialogue_understanding/generator/command_parser.py +201 -0
- rasa/dialogue_understanding/generator/constants.py +2 -2
- rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +11 -57
- rasa/dialogue_understanding/generator/llm_command_generator.py +2 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +67 -120
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +8 -10
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +32 -93
- rasa/dialogue_understanding/generator/utils.py +45 -0
- rasa/dialogue_understanding/patterns/cancel.py +2 -1
- rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
- rasa/dialogue_understanding/patterns/chitchat.py +1 -1
- rasa/dialogue_understanding/patterns/clarify.py +2 -1
- rasa/dialogue_understanding/patterns/code_change.py +2 -0
- rasa/dialogue_understanding/patterns/collect_information.py +6 -3
- rasa/dialogue_understanding/patterns/completed.py +1 -1
- rasa/dialogue_understanding/patterns/continue_interrupted.py +10 -1
- rasa/dialogue_understanding/patterns/correction.py +4 -2
- rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
- rasa/dialogue_understanding/patterns/internal_error.py +1 -0
- rasa/dialogue_understanding/patterns/search.py +1 -1
- rasa/dialogue_understanding/patterns/session_start.py +1 -1
- rasa/dialogue_understanding/patterns/skip_question.py +1 -0
- rasa/dialogue_understanding/patterns/user_silence.py +1 -1
- rasa/dialogue_understanding/processor/command_processor.py +13 -9
- rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
- rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
- rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
- rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
- rasa/dialogue_understanding/stack/utils.py +8 -4
- rasa/dialogue_understanding/utils.py +121 -2
- rasa/dialogue_understanding_test/README.md +379 -0
- rasa/dialogue_understanding_test/command_comparison.py +60 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +110 -4
- rasa/dialogue_understanding_test/constants.py +6 -1
- rasa/dialogue_understanding_test/du_test_case.py +252 -38
- rasa/dialogue_understanding_test/du_test_result.py +281 -2
- rasa/dialogue_understanding_test/du_test_runner.py +239 -10
- rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
- rasa/dialogue_understanding_test/io.py +338 -20
- rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
- rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
- rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
- rasa/dialogue_understanding_test/utils.py +70 -0
- rasa/dialogue_understanding_test/validation.py +59 -4
- rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
- rasa/e2e_test/assertions.py +1 -1
- rasa/e2e_test/e2e_config.py +1 -1
- rasa/e2e_test/e2e_test_case.py +3 -4
- rasa/e2e_test/e2e_test_converter.py +2 -3
- rasa/e2e_test/e2e_test_coverage_report.py +6 -6
- rasa/e2e_test/e2e_test_result.py +1 -1
- rasa/e2e_test/e2e_test_runner.py +134 -31
- rasa/e2e_test/stub_custom_action.py +1 -1
- rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
- rasa/e2e_test/utils/io.py +132 -65
- rasa/e2e_test/utils/validation.py +1 -1
- rasa/engine/caching.py +5 -7
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +2 -2
- rasa/engine/recipes/default_components.py +13 -15
- rasa/engine/recipes/recipe.py +2 -2
- rasa/engine/runner/dask.py +2 -2
- rasa/engine/runner/interface.py +1 -0
- rasa/engine/storage/local_model_storage.py +5 -4
- rasa/engine/storage/resource.py +2 -1
- rasa/engine/storage/storage.py +5 -3
- rasa/engine/training/components.py +2 -1
- rasa/engine/training/fingerprinting.py +4 -2
- rasa/engine/training/graph_trainer.py +4 -4
- rasa/engine/training/hooks.py +2 -2
- rasa/engine/validation.py +34 -33
- rasa/exceptions.py +3 -2
- rasa/graph_components/converters/nlu_message_converter.py +3 -3
- rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
- rasa/graph_components/providers/domain_provider.py +3 -2
- rasa/graph_components/providers/flows_provider.py +2 -3
- rasa/graph_components/providers/forms_provider.py +4 -4
- rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
- rasa/graph_components/providers/responses_provider.py +4 -4
- rasa/graph_components/providers/rule_only_provider.py +3 -2
- rasa/graph_components/providers/story_graph_provider.py +8 -8
- rasa/graph_components/providers/training_tracker_provider.py +3 -2
- rasa/graph_components/validators/default_recipe_validator.py +16 -16
- rasa/graph_components/validators/finetuning_validator.py +10 -8
- rasa/hooks.py +18 -12
- rasa/jupyter.py +2 -2
- rasa/llm_fine_tuning/annotation_module.py +4 -4
- rasa/llm_fine_tuning/conversations.py +6 -6
- rasa/llm_fine_tuning/llm_data_preparation_module.py +1 -1
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +1 -1
- rasa/llm_fine_tuning/paraphrasing_module.py +1 -1
- rasa/llm_fine_tuning/storage.py +3 -3
- rasa/markers/marker.py +2 -3
- rasa/markers/marker_base.py +1 -2
- rasa/markers/upload.py +2 -2
- rasa/markers/validate.py +2 -3
- rasa/model.py +3 -5
- rasa/model_manager/config.py +1 -1
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +6 -6
- rasa/model_manager/socket_bridge.py +8 -3
- rasa/model_manager/studio_jwt_auth.py +1 -0
- rasa/model_manager/trainer_service.py +9 -7
- rasa/model_manager/utils.py +1 -1
- rasa/model_manager/warm_rasa_process.py +14 -8
- rasa/model_service.py +5 -6
- rasa/model_testing.py +13 -15
- rasa/nlu/classifiers/diet_classifier.py +72 -73
- rasa/nlu/classifiers/fallback_classifier.py +9 -8
- rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
- rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
- rasa/nlu/classifiers/regex_message_handler.py +3 -2
- rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
- rasa/nlu/convert.py +2 -2
- rasa/nlu/emulators/dialogflow.py +3 -3
- rasa/nlu/emulators/luis.py +5 -5
- rasa/nlu/emulators/no_emulator.py +1 -0
- rasa/nlu/emulators/wit.py +4 -4
- rasa/nlu/extractors/crf_entity_extractor.py +11 -11
- rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
- rasa/nlu/extractors/entity_synonyms.py +10 -9
- rasa/nlu/extractors/extractor.py +16 -16
- rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
- rasa/nlu/extractors/regex_entity_extractor.py +11 -10
- rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
- rasa/nlu/featurizers/featurizer.py +5 -4
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
- rasa/nlu/model.py +0 -1
- rasa/nlu/selectors/response_selector.py +67 -68
- rasa/nlu/test.py +38 -38
- rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
- rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
- rasa/nlu/tokenizers/tokenizer.py +6 -7
- rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
- rasa/nlu/utils/bilou_utils.py +7 -7
- rasa/nlu/utils/hugging_face/registry.py +22 -22
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
- rasa/nlu/utils/mitie_utils.py +2 -1
- rasa/nlu/utils/pattern_utils.py +1 -1
- rasa/nlu/utils/spacy_utils.py +3 -3
- rasa/plugin.py +12 -1
- rasa/server.py +37 -1
- rasa/shared/constants.py +22 -2
- rasa/shared/core/command_payload_reader.py +15 -7
- rasa/shared/core/constants.py +4 -1
- rasa/shared/core/conversation.py +1 -2
- rasa/shared/core/events.py +47 -37
- rasa/shared/core/flows/__init__.py +0 -1
- rasa/shared/core/flows/flow.py +11 -11
- rasa/shared/core/flows/flow_step.py +19 -13
- rasa/shared/core/flows/flow_step_links.py +21 -14
- rasa/shared/core/flows/flow_step_sequence.py +6 -4
- rasa/shared/core/flows/flows_list.py +3 -3
- rasa/shared/core/flows/nlu_trigger.py +1 -1
- rasa/shared/core/flows/steps/__init__.py +2 -2
- rasa/shared/core/flows/steps/action.py +4 -3
- rasa/shared/core/flows/steps/call.py +4 -4
- rasa/shared/core/flows/steps/collect.py +7 -4
- rasa/shared/core/flows/steps/continuation.py +3 -1
- rasa/shared/core/flows/steps/end.py +3 -1
- rasa/shared/core/flows/steps/internal.py +3 -2
- rasa/shared/core/flows/steps/link.py +6 -4
- rasa/shared/core/flows/steps/no_operation.py +7 -5
- rasa/shared/core/flows/steps/set_slots.py +4 -3
- rasa/shared/core/flows/steps/start.py +3 -1
- rasa/shared/core/flows/utils.py +1 -0
- rasa/shared/core/flows/validation.py +3 -5
- rasa/shared/core/generator.py +20 -21
- rasa/shared/core/slot_mappings.py +15 -15
- rasa/shared/core/slots.py +3 -3
- rasa/shared/core/trackers.py +31 -31
- rasa/shared/core/training_data/loading.py +1 -1
- rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
- rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
- rasa/shared/core/training_data/structures.py +11 -12
- rasa/shared/core/training_data/visualization.py +10 -10
- rasa/shared/data.py +6 -6
- rasa/shared/engine/caching.py +0 -1
- rasa/shared/exceptions.py +2 -2
- rasa/shared/importers/rasa.py +5 -6
- rasa/shared/importers/utils.py +1 -1
- rasa/shared/nlu/constants.py +3 -0
- rasa/shared/nlu/training_data/entities_parser.py +6 -6
- rasa/shared/nlu/training_data/features.py +3 -3
- rasa/shared/nlu/training_data/formats/__init__.py +1 -1
- rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
- rasa/shared/nlu/training_data/formats/luis.py +7 -8
- rasa/shared/nlu/training_data/formats/rasa.py +4 -5
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
- rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
- rasa/shared/nlu/training_data/formats/wit.py +3 -4
- rasa/shared/nlu/training_data/loading.py +4 -4
- rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
- rasa/shared/nlu/training_data/message.py +13 -14
- rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +1 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
- rasa/shared/nlu/training_data/training_data.py +12 -13
- rasa/shared/nlu/training_data/util.py +11 -10
- rasa/shared/providers/_configs/azure_openai_client_config.py +3 -497
- rasa/shared/providers/_configs/client_config.py +1 -3
- rasa/shared/providers/_configs/default_litellm_client_config.py +1 -3
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -3
- rasa/shared/providers/_configs/litellm_router_client_config.py +1 -3
- rasa/shared/providers/_configs/model_group_config.py +2 -7
- rasa/shared/providers/_configs/openai_client_config.py +1 -3
- rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -3
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -3
- rasa/shared/providers/_configs/utils.py +1 -0
- rasa/shared/providers/_ssl_verification_utils.py +5 -6
- rasa/shared/providers/_utils.py +5 -5
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +3 -28
- rasa/shared/providers/embedding/embedding_client.py +1 -1
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +1 -3
- rasa/shared/providers/llm/_base_litellm_client.py +1 -3
- rasa/shared/providers/llm/azure_openai_llm_client.py +25 -81
- rasa/shared/providers/llm/default_litellm_llm_client.py +1 -3
- rasa/shared/providers/llm/litellm_router_llm_client.py +2 -21
- rasa/shared/providers/llm/llm_client.py +1 -3
- rasa/shared/providers/llm/llm_response.py +41 -2
- rasa/shared/providers/llm/openai_llm_client.py +3 -9
- rasa/shared/providers/llm/rasa_llm_client.py +6 -20
- rasa/shared/providers/llm/self_hosted_llm_client.py +3 -9
- rasa/shared/providers/mappings.py +18 -19
- rasa/shared/providers/router/_base_litellm_router_client.py +1 -3
- rasa/shared/providers/router/router_client.py +1 -3
- rasa/shared/utils/cli.py +1 -1
- rasa/shared/utils/common.py +1 -1
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
- rasa/shared/utils/health_check/health_check.py +3 -3
- rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
- rasa/shared/utils/io.py +1 -1
- rasa/shared/utils/llm.py +5 -9
- rasa/shared/utils/pykwalify_extensions.py +1 -1
- rasa/shared/utils/schemas/events.py +1 -1
- rasa/shared/utils/yaml.py +29 -26
- rasa/studio/auth.py +3 -3
- rasa/studio/config.py +1 -2
- rasa/studio/data_handler.py +3 -3
- rasa/studio/download.py +1 -1
- rasa/studio/results_logger.py +3 -3
- rasa/studio/upload.py +2 -0
- rasa/telemetry.py +31 -0
- rasa/tracing/config.py +3 -3
- rasa/tracing/instrumentation/attribute_extractors.py +2 -0
- rasa/tracing/instrumentation/instrumentation.py +4 -4
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
- rasa/tracing/instrumentation/metrics.py +11 -11
- rasa/tracing/metric_instrument_provider.py +14 -14
- rasa/utils/common.py +12 -9
- rasa/utils/endpoints.py +1 -1
- rasa/utils/io.py +7 -7
- rasa/utils/licensing.py +3 -4
- rasa/utils/log_utils.py +7 -6
- rasa/utils/ml_utils.py +1 -0
- rasa/utils/plotting.py +3 -3
- rasa/utils/sanic_error_handler.py +1 -1
- rasa/utils/tensorflow/callback.py +2 -2
- rasa/utils/tensorflow/crf.py +2 -2
- rasa/utils/tensorflow/data_generator.py +5 -5
- rasa/utils/tensorflow/environment.py +3 -3
- rasa/utils/tensorflow/feature_array.py +2 -3
- rasa/utils/tensorflow/layers.py +18 -12
- rasa/utils/tensorflow/layers_utils.py +2 -1
- rasa/utils/tensorflow/metrics.py +2 -2
- rasa/utils/tensorflow/model_data.py +7 -7
- rasa/utils/tensorflow/model_data_utils.py +10 -9
- rasa/utils/tensorflow/models.py +31 -32
- rasa/utils/tensorflow/rasa_layers.py +20 -19
- rasa/utils/tensorflow/types.py +2 -1
- rasa/utils/train_utils.py +23 -21
- rasa/utils/url_tools.py +1 -1
- rasa/validator.py +17 -1
- rasa/version.py +1 -1
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/METADATA +8 -9
- rasa_pro-3.12.0.dev3.dist-info/RECORD +800 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
- rasa/shared/providers/constants.py +0 -7
- rasa_pro-3.12.0.dev1.dist-info/RECORD +0 -790
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from functools import lru_cache
|
|
3
|
+
from typing import Any, Callable, Dict, List, Optional, Type, Union
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
from rasa.dialogue_understanding.commands import (
|
|
8
|
+
CancelFlowCommand,
|
|
9
|
+
ChitChatAnswerCommand,
|
|
10
|
+
ClarifyCommand,
|
|
11
|
+
Command,
|
|
12
|
+
HumanHandoffCommand,
|
|
13
|
+
KnowledgeAnswerCommand,
|
|
14
|
+
RepeatBotMessagesCommand,
|
|
15
|
+
SetSlotCommand,
|
|
16
|
+
SkipQuestionCommand,
|
|
17
|
+
StartFlowCommand,
|
|
18
|
+
)
|
|
19
|
+
from rasa.dialogue_understanding.commands.utils import start_flow_by_name
|
|
20
|
+
from rasa.shared.core.flows import FlowsList
|
|
21
|
+
|
|
22
|
+
structlogger = structlog.get_logger()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
DEFAULT_COMMANDS = [
|
|
26
|
+
SetSlotCommand,
|
|
27
|
+
StartFlowCommand,
|
|
28
|
+
CancelFlowCommand,
|
|
29
|
+
ChitChatAnswerCommand,
|
|
30
|
+
SkipQuestionCommand,
|
|
31
|
+
KnowledgeAnswerCommand,
|
|
32
|
+
HumanHandoffCommand,
|
|
33
|
+
ClarifyCommand,
|
|
34
|
+
RepeatBotMessagesCommand,
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@lru_cache(maxsize=128)
|
|
39
|
+
def _get_compiled_pattern(pattern_str: str) -> re.Pattern:
|
|
40
|
+
return re.compile(pattern_str)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _create_default_commands(
|
|
44
|
+
default_commands_to_remove: Union[List[Type[Command]], List[str]],
|
|
45
|
+
) -> List[Type[Command]]:
|
|
46
|
+
"""Return an updated list of default commands after removing the provided commands.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
default_commands_to_remove: A list of commands to remove from the default
|
|
50
|
+
commands.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A copy of the default commands with the provided commands removed.
|
|
54
|
+
"""
|
|
55
|
+
commands_after_removal = []
|
|
56
|
+
for command in DEFAULT_COMMANDS:
|
|
57
|
+
if (
|
|
58
|
+
command not in default_commands_to_remove
|
|
59
|
+
and command.__name__ not in default_commands_to_remove
|
|
60
|
+
):
|
|
61
|
+
commands_after_removal.append(command)
|
|
62
|
+
|
|
63
|
+
return commands_after_removal
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _get_additional_parsing_logic(
|
|
67
|
+
command_clz: Type[Command],
|
|
68
|
+
) -> Optional[Callable[[Command, FlowsList], Optional[Command]]]:
|
|
69
|
+
"""Get additional parsing logic for a command."""
|
|
70
|
+
command_to_parsing_fn_mapper: Dict[
|
|
71
|
+
Type[Command], Callable[..., Optional[Command]]
|
|
72
|
+
] = {
|
|
73
|
+
ClarifyCommand: _parse_clarify_command,
|
|
74
|
+
SetSlotCommand: _parse_set_slot_command,
|
|
75
|
+
StartFlowCommand: _parse_start_flow_command,
|
|
76
|
+
}
|
|
77
|
+
return command_to_parsing_fn_mapper.get(command_clz)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def parse_commands(
|
|
81
|
+
actions: Optional[str],
|
|
82
|
+
flows: FlowsList,
|
|
83
|
+
is_handle_flows_prompt: bool = False,
|
|
84
|
+
additional_commands: Optional[List[Type[Command]]] = None,
|
|
85
|
+
default_commands_to_remove: Optional[Union[List[Type[Command]], List[str]]] = None,
|
|
86
|
+
**kwargs: Any,
|
|
87
|
+
) -> List[Command]:
|
|
88
|
+
"""Parse a list of action commands."""
|
|
89
|
+
if not actions:
|
|
90
|
+
return []
|
|
91
|
+
|
|
92
|
+
commands: List[Command] = []
|
|
93
|
+
default_commands = DEFAULT_COMMANDS
|
|
94
|
+
if default_commands_to_remove:
|
|
95
|
+
default_commands = _create_default_commands(default_commands_to_remove)
|
|
96
|
+
|
|
97
|
+
for action in actions.strip().splitlines():
|
|
98
|
+
if is_handle_flows_prompt:
|
|
99
|
+
# Needed for multistep command generator.
|
|
100
|
+
if (
|
|
101
|
+
len(commands) >= 2
|
|
102
|
+
or len(commands) == 1
|
|
103
|
+
and isinstance(commands[0], ClarifyCommand)
|
|
104
|
+
):
|
|
105
|
+
break
|
|
106
|
+
commands.extend(
|
|
107
|
+
_parse_standard_commands(default_commands, action.strip(), flows, **kwargs)
|
|
108
|
+
)
|
|
109
|
+
if additional_commands:
|
|
110
|
+
commands.extend(
|
|
111
|
+
_parse_custom_commands(
|
|
112
|
+
additional_commands, action.strip(), flows, **kwargs
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
return commands
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _parse_standard_commands(
|
|
119
|
+
standard_commands: List[Type[Command]],
|
|
120
|
+
action: str,
|
|
121
|
+
flows: FlowsList,
|
|
122
|
+
**kwargs: Any,
|
|
123
|
+
) -> List[Command]:
|
|
124
|
+
"""Parse predefined standard commands."""
|
|
125
|
+
commands: List[Command] = []
|
|
126
|
+
for command_clz in standard_commands:
|
|
127
|
+
pattern = _get_compiled_pattern(command_clz.regex_pattern())
|
|
128
|
+
if match := pattern.search(action):
|
|
129
|
+
parsed_command = command_clz.from_dsl(match, **kwargs)
|
|
130
|
+
if _additional_parsing_fn := _get_additional_parsing_logic(command_clz):
|
|
131
|
+
parsed_command = _additional_parsing_fn(parsed_command, flows, **kwargs)
|
|
132
|
+
if parsed_command:
|
|
133
|
+
commands.append(parsed_command)
|
|
134
|
+
return commands
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _parse_custom_commands(
|
|
138
|
+
custom_commands: List[Type[Command]],
|
|
139
|
+
action: str,
|
|
140
|
+
flows: FlowsList,
|
|
141
|
+
**kwargs: Any,
|
|
142
|
+
) -> List[Command]:
|
|
143
|
+
"""Parse custom commands."""
|
|
144
|
+
commands: List[Command] = []
|
|
145
|
+
for command_clz in custom_commands:
|
|
146
|
+
pattern = _get_compiled_pattern(command_clz.regex_pattern())
|
|
147
|
+
if match := pattern.search(action):
|
|
148
|
+
if parsed_command := command_clz.from_dsl(match, flows=flows, **kwargs):
|
|
149
|
+
commands.append(parsed_command)
|
|
150
|
+
return commands
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _parse_set_slot_command(
|
|
154
|
+
parsed_command: Optional[SetSlotCommand], flows: FlowsList, **kwargs: Any
|
|
155
|
+
) -> Optional[Command]:
|
|
156
|
+
"""Additional parsing logic for the SetSlotCommand."""
|
|
157
|
+
if not parsed_command:
|
|
158
|
+
return None
|
|
159
|
+
# error case where the llm tries to start a flow using a slot set
|
|
160
|
+
if parsed_command.name == "flow_name":
|
|
161
|
+
return start_flow_by_name(parsed_command.value, flows)
|
|
162
|
+
return parsed_command
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _parse_clarify_command(
|
|
166
|
+
parsed_command: Optional[ClarifyCommand], flows: FlowsList, **kwargs: Any
|
|
167
|
+
) -> Optional[Command]:
|
|
168
|
+
"""Additional parsing logic for the ClarifyCommand."""
|
|
169
|
+
if not parsed_command:
|
|
170
|
+
return None
|
|
171
|
+
|
|
172
|
+
# if no options are available
|
|
173
|
+
if not parsed_command.options:
|
|
174
|
+
# Return the command if options are optional; else, return an empty list
|
|
175
|
+
return (
|
|
176
|
+
ClarifyCommand([])
|
|
177
|
+
if kwargs.get("clarify_options_optional", False)
|
|
178
|
+
else None
|
|
179
|
+
)
|
|
180
|
+
valid_options = [
|
|
181
|
+
flow for flow in parsed_command.options if flow in flows.user_flow_ids
|
|
182
|
+
]
|
|
183
|
+
unique_valid_options = list(set(valid_options))
|
|
184
|
+
|
|
185
|
+
# if there is only one valid option, start the flow
|
|
186
|
+
if len(unique_valid_options) == 1:
|
|
187
|
+
return start_flow_by_name(valid_options[0], flows)
|
|
188
|
+
|
|
189
|
+
# if there are multiple valid options, return a clarify command
|
|
190
|
+
if len(valid_options) > 1:
|
|
191
|
+
return ClarifyCommand(valid_options)
|
|
192
|
+
return None
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _parse_start_flow_command(
|
|
196
|
+
parsed_command: Optional[StartFlowCommand], flows: FlowsList, **kwargs: Any
|
|
197
|
+
) -> Optional[Command]:
|
|
198
|
+
"""Additional parsing logic for the StartFlowCommand."""
|
|
199
|
+
if not parsed_command:
|
|
200
|
+
return None
|
|
201
|
+
return start_flow_by_name(parsed_command.flow, flows)
|
|
@@ -18,7 +18,7 @@ flows within a conversational context.
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
import importlib
|
|
21
|
-
from typing import
|
|
21
|
+
from typing import Any, Dict, List, Optional, Text
|
|
22
22
|
|
|
23
23
|
import structlog
|
|
24
24
|
from jinja2 import Template
|
|
@@ -27,19 +27,19 @@ from langchain.schema.embeddings import Embeddings
|
|
|
27
27
|
from langchain_community.vectorstores.faiss import FAISS
|
|
28
28
|
from langchain_community.vectorstores.utils import DistanceStrategy
|
|
29
29
|
|
|
30
|
+
import rasa.shared.utils.io
|
|
30
31
|
from rasa.engine.storage.resource import Resource
|
|
31
32
|
from rasa.engine.storage.storage import ModelStorage
|
|
32
|
-
import rasa.shared.utils.io
|
|
33
33
|
from rasa.shared.constants import (
|
|
34
34
|
EMBEDDINGS_CONFIG_KEY,
|
|
35
|
-
PROVIDER_CONFIG_KEY,
|
|
36
35
|
OPENAI_PROVIDER,
|
|
36
|
+
PROVIDER_CONFIG_KEY,
|
|
37
37
|
)
|
|
38
38
|
from rasa.shared.core.domain import Domain
|
|
39
39
|
from rasa.shared.core.flows import FlowsList
|
|
40
40
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
41
41
|
from rasa.shared.exceptions import ProviderClientAPIException
|
|
42
|
-
from rasa.shared.nlu.constants import
|
|
42
|
+
from rasa.shared.nlu.constants import FLOWS_FROM_SEMANTIC_SEARCH, TEXT
|
|
43
43
|
from rasa.shared.nlu.training_data.message import Message
|
|
44
44
|
from rasa.shared.providers.embedding._langchain_embedding_client_adapter import (
|
|
45
45
|
_LangchainEmbeddingClientAdapter,
|
|
@@ -48,13 +48,13 @@ from rasa.shared.utils.health_check.embeddings_health_check_mixin import (
|
|
|
48
48
|
EmbeddingsHealthCheckMixin,
|
|
49
49
|
)
|
|
50
50
|
from rasa.shared.utils.llm import (
|
|
51
|
-
tracker_as_readable_transcript,
|
|
52
|
-
embedder_factory,
|
|
53
51
|
DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
|
|
54
52
|
USER,
|
|
55
|
-
get_prompt_template,
|
|
56
53
|
allowed_values_for_slot,
|
|
54
|
+
embedder_factory,
|
|
55
|
+
get_prompt_template,
|
|
57
56
|
resolve_model_client_config,
|
|
57
|
+
tracker_as_readable_transcript,
|
|
58
58
|
)
|
|
59
59
|
|
|
60
60
|
DEFAULT_FLOW_DOCUMENT_TEMPLATE = importlib.resources.read_text(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
2
|
from functools import lru_cache
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Any, Dict, List, Optional, Text, Tuple, Union
|
|
4
4
|
|
|
5
5
|
import structlog
|
|
6
6
|
from jinja2 import Template
|
|
@@ -8,30 +8,29 @@ from jinja2 import Template
|
|
|
8
8
|
import rasa.shared.utils.io
|
|
9
9
|
from rasa.dialogue_understanding.commands import (
|
|
10
10
|
Command,
|
|
11
|
-
StartFlowCommand,
|
|
12
11
|
)
|
|
13
12
|
from rasa.dialogue_understanding.generator import CommandGenerator
|
|
14
13
|
from rasa.dialogue_understanding.generator.constants import (
|
|
15
14
|
DEFAULT_LLM_CONFIG,
|
|
16
|
-
LLM_CONFIG_KEY,
|
|
17
|
-
FLOW_RETRIEVAL_KEY,
|
|
18
15
|
FLOW_RETRIEVAL_ACTIVE_KEY,
|
|
19
16
|
FLOW_RETRIEVAL_FLOW_THRESHOLD,
|
|
17
|
+
FLOW_RETRIEVAL_KEY,
|
|
18
|
+
LLM_CONFIG_KEY,
|
|
20
19
|
)
|
|
21
20
|
from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
|
|
22
|
-
from rasa.engine.graph import
|
|
21
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
23
22
|
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
24
23
|
from rasa.engine.storage.resource import Resource
|
|
25
24
|
from rasa.engine.storage.storage import ModelStorage
|
|
26
25
|
from rasa.shared.core.domain import Domain
|
|
27
|
-
from rasa.shared.core.flows import
|
|
26
|
+
from rasa.shared.core.flows import Flow, FlowsList, FlowStep
|
|
28
27
|
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
29
28
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
30
|
-
from rasa.shared.exceptions import FileIOException
|
|
31
|
-
from rasa.shared.exceptions import ProviderClientAPIException
|
|
29
|
+
from rasa.shared.exceptions import FileIOException, ProviderClientAPIException
|
|
32
30
|
from rasa.shared.nlu.constants import FLOWS_IN_PROMPT
|
|
33
31
|
from rasa.shared.nlu.training_data.message import Message
|
|
34
32
|
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
33
|
+
from rasa.shared.providers.llm.llm_response import LLMResponse
|
|
35
34
|
from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
|
|
36
35
|
from rasa.shared.utils.llm import (
|
|
37
36
|
allowed_values_for_slot,
|
|
@@ -304,22 +303,21 @@ class LLMBasedCommandGenerator(
|
|
|
304
303
|
)
|
|
305
304
|
return filtered_flows
|
|
306
305
|
|
|
307
|
-
async def invoke_llm(self, prompt: Text) -> Optional[
|
|
306
|
+
async def invoke_llm(self, prompt: Text) -> Optional[LLMResponse]:
|
|
308
307
|
"""Use LLM to generate a response.
|
|
309
308
|
|
|
310
309
|
Args:
|
|
311
310
|
prompt: The prompt to send to the LLM.
|
|
312
311
|
|
|
313
312
|
Returns:
|
|
314
|
-
|
|
313
|
+
An LLMResponse object.
|
|
315
314
|
|
|
316
315
|
Raises:
|
|
317
|
-
ProviderClientAPIException
|
|
316
|
+
ProviderClientAPIException: If an error occurs during the LLM API call.
|
|
318
317
|
"""
|
|
319
318
|
llm = llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
|
|
320
319
|
try:
|
|
321
|
-
|
|
322
|
-
return llm_response.choices[0]
|
|
320
|
+
return await llm.acompletion(prompt)
|
|
323
321
|
except Exception as e:
|
|
324
322
|
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
325
323
|
# we have to catch all exceptions here
|
|
@@ -328,50 +326,6 @@ class LLMBasedCommandGenerator(
|
|
|
328
326
|
message="LLM call exception", original_exception=e
|
|
329
327
|
)
|
|
330
328
|
|
|
331
|
-
@staticmethod
|
|
332
|
-
def start_flow_by_name(flow_name: str, flows: FlowsList) -> List[Command]:
|
|
333
|
-
"""Start a flow by name.
|
|
334
|
-
|
|
335
|
-
If the flow does not exist, no command is returned.
|
|
336
|
-
"""
|
|
337
|
-
if flow_name in flows.user_flow_ids:
|
|
338
|
-
return [StartFlowCommand(flow=flow_name)]
|
|
339
|
-
else:
|
|
340
|
-
structlogger.debug(
|
|
341
|
-
"llm_command_generator.flow.start_invalid_flow_id", flow=flow_name
|
|
342
|
-
)
|
|
343
|
-
return []
|
|
344
|
-
|
|
345
|
-
@staticmethod
|
|
346
|
-
def is_none_value(value: str) -> bool:
|
|
347
|
-
"""Check if the value is a none value."""
|
|
348
|
-
return value in {
|
|
349
|
-
"[missing information]",
|
|
350
|
-
"[missing]",
|
|
351
|
-
"None",
|
|
352
|
-
"undefined",
|
|
353
|
-
"null",
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
@staticmethod
|
|
357
|
-
def clean_extracted_value(value: str) -> str:
|
|
358
|
-
"""Clean up the extracted value from the llm."""
|
|
359
|
-
# replace any combination of single quotes, double quotes, and spaces
|
|
360
|
-
# from the beginning and end of the string
|
|
361
|
-
return value.strip("'\" ")
|
|
362
|
-
|
|
363
|
-
@classmethod
|
|
364
|
-
def get_nullable_slot_value(cls, slot_value: str) -> Union[str, None]:
|
|
365
|
-
"""Get the slot value or None if the value is a none value.
|
|
366
|
-
|
|
367
|
-
Args:
|
|
368
|
-
slot_value: the value to coerce
|
|
369
|
-
|
|
370
|
-
Returns:
|
|
371
|
-
The slot value or None if the value is a none value.
|
|
372
|
-
"""
|
|
373
|
-
return slot_value if not cls.is_none_value(slot_value) else None
|
|
374
|
-
|
|
375
329
|
def prepare_flows_for_template(
|
|
376
330
|
self, flows: FlowsList, tracker: DialogueStateTracker
|
|
377
331
|
) -> List[Dict[str, Any]]:
|
|
@@ -10,6 +10,7 @@ from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
|
10
10
|
from rasa.engine.storage.resource import Resource
|
|
11
11
|
from rasa.engine.storage.storage import ModelStorage
|
|
12
12
|
from rasa.shared.exceptions import ProviderClientAPIException
|
|
13
|
+
from rasa.shared.providers.llm.llm_response import LLMResponse
|
|
13
14
|
from rasa.shared.utils.io import raise_deprecation_warning
|
|
14
15
|
|
|
15
16
|
structlogger = structlog.get_logger()
|
|
@@ -53,7 +54,7 @@ class LLMCommandGenerator(SingleStepLLMCommandGenerator):
|
|
|
53
54
|
**kwargs,
|
|
54
55
|
)
|
|
55
56
|
|
|
56
|
-
async def invoke_llm(self, prompt: Text) -> Optional[
|
|
57
|
+
async def invoke_llm(self, prompt: Text) -> Optional[LLMResponse]:
|
|
57
58
|
try:
|
|
58
59
|
return await super().invoke_llm(prompt)
|
|
59
60
|
except ProviderClientAPIException:
|
|
@@ -1,63 +1,63 @@
|
|
|
1
1
|
import importlib.resources
|
|
2
|
-
import
|
|
3
|
-
from typing import Dict, Any, List, Optional, Tuple, Union, Text
|
|
2
|
+
from typing import Any, Dict, List, Optional, Text, Tuple, Union
|
|
4
3
|
|
|
5
4
|
import structlog
|
|
6
5
|
from jinja2 import Template
|
|
7
6
|
|
|
8
7
|
import rasa.shared.utils.io
|
|
9
8
|
from rasa.dialogue_understanding.commands import (
|
|
9
|
+
CannotHandleCommand,
|
|
10
|
+
ChangeFlowCommand,
|
|
10
11
|
Command,
|
|
11
12
|
ErrorCommand,
|
|
12
13
|
SetSlotCommand,
|
|
13
|
-
CancelFlowCommand,
|
|
14
14
|
StartFlowCommand,
|
|
15
|
-
HumanHandoffCommand,
|
|
16
|
-
ChitChatAnswerCommand,
|
|
17
|
-
SkipQuestionCommand,
|
|
18
|
-
KnowledgeAnswerCommand,
|
|
19
|
-
ClarifyCommand,
|
|
20
|
-
CannotHandleCommand,
|
|
21
15
|
)
|
|
22
|
-
from rasa.dialogue_understanding.commands.
|
|
16
|
+
from rasa.dialogue_understanding.commands.can_not_handle_command import (
|
|
17
|
+
DATA_KEY_CANNOT_HANDLE_REASON,
|
|
18
|
+
)
|
|
19
|
+
from rasa.dialogue_understanding.generator.command_parser import (
|
|
20
|
+
parse_commands as parse_commands_using_command_parsers,
|
|
21
|
+
)
|
|
23
22
|
from rasa.dialogue_understanding.generator.constants import (
|
|
23
|
+
DEFAULT_LLM_CONFIG,
|
|
24
|
+
FLOW_RETRIEVAL_KEY,
|
|
24
25
|
LLM_CONFIG_KEY,
|
|
25
26
|
USER_INPUT_CONFIG_KEY,
|
|
26
|
-
FLOW_RETRIEVAL_KEY,
|
|
27
|
-
DEFAULT_LLM_CONFIG,
|
|
28
27
|
)
|
|
29
28
|
from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
|
|
30
29
|
from rasa.dialogue_understanding.generator.llm_based_command_generator import (
|
|
31
30
|
LLMBasedCommandGenerator,
|
|
32
31
|
)
|
|
33
32
|
from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
|
|
34
|
-
from rasa.dialogue_understanding.stack.utils import
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
from rasa.dialogue_understanding.stack.utils import top_flow_frame, top_user_flow_frame
|
|
34
|
+
from rasa.dialogue_understanding.utils import (
|
|
35
|
+
add_commands_to_message_parse_data,
|
|
36
|
+
add_prompt_to_message_parse_data,
|
|
38
37
|
)
|
|
39
38
|
from rasa.engine.graph import ExecutionContext
|
|
40
39
|
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
41
40
|
from rasa.engine.storage.resource import Resource
|
|
42
41
|
from rasa.engine.storage.storage import ModelStorage
|
|
43
42
|
from rasa.shared.constants import (
|
|
44
|
-
RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED,
|
|
45
43
|
EMBEDDINGS_CONFIG_KEY,
|
|
44
|
+
RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED,
|
|
45
|
+
ROUTE_TO_CALM_SLOT,
|
|
46
46
|
)
|
|
47
|
-
from rasa.shared.
|
|
48
|
-
from rasa.shared.core.flows import FlowStep, Flow, FlowsList
|
|
47
|
+
from rasa.shared.core.flows import Flow, FlowsList, FlowStep
|
|
49
48
|
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
50
49
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
51
50
|
from rasa.shared.exceptions import ProviderClientAPIException
|
|
52
51
|
from rasa.shared.nlu.constants import TEXT
|
|
53
52
|
from rasa.shared.nlu.training_data.message import Message
|
|
53
|
+
from rasa.shared.providers.llm.llm_response import LLMResponse
|
|
54
54
|
from rasa.shared.utils.io import deep_container_fingerprint
|
|
55
55
|
from rasa.shared.utils.llm import (
|
|
56
|
-
get_prompt_template,
|
|
57
|
-
tracker_as_readable_transcript,
|
|
58
|
-
sanitize_message_for_prompt,
|
|
59
56
|
allowed_values_for_slot,
|
|
57
|
+
get_prompt_template,
|
|
60
58
|
resolve_model_client_config,
|
|
59
|
+
sanitize_message_for_prompt,
|
|
60
|
+
tracker_as_readable_transcript,
|
|
61
61
|
)
|
|
62
62
|
|
|
63
63
|
# multistep template keys
|
|
@@ -199,7 +199,7 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
199
199
|
message, flows, tracker
|
|
200
200
|
)
|
|
201
201
|
commands = self._clean_up_commands(commands)
|
|
202
|
-
|
|
202
|
+
add_commands_to_message_parse_data(
|
|
203
203
|
message, MultiStepLLMCommandGenerator.__name__, commands
|
|
204
204
|
)
|
|
205
205
|
except ProviderClientAPIException:
|
|
@@ -242,86 +242,15 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
242
242
|
Returns:
|
|
243
243
|
The parsed commands.
|
|
244
244
|
"""
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
245
|
+
commands = parse_commands_using_command_parsers(
|
|
246
|
+
actions,
|
|
247
|
+
flows,
|
|
248
|
+
is_handle_flows_prompt=is_handle_flows_prompt,
|
|
249
|
+
additional_commands=[CannotHandleCommand, ChangeFlowCommand],
|
|
250
|
+
data={
|
|
251
|
+
DATA_KEY_CANNOT_HANDLE_REASON: RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED
|
|
252
|
+
},
|
|
252
253
|
)
|
|
253
|
-
start_flow_re = re.compile(r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)")
|
|
254
|
-
change_flow_re = re.compile(r"ChangeFlow\(\)")
|
|
255
|
-
cancel_flow_re = re.compile(r"CancelFlow\(\)")
|
|
256
|
-
chitchat_re = re.compile(r"ChitChat\(\)")
|
|
257
|
-
skip_question_re = re.compile(r"SkipQuestion\(\)")
|
|
258
|
-
knowledge_re = re.compile(r"SearchAndReply\(\)")
|
|
259
|
-
humand_handoff_re = re.compile(r"HumanHandoff\(\)")
|
|
260
|
-
clarify_re = re.compile(r"Clarify\(([\"\'a-zA-Z0-9_, ]+)\)")
|
|
261
|
-
cannot_handle_re = re.compile(r"CannotHandle\(\)")
|
|
262
|
-
|
|
263
|
-
for action in actions.strip().splitlines():
|
|
264
|
-
if is_handle_flows_prompt:
|
|
265
|
-
if (
|
|
266
|
-
len(commands) >= 2
|
|
267
|
-
or len(commands) == 1
|
|
268
|
-
and isinstance(commands[0], ClarifyCommand)
|
|
269
|
-
):
|
|
270
|
-
break
|
|
271
|
-
|
|
272
|
-
if cannot_handle_re.search(action):
|
|
273
|
-
commands.append(
|
|
274
|
-
CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)
|
|
275
|
-
)
|
|
276
|
-
if match := slot_set_re.search(action):
|
|
277
|
-
slot_name = cls.clean_extracted_value(match.group(1).strip())
|
|
278
|
-
slot_value = cls.clean_extracted_value(match.group(2))
|
|
279
|
-
# error case where the llm tries to start a flow using a slot set
|
|
280
|
-
if slot_name == "flow_name":
|
|
281
|
-
commands.extend(cls.start_flow_by_name(slot_value, flows))
|
|
282
|
-
else:
|
|
283
|
-
typed_slot_value = cls.get_nullable_slot_value(slot_value)
|
|
284
|
-
commands.append(
|
|
285
|
-
SetSlotCommand(name=slot_name, value=typed_slot_value)
|
|
286
|
-
)
|
|
287
|
-
elif match := start_flow_re.search(action):
|
|
288
|
-
flow_name = match.group(1).strip()
|
|
289
|
-
commands.extend(cls.start_flow_by_name(flow_name, flows))
|
|
290
|
-
elif cancel_flow_re.search(action):
|
|
291
|
-
commands.append(CancelFlowCommand())
|
|
292
|
-
elif chitchat_re.search(action):
|
|
293
|
-
commands.append(ChitChatAnswerCommand())
|
|
294
|
-
elif skip_question_re.search(action):
|
|
295
|
-
commands.append(SkipQuestionCommand())
|
|
296
|
-
elif knowledge_re.search(action):
|
|
297
|
-
commands.append(KnowledgeAnswerCommand())
|
|
298
|
-
elif humand_handoff_re.search(action):
|
|
299
|
-
commands.append(HumanHandoffCommand())
|
|
300
|
-
elif match := clarify_re.search(action):
|
|
301
|
-
options = sorted([opt.strip() for opt in match.group(1).split(",")])
|
|
302
|
-
# Remove surrounding quotes if present
|
|
303
|
-
cleaned_options = []
|
|
304
|
-
for flow in options:
|
|
305
|
-
if (flow.startswith('"') and flow.endswith('"')) or (
|
|
306
|
-
flow.startswith("'") and flow.endswith("'")
|
|
307
|
-
):
|
|
308
|
-
cleaned_options.append(flow[1:-1])
|
|
309
|
-
else:
|
|
310
|
-
cleaned_options.append(flow)
|
|
311
|
-
# check if flow is valid
|
|
312
|
-
valid_options = [
|
|
313
|
-
flow
|
|
314
|
-
for flow in cleaned_options
|
|
315
|
-
if flow in flows.user_flow_ids
|
|
316
|
-
and flow not in user_flows_on_the_stack(tracker.stack)
|
|
317
|
-
]
|
|
318
|
-
if len(valid_options) == 1:
|
|
319
|
-
commands.extend(cls.start_flow_by_name(valid_options[0], flows))
|
|
320
|
-
elif 1 < len(valid_options) <= 5:
|
|
321
|
-
commands.append(ClarifyCommand(valid_options))
|
|
322
|
-
elif change_flow_re.search(action):
|
|
323
|
-
commands.append(ChangeFlowCommand())
|
|
324
|
-
|
|
325
254
|
if not commands:
|
|
326
255
|
structlogger.debug(
|
|
327
256
|
"multi_step_llm_command_generator.parse_commands",
|
|
@@ -535,7 +464,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
535
464
|
prompt=prompt,
|
|
536
465
|
)
|
|
537
466
|
|
|
538
|
-
|
|
467
|
+
response = await self.invoke_llm(prompt)
|
|
468
|
+
llm_response = LLMResponse.ensure_llm_response(response)
|
|
469
|
+
actions = None
|
|
470
|
+
if llm_response and llm_response.choices:
|
|
471
|
+
actions = llm_response.choices[0]
|
|
472
|
+
|
|
539
473
|
structlogger.debug(
|
|
540
474
|
"multi_step_llm_command_generator"
|
|
541
475
|
".predict_commands_for_active_flow"
|
|
@@ -546,11 +480,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
546
480
|
commands = self.parse_commands(actions, tracker, available_flows)
|
|
547
481
|
|
|
548
482
|
if commands:
|
|
549
|
-
|
|
550
|
-
message,
|
|
551
|
-
MultiStepLLMCommandGenerator.__name__,
|
|
552
|
-
"fill_slots_for_active_flow_prompt",
|
|
553
|
-
prompt,
|
|
483
|
+
add_prompt_to_message_parse_data(
|
|
484
|
+
message=message,
|
|
485
|
+
component_name=MultiStepLLMCommandGenerator.__name__,
|
|
486
|
+
prompt_name="fill_slots_for_active_flow_prompt",
|
|
487
|
+
user_prompt=prompt,
|
|
488
|
+
llm_response=llm_response,
|
|
554
489
|
)
|
|
555
490
|
|
|
556
491
|
return commands
|
|
@@ -584,7 +519,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
584
519
|
prompt=prompt,
|
|
585
520
|
)
|
|
586
521
|
|
|
587
|
-
|
|
522
|
+
response = await self.invoke_llm(prompt)
|
|
523
|
+
llm_response = LLMResponse.ensure_llm_response(response)
|
|
524
|
+
actions = None
|
|
525
|
+
if llm_response and llm_response.choices:
|
|
526
|
+
actions = llm_response.choices[0]
|
|
527
|
+
|
|
588
528
|
structlogger.debug(
|
|
589
529
|
"multi_step_llm_command_generator"
|
|
590
530
|
".predict_commands_for_handling_flows"
|
|
@@ -597,11 +537,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
597
537
|
commands = self._filter_redundant_start_flow_commands(tracker, commands)
|
|
598
538
|
|
|
599
539
|
if commands:
|
|
600
|
-
|
|
601
|
-
message,
|
|
602
|
-
MultiStepLLMCommandGenerator.__name__,
|
|
603
|
-
"handle_flows_prompt",
|
|
604
|
-
prompt,
|
|
540
|
+
add_prompt_to_message_parse_data(
|
|
541
|
+
message=message,
|
|
542
|
+
component_name=MultiStepLLMCommandGenerator.__name__,
|
|
543
|
+
prompt_name="handle_flows_prompt",
|
|
544
|
+
user_prompt=prompt,
|
|
545
|
+
llm_response=llm_response,
|
|
605
546
|
)
|
|
606
547
|
|
|
607
548
|
return commands
|
|
@@ -668,7 +609,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
668
609
|
prompt=prompt,
|
|
669
610
|
)
|
|
670
611
|
|
|
671
|
-
|
|
612
|
+
response = await self.invoke_llm(prompt)
|
|
613
|
+
llm_response = LLMResponse.ensure_llm_response(response)
|
|
614
|
+
actions = None
|
|
615
|
+
if llm_response and llm_response.choices:
|
|
616
|
+
actions = llm_response.choices[0]
|
|
617
|
+
|
|
672
618
|
structlogger.debug(
|
|
673
619
|
"multi_step_llm_command_generator"
|
|
674
620
|
".predict_commands_for_newly_started_flow"
|
|
@@ -694,11 +640,12 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
|
694
640
|
)
|
|
695
641
|
|
|
696
642
|
if commands:
|
|
697
|
-
|
|
698
|
-
message,
|
|
699
|
-
MultiStepLLMCommandGenerator.__name__,
|
|
700
|
-
"fill_slots_for_new_flow_prompt",
|
|
701
|
-
prompt,
|
|
643
|
+
add_prompt_to_message_parse_data(
|
|
644
|
+
message=message,
|
|
645
|
+
component_name=MultiStepLLMCommandGenerator.__name__,
|
|
646
|
+
prompt_name="fill_slots_for_new_flow_prompt",
|
|
647
|
+
user_prompt=prompt,
|
|
648
|
+
llm_response=llm_response,
|
|
702
649
|
)
|
|
703
650
|
|
|
704
651
|
return commands
|