rasa-pro 3.12.0.dev2__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 -119
- 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 -26
- 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 -79
- 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.dev2.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/_configs/azure_entra_id_client_creds.py +0 -40
- rasa/shared/providers/_configs/azure_entra_id_config.py +0 -533
- rasa/shared/providers/_configs/oauth_config.py +0 -33
- rasa/shared/providers/constants.py +0 -6
- rasa_pro-3.12.0.dev2.dist-info/RECORD +0 -793
- {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
- {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
- {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev3.dist-info}/entry_points.txt +0 -0
rasa/core/channels/telegram.py
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
import asyncio
|
|
2
1
|
import json
|
|
3
2
|
import logging
|
|
4
3
|
from copy import deepcopy
|
|
5
|
-
from
|
|
6
|
-
|
|
7
|
-
from sanic.response import HTTPResponse
|
|
4
|
+
from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
|
|
5
|
+
|
|
8
6
|
from aiogram import Bot
|
|
7
|
+
from aiogram.exceptions import TelegramAPIError
|
|
9
8
|
from aiogram.types import (
|
|
10
9
|
InlineKeyboardButton,
|
|
11
|
-
Update,
|
|
12
|
-
InlineKeyboardMarkup,
|
|
13
10
|
KeyboardButton,
|
|
14
|
-
ReplyKeyboardMarkup,
|
|
15
11
|
Message,
|
|
12
|
+
Update,
|
|
16
13
|
)
|
|
17
|
-
from aiogram.utils.
|
|
18
|
-
|
|
14
|
+
from aiogram.utils.keyboard import (
|
|
15
|
+
InlineKeyboardBuilder,
|
|
16
|
+
KeyboardBuilder,
|
|
17
|
+
ReplyKeyboardBuilder,
|
|
18
|
+
)
|
|
19
|
+
from sanic import Blueprint, response
|
|
20
|
+
from sanic.request import Request
|
|
21
|
+
from sanic.response import HTTPResponse
|
|
19
22
|
|
|
20
|
-
from rasa.core.channels.channel import InputChannel,
|
|
23
|
+
from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
|
|
21
24
|
from rasa.shared.constants import INTENT_MESSAGE_PREFIX
|
|
22
25
|
from rasa.shared.core.constants import USER_INTENT_RESTART
|
|
23
26
|
from rasa.shared.exceptions import RasaException
|
|
@@ -68,33 +71,37 @@ class TelegramOutput(Bot, OutputChannel):
|
|
|
68
71
|
:button_type reply: reply keyboard
|
|
69
72
|
"""
|
|
70
73
|
if button_type == "inline":
|
|
71
|
-
|
|
74
|
+
reply_markup_builder: KeyboardBuilder = InlineKeyboardBuilder()
|
|
72
75
|
button_list = [
|
|
73
|
-
InlineKeyboardButton(s["title"], callback_data=s["payload"])
|
|
76
|
+
InlineKeyboardButton(text=s["title"], callback_data=s["payload"])
|
|
74
77
|
for s in buttons
|
|
75
78
|
]
|
|
76
|
-
|
|
79
|
+
reply_markup_builder.row(*button_list)
|
|
80
|
+
reply_markup = reply_markup_builder.as_markup()
|
|
77
81
|
|
|
78
82
|
elif button_type == "vertical":
|
|
79
|
-
|
|
83
|
+
reply_markup_builder = InlineKeyboardBuilder()
|
|
80
84
|
[
|
|
81
|
-
|
|
82
|
-
InlineKeyboardButton(s["title"], callback_data=s["payload"])
|
|
85
|
+
reply_markup_builder.row(
|
|
86
|
+
InlineKeyboardButton(text=s["title"], callback_data=s["payload"])
|
|
83
87
|
)
|
|
84
88
|
for s in buttons
|
|
85
89
|
]
|
|
90
|
+
reply_markup = reply_markup_builder.as_markup()
|
|
86
91
|
|
|
87
92
|
elif button_type == "reply":
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
)
|
|
91
|
-
# drop button_type from button_list
|
|
92
|
-
button_list = [b for b in buttons if b.get("title")]
|
|
93
|
+
reply_markup_builder = ReplyKeyboardBuilder()
|
|
94
|
+
|
|
93
95
|
for idx, button in enumerate(buttons):
|
|
94
96
|
if isinstance(button, list):
|
|
95
|
-
|
|
97
|
+
reply_markup_builder.add(
|
|
98
|
+
*[KeyboardButton(text=s["title"]) for s in button]
|
|
99
|
+
)
|
|
96
100
|
else:
|
|
97
|
-
|
|
101
|
+
reply_markup_builder.add(KeyboardButton(text=button["title"]))
|
|
102
|
+
reply_markup = reply_markup_builder.as_markup(
|
|
103
|
+
resize_keyboard=False, one_time_keyboard=True
|
|
104
|
+
)
|
|
98
105
|
else:
|
|
99
106
|
logger.error(
|
|
100
107
|
"Trying to send text with buttons for unknown button type {}".format(
|
|
@@ -205,13 +212,14 @@ class TelegramInput(InputChannel):
|
|
|
205
212
|
|
|
206
213
|
@telegram_webhook.route("/set_webhook", methods=["GET", "POST"])
|
|
207
214
|
async def set_webhook(_: Request) -> HTTPResponse:
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
+
try:
|
|
216
|
+
await self.set_webhook(out_channel)
|
|
217
|
+
except RasaException as exc:
|
|
218
|
+
logger.error(exc)
|
|
219
|
+
return response.text(str(exc))
|
|
220
|
+
|
|
221
|
+
logger.info("Webhook Setup Successful")
|
|
222
|
+
return response.text("Webhook setup successful")
|
|
215
223
|
|
|
216
224
|
@telegram_webhook.route("/webhook", methods=["GET", "POST"])
|
|
217
225
|
async def message(request: Request) -> Any:
|
|
@@ -226,24 +234,49 @@ class TelegramInput(InputChannel):
|
|
|
226
234
|
return response.text("failed")
|
|
227
235
|
|
|
228
236
|
if self._is_button(update):
|
|
229
|
-
msg =
|
|
230
|
-
|
|
237
|
+
msg = (
|
|
238
|
+
update.callback_query.message
|
|
239
|
+
if update.callback_query is not None
|
|
240
|
+
else None
|
|
241
|
+
)
|
|
242
|
+
text = (
|
|
243
|
+
update.callback_query.data
|
|
244
|
+
if update.callback_query is not None
|
|
245
|
+
else None
|
|
246
|
+
)
|
|
231
247
|
elif self._is_edited_message(update):
|
|
232
248
|
msg = update.edited_message
|
|
233
|
-
text =
|
|
249
|
+
text = (
|
|
250
|
+
update.edited_message.text
|
|
251
|
+
if update.edited_message is not None
|
|
252
|
+
else None
|
|
253
|
+
)
|
|
234
254
|
else:
|
|
235
255
|
msg = update.message
|
|
236
256
|
if self._is_user_message(msg):
|
|
237
|
-
text =
|
|
257
|
+
text = (
|
|
258
|
+
msg.text.replace("/bot", "")
|
|
259
|
+
if msg is not None and msg.text is not None
|
|
260
|
+
else None
|
|
261
|
+
)
|
|
238
262
|
elif self._is_location(msg):
|
|
239
|
-
text =
|
|
240
|
-
|
|
263
|
+
text = (
|
|
264
|
+
'{{"lng":{0}, "lat":{1}}}'.format(
|
|
265
|
+
msg.location.longitude, msg.location.latitude
|
|
266
|
+
)
|
|
267
|
+
if msg is not None and msg.location is not None
|
|
268
|
+
else None
|
|
241
269
|
)
|
|
242
270
|
else:
|
|
243
271
|
return response.text("success")
|
|
244
|
-
|
|
272
|
+
|
|
245
273
|
metadata = self.get_metadata(request)
|
|
246
274
|
try:
|
|
275
|
+
if msg is not None:
|
|
276
|
+
sender_id = str(msg.chat.id)
|
|
277
|
+
else:
|
|
278
|
+
raise ValueError("No message found.")
|
|
279
|
+
|
|
247
280
|
if text == (INTENT_MESSAGE_PREFIX + USER_INTENT_RESTART):
|
|
248
281
|
await on_new_message(
|
|
249
282
|
UserMessage(
|
|
@@ -286,13 +319,12 @@ class TelegramInput(InputChannel):
|
|
|
286
319
|
|
|
287
320
|
def get_output_channel(self) -> TelegramOutput:
|
|
288
321
|
"""Loads the telegram channel."""
|
|
289
|
-
|
|
322
|
+
return TelegramOutput(self.access_token)
|
|
290
323
|
|
|
324
|
+
async def set_webhook(self, channel: TelegramOutput) -> None:
|
|
291
325
|
try:
|
|
292
|
-
|
|
326
|
+
await channel.set_webhook(url=self.webhook_url)
|
|
293
327
|
except TelegramAPIError as error:
|
|
294
328
|
raise RasaException(
|
|
295
329
|
"Failed to set channel webhook: " + str(error)
|
|
296
330
|
) from error
|
|
297
|
-
|
|
298
|
-
return channel
|
rasa/core/channels/twilio.py
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Optional, Text
|
|
3
|
+
|
|
2
4
|
from sanic import Blueprint, response
|
|
3
5
|
from sanic.request import Request
|
|
4
6
|
from sanic.response import HTTPResponse
|
|
5
7
|
from twilio.base.exceptions import TwilioRestException
|
|
6
8
|
from twilio.rest import Client
|
|
7
|
-
from typing import Dict, Text, Any, Callable, Awaitable, Optional, TYPE_CHECKING
|
|
8
9
|
|
|
9
|
-
from rasa.core.channels.channel import InputChannel
|
|
10
|
-
from rasa.core.channels.channel import UserMessage, OutputChannel
|
|
10
|
+
from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
13
|
from twilio.rest.api.v2010.account.message import MessageInstance
|
rasa/core/channels/vier_cvg.py
CHANGED
|
@@ -8,10 +8,10 @@ from dataclasses import dataclass
|
|
|
8
8
|
from functools import wraps
|
|
9
9
|
from typing import Any, Awaitable, Callable, Dict, Optional, Text
|
|
10
10
|
|
|
11
|
-
import rasa.shared.utils.io
|
|
12
11
|
import structlog
|
|
13
|
-
from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
|
|
14
12
|
|
|
13
|
+
import rasa.shared.utils.io
|
|
14
|
+
from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
|
|
15
15
|
from rasa.utils.beta import ensure_beta_feature_is_enabled
|
|
16
16
|
|
|
17
17
|
# ignore ResourceWarning, InsecureRequestWarning
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import copy
|
|
2
|
-
from datetime import datetime, timezone, timedelta
|
|
3
2
|
import json
|
|
4
3
|
import uuid
|
|
5
|
-
from typing import Any, Awaitable, Callable, Dict, List, Optional, Text, Union
|
|
6
4
|
from dataclasses import asdict
|
|
5
|
+
from datetime import datetime, timedelta, timezone
|
|
6
|
+
from typing import Any, Awaitable, Callable, Dict, List, Optional, Text, Union
|
|
7
7
|
|
|
8
8
|
import structlog
|
|
9
9
|
from jsonschema import ValidationError, validate
|
|
10
|
+
from sanic import Blueprint, response
|
|
11
|
+
from sanic.exceptions import NotFound, SanicException, ServerError
|
|
12
|
+
from sanic.request import Request
|
|
13
|
+
from sanic.response import HTTPResponse
|
|
14
|
+
|
|
10
15
|
from rasa.core import jobs
|
|
11
16
|
from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
|
|
12
17
|
from rasa.core.channels.voice_ready.utils import (
|
|
13
|
-
validate_voice_license_scope,
|
|
14
18
|
CallParameters,
|
|
19
|
+
validate_voice_license_scope,
|
|
15
20
|
)
|
|
16
21
|
from rasa.shared.constants import INTENT_MESSAGE_PREFIX
|
|
17
22
|
from rasa.shared.core.constants import USER_INTENT_SESSION_START
|
|
18
23
|
from rasa.shared.exceptions import RasaException
|
|
19
|
-
from sanic import Blueprint, response
|
|
20
|
-
from sanic.exceptions import NotFound, SanicException, ServerError
|
|
21
|
-
from sanic.request import Request
|
|
22
|
-
from sanic.response import HTTPResponse
|
|
23
|
-
|
|
24
24
|
from rasa.utils.io import remove_emojis
|
|
25
25
|
|
|
26
26
|
structlogger = structlog.get_logger()
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
|
+
from sanic import Blueprint, Websocket, response # type: ignore[attr-defined]
|
|
5
|
+
from sanic.request import Request
|
|
6
|
+
from sanic.response import HTTPResponse
|
|
7
|
+
|
|
4
8
|
from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
|
|
5
9
|
from rasa.core.channels.voice_ready.jambonz_protocol import (
|
|
10
|
+
send_ws_hangup_message,
|
|
6
11
|
send_ws_text_message,
|
|
7
12
|
websocket_message_handler,
|
|
8
|
-
send_ws_hangup_message,
|
|
9
13
|
)
|
|
10
14
|
from rasa.core.channels.voice_ready.utils import validate_voice_license_scope
|
|
11
15
|
from rasa.shared.exceptions import RasaException
|
|
12
|
-
from sanic import Blueprint, response, Websocket # type: ignore[attr-defined]
|
|
13
|
-
from sanic.request import Request
|
|
14
|
-
from sanic.response import HTTPResponse
|
|
15
|
-
|
|
16
16
|
from rasa.shared.utils.common import mark_as_beta_feature
|
|
17
17
|
from rasa.utils.io import remove_emojis
|
|
18
18
|
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
from dataclasses import dataclass, field
|
|
2
1
|
import json
|
|
3
2
|
import uuid
|
|
3
|
+
from dataclasses import asdict, dataclass, field
|
|
4
4
|
from typing import Any, Awaitable, Callable, Dict, List, Text
|
|
5
5
|
|
|
6
6
|
import structlog
|
|
7
|
-
from rasa.core.channels.channel import UserMessage
|
|
8
|
-
from rasa.core.channels.voice_ready.utils import CallParameters
|
|
9
|
-
from dataclasses import asdict
|
|
10
7
|
from sanic import Websocket # type: ignore[attr-defined]
|
|
11
8
|
|
|
9
|
+
from rasa.core.channels.channel import UserMessage
|
|
10
|
+
from rasa.core.channels.voice_ready.utils import CallParameters
|
|
12
11
|
|
|
13
12
|
structlogger = structlog.get_logger()
|
|
14
13
|
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
+
from dataclasses import asdict
|
|
2
|
+
from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
|
|
3
|
+
|
|
4
|
+
import structlog
|
|
1
5
|
from sanic import Blueprint, response
|
|
2
6
|
from sanic.request import Request, RequestParameters
|
|
3
7
|
from sanic.response import HTTPResponse
|
|
4
|
-
from twilio.twiml.voice_response import
|
|
5
|
-
from typing import Text, Callable, Awaitable, List, Any, Dict, Optional
|
|
6
|
-
from dataclasses import asdict
|
|
8
|
+
from twilio.twiml.voice_response import Gather, VoiceResponse
|
|
7
9
|
|
|
8
|
-
import structlog
|
|
9
|
-
import rasa.utils.io
|
|
10
10
|
import rasa.shared.utils.io
|
|
11
|
-
|
|
12
|
-
from rasa.shared.exceptions import InvalidConfigException
|
|
11
|
+
import rasa.utils.io
|
|
13
12
|
from rasa.core.channels.channel import (
|
|
14
|
-
InputChannel,
|
|
15
13
|
CollectingOutputChannel,
|
|
14
|
+
InputChannel,
|
|
16
15
|
UserMessage,
|
|
17
16
|
)
|
|
18
17
|
from rasa.core.channels.voice_ready.utils import CallParameters
|
|
18
|
+
from rasa.shared.core.events import BotUttered
|
|
19
|
+
from rasa.shared.exceptions import InvalidConfigException
|
|
19
20
|
|
|
20
21
|
logger = structlog.get_logger(__name__)
|
|
21
22
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
import os
|
|
2
3
|
from dataclasses import dataclass
|
|
3
|
-
from typing import Any, Dict, Optional
|
|
4
|
-
import asyncio
|
|
4
|
+
from typing import Any, AsyncIterator, Dict, Optional
|
|
5
5
|
|
|
6
6
|
from rasa.core.channels.voice_stream.asr.asr_engine import ASREngine, ASREngineConfig
|
|
7
7
|
from rasa.core.channels.voice_stream.asr.asr_event import (
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, Dict, Optional
|
|
3
1
|
import json
|
|
4
2
|
import os
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, Optional
|
|
5
|
+
from urllib.parse import urlencode
|
|
5
6
|
|
|
6
7
|
import websockets
|
|
7
8
|
from websockets.legacy.client import WebSocketClientProtocol
|
|
@@ -19,11 +20,14 @@ from rasa.shared.constants import DEEPGRAM_API_KEY_ENV_VAR
|
|
|
19
20
|
@dataclass
|
|
20
21
|
class DeepgramASRConfig(ASREngineConfig):
|
|
21
22
|
endpoint: Optional[str] = None
|
|
22
|
-
# number of
|
|
23
|
+
# number of milliseconds of silence to determine end of speech
|
|
23
24
|
endpointing: Optional[int] = None
|
|
24
25
|
language: Optional[str] = None
|
|
25
26
|
model: Optional[str] = None
|
|
26
27
|
smart_format: Optional[bool] = None
|
|
28
|
+
# number of milliseconds of no new transcript to determine end of speech
|
|
29
|
+
# should be at least 1000 according to docs
|
|
30
|
+
utterance_end_ms: Optional[int] = None
|
|
27
31
|
|
|
28
32
|
|
|
29
33
|
class DeepgramASR(ASREngine[DeepgramASRConfig]):
|
|
@@ -37,22 +41,35 @@ class DeepgramASR(ASREngine[DeepgramASRConfig]):
|
|
|
37
41
|
"""Connect to the ASR system."""
|
|
38
42
|
deepgram_api_key = os.environ[DEEPGRAM_API_KEY_ENV_VAR]
|
|
39
43
|
extra_headers = {"Authorization": f"Token {deepgram_api_key}"}
|
|
40
|
-
api_url = self._get_api_url()
|
|
41
|
-
query_params = self._get_query_params()
|
|
42
44
|
return await websockets.connect( # type: ignore
|
|
43
|
-
|
|
45
|
+
self._get_api_url_with_query_params(),
|
|
44
46
|
extra_headers=extra_headers,
|
|
45
47
|
)
|
|
46
48
|
|
|
49
|
+
def _get_api_url_with_query_params(self) -> str:
|
|
50
|
+
"""Combine api url and query params."""
|
|
51
|
+
return self._get_api_url() + self._get_query_params()
|
|
52
|
+
|
|
47
53
|
def _get_api_url(self) -> str:
|
|
54
|
+
"""Get the api url with the configured endpoint."""
|
|
48
55
|
return f"wss://{self.config.endpoint}/v1/listen?"
|
|
49
56
|
|
|
50
57
|
def _get_query_params(self) -> str:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
"""Get the configured query parameters for the api."""
|
|
59
|
+
query_params = {
|
|
60
|
+
"encoding": "mulaw",
|
|
61
|
+
"sample_rate": HERTZ,
|
|
62
|
+
"endpointing": self.config.endpointing,
|
|
63
|
+
"vad_events": "true",
|
|
64
|
+
"language": self.config.language,
|
|
65
|
+
"interim_results": "true",
|
|
66
|
+
"model": self.config.model,
|
|
67
|
+
"smart_format": str(self.config.smart_format).lower(),
|
|
68
|
+
}
|
|
69
|
+
if self.config.utterance_end_ms and self.config.utterance_end_ms > 0:
|
|
70
|
+
query_params["utterance_end_ms"] = self.config.utterance_end_ms
|
|
71
|
+
|
|
72
|
+
return urlencode(query_params)
|
|
56
73
|
|
|
57
74
|
async def signal_audio_done(self) -> None:
|
|
58
75
|
"""Signal to the ASR Api that you are done sending data."""
|
|
@@ -67,24 +84,48 @@ class DeepgramASR(ASREngine[DeepgramASRConfig]):
|
|
|
67
84
|
def engine_event_to_asr_event(self, e: Any) -> Optional[ASREvent]:
|
|
68
85
|
"""Translate an engine event to a common ASREvent."""
|
|
69
86
|
data = json.loads(e)
|
|
70
|
-
|
|
71
|
-
|
|
87
|
+
data_type = data["type"]
|
|
88
|
+
if data_type == "Results":
|
|
89
|
+
transcript_data = data["channel"]["alternatives"][0]
|
|
90
|
+
transcript = transcript_data["transcript"]
|
|
72
91
|
if data["is_final"]:
|
|
73
92
|
if data.get("speech_final"):
|
|
74
|
-
full_transcript = self.
|
|
93
|
+
full_transcript = self.concatenate_transcripts(
|
|
94
|
+
self.accumulated_transcript, transcript
|
|
95
|
+
)
|
|
75
96
|
self.accumulated_transcript = ""
|
|
76
97
|
if full_transcript:
|
|
77
98
|
return NewTranscript(full_transcript)
|
|
78
99
|
else:
|
|
79
|
-
self.accumulated_transcript
|
|
100
|
+
self.accumulated_transcript = self.concatenate_transcripts(
|
|
101
|
+
self.accumulated_transcript, transcript
|
|
102
|
+
)
|
|
80
103
|
elif transcript:
|
|
81
104
|
return UserIsSpeaking()
|
|
105
|
+
# event that comes after utterance_end_ms of no new transcript
|
|
106
|
+
elif data_type == "UtteranceEnd":
|
|
107
|
+
if self.accumulated_transcript:
|
|
108
|
+
transcript = self.accumulated_transcript
|
|
109
|
+
self.accumulated_transcript = ""
|
|
110
|
+
return NewTranscript(transcript)
|
|
82
111
|
return None
|
|
83
112
|
|
|
84
113
|
@staticmethod
|
|
85
114
|
def get_default_config() -> DeepgramASRConfig:
|
|
86
|
-
return DeepgramASRConfig(
|
|
115
|
+
return DeepgramASRConfig(
|
|
116
|
+
endpoint="api.deepgram.com",
|
|
117
|
+
endpointing=400,
|
|
118
|
+
language="en",
|
|
119
|
+
model="nova-2-general",
|
|
120
|
+
smart_format=True,
|
|
121
|
+
utterance_end_ms=1000,
|
|
122
|
+
)
|
|
87
123
|
|
|
88
124
|
@classmethod
|
|
89
125
|
def from_config_dict(cls, config: Dict) -> "DeepgramASR":
|
|
90
126
|
return DeepgramASR(DeepgramASRConfig.from_dict(config))
|
|
127
|
+
|
|
128
|
+
@staticmethod
|
|
129
|
+
def concatenate_transcripts(t1: str, t2: str) -> str:
|
|
130
|
+
"""Concatenate two transcripts making sure there is a space between them."""
|
|
131
|
+
return (t1.strip() + " " + t2.strip()).strip()
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
import audioop
|
|
2
2
|
import base64
|
|
3
3
|
import json
|
|
4
|
-
|
|
5
|
-
import structlog
|
|
6
4
|
import uuid
|
|
7
5
|
from typing import Any, Awaitable, Callable, Optional, Tuple
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
from sanic import
|
|
11
|
-
|
|
7
|
+
import structlog
|
|
8
|
+
from sanic import ( # type: ignore[attr-defined]
|
|
9
|
+
Blueprint,
|
|
10
|
+
HTTPResponse,
|
|
11
|
+
Request,
|
|
12
|
+
Websocket,
|
|
13
|
+
response,
|
|
14
|
+
)
|
|
12
15
|
|
|
13
16
|
from rasa.core.channels import UserMessage
|
|
14
17
|
from rasa.core.channels.voice_ready.utils import CallParameters
|
|
18
|
+
from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
|
|
15
19
|
from rasa.core.channels.voice_stream.call_state import call_state
|
|
16
20
|
from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine
|
|
17
|
-
from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
|
|
18
21
|
from rasa.core.channels.voice_stream.voice_channel import (
|
|
19
22
|
ContinueConversationAction,
|
|
20
23
|
EndConversationAction,
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from contextvars import ContextVar
|
|
3
|
-
from werkzeug.local import LocalProxy
|
|
4
3
|
from dataclasses import dataclass
|
|
5
4
|
from typing import Optional
|
|
6
5
|
|
|
6
|
+
from werkzeug.local import LocalProxy
|
|
7
|
+
|
|
7
8
|
|
|
8
9
|
# Per voice session data
|
|
9
10
|
# This is similar to how flask makes the "request" object available as a global variable
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import AsyncIterator, Dict, Optional
|
|
3
2
|
from dataclasses import dataclass
|
|
3
|
+
from typing import AsyncIterator, Dict, Optional
|
|
4
4
|
|
|
5
5
|
import aiohttp
|
|
6
6
|
import structlog
|
|
@@ -15,7 +15,6 @@ from rasa.core.channels.voice_stream.tts.tts_engine import (
|
|
|
15
15
|
from rasa.shared.constants import AZURE_SPEECH_API_KEY_ENV_VAR
|
|
16
16
|
from rasa.shared.exceptions import ConnectionException
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
structlogger = structlog.get_logger()
|
|
20
19
|
|
|
21
20
|
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import os
|
|
1
2
|
from dataclasses import dataclass
|
|
2
3
|
from typing import AsyncIterator, Dict, Optional
|
|
3
|
-
|
|
4
|
+
|
|
4
5
|
import aiohttp
|
|
5
6
|
import structlog
|
|
6
7
|
from aiohttp import ClientConnectorError, ClientTimeout
|
|
7
8
|
|
|
9
|
+
from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
|
|
8
10
|
from rasa.core.channels.voice_stream.tts.tts_engine import (
|
|
11
|
+
TTSEngine,
|
|
9
12
|
TTSEngineConfig,
|
|
13
|
+
TTSError,
|
|
10
14
|
)
|
|
11
|
-
|
|
12
|
-
from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
|
|
13
|
-
from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine, TTSError
|
|
14
15
|
from rasa.shared.constants import CARTESIA_API_KEY_ENV_VAR
|
|
15
16
|
from rasa.shared.exceptions import ConnectionException
|
|
16
17
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
from collections import OrderedDict
|
|
3
1
|
import logging
|
|
2
|
+
from collections import OrderedDict
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
4
5
|
from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
|
|
5
6
|
|
|
6
7
|
logger = logging.getLogger(__name__)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
from typing import AsyncIterator, Dict, Generic, Optional, Tuple, Type, TypeVar
|
|
2
1
|
from dataclasses import dataclass
|
|
2
|
+
from typing import AsyncIterator, Dict, Generic, Optional, Tuple, Type, TypeVar
|
|
3
3
|
|
|
4
4
|
from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
|
|
5
5
|
from rasa.core.channels.voice_stream.util import MergeableConfig
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
import base64
|
|
2
2
|
import json
|
|
3
3
|
import uuid
|
|
4
|
-
|
|
5
|
-
import structlog
|
|
6
4
|
from typing import Any, Awaitable, Callable, Dict, Optional, Text, Tuple
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
from sanic import
|
|
10
|
-
|
|
6
|
+
import structlog
|
|
7
|
+
from sanic import ( # type: ignore[attr-defined]
|
|
8
|
+
Blueprint,
|
|
9
|
+
HTTPResponse,
|
|
10
|
+
Request,
|
|
11
|
+
Websocket,
|
|
12
|
+
response,
|
|
13
|
+
)
|
|
11
14
|
|
|
12
15
|
from rasa.core.channels import UserMessage
|
|
13
16
|
from rasa.core.channels.voice_ready.utils import CallParameters
|
|
17
|
+
from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
|
|
14
18
|
from rasa.core.channels.voice_stream.call_state import call_state
|
|
15
19
|
from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine
|
|
16
|
-
from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
|
|
17
20
|
from rasa.core.channels.voice_stream.voice_channel import (
|
|
21
|
+
ContinueConversationAction,
|
|
18
22
|
EndConversationAction,
|
|
19
23
|
NewAudioAction,
|
|
20
24
|
VoiceChannelAction,
|
|
21
|
-
ContinueConversationAction,
|
|
22
25
|
VoiceInputChannel,
|
|
23
26
|
VoiceOutputChannel,
|
|
24
27
|
)
|