rasa-pro 3.11.5__py3-none-any.whl → 3.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +10 -13
- rasa/__main__.py +7 -7
- rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
- rasa/anonymization/anonymization_pipeline.py +3 -3
- rasa/anonymization/anonymization_rule_executor.py +17 -11
- rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
- rasa/cli/arguments/data.py +2 -2
- rasa/cli/arguments/default_arguments.py +1 -1
- rasa/cli/arguments/evaluate.py +2 -1
- rasa/cli/arguments/interactive.py +1 -1
- rasa/cli/arguments/run.py +1 -1
- rasa/cli/arguments/test.py +7 -5
- rasa/cli/arguments/train.py +3 -3
- rasa/cli/arguments/visualize.py +2 -2
- rasa/cli/arguments/x.py +1 -0
- rasa/cli/data.py +20 -3
- rasa/cli/dialogue_understanding_test.py +386 -0
- rasa/cli/evaluate.py +1 -1
- rasa/cli/export.py +6 -6
- rasa/cli/inspect.py +20 -1
- rasa/cli/interactive.py +4 -5
- rasa/cli/llm_fine_tuning.py +51 -16
- rasa/cli/markers.py +1 -2
- rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
- rasa/cli/project_templates/calm/config.yml +2 -2
- rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
- rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
- rasa/cli/project_templates/calm/domain/shared.yml +1 -4
- rasa/cli/project_templates/calm/endpoints.yml +2 -2
- rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
- rasa/cli/shell.py +5 -6
- rasa/cli/studio/download.py +1 -2
- rasa/cli/studio/studio.py +2 -3
- rasa/cli/studio/train.py +0 -1
- rasa/cli/telemetry.py +2 -2
- rasa/cli/test.py +11 -11
- rasa/cli/train.py +3 -0
- rasa/cli/utils.py +25 -5
- rasa/constants.py +0 -1
- rasa/core/__init__.py +0 -1
- rasa/core/actions/action.py +135 -208
- rasa/core/actions/action_handle_digressions.py +164 -0
- rasa/core/actions/action_hangup.py +1 -1
- rasa/core/actions/action_repeat_bot_messages.py +2 -2
- rasa/core/actions/action_run_slot_rejections.py +18 -6
- rasa/core/actions/action_trigger_chitchat.py +1 -1
- rasa/core/actions/action_trigger_flow.py +5 -5
- rasa/core/actions/action_trigger_search.py +1 -1
- rasa/core/actions/custom_action_executor.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +1 -0
- rasa/core/actions/forms.py +22 -15
- rasa/core/actions/http_custom_action_executor.py +8 -1
- rasa/core/actions/loops.py +3 -3
- rasa/core/actions/two_stage_fallback.py +13 -13
- rasa/core/auth_retry_tracker_store.py +1 -2
- rasa/core/brokers/broker.py +2 -1
- rasa/core/brokers/file.py +1 -1
- rasa/core/brokers/kafka.py +8 -8
- rasa/core/brokers/pika.py +8 -9
- rasa/core/brokers/sql.py +4 -3
- rasa/core/channels/__init__.py +7 -0
- rasa/core/channels/botframework.py +2 -2
- rasa/core/channels/callback.py +4 -4
- rasa/core/channels/channel.py +11 -11
- rasa/core/channels/console.py +0 -1
- rasa/core/channels/development_inspector.py +80 -24
- rasa/core/channels/facebook.py +5 -5
- rasa/core/channels/hangouts.py +7 -8
- rasa/core/channels/inspector/dist/assets/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +1 -0
- rasa/core/channels/inspector/src/App.tsx +15 -2
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
- rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
- rasa/core/channels/inspector/yarn.lock +5 -0
- rasa/core/channels/mattermost.py +4 -4
- rasa/core/channels/rasa_chat.py +4 -4
- rasa/core/channels/rest.py +11 -12
- rasa/core/channels/rocketchat.py +4 -3
- rasa/core/channels/slack.py +6 -5
- rasa/core/channels/socketio.py +8 -28
- rasa/core/channels/studio_chat.py +212 -0
- rasa/core/channels/telegram.py +105 -55
- rasa/core/channels/twilio.py +3 -3
- rasa/core/channels/vier_cvg.py +2 -2
- rasa/core/channels/voice_ready/audiocodes.py +9 -9
- rasa/core/channels/voice_ready/jambonz.py +5 -5
- rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
- rasa/core/channels/voice_ready/twilio_voice.py +9 -8
- rasa/core/channels/voice_ready/utils.py +2 -2
- rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
- rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
- rasa/core/channels/voice_stream/asr/azure.py +16 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
- rasa/core/channels/voice_stream/audiocodes.py +292 -0
- rasa/core/channels/voice_stream/browser_audio.py +14 -7
- rasa/core/channels/voice_stream/call_state.py +6 -2
- rasa/core/channels/voice_stream/genesys.py +320 -0
- rasa/core/channels/voice_stream/tts/azure.py +13 -5
- rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
- rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
- rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
- rasa/core/channels/voice_stream/util.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +100 -56
- rasa/core/channels/webexteams.py +3 -4
- rasa/core/constants.py +2 -0
- rasa/core/evaluation/marker.py +7 -6
- rasa/core/evaluation/marker_base.py +15 -16
- rasa/core/evaluation/marker_stats.py +3 -4
- rasa/core/evaluation/marker_tracker_loader.py +5 -4
- rasa/core/exporter.py +4 -4
- rasa/core/featurizers/precomputation.py +8 -8
- rasa/core/featurizers/single_state_featurizer.py +7 -7
- rasa/core/featurizers/tracker_featurizers.py +13 -13
- rasa/core/http_interpreter.py +3 -4
- rasa/core/information_retrieval/__init__.py +1 -1
- rasa/core/information_retrieval/faiss.py +4 -4
- rasa/core/information_retrieval/information_retrieval.py +2 -2
- rasa/core/information_retrieval/milvus.py +3 -3
- rasa/core/information_retrieval/qdrant.py +3 -3
- rasa/core/jobs.py +1 -0
- rasa/core/lock.py +2 -3
- rasa/core/lock_store.py +3 -3
- rasa/core/migrate.py +12 -9
- rasa/core/nlg/__init__.py +1 -1
- rasa/core/nlg/callback.py +2 -3
- rasa/core/nlg/contextual_response_rephraser.py +82 -14
- rasa/core/nlg/generator.py +85 -17
- rasa/core/nlg/interpolator.py +4 -3
- rasa/core/nlg/response.py +9 -7
- rasa/core/nlg/summarize.py +1 -0
- rasa/core/nlg/translate.py +55 -0
- rasa/core/persistor.py +3 -3
- rasa/core/policies/ensemble.py +10 -9
- rasa/core/policies/enterprise_search_policy.py +87 -21
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
- rasa/core/policies/flow_policy.py +13 -14
- rasa/core/policies/flows/flow_executor.py +85 -55
- rasa/core/policies/intentless_policy.py +6 -7
- rasa/core/policies/memoization.py +22 -20
- rasa/core/policies/policy.py +24 -22
- rasa/core/policies/rule_policy.py +37 -36
- rasa/core/policies/ted_policy.py +87 -85
- rasa/core/policies/unexpected_intent_policy.py +77 -75
- rasa/core/processor.py +167 -74
- rasa/core/run.py +5 -4
- rasa/core/secrets_manager/endpoints.py +2 -3
- rasa/core/secrets_manager/factory.py +2 -3
- rasa/core/secrets_manager/secret_manager.py +2 -3
- rasa/core/secrets_manager/vault.py +2 -2
- rasa/core/test.py +30 -30
- rasa/core/tracker_store.py +138 -49
- rasa/core/train.py +1 -1
- rasa/core/training/__init__.py +2 -2
- rasa/core/training/converters/responses_prefix_converter.py +1 -2
- rasa/core/training/interactive.py +13 -13
- rasa/core/training/story_conflict.py +4 -5
- rasa/core/training/training.py +3 -5
- rasa/core/utils.py +5 -5
- rasa/core/visualize.py +1 -1
- rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
- rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
- rasa/dialogue_understanding/commands/__init__.py +22 -22
- rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
- rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/clarify_command.py +46 -4
- rasa/dialogue_understanding/commands/command.py +3 -2
- rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
- rasa/dialogue_understanding/commands/error_command.py +1 -1
- rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
- rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
- rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
- rasa/dialogue_understanding/commands/noop_command.py +2 -1
- rasa/dialogue_understanding/commands/prompt_command.py +94 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
- rasa/dialogue_understanding/commands/restart_command.py +2 -5
- rasa/dialogue_understanding/commands/session_end_command.py +3 -5
- rasa/dialogue_understanding/commands/session_start_command.py +3 -5
- rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
- rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
- rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
- rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
- rasa/dialogue_understanding/commands/utils.py +126 -43
- rasa/dialogue_understanding/constants.py +2 -0
- rasa/dialogue_understanding/generator/__init__.py +2 -0
- rasa/dialogue_understanding/generator/command_generator.py +120 -79
- rasa/dialogue_understanding/generator/command_parser.py +245 -0
- rasa/dialogue_understanding/generator/constants.py +12 -4
- rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
- rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
- rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
- rasa/dialogue_understanding/generator/utils.py +76 -0
- rasa/dialogue_understanding/patterns/cancel.py +2 -1
- rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
- rasa/dialogue_understanding/patterns/chitchat.py +1 -1
- rasa/dialogue_understanding/patterns/clarify.py +2 -1
- rasa/dialogue_understanding/patterns/code_change.py +2 -0
- rasa/dialogue_understanding/patterns/collect_information.py +7 -4
- rasa/dialogue_understanding/patterns/completed.py +1 -1
- rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
- rasa/dialogue_understanding/patterns/correction.py +17 -3
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
- rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
- rasa/dialogue_understanding/patterns/internal_error.py +1 -0
- rasa/dialogue_understanding/patterns/search.py +1 -1
- rasa/dialogue_understanding/patterns/session_start.py +1 -1
- rasa/dialogue_understanding/patterns/skip_question.py +1 -0
- rasa/dialogue_understanding/patterns/user_silence.py +1 -1
- rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
- rasa/dialogue_understanding/processor/command_processor.py +193 -43
- rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
- rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
- rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
- rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
- rasa/dialogue_understanding/stack/utils.py +56 -10
- rasa/dialogue_understanding/utils.py +164 -0
- rasa/dialogue_understanding_test/README.md +429 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_comparison.py +60 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
- rasa/dialogue_understanding_test/constants.py +22 -0
- rasa/dialogue_understanding_test/du_test_case.py +448 -0
- rasa/dialogue_understanding_test/du_test_result.py +390 -0
- rasa/dialogue_understanding_test/du_test_runner.py +322 -0
- rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
- rasa/dialogue_understanding_test/io.py +443 -0
- rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
- rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
- rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
- rasa/dialogue_understanding_test/utils.py +70 -0
- rasa/dialogue_understanding_test/validation.py +77 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
- rasa/e2e_test/assertions.py +202 -175
- rasa/e2e_test/assertions_schema.yml +6 -0
- rasa/e2e_test/constants.py +16 -1
- rasa/e2e_test/e2e_config.py +102 -41
- rasa/e2e_test/e2e_config_schema.yml +28 -10
- rasa/e2e_test/e2e_test_case.py +5 -5
- rasa/e2e_test/e2e_test_converter.py +2 -3
- rasa/e2e_test/e2e_test_coverage_report.py +6 -6
- rasa/e2e_test/e2e_test_result.py +1 -1
- rasa/e2e_test/e2e_test_runner.py +143 -38
- rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
- rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
- rasa/e2e_test/stub_custom_action.py +1 -1
- rasa/e2e_test/utils/generative_assertions.py +243 -0
- rasa/e2e_test/utils/io.py +123 -93
- rasa/e2e_test/utils/validation.py +101 -3
- rasa/engine/caching.py +5 -7
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +3 -2
- rasa/engine/language.py +182 -0
- rasa/engine/recipes/config_files/default_config.yml +4 -0
- rasa/engine/recipes/default_components.py +13 -15
- rasa/engine/recipes/default_recipe.py +65 -49
- rasa/engine/recipes/graph_recipe.py +10 -7
- rasa/engine/recipes/recipe.py +2 -2
- rasa/engine/runner/dask.py +2 -2
- rasa/engine/runner/interface.py +1 -0
- rasa/engine/storage/local_model_storage.py +6 -4
- rasa/engine/storage/resource.py +2 -1
- rasa/engine/storage/storage.py +8 -3
- rasa/engine/training/components.py +2 -1
- rasa/engine/training/fingerprinting.py +4 -2
- rasa/engine/training/graph_trainer.py +4 -4
- rasa/engine/training/hooks.py +2 -2
- rasa/engine/validation.py +36 -33
- rasa/exceptions.py +3 -2
- rasa/graph_components/converters/nlu_message_converter.py +3 -3
- rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
- rasa/graph_components/providers/domain_provider.py +3 -2
- rasa/graph_components/providers/flows_provider.py +2 -3
- rasa/graph_components/providers/forms_provider.py +4 -4
- rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
- rasa/graph_components/providers/responses_provider.py +4 -4
- rasa/graph_components/providers/rule_only_provider.py +3 -2
- rasa/graph_components/providers/story_graph_provider.py +8 -8
- rasa/graph_components/providers/training_tracker_provider.py +3 -2
- rasa/graph_components/validators/default_recipe_validator.py +16 -16
- rasa/graph_components/validators/finetuning_validator.py +10 -8
- rasa/hooks.py +19 -14
- rasa/jupyter.py +2 -2
- rasa/llm_fine_tuning/annotation_module.py +4 -4
- rasa/llm_fine_tuning/conversations.py +5 -33
- rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
- rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
- rasa/llm_fine_tuning/storage.py +3 -3
- rasa/llm_fine_tuning/train_test_split_module.py +27 -27
- rasa/llm_fine_tuning/utils.py +7 -0
- rasa/markers/marker.py +2 -3
- rasa/markers/marker_base.py +1 -2
- rasa/markers/upload.py +2 -2
- rasa/markers/validate.py +2 -3
- rasa/model.py +3 -5
- rasa/model_manager/config.py +1 -1
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +13 -10
- rasa/model_manager/socket_bridge.py +15 -9
- rasa/model_manager/studio_jwt_auth.py +1 -0
- rasa/model_manager/trainer_service.py +9 -7
- rasa/model_manager/utils.py +1 -1
- rasa/model_manager/warm_rasa_process.py +14 -9
- rasa/model_service.py +5 -6
- rasa/model_testing.py +13 -15
- rasa/model_training.py +29 -29
- rasa/nlu/classifiers/diet_classifier.py +72 -73
- rasa/nlu/classifiers/fallback_classifier.py +9 -8
- rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
- rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
- rasa/nlu/classifiers/regex_message_handler.py +3 -2
- rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
- rasa/nlu/convert.py +2 -2
- rasa/nlu/emulators/dialogflow.py +3 -3
- rasa/nlu/emulators/luis.py +5 -5
- rasa/nlu/emulators/no_emulator.py +1 -0
- rasa/nlu/emulators/wit.py +4 -4
- rasa/nlu/extractors/crf_entity_extractor.py +11 -11
- rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
- rasa/nlu/extractors/entity_synonyms.py +10 -9
- rasa/nlu/extractors/extractor.py +16 -16
- rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
- rasa/nlu/extractors/regex_entity_extractor.py +11 -10
- rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
- rasa/nlu/featurizers/featurizer.py +5 -4
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
- rasa/nlu/model.py +0 -1
- rasa/nlu/selectors/response_selector.py +67 -68
- rasa/nlu/test.py +38 -38
- rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
- rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
- rasa/nlu/tokenizers/tokenizer.py +6 -7
- rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
- rasa/nlu/utils/bilou_utils.py +7 -7
- rasa/nlu/utils/hugging_face/registry.py +22 -22
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
- rasa/nlu/utils/mitie_utils.py +2 -1
- rasa/nlu/utils/pattern_utils.py +1 -1
- rasa/nlu/utils/spacy_utils.py +3 -3
- rasa/plugin.py +12 -1
- rasa/server.py +3 -2
- rasa/shared/constants.py +45 -18
- rasa/shared/core/command_payload_reader.py +15 -7
- rasa/shared/core/constants.py +34 -4
- rasa/shared/core/conversation.py +1 -2
- rasa/shared/core/domain.py +19 -20
- rasa/shared/core/events.py +60 -39
- rasa/shared/core/flows/__init__.py +0 -1
- rasa/shared/core/flows/constants.py +11 -0
- rasa/shared/core/flows/flow.py +107 -26
- rasa/shared/core/flows/flow_step.py +4 -3
- rasa/shared/core/flows/flow_step_links.py +1 -2
- rasa/shared/core/flows/flow_step_sequence.py +1 -1
- rasa/shared/core/flows/flows_list.py +3 -3
- rasa/shared/core/flows/flows_yaml_schema.json +69 -3
- rasa/shared/core/flows/nlu_trigger.py +1 -1
- rasa/shared/core/flows/steps/__init__.py +2 -2
- rasa/shared/core/flows/steps/action.py +1 -1
- rasa/shared/core/flows/steps/call.py +1 -1
- rasa/shared/core/flows/steps/collect.py +22 -40
- rasa/shared/core/flows/steps/internal.py +1 -1
- rasa/shared/core/flows/steps/link.py +1 -1
- rasa/shared/core/flows/steps/no_operation.py +2 -2
- rasa/shared/core/flows/steps/set_slots.py +1 -1
- rasa/shared/core/flows/utils.py +44 -4
- rasa/shared/core/flows/validation.py +4 -6
- rasa/shared/core/generator.py +20 -21
- rasa/shared/core/slot_mappings.py +360 -121
- rasa/shared/core/slots.py +163 -6
- rasa/shared/core/trackers.py +108 -33
- rasa/shared/core/training_data/loading.py +1 -1
- rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
- rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
- rasa/shared/core/training_data/structures.py +11 -12
- rasa/shared/core/training_data/visualization.py +10 -10
- rasa/shared/data.py +6 -6
- rasa/shared/engine/caching.py +0 -1
- rasa/shared/exceptions.py +2 -2
- rasa/shared/importers/importer.py +58 -2
- rasa/shared/importers/rasa.py +5 -6
- rasa/shared/importers/utils.py +1 -1
- rasa/shared/nlu/constants.py +9 -0
- rasa/shared/nlu/training_data/entities_parser.py +6 -6
- rasa/shared/nlu/training_data/features.py +3 -3
- rasa/shared/nlu/training_data/formats/__init__.py +1 -1
- rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
- rasa/shared/nlu/training_data/formats/luis.py +7 -8
- rasa/shared/nlu/training_data/formats/rasa.py +4 -5
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
- rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
- rasa/shared/nlu/training_data/formats/wit.py +3 -4
- rasa/shared/nlu/training_data/loading.py +4 -4
- rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
- rasa/shared/nlu/training_data/message.py +13 -14
- rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
- rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
- rasa/shared/nlu/training_data/training_data.py +12 -13
- rasa/shared/nlu/training_data/util.py +11 -10
- rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
- rasa/shared/providers/_configs/client_config.py +3 -1
- rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
- rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
- rasa/shared/providers/_configs/model_group_config.py +8 -5
- rasa/shared/providers/_configs/oauth_config.py +33 -0
- rasa/shared/providers/_configs/openai_client_config.py +14 -12
- rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
- rasa/shared/providers/_configs/utils.py +1 -0
- rasa/shared/providers/_ssl_verification_utils.py +5 -6
- rasa/shared/providers/_utils.py +5 -5
- rasa/shared/providers/constants.py +6 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
- rasa/shared/providers/embedding/embedding_client.py +1 -1
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
- rasa/shared/providers/llm/_base_litellm_client.py +43 -18
- rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
- rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
- rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
- rasa/shared/providers/llm/llm_client.py +24 -8
- rasa/shared/providers/llm/llm_response.py +61 -2
- rasa/shared/providers/llm/openai_llm_client.py +11 -5
- rasa/shared/providers/llm/rasa_llm_client.py +17 -14
- rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
- rasa/shared/providers/mappings.py +18 -19
- rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
- rasa/shared/providers/router/router_client.py +3 -1
- rasa/shared/utils/cli.py +1 -1
- rasa/shared/utils/common.py +15 -1
- rasa/shared/utils/constants.py +3 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
- rasa/shared/utils/health_check/health_check.py +3 -3
- rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
- rasa/shared/utils/io.py +1 -1
- rasa/shared/utils/llm.py +100 -18
- rasa/shared/utils/pykwalify_extensions.py +25 -1
- rasa/shared/utils/schemas/domain.yml +26 -1
- rasa/shared/utils/schemas/events.py +1 -1
- rasa/shared/utils/yaml.py +24 -20
- rasa/studio/auth.py +3 -3
- rasa/studio/config.py +1 -2
- rasa/studio/data_handler.py +3 -3
- rasa/studio/download.py +1 -1
- rasa/studio/results_logger.py +3 -3
- rasa/studio/upload.py +21 -5
- rasa/telemetry.py +127 -48
- rasa/tracing/config.py +5 -3
- rasa/tracing/constants.py +12 -0
- rasa/tracing/instrumentation/attribute_extractors.py +92 -14
- rasa/tracing/instrumentation/instrumentation.py +61 -5
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
- rasa/tracing/instrumentation/metrics.py +52 -11
- rasa/tracing/metric_instrument_provider.py +54 -14
- rasa/utils/common.py +12 -24
- rasa/utils/endpoints.py +1 -1
- rasa/utils/io.py +7 -7
- rasa/utils/licensing.py +3 -4
- rasa/utils/log_utils.py +7 -6
- rasa/utils/ml_utils.py +1 -0
- rasa/utils/plotting.py +3 -3
- rasa/utils/sanic_error_handler.py +1 -1
- rasa/utils/tensorflow/callback.py +2 -2
- rasa/utils/tensorflow/crf.py +2 -2
- rasa/utils/tensorflow/data_generator.py +5 -5
- rasa/utils/tensorflow/environment.py +3 -3
- rasa/utils/tensorflow/feature_array.py +2 -3
- rasa/utils/tensorflow/layers.py +18 -12
- rasa/utils/tensorflow/layers_utils.py +2 -1
- rasa/utils/tensorflow/metrics.py +2 -2
- rasa/utils/tensorflow/model_data.py +7 -7
- rasa/utils/tensorflow/model_data_utils.py +10 -9
- rasa/utils/tensorflow/models.py +31 -32
- rasa/utils/tensorflow/rasa_layers.py +20 -19
- rasa/utils/tensorflow/types.py +2 -1
- rasa/utils/train_utils.py +23 -21
- rasa/utils/url_tools.py +1 -1
- rasa/validator.py +594 -115
- rasa/version.py +1 -1
- {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
- rasa_pro-3.12.0.dist-info/RECORD +829 -0
- rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
- rasa_pro-3.11.5.dist-info/RECORD +0 -785
- /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
- {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
from rasa.core.actions.action import Action, create_bot_utterance
|
|
8
|
+
from rasa.core.channels import OutputChannel
|
|
9
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
10
|
+
from rasa.core.utils import add_bot_utterance_metadata
|
|
11
|
+
from rasa.dialogue_understanding.patterns.continue_interrupted import (
|
|
12
|
+
ContinueInterruptedPatternFlowStackFrame,
|
|
13
|
+
)
|
|
14
|
+
from rasa.dialogue_understanding.patterns.handle_digressions import (
|
|
15
|
+
HandleDigressionsPatternFlowStackFrame,
|
|
16
|
+
)
|
|
17
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
18
|
+
FlowStackFrameType,
|
|
19
|
+
UserFlowStackFrame,
|
|
20
|
+
)
|
|
21
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
22
|
+
remove_digression_from_stack,
|
|
23
|
+
user_flows_on_the_stack,
|
|
24
|
+
)
|
|
25
|
+
from rasa.shared.core.constants import (
|
|
26
|
+
ACTION_BLOCK_DIGRESSION,
|
|
27
|
+
ACTION_CONTINUE_DIGRESSION,
|
|
28
|
+
)
|
|
29
|
+
from rasa.shared.core.domain import Domain
|
|
30
|
+
from rasa.shared.core.events import Event, FlowInterrupted
|
|
31
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
32
|
+
|
|
33
|
+
structlogger = structlog.get_logger()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ActionBlockDigressions(Action):
|
|
37
|
+
"""Action which blocks an interruption and continues the current flow."""
|
|
38
|
+
|
|
39
|
+
def name(self) -> str:
|
|
40
|
+
"""Return the action name."""
|
|
41
|
+
return ACTION_BLOCK_DIGRESSION
|
|
42
|
+
|
|
43
|
+
async def run(
|
|
44
|
+
self,
|
|
45
|
+
output_channel: OutputChannel,
|
|
46
|
+
nlg: NaturalLanguageGenerator,
|
|
47
|
+
tracker: DialogueStateTracker,
|
|
48
|
+
domain: Domain,
|
|
49
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
50
|
+
) -> List[Event]:
|
|
51
|
+
"""Update the stack."""
|
|
52
|
+
structlogger.debug("action_block_digressions.run")
|
|
53
|
+
top_frame = tracker.stack.top()
|
|
54
|
+
|
|
55
|
+
if not isinstance(top_frame, HandleDigressionsPatternFlowStackFrame):
|
|
56
|
+
return []
|
|
57
|
+
|
|
58
|
+
blocked_flow_id = top_frame.interrupting_flow_id
|
|
59
|
+
frame_type = FlowStackFrameType.REGULAR
|
|
60
|
+
|
|
61
|
+
stack = tracker.stack
|
|
62
|
+
|
|
63
|
+
if blocked_flow_id in user_flows_on_the_stack(stack):
|
|
64
|
+
structlogger.debug(
|
|
65
|
+
"action_block_digressions.already_blocked_flow",
|
|
66
|
+
blocked_flow_id=blocked_flow_id,
|
|
67
|
+
)
|
|
68
|
+
events = []
|
|
69
|
+
else:
|
|
70
|
+
stack.push(
|
|
71
|
+
UserFlowStackFrame(flow_id=blocked_flow_id, frame_type=frame_type), 0
|
|
72
|
+
)
|
|
73
|
+
stack.push(
|
|
74
|
+
ContinueInterruptedPatternFlowStackFrame(
|
|
75
|
+
previous_flow_name=blocked_flow_id
|
|
76
|
+
),
|
|
77
|
+
1,
|
|
78
|
+
)
|
|
79
|
+
events = tracker.create_stack_updated_events(stack)
|
|
80
|
+
|
|
81
|
+
utterance = "utter_block_digressions"
|
|
82
|
+
message = await nlg.generate(
|
|
83
|
+
utterance,
|
|
84
|
+
tracker,
|
|
85
|
+
output_channel.name(),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
if message is None:
|
|
89
|
+
structlogger.error(
|
|
90
|
+
"action_block_digressions.run.failed.finding.utter",
|
|
91
|
+
utterance=utterance,
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
message = add_bot_utterance_metadata(
|
|
95
|
+
message, utterance, nlg, domain, tracker
|
|
96
|
+
)
|
|
97
|
+
events.append(create_bot_utterance(message))
|
|
98
|
+
|
|
99
|
+
return events
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class ActionContinueDigression(Action):
|
|
103
|
+
"""Action which continues with an interruption."""
|
|
104
|
+
|
|
105
|
+
def name(self) -> str:
|
|
106
|
+
"""Return the action name."""
|
|
107
|
+
return ACTION_CONTINUE_DIGRESSION
|
|
108
|
+
|
|
109
|
+
async def run(
|
|
110
|
+
self,
|
|
111
|
+
output_channel: OutputChannel,
|
|
112
|
+
nlg: NaturalLanguageGenerator,
|
|
113
|
+
tracker: DialogueStateTracker,
|
|
114
|
+
domain: Domain,
|
|
115
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
116
|
+
) -> List[Event]:
|
|
117
|
+
"""Update the stack."""
|
|
118
|
+
structlogger.debug("action_continue_digression.run")
|
|
119
|
+
top_frame = tracker.stack.top()
|
|
120
|
+
|
|
121
|
+
if not isinstance(top_frame, HandleDigressionsPatternFlowStackFrame):
|
|
122
|
+
return []
|
|
123
|
+
|
|
124
|
+
interrupting_flow_id = top_frame.interrupting_flow_id
|
|
125
|
+
stack = tracker.stack
|
|
126
|
+
|
|
127
|
+
if interrupting_flow_id in user_flows_on_the_stack(stack):
|
|
128
|
+
structlogger.debug(
|
|
129
|
+
"action_continue_digression.interrupting_flow_id_already_on_the_stack",
|
|
130
|
+
interrupting_flow_id=interrupting_flow_id,
|
|
131
|
+
)
|
|
132
|
+
stack = remove_digression_from_stack(stack, interrupting_flow_id)
|
|
133
|
+
|
|
134
|
+
frame_type = FlowStackFrameType.INTERRUPT
|
|
135
|
+
stack.push(
|
|
136
|
+
UserFlowStackFrame(flow_id=interrupting_flow_id, frame_type=frame_type)
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
events = [
|
|
140
|
+
FlowInterrupted(
|
|
141
|
+
flow_id=top_frame.interrupted_flow_id,
|
|
142
|
+
step_id=top_frame.interrupted_step_id,
|
|
143
|
+
)
|
|
144
|
+
] + tracker.create_stack_updated_events(stack)
|
|
145
|
+
|
|
146
|
+
utterance = "utter_continue_interruption"
|
|
147
|
+
message = await nlg.generate(
|
|
148
|
+
utterance,
|
|
149
|
+
tracker,
|
|
150
|
+
output_channel.name(),
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
if message is None:
|
|
154
|
+
structlogger.error(
|
|
155
|
+
"action_continue_digression.run.failed.finding.utter",
|
|
156
|
+
utterance=utterance,
|
|
157
|
+
)
|
|
158
|
+
else:
|
|
159
|
+
message = add_bot_utterance_metadata(
|
|
160
|
+
message, utterance, nlg, domain, tracker
|
|
161
|
+
)
|
|
162
|
+
events.append(create_bot_utterance(message))
|
|
163
|
+
|
|
164
|
+
return events
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import Any, Dict, List, Optional
|
|
2
2
|
|
|
3
3
|
from rasa.core.actions.action import Action
|
|
4
4
|
from rasa.core.channels import OutputChannel
|
|
@@ -14,7 +14,7 @@ from rasa.dialogue_understanding.patterns.user_silence import (
|
|
|
14
14
|
)
|
|
15
15
|
from rasa.shared.core.constants import ACTION_REPEAT_BOT_MESSAGES
|
|
16
16
|
from rasa.shared.core.domain import Domain
|
|
17
|
-
from rasa.shared.core.events import
|
|
17
|
+
from rasa.shared.core.events import BotUttered, Event, UserUttered
|
|
18
18
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
19
19
|
|
|
20
20
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Optional,
|
|
1
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Union
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
4
|
from jinja2 import Template
|
|
@@ -9,19 +9,22 @@ from rasa.core.utils import add_bot_utterance_metadata
|
|
|
9
9
|
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
10
10
|
CollectInformationPatternFlowStackFrame,
|
|
11
11
|
)
|
|
12
|
+
from rasa.dialogue_understanding.patterns.validate_slot import (
|
|
13
|
+
ValidateSlotPatternFlowStackFrame,
|
|
14
|
+
)
|
|
12
15
|
from rasa.shared.core.constants import ACTION_RUN_SLOT_REJECTIONS_NAME
|
|
13
16
|
from rasa.shared.core.events import Event, SlotSet
|
|
14
|
-
from rasa.shared.core.flows.steps.collect import SlotRejection
|
|
15
17
|
from rasa.shared.core.slots import (
|
|
16
18
|
BooleanSlot,
|
|
17
19
|
CategoricalSlot,
|
|
18
20
|
FloatSlot,
|
|
19
21
|
Slot,
|
|
22
|
+
SlotRejection,
|
|
20
23
|
)
|
|
21
24
|
|
|
22
25
|
if TYPE_CHECKING:
|
|
23
|
-
from rasa.core.nlg import NaturalLanguageGenerator
|
|
24
26
|
from rasa.core.channels.channel import OutputChannel
|
|
27
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
25
28
|
from rasa.shared.core.domain import Domain
|
|
26
29
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
27
30
|
|
|
@@ -138,10 +141,19 @@ class ActionRunSlotRejections(Action):
|
|
|
138
141
|
"""Run the predicate checks."""
|
|
139
142
|
utterance = None
|
|
140
143
|
top_frame = tracker.stack.top()
|
|
141
|
-
if not isinstance(
|
|
144
|
+
if not isinstance(
|
|
145
|
+
top_frame,
|
|
146
|
+
(
|
|
147
|
+
CollectInformationPatternFlowStackFrame,
|
|
148
|
+
ValidateSlotPatternFlowStackFrame,
|
|
149
|
+
),
|
|
150
|
+
):
|
|
142
151
|
return []
|
|
152
|
+
elif isinstance(top_frame, CollectInformationPatternFlowStackFrame):
|
|
153
|
+
slot_name = top_frame.collect
|
|
154
|
+
elif isinstance(top_frame, ValidateSlotPatternFlowStackFrame):
|
|
155
|
+
slot_name = top_frame.validate
|
|
143
156
|
|
|
144
|
-
slot_name = top_frame.collect
|
|
145
157
|
slot_instance = tracker.slots.get(slot_name)
|
|
146
158
|
if slot_instance and not slot_instance.has_been_set:
|
|
147
159
|
# this is the first time the assistant asks for the slot value,
|
|
@@ -205,6 +217,6 @@ class ActionRunSlotRejections(Action):
|
|
|
205
217
|
message = add_bot_utterance_metadata(
|
|
206
218
|
message, utterance, nlg, domain, tracker
|
|
207
219
|
)
|
|
208
|
-
events.append(create_bot_utterance(message))
|
|
220
|
+
events.append(create_bot_utterance(message, tracker.current_language))
|
|
209
221
|
|
|
210
222
|
return events
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
from typing import Any, Dict, Optional, Text
|
|
1
|
+
from typing import Any, Dict, List, Optional, Text
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
|
+
|
|
5
|
+
from rasa.core.actions import action
|
|
6
|
+
from rasa.core.channels import OutputChannel
|
|
7
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
4
8
|
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
5
9
|
FlowStackFrameType,
|
|
6
10
|
UserFlowStackFrame,
|
|
7
11
|
)
|
|
8
12
|
from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
|
|
9
|
-
from rasa.core.actions import action
|
|
10
|
-
from rasa.core.channels import OutputChannel
|
|
11
13
|
from rasa.shared.constants import FLOW_PREFIX
|
|
12
|
-
|
|
13
14
|
from rasa.shared.core.domain import Domain
|
|
14
15
|
from rasa.shared.core.events import (
|
|
15
16
|
ActiveLoop,
|
|
@@ -17,7 +18,6 @@ from rasa.shared.core.events import (
|
|
|
17
18
|
FlowInterrupted,
|
|
18
19
|
SlotSet,
|
|
19
20
|
)
|
|
20
|
-
from rasa.core.nlg import NaturalLanguageGenerator
|
|
21
21
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
22
22
|
|
|
23
23
|
structlogger = structlog.get_logger(__name__)
|
|
@@ -84,7 +84,7 @@ class NoEndpointCustomActionExecutor(CustomActionExecutor):
|
|
|
84
84
|
f"custom action. Please take a look at "
|
|
85
85
|
f"the docs and set an endpoint configuration via the "
|
|
86
86
|
f"--endpoints flag. "
|
|
87
|
-
f"{DOCS_BASE_URL}/
|
|
87
|
+
f"{DOCS_BASE_URL}/action-server/actions"
|
|
88
88
|
)
|
|
89
89
|
|
|
90
90
|
|
|
@@ -36,6 +36,7 @@ class DirectCustomActionExecutor(CustomActionExecutor):
|
|
|
36
36
|
self.action_endpoint = action_endpoint
|
|
37
37
|
self.action_executor = self._create_action_executor()
|
|
38
38
|
self.register_actions_from_a_module()
|
|
39
|
+
self.action_executor.reload()
|
|
39
40
|
|
|
40
41
|
@staticmethod
|
|
41
42
|
@lru_cache(maxsize=1)
|
rasa/core/actions/forms.py
CHANGED
|
@@ -1,38 +1,43 @@
|
|
|
1
1
|
import copy
|
|
2
|
-
from typing import Text, List, Optional, Union, Any, Dict, Set
|
|
3
2
|
import itertools
|
|
3
|
+
import json
|
|
4
4
|
import logging
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Text, Union
|
|
6
|
+
|
|
5
7
|
import structlog
|
|
6
|
-
import json
|
|
7
8
|
|
|
8
9
|
from rasa.core.actions import action
|
|
9
|
-
from rasa.core.actions.loops import LoopAction
|
|
10
|
-
from rasa.core.channels import OutputChannel
|
|
11
|
-
from rasa.shared.core.domain import Domain, KEY_SLOTS
|
|
12
|
-
from rasa.shared.core.constants import SlotMappingType, SLOT_MAPPINGS, MAPPING_TYPE
|
|
13
|
-
|
|
14
10
|
from rasa.core.actions.action import RemoteAction
|
|
15
11
|
from rasa.core.actions.action_exceptions import ActionExecutionRejection
|
|
12
|
+
from rasa.core.actions.loops import LoopAction
|
|
13
|
+
from rasa.core.channels import OutputChannel
|
|
14
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
15
|
+
from rasa.shared.constants import UTTER_PREFIX
|
|
16
16
|
from rasa.shared.core.constants import (
|
|
17
17
|
ACTION_EXTRACT_SLOTS,
|
|
18
18
|
ACTION_LISTEN_NAME,
|
|
19
|
+
KEY_MAPPING_TYPE,
|
|
19
20
|
REQUESTED_SLOT,
|
|
21
|
+
SLOT_MAPPINGS,
|
|
22
|
+
SlotMappingType,
|
|
20
23
|
)
|
|
21
|
-
from rasa.shared.
|
|
24
|
+
from rasa.shared.core.domain import KEY_SLOTS, Domain
|
|
22
25
|
from rasa.shared.core.events import (
|
|
23
|
-
Event,
|
|
24
|
-
SlotSet,
|
|
25
26
|
ActionExecuted,
|
|
26
|
-
ActiveLoop,
|
|
27
27
|
ActionExecutionRejected,
|
|
28
|
+
ActiveLoop,
|
|
29
|
+
Event,
|
|
28
30
|
Restarted,
|
|
31
|
+
SlotSet,
|
|
29
32
|
)
|
|
30
|
-
from rasa.core.nlg import NaturalLanguageGenerator
|
|
31
33
|
from rasa.shared.core.slot_mappings import SlotMapping
|
|
32
34
|
from rasa.shared.core.slots import ListSlot
|
|
33
35
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
34
36
|
from rasa.utils.endpoints import EndpointConfig
|
|
35
37
|
|
|
38
|
+
if TYPE_CHECKING:
|
|
39
|
+
from rasa.shared.core.slot_mappings import SlotMapping
|
|
40
|
+
|
|
36
41
|
logger = logging.getLogger(__name__)
|
|
37
42
|
structlogger = structlog.get_logger()
|
|
38
43
|
|
|
@@ -156,7 +161,9 @@ class FormAction(LoopAction):
|
|
|
156
161
|
domain_slots = domain.as_dict().get(KEY_SLOTS, {})
|
|
157
162
|
for slot in domain.required_slots_for_form(self.name()):
|
|
158
163
|
for slot_mapping in domain_slots.get(slot, {}).get(SLOT_MAPPINGS, []):
|
|
159
|
-
if slot_mapping.get(
|
|
164
|
+
if slot_mapping.get(KEY_MAPPING_TYPE) == str(
|
|
165
|
+
SlotMappingType.FROM_ENTITY
|
|
166
|
+
):
|
|
160
167
|
mapping_as_string = json.dumps(slot_mapping, sort_keys=True)
|
|
161
168
|
if mapping_as_string in unique_entity_slot_mappings:
|
|
162
169
|
unique_entity_slot_mappings.remove(mapping_as_string)
|
|
@@ -167,7 +174,7 @@ class FormAction(LoopAction):
|
|
|
167
174
|
return unique_entity_slot_mappings
|
|
168
175
|
|
|
169
176
|
def entity_mapping_is_unique(
|
|
170
|
-
self, slot_mapping:
|
|
177
|
+
self, slot_mapping: "SlotMapping", domain: Domain
|
|
171
178
|
) -> bool:
|
|
172
179
|
"""Verifies if the from_entity mapping is unique."""
|
|
173
180
|
if not self._have_unique_entity_mappings_been_initialized:
|
|
@@ -175,7 +182,7 @@ class FormAction(LoopAction):
|
|
|
175
182
|
self._unique_entity_mappings = self._create_unique_entity_mappings(domain)
|
|
176
183
|
self._have_unique_entity_mappings_been_initialized = True
|
|
177
184
|
|
|
178
|
-
mapping_as_string = json.dumps(slot_mapping, sort_keys=True)
|
|
185
|
+
mapping_as_string = json.dumps(slot_mapping.as_dict(), sort_keys=True)
|
|
179
186
|
return mapping_as_string in self._unique_entity_mappings
|
|
180
187
|
|
|
181
188
|
@staticmethod
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Any, Dict, Optional
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional
|
|
4
4
|
|
|
5
5
|
import aiohttp
|
|
6
6
|
|
|
@@ -94,6 +94,13 @@ class HTTPCustomActionExecutor(CustomActionExecutor):
|
|
|
94
94
|
)
|
|
95
95
|
logger.error(exception.message)
|
|
96
96
|
raise exception
|
|
97
|
+
elif e.status == 404:
|
|
98
|
+
message = (
|
|
99
|
+
f"Custom action implementation with name '{self.action_name}' "
|
|
100
|
+
f"not found."
|
|
101
|
+
)
|
|
102
|
+
logger.error(message)
|
|
103
|
+
raise RasaException(message) from e
|
|
97
104
|
else:
|
|
98
105
|
raise RasaException(
|
|
99
106
|
f"Failed to execute custom action '{self.action_name}'"
|
rasa/core/actions/loops.py
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
from abc import ABC
|
|
2
|
-
from typing import Any, Dict, List,
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text
|
|
3
3
|
|
|
4
4
|
from rasa.core.actions.action import Action
|
|
5
|
-
from rasa.shared.core.events import
|
|
5
|
+
from rasa.shared.core.events import ActiveLoop, Event
|
|
6
6
|
|
|
7
7
|
if TYPE_CHECKING:
|
|
8
8
|
from rasa.core.channels import OutputChannel
|
|
9
|
-
from rasa.shared.core.domain import Domain
|
|
10
9
|
from rasa.core.nlg import NaturalLanguageGenerator
|
|
10
|
+
from rasa.shared.core.domain import Domain
|
|
11
11
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
12
12
|
|
|
13
13
|
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import time
|
|
3
|
-
from typing import List,
|
|
3
|
+
from typing import List, Optional, Text
|
|
4
4
|
|
|
5
5
|
from rasa.core.actions import action
|
|
6
6
|
from rasa.core.actions.loops import LoopAction
|
|
7
7
|
from rasa.core.channels import OutputChannel
|
|
8
|
-
from rasa.shared.core.domain import Domain
|
|
9
|
-
from rasa.shared.core.events import (
|
|
10
|
-
Event,
|
|
11
|
-
UserUtteranceReverted,
|
|
12
|
-
ActionExecuted,
|
|
13
|
-
UserUttered,
|
|
14
|
-
ActiveLoop,
|
|
15
|
-
)
|
|
16
8
|
from rasa.core.nlg import NaturalLanguageGenerator
|
|
17
|
-
from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
|
|
18
9
|
from rasa.shared.constants import DEFAULT_NLU_FALLBACK_INTENT_NAME
|
|
19
10
|
from rasa.shared.core.constants import (
|
|
20
|
-
USER_INTENT_OUT_OF_SCOPE,
|
|
21
|
-
ACTION_LISTEN_NAME,
|
|
22
|
-
ACTION_DEFAULT_FALLBACK_NAME,
|
|
23
11
|
ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
|
|
24
12
|
ACTION_DEFAULT_ASK_REPHRASE_NAME,
|
|
13
|
+
ACTION_DEFAULT_FALLBACK_NAME,
|
|
14
|
+
ACTION_LISTEN_NAME,
|
|
25
15
|
ACTION_TWO_STAGE_FALLBACK_NAME,
|
|
16
|
+
USER_INTENT_OUT_OF_SCOPE,
|
|
17
|
+
)
|
|
18
|
+
from rasa.shared.core.domain import Domain
|
|
19
|
+
from rasa.shared.core.events import (
|
|
20
|
+
ActionExecuted,
|
|
21
|
+
ActiveLoop,
|
|
22
|
+
Event,
|
|
23
|
+
UserUtteranceReverted,
|
|
24
|
+
UserUttered,
|
|
26
25
|
)
|
|
26
|
+
from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
|
|
27
27
|
from rasa.shared.nlu.constants import INTENT, PREDICTED_CONFIDENCE_KEY
|
|
28
28
|
from rasa.utils.endpoints import EndpointConfig
|
|
29
29
|
|
|
@@ -2,13 +2,12 @@ import logging
|
|
|
2
2
|
from typing import Iterable, Optional, Text
|
|
3
3
|
|
|
4
4
|
from rasa.core.brokers.broker import EventBroker
|
|
5
|
+
from rasa.core.secrets_manager.secret_manager import EndpointResolver
|
|
5
6
|
from rasa.core.tracker_store import TrackerStore, create_tracker_store
|
|
6
7
|
from rasa.shared.core.domain import Domain
|
|
7
8
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
8
9
|
from rasa.utils.endpoints import EndpointConfig
|
|
9
10
|
|
|
10
|
-
from rasa.core.secrets_manager.secret_manager import EndpointResolver
|
|
11
|
-
|
|
12
11
|
logger = logging.getLogger(__name__)
|
|
13
12
|
|
|
14
13
|
DEFAULT_RETRIES = 3
|
rasa/core/brokers/broker.py
CHANGED
rasa/core/brokers/file.py
CHANGED
rasa/core/brokers/kafka.py
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
import os
|
|
3
2
|
import json
|
|
4
3
|
import logging
|
|
4
|
+
import os
|
|
5
|
+
import threading
|
|
6
|
+
import time
|
|
7
|
+
from asyncio import AbstractEventLoop
|
|
5
8
|
from functools import cached_property
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Union
|
|
6
10
|
|
|
7
11
|
import structlog
|
|
8
|
-
import threading
|
|
9
|
-
from asyncio import AbstractEventLoop
|
|
10
|
-
from typing import Any, Text, List, Optional, Union, Dict, TYPE_CHECKING
|
|
11
|
-
import time
|
|
12
12
|
|
|
13
|
+
import rasa.shared.utils.common
|
|
13
14
|
from rasa.core.brokers.broker import EventBroker
|
|
14
15
|
from rasa.core.exceptions import KafkaProducerInitializationError
|
|
15
16
|
from rasa.shared.utils.io import DEFAULT_ENCODING
|
|
16
17
|
from rasa.utils.endpoints import EndpointConfig
|
|
17
|
-
import rasa.shared.utils.common
|
|
18
18
|
|
|
19
19
|
if TYPE_CHECKING:
|
|
20
|
-
from confluent_kafka import KafkaError,
|
|
20
|
+
from confluent_kafka import KafkaError, Message, Producer
|
|
21
21
|
|
|
22
22
|
logger = logging.getLogger(__name__)
|
|
23
23
|
structlogger = structlog.get_logger()
|
|
@@ -293,7 +293,7 @@ def kafka_error_callback(err: "KafkaError") -> None:
|
|
|
293
293
|
Any exception raised from this callback will be re-raised from the
|
|
294
294
|
triggering flush() call.
|
|
295
295
|
"""
|
|
296
|
-
from confluent_kafka import
|
|
296
|
+
from confluent_kafka import KafkaError, KafkaException
|
|
297
297
|
|
|
298
298
|
# handle authentication / connection related issues, likely pointing
|
|
299
299
|
# to a configuration error
|
rasa/core/brokers/pika.py
CHANGED
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import json
|
|
3
3
|
import logging
|
|
4
|
-
from functools import cached_property
|
|
5
|
-
|
|
6
|
-
import structlog
|
|
7
4
|
import os
|
|
8
5
|
import ssl
|
|
9
6
|
from asyncio import AbstractEventLoop
|
|
10
7
|
from collections import deque
|
|
11
|
-
from
|
|
8
|
+
from functools import cached_property
|
|
9
|
+
from typing import Any, Deque, Dict, List, Optional, Set, Text, Tuple, Union, cast
|
|
12
10
|
from urllib.parse import urlparse
|
|
13
11
|
|
|
14
12
|
import aio_pika
|
|
13
|
+
import structlog
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
from rasa.shared.constants import DOCS_URL_PIKA_EVENT_BROKER
|
|
18
|
-
from rasa.core.brokers.broker import EventBroker
|
|
15
|
+
import rasa.shared.utils.common
|
|
19
16
|
import rasa.shared.utils.io
|
|
20
|
-
from rasa.
|
|
17
|
+
from rasa.core.brokers.broker import EventBroker
|
|
18
|
+
from rasa.shared.constants import DOCS_URL_PIKA_EVENT_BROKER
|
|
19
|
+
from rasa.shared.exceptions import RasaException
|
|
21
20
|
from rasa.shared.utils.io import DEFAULT_ENCODING
|
|
22
|
-
|
|
21
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
23
22
|
|
|
24
23
|
logger = logging.getLogger(__name__)
|
|
25
24
|
structlogger = structlog.get_logger()
|
rasa/core/brokers/sql.py
CHANGED
|
@@ -2,11 +2,11 @@ import contextlib
|
|
|
2
2
|
import json
|
|
3
3
|
import logging
|
|
4
4
|
from asyncio import AbstractEventLoop
|
|
5
|
-
from typing import Any, Dict, Optional, Text
|
|
5
|
+
from typing import Any, Dict, Generator, Optional, Text
|
|
6
6
|
|
|
7
|
-
from sqlalchemy.orm import Session
|
|
8
7
|
from sqlalchemy import Column, Integer, String
|
|
9
8
|
from sqlalchemy import Text as SqlAlchemyText # to avoid name clash with typing.Text
|
|
9
|
+
from sqlalchemy.orm import Session
|
|
10
10
|
|
|
11
11
|
from rasa.core.brokers.broker import EventBroker
|
|
12
12
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -44,9 +44,10 @@ class SQLEventBroker(EventBroker):
|
|
|
44
44
|
password: Optional[Text] = None,
|
|
45
45
|
) -> None:
|
|
46
46
|
"""Initializes `SQLBrokerEvent`."""
|
|
47
|
-
from rasa.core.tracker_store import SQLTrackerStore
|
|
48
47
|
import sqlalchemy.orm
|
|
49
48
|
|
|
49
|
+
from rasa.core.tracker_store import SQLTrackerStore
|
|
50
|
+
|
|
50
51
|
engine_url = SQLTrackerStore.get_db_url(
|
|
51
52
|
dialect, host, port, db, username, password
|
|
52
53
|
)
|
rasa/core/channels/__init__.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# ruff: noqa: I001
|
|
1
2
|
from typing import Text, Dict, List, Type
|
|
2
3
|
|
|
3
4
|
from rasa.core.channels.channel import ( # noqa: F401
|
|
@@ -31,6 +32,9 @@ from rasa.core.channels.vier_cvg import CVGInput
|
|
|
31
32
|
from rasa.core.channels.voice_stream.twilio_media_streams import (
|
|
32
33
|
TwilioMediaStreamsInputChannel,
|
|
33
34
|
)
|
|
35
|
+
from rasa.core.channels.voice_stream.genesys import GenesysInputChannel
|
|
36
|
+
from rasa.core.channels.studio_chat import StudioChatInput
|
|
37
|
+
from rasa.core.channels.voice_stream.audiocodes import AudiocodesVoiceInputChannel
|
|
34
38
|
|
|
35
39
|
input_channel_classes: List[Type[InputChannel]] = [
|
|
36
40
|
CmdlineInput,
|
|
@@ -53,6 +57,9 @@ input_channel_classes: List[Type[InputChannel]] = [
|
|
|
53
57
|
JambonzVoiceReadyInput,
|
|
54
58
|
TwilioMediaStreamsInputChannel,
|
|
55
59
|
BrowserAudioInputChannel,
|
|
60
|
+
GenesysInputChannel,
|
|
61
|
+
StudioChatInput,
|
|
62
|
+
AudiocodesVoiceInputChannel,
|
|
56
63
|
]
|
|
57
64
|
|
|
58
65
|
# Mapping from an input channel name to its class to allow name based lookup.
|
|
@@ -3,7 +3,7 @@ import json
|
|
|
3
3
|
import logging
|
|
4
4
|
import re
|
|
5
5
|
from http import HTTPStatus
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Any, Awaitable, Callable, Dict, Iterable, List, Optional, Text
|
|
7
7
|
|
|
8
8
|
import jwt
|
|
9
9
|
import requests
|
|
@@ -14,7 +14,7 @@ from sanic import Blueprint, response
|
|
|
14
14
|
from sanic.request import Request
|
|
15
15
|
from sanic.response import HTTPResponse
|
|
16
16
|
|
|
17
|
-
from rasa.core.channels.channel import
|
|
17
|
+
from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
|
|
18
18
|
|
|
19
19
|
MICROSOFT_OPEN_ID_URI = (
|
|
20
20
|
"https://login.botframework.com/v1/.well-known/openidconfiguration"
|