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
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Dict, List
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
5
6
|
|
|
6
7
|
import structlog
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
10
|
+
from rasa.dialogue_understanding.commands.command_syntax_manager import (
|
|
11
|
+
CommandSyntaxManager,
|
|
12
|
+
CommandSyntaxVersion,
|
|
13
|
+
)
|
|
14
|
+
from rasa.dialogue_understanding.patterns.clarify import FLOW_PATTERN_CLARIFICATION
|
|
15
|
+
from rasa.dialogue_understanding.patterns.continue_interrupted import (
|
|
16
|
+
ContinueInterruptedPatternFlowStackFrame,
|
|
17
|
+
)
|
|
18
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
8
19
|
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
9
20
|
FlowStackFrameType,
|
|
10
21
|
UserFlowStackFrame,
|
|
@@ -66,6 +77,10 @@ class StartFlowCommand(Command):
|
|
|
66
77
|
applied_events: List[Event] = []
|
|
67
78
|
|
|
68
79
|
if self.flow in user_flows_on_the_stack(stack):
|
|
80
|
+
top_frame = stack.top()
|
|
81
|
+
if top_frame is not None and top_frame.type() == FLOW_PATTERN_CLARIFICATION:
|
|
82
|
+
return self.change_flow_frame_position_in_the_stack(stack, tracker)
|
|
83
|
+
|
|
69
84
|
structlogger.debug(
|
|
70
85
|
"command_executor.skip_command.already_started_flow", command=self
|
|
71
86
|
)
|
|
@@ -105,3 +120,64 @@ class StartFlowCommand(Command):
|
|
|
105
120
|
return False
|
|
106
121
|
|
|
107
122
|
return other.flow == self.flow
|
|
123
|
+
|
|
124
|
+
def to_dsl(self) -> str:
|
|
125
|
+
"""Converts the command to a DSL string."""
|
|
126
|
+
mapper = {
|
|
127
|
+
CommandSyntaxVersion.v1: f"StartFlow({self.flow})",
|
|
128
|
+
CommandSyntaxVersion.v2: f"start flow {self.flow}",
|
|
129
|
+
}
|
|
130
|
+
return mapper.get(
|
|
131
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
132
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
@classmethod
|
|
136
|
+
def from_dsl(cls, match: re.Match, **kwargs: Any) -> Optional[StartFlowCommand]:
|
|
137
|
+
"""Converts the DSL string to a command."""
|
|
138
|
+
return StartFlowCommand(flow=str(match.group(1).strip()))
|
|
139
|
+
|
|
140
|
+
@staticmethod
|
|
141
|
+
def regex_pattern() -> str:
|
|
142
|
+
mapper = {
|
|
143
|
+
CommandSyntaxVersion.v1: r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)",
|
|
144
|
+
CommandSyntaxVersion.v2: (
|
|
145
|
+
r"""^[\s\W\d]*start flow ['"`]?([a-zA-Z0-9_-]+)['"`]*"""
|
|
146
|
+
),
|
|
147
|
+
}
|
|
148
|
+
return mapper.get(
|
|
149
|
+
CommandSyntaxManager.get_syntax_version(),
|
|
150
|
+
mapper[CommandSyntaxManager.get_default_syntax_version()],
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def change_flow_frame_position_in_the_stack(
|
|
154
|
+
self, stack: DialogueStack, tracker: DialogueStateTracker
|
|
155
|
+
) -> List[Event]:
|
|
156
|
+
"""Changes the position of the flow frame in the stack.
|
|
157
|
+
|
|
158
|
+
This is a special case when pattern clarification is the active flow and
|
|
159
|
+
the same flow is selected to start. In this case, the existing flow frame
|
|
160
|
+
should be moved up in the stack.
|
|
161
|
+
"""
|
|
162
|
+
frames = stack.frames[:]
|
|
163
|
+
|
|
164
|
+
for idx, frame in enumerate(frames):
|
|
165
|
+
if isinstance(frame, UserFlowStackFrame) and frame.flow_id == self.flow:
|
|
166
|
+
structlogger.debug(
|
|
167
|
+
"command_executor.change_flow_position_during_clarification",
|
|
168
|
+
command=self,
|
|
169
|
+
index=idx,
|
|
170
|
+
)
|
|
171
|
+
# pop the continue interrupted flow frame if it exists
|
|
172
|
+
next_frame = frames[idx + 1] if idx + 1 < len(frames) else None
|
|
173
|
+
if (
|
|
174
|
+
isinstance(next_frame, ContinueInterruptedPatternFlowStackFrame)
|
|
175
|
+
and next_frame.previous_flow_name == self.flow
|
|
176
|
+
):
|
|
177
|
+
stack.frames.pop(idx + 1)
|
|
178
|
+
# move up the existing flow from the stack
|
|
179
|
+
stack.frames.pop(idx)
|
|
180
|
+
stack.push(frame)
|
|
181
|
+
return tracker.create_stack_updated_events(stack)
|
|
182
|
+
|
|
183
|
+
return []
|
|
@@ -2,7 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Any, Dict, List
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
6
7
|
from rasa.dialogue_understanding.patterns.user_silence import (
|
|
7
8
|
UserSilencePatternFlowStackFrame,
|
|
8
9
|
)
|
|
@@ -53,7 +54,4 @@ class UserSilenceCommand(Command):
|
|
|
53
54
|
return hash(self.command())
|
|
54
55
|
|
|
55
56
|
def __eq__(self, other: object) -> bool:
|
|
56
|
-
|
|
57
|
-
return False
|
|
58
|
-
|
|
59
|
-
return True
|
|
57
|
+
return isinstance(other, UserSilenceCommand)
|
|
@@ -1,45 +1,128 @@
|
|
|
1
|
-
from typing import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Command,
|
|
8
|
-
HumanHandoffCommand,
|
|
9
|
-
KnowledgeAnswerCommand,
|
|
10
|
-
SessionStartCommand,
|
|
11
|
-
SkipQuestionCommand,
|
|
12
|
-
RestartCommand,
|
|
13
|
-
)
|
|
14
|
-
from rasa.dialogue_understanding.commands.user_silence_command import UserSilenceCommand
|
|
15
|
-
from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
|
|
16
|
-
from rasa.dialogue_understanding.patterns.cannot_handle import (
|
|
17
|
-
CannotHandlePatternFlowStackFrame,
|
|
18
|
-
)
|
|
19
|
-
from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowStackFrame
|
|
20
|
-
from rasa.dialogue_understanding.patterns.human_handoff import (
|
|
21
|
-
HumanHandoffPatternFlowStackFrame,
|
|
22
|
-
)
|
|
23
|
-
from rasa.dialogue_understanding.patterns.restart import RestartPatternFlowStackFrame
|
|
24
|
-
from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
|
|
25
|
-
from rasa.dialogue_understanding.patterns.session_start import (
|
|
26
|
-
SessionStartPatternFlowStackFrame,
|
|
27
|
-
)
|
|
28
|
-
from rasa.dialogue_understanding.patterns.skip_question import (
|
|
29
|
-
SkipQuestionPatternFlowStackFrame,
|
|
30
|
-
)
|
|
31
|
-
from rasa.dialogue_understanding.patterns.user_silence import (
|
|
32
|
-
UserSilencePatternFlowStackFrame,
|
|
1
|
+
from typing import TYPE_CHECKING, List, Optional, Tuple, Union
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
|
|
5
|
+
from rasa.dialogue_understanding.patterns.validate_slot import (
|
|
6
|
+
ValidateSlotPatternFlowStackFrame,
|
|
33
7
|
)
|
|
8
|
+
from rasa.shared.constants import ACTION_ASK_PREFIX, UTTER_ASK_PREFIX
|
|
9
|
+
from rasa.shared.core.events import Event, SlotSet
|
|
10
|
+
from rasa.shared.core.slots import Slot
|
|
11
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from rasa.dialogue_understanding.commands import StartFlowCommand
|
|
15
|
+
from rasa.shared.core.flows import FlowsList
|
|
16
|
+
|
|
17
|
+
structlogger = structlog.get_logger()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def start_flow_by_name(
|
|
21
|
+
flow_name: str, flows: "FlowsList"
|
|
22
|
+
) -> Optional["StartFlowCommand"]:
|
|
23
|
+
from rasa.dialogue_understanding.commands import StartFlowCommand
|
|
24
|
+
|
|
25
|
+
if flow_name in flows.user_flow_ids:
|
|
26
|
+
return StartFlowCommand(flow=flow_name)
|
|
27
|
+
else:
|
|
28
|
+
structlogger.debug(
|
|
29
|
+
"command_parser.start_flow_by_name.invalid_flow_id", flow=flow_name
|
|
30
|
+
)
|
|
31
|
+
return None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def extract_cleaned_options(options_str: str) -> List[str]:
|
|
35
|
+
"""Extract and clean options from a string."""
|
|
36
|
+
delimiters = [",", " "]
|
|
37
|
+
|
|
38
|
+
for delimiter in delimiters:
|
|
39
|
+
options_str = options_str.replace(delimiter, " ")
|
|
40
|
+
|
|
41
|
+
return sorted(
|
|
42
|
+
opt.strip().strip('"').strip("'") for opt in options_str.split() if opt.strip()
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def is_none_value(value: str) -> bool:
|
|
47
|
+
"""Check if the value is a none value."""
|
|
48
|
+
if not value:
|
|
49
|
+
return True
|
|
50
|
+
return value in {
|
|
51
|
+
"[missing information]",
|
|
52
|
+
"[missing]",
|
|
53
|
+
"None",
|
|
54
|
+
"undefined",
|
|
55
|
+
"null",
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def clean_extracted_value(value: str) -> str:
|
|
60
|
+
"""Clean up the extracted value from the llm."""
|
|
61
|
+
# replace any combination of single quotes, double quotes, and spaces
|
|
62
|
+
# from the beginning and end of the string
|
|
63
|
+
return value.strip("'\" ")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def get_nullable_slot_value(slot_value: str) -> Union[str, None]:
|
|
67
|
+
"""Get the slot value or None if the value is a none value.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
slot_value: the value to coerce
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
The slot value or None if the value is a none value.
|
|
74
|
+
"""
|
|
75
|
+
return slot_value if not is_none_value(slot_value) else None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def initialize_pattern_validate_slot(
|
|
79
|
+
slot: Slot,
|
|
80
|
+
) -> Optional[ValidateSlotPatternFlowStackFrame]:
|
|
81
|
+
"""Initialize the pattern to validate a slot value."""
|
|
82
|
+
if not slot.requires_validation():
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
validation = slot.validation
|
|
86
|
+
slot_name = slot.name
|
|
87
|
+
return ValidateSlotPatternFlowStackFrame(
|
|
88
|
+
validate=slot_name,
|
|
89
|
+
refill_utter=validation.refill_utter or f"{UTTER_ASK_PREFIX}{slot_name}", # type: ignore[union-attr]
|
|
90
|
+
refill_action=f"{ACTION_ASK_PREFIX}{slot_name}",
|
|
91
|
+
rejections=validation.rejections, # type: ignore[union-attr]
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def create_validate_frames_from_slot_set_events(
|
|
96
|
+
tracker: DialogueStateTracker,
|
|
97
|
+
events: List[Event],
|
|
98
|
+
validate_frames: List[ValidateSlotPatternFlowStackFrame] = [],
|
|
99
|
+
should_break: bool = False,
|
|
100
|
+
) -> Tuple[DialogueStateTracker, List[ValidateSlotPatternFlowStackFrame]]:
|
|
101
|
+
"""Process SlotSet events and create validation frames.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
tracker: The dialogue state tracker.
|
|
105
|
+
events: List of events to process.
|
|
106
|
+
should_break: whether or not to break after the first non-SlotSet event.
|
|
107
|
+
if True, break out of the event loop as soon as the first non-SlotSet
|
|
108
|
+
event is encountered.
|
|
109
|
+
if False, continue processing the events until the end.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Tuple of (updated tracker, list of validation frames).
|
|
113
|
+
"""
|
|
114
|
+
for event in events:
|
|
115
|
+
if not isinstance(event, SlotSet):
|
|
116
|
+
if should_break:
|
|
117
|
+
# we want to only process the most recent SlotSet events
|
|
118
|
+
# so we break once we encounter a different event
|
|
119
|
+
break
|
|
120
|
+
continue
|
|
121
|
+
|
|
122
|
+
slot = tracker.slots.get(event.key)
|
|
123
|
+
frame = initialize_pattern_validate_slot(slot)
|
|
124
|
+
|
|
125
|
+
if frame:
|
|
126
|
+
validate_frames.append(frame)
|
|
34
127
|
|
|
35
|
-
|
|
36
|
-
SessionStartPatternFlowStackFrame.flow_id: SessionStartCommand,
|
|
37
|
-
UserSilencePatternFlowStackFrame.flow_id: UserSilenceCommand,
|
|
38
|
-
CancelPatternFlowStackFrame.flow_id: CancelFlowCommand,
|
|
39
|
-
ChitchatPatternFlowStackFrame.flow_id: ChitChatAnswerCommand,
|
|
40
|
-
HumanHandoffPatternFlowStackFrame.flow_id: HumanHandoffCommand,
|
|
41
|
-
SearchPatternFlowStackFrame.flow_id: KnowledgeAnswerCommand,
|
|
42
|
-
SkipQuestionPatternFlowStackFrame.flow_id: SkipQuestionCommand,
|
|
43
|
-
CannotHandlePatternFlowStackFrame.flow_id: CannotHandleCommand,
|
|
44
|
-
RestartPatternFlowStackFrame.flow_id: RestartCommand,
|
|
45
|
-
}
|
|
128
|
+
return tracker, validate_frames
|
|
@@ -9,6 +9,7 @@ from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_gen
|
|
|
9
9
|
MultiStepLLMCommandGenerator,
|
|
10
10
|
)
|
|
11
11
|
from rasa.dialogue_understanding.generator.single_step.single_step_llm_command_generator import ( # noqa: E501
|
|
12
|
+
CompactLLMCommandGenerator,
|
|
12
13
|
SingleStepLLMCommandGenerator,
|
|
13
14
|
)
|
|
14
15
|
|
|
@@ -18,4 +19,5 @@ __all__ = [
|
|
|
18
19
|
"LLMCommandGenerator",
|
|
19
20
|
"MultiStepLLMCommandGenerator",
|
|
20
21
|
"SingleStepLLMCommandGenerator",
|
|
22
|
+
"CompactLLMCommandGenerator",
|
|
21
23
|
]
|
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, Dict, List, Optional, Text
|
|
2
|
+
from typing import Any, Dict, List, Optional, Set, Text, Tuple
|
|
3
3
|
|
|
4
4
|
import structlog
|
|
5
5
|
|
|
6
6
|
from rasa.dialogue_understanding.commands import (
|
|
7
7
|
Command,
|
|
8
|
+
CorrectSlotsCommand,
|
|
9
|
+
ErrorCommand,
|
|
8
10
|
SetSlotCommand,
|
|
9
11
|
StartFlowCommand,
|
|
10
|
-
ErrorCommand,
|
|
11
12
|
)
|
|
12
|
-
from rasa.dialogue_understanding.
|
|
13
|
-
|
|
13
|
+
from rasa.dialogue_understanding.utils import (
|
|
14
|
+
_handle_via_nlu_in_coexistence,
|
|
15
|
+
)
|
|
16
|
+
from rasa.shared.constants import (
|
|
17
|
+
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
|
|
18
|
+
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
|
|
19
|
+
)
|
|
14
20
|
from rasa.shared.core.domain import Domain
|
|
15
21
|
from rasa.shared.core.flows import FlowsList
|
|
16
|
-
from rasa.shared.core.slot_mappings import SlotFillingManager
|
|
17
22
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
23
|
+
from rasa.shared.nlu.constants import (
|
|
24
|
+
COMMANDS,
|
|
25
|
+
TEXT,
|
|
26
|
+
)
|
|
18
27
|
from rasa.shared.nlu.training_data.message import Message
|
|
19
|
-
from rasa.shared.nlu.constants import COMMANDS, TEXT
|
|
20
28
|
from rasa.shared.utils.llm import DEFAULT_MAX_USER_INPUT_CHARACTERS
|
|
21
|
-
from rasa.shared.constants import (
|
|
22
|
-
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
|
|
23
|
-
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
|
|
24
|
-
)
|
|
25
29
|
|
|
26
30
|
structlogger = structlog.get_logger()
|
|
27
31
|
|
|
@@ -89,9 +93,9 @@ class CommandGenerator:
|
|
|
89
93
|
)
|
|
90
94
|
|
|
91
95
|
for message in messages:
|
|
92
|
-
if message
|
|
93
|
-
#
|
|
94
|
-
#
|
|
96
|
+
if _handle_via_nlu_in_coexistence(tracker, message):
|
|
97
|
+
# Skip running the CALM pipeline if the message should
|
|
98
|
+
# be handled by the NLU-based system in a coexistence mode.
|
|
95
99
|
continue
|
|
96
100
|
|
|
97
101
|
commands = await self._evaluate_and_predict(
|
|
@@ -103,9 +107,6 @@ class CommandGenerator:
|
|
|
103
107
|
commands = self._check_commands_against_startable_flows(
|
|
104
108
|
commands, startable_flows
|
|
105
109
|
)
|
|
106
|
-
commands = self._check_commands_against_slot_mappings(
|
|
107
|
-
commands, tracker, domain
|
|
108
|
-
)
|
|
109
110
|
commands_dicts = [command.as_dict() for command in commands]
|
|
110
111
|
message.set(COMMANDS, commands_dicts, add_to_output=True)
|
|
111
112
|
|
|
@@ -193,11 +194,100 @@ class CommandGenerator:
|
|
|
193
194
|
flows: The flows to use for command prediction.
|
|
194
195
|
tracker: The tracker containing the conversation history up to now.
|
|
195
196
|
**kwargs: Keyword arguments for forward compatibility.
|
|
197
|
+
|
|
196
198
|
Returns:
|
|
197
199
|
The predicted commands.
|
|
198
200
|
"""
|
|
199
201
|
raise NotImplementedError()
|
|
200
202
|
|
|
203
|
+
def _check_commands_overlap(
|
|
204
|
+
self, prior_commands: List[Command], commands: List[Command]
|
|
205
|
+
) -> List[Command]:
|
|
206
|
+
"""Check if there is overlap between the prior commands and the current ones.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
prior_commands: The prior commands.
|
|
210
|
+
commands: The commands to check.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
The final commands.
|
|
214
|
+
"""
|
|
215
|
+
if not prior_commands:
|
|
216
|
+
return commands
|
|
217
|
+
|
|
218
|
+
prior_commands, commands = self._check_slot_command_overlap(
|
|
219
|
+
prior_commands, commands
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
prior_start_flow_names = {
|
|
223
|
+
command.flow
|
|
224
|
+
for command in prior_commands
|
|
225
|
+
if isinstance(command, StartFlowCommand)
|
|
226
|
+
}
|
|
227
|
+
current_start_flow_names = {
|
|
228
|
+
command.flow
|
|
229
|
+
for command in commands
|
|
230
|
+
if isinstance(command, StartFlowCommand)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return self._check_start_flow_command_overlap(
|
|
234
|
+
prior_commands,
|
|
235
|
+
commands,
|
|
236
|
+
prior_start_flow_names,
|
|
237
|
+
current_start_flow_names,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
def _check_start_flow_command_overlap(
|
|
241
|
+
self,
|
|
242
|
+
prior_commands: List[Command],
|
|
243
|
+
commands: List[Command],
|
|
244
|
+
prior_start_flow_names: Set[str],
|
|
245
|
+
current_start_flow_names: Set[str],
|
|
246
|
+
) -> List[Command]:
|
|
247
|
+
"""Get the final commands.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
prior_commands: The prior commands.
|
|
251
|
+
commands: The currently predicted commands to check.
|
|
252
|
+
prior_start_flow_names: The names of the flows from the prior commands.
|
|
253
|
+
current_start_flow_names: The names of the flows from the current commands.
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
The final commands.
|
|
257
|
+
"""
|
|
258
|
+
raise NotImplementedError()
|
|
259
|
+
|
|
260
|
+
def _check_slot_command_overlap(
|
|
261
|
+
self,
|
|
262
|
+
prior_commands: List[Command],
|
|
263
|
+
commands: List[Command],
|
|
264
|
+
) -> Tuple[List[Command], List[Command]]:
|
|
265
|
+
"""Check if the current commands overlap with the prior commands."""
|
|
266
|
+
prior_slot_names = gather_slot_names(prior_commands)
|
|
267
|
+
current_slot_names = gather_slot_names(commands)
|
|
268
|
+
overlapping_slot_names = prior_slot_names.intersection(current_slot_names)
|
|
269
|
+
|
|
270
|
+
structlogger.debug(
|
|
271
|
+
"command_generator.check_slot_command_overlap",
|
|
272
|
+
overlapping_slot_names=overlapping_slot_names,
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
if not overlapping_slot_names:
|
|
276
|
+
return prior_commands, commands
|
|
277
|
+
|
|
278
|
+
return self._filter_slot_commands(
|
|
279
|
+
prior_commands, commands, overlapping_slot_names
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
def _filter_slot_commands(
|
|
283
|
+
self,
|
|
284
|
+
prior_commands: List[Command],
|
|
285
|
+
commands: List[Command],
|
|
286
|
+
overlapping_slot_names: Set[str],
|
|
287
|
+
) -> Tuple[List[Command], List[Command]]:
|
|
288
|
+
"""Filter out the overlapping slot commands."""
|
|
289
|
+
raise NotImplementedError()
|
|
290
|
+
|
|
201
291
|
def _check_commands_against_startable_flows(
|
|
202
292
|
self, commands: List[Command], startable_flows: FlowsList
|
|
203
293
|
) -> List[Command]:
|
|
@@ -274,70 +364,21 @@ class CommandGenerator:
|
|
|
274
364
|
return len(message.get(TEXT, "").strip()) == 0
|
|
275
365
|
|
|
276
366
|
@staticmethod
|
|
277
|
-
def
|
|
278
|
-
commands
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
) -> List[Command]:
|
|
282
|
-
"""Check if the LLM-issued slot commands are fillable.
|
|
283
|
-
|
|
284
|
-
The LLM-issued slot commands are fillable if the slot
|
|
285
|
-
mappings are satisfied.
|
|
286
|
-
"""
|
|
287
|
-
if not domain:
|
|
288
|
-
return commands
|
|
289
|
-
|
|
290
|
-
llm_fillable_slot_names = [
|
|
291
|
-
command.name
|
|
292
|
-
for command in commands
|
|
293
|
-
if isinstance(command, SetSlotCommand)
|
|
294
|
-
and command.extractor == SetSlotExtractor.LLM.value
|
|
367
|
+
def _get_prior_commands(message: Message) -> List[Command]:
|
|
368
|
+
"""Get the prior commands from the tracker."""
|
|
369
|
+
return [
|
|
370
|
+
Command.command_from_json(command) for command in message.get(COMMANDS, [])
|
|
295
371
|
]
|
|
296
372
|
|
|
297
|
-
if not llm_fillable_slot_names:
|
|
298
|
-
return commands
|
|
299
373
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
active_flow=tracker.active_flow,
|
|
310
|
-
)
|
|
311
|
-
|
|
312
|
-
for slot in llm_fillable_slots:
|
|
313
|
-
should_fill_slot = False
|
|
314
|
-
for mapping in slot.mappings:
|
|
315
|
-
mapping_type = SlotMappingType(mapping.get("type"))
|
|
316
|
-
|
|
317
|
-
should_fill_slot = slot_filling_manager.should_fill_slot(
|
|
318
|
-
slot.name, mapping_type, mapping
|
|
319
|
-
)
|
|
320
|
-
|
|
321
|
-
if should_fill_slot:
|
|
322
|
-
break
|
|
323
|
-
|
|
324
|
-
if not should_fill_slot:
|
|
325
|
-
structlogger.debug(
|
|
326
|
-
"command_processor.check_commands_against_slot_mappings.slot_not_fillable",
|
|
327
|
-
slot_name=slot.name,
|
|
328
|
-
)
|
|
329
|
-
slots_to_be_removed.append(slot.name)
|
|
330
|
-
|
|
331
|
-
if not slots_to_be_removed:
|
|
332
|
-
return commands
|
|
333
|
-
|
|
334
|
-
filtered_commands = [
|
|
335
|
-
command
|
|
336
|
-
for command in commands
|
|
337
|
-
if not (
|
|
338
|
-
isinstance(command, SetSlotCommand)
|
|
339
|
-
and command.name in slots_to_be_removed
|
|
340
|
-
)
|
|
341
|
-
]
|
|
374
|
+
def gather_slot_names(commands: List[Command]) -> Set[str]:
|
|
375
|
+
"""Gather all slot names from the commands."""
|
|
376
|
+
slot_names = set()
|
|
377
|
+
for command in commands:
|
|
378
|
+
if isinstance(command, SetSlotCommand):
|
|
379
|
+
slot_names.add(command.name)
|
|
380
|
+
if isinstance(command, CorrectSlotsCommand):
|
|
381
|
+
for slot in command.corrected_slots:
|
|
382
|
+
slot_names.add(slot.name)
|
|
342
383
|
|
|
343
|
-
|
|
384
|
+
return slot_names
|