rasa-pro 3.13.12__py3-none-any.whl → 3.14.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.
- rasa/__main__.py +15 -3
- rasa/agents/__init__.py +0 -0
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +213 -0
- rasa/agents/constants.py +43 -0
- rasa/agents/core/__init__.py +0 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +81 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/__init__.py +0 -0
- rasa/agents/protocol/a2a/a2a_agent.py +889 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +778 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
- rasa/agents/schemas/__init__.py +13 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +65 -0
- rasa/agents/schemas/agent_tool_schema.py +186 -0
- rasa/agents/templates/__init__.py +0 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
- rasa/agents/utils.py +228 -0
- rasa/agents/validation.py +538 -0
- rasa/api.py +23 -9
- rasa/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +96 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +38 -0
- rasa/builder/copilot/copilot.py +562 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +81 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +690 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +787 -0
- rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +91 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +234 -0
- rasa/builder/copilot/templated_messages/__init__.py +0 -0
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +41 -0
- rasa/builder/copilot/templated_messages/copilot_welcome_messages.yml +56 -0
- rasa/builder/document_retrieval/__init__.py +0 -0
- rasa/builder/document_retrieval/constants.py +15 -0
- rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
- rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
- rasa/builder/document_retrieval/models.py +62 -0
- rasa/builder/download.py +140 -0
- rasa/builder/exceptions.py +91 -0
- rasa/builder/guardrails/__init__.py +1 -0
- rasa/builder/guardrails/clients.py +256 -0
- rasa/builder/guardrails/constants.py +12 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/models.py +266 -0
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +94 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +609 -0
- rasa/builder/llm_service.py +273 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +234 -0
- rasa/builder/models.py +229 -0
- rasa/builder/project_generator.py +463 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/service.py +1367 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/template_cache.py +69 -0
- rasa/builder/training_service.py +188 -0
- rasa/builder/validation_service.py +101 -0
- rasa/cli/arguments/data.py +9 -0
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +78 -10
- rasa/cli/dialogue_understanding_test.py +11 -7
- rasa/cli/e2e_test.py +10 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +9 -4
- rasa/cli/interactive.py +8 -4
- rasa/cli/llm_fine_tuning.py +12 -6
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/__init__ +0 -0
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +29 -0
- rasa/cli/project_templates/basic/credentials.yml +33 -0
- rasa/cli/project_templates/basic/data/data.md +8 -0
- rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
- rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
- rasa/cli/project_templates/basic/data/general/help.yml +6 -0
- rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/basic/docs/docs.md +5 -0
- rasa/cli/project_templates/basic/docs/template.txt +28 -0
- rasa/cli/project_templates/basic/domain/domain.md +11 -0
- rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
- rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
- rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
- rasa/cli/project_templates/basic/endpoints.yml +67 -0
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/help.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/human_handoff.yml +41 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/patterns.yml +32 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/show_faqs.yml +8 -0
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/defaults.py +1 -0
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/cards/check_that_card_exists.py +21 -0
- rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
- rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
- rasa/cli/project_templates/finance/actions/db.py +117 -0
- rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
- rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
- rasa/cli/project_templates/finance/config.yml +29 -0
- rasa/cli/project_templates/finance/credentials.yml +33 -0
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
- rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
- rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +45 -0
- rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
- rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
- rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
- rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
- rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
- rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
- rasa/cli/project_templates/finance/data/data.md +14 -0
- rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +6 -0
- rasa/cli/project_templates/finance/data/general/help.yml +9 -0
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
- rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
- rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +34 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
- rasa/cli/project_templates/finance/db/cards.json +18 -0
- rasa/cli/project_templates/finance/db/contacts.json +10 -0
- rasa/cli/project_templates/finance/db/my_account.json +6 -0
- rasa/cli/project_templates/finance/db/transactions.json +22 -0
- rasa/cli/project_templates/finance/docs/docs.md +8 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +15 -0
- rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
- rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
- rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +44 -0
- rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
- rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
- rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
- rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
- rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
- rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
- rasa/cli/project_templates/finance/domain/domain.md +18 -0
- rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
- rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +8 -0
- rasa/cli/project_templates/finance/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -0
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +31 -0
- rasa/cli/project_templates/finance/domain/general/welcome.yml +39 -0
- rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
- rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
- rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +221 -0
- rasa/cli/project_templates/finance/endpoints.yml +67 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/download_statements.yml +43 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/cards/block_card.yml +55 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/patterns.yml +22 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/transfers/transfer_money.yml +56 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
- rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
- rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
- rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
- rasa/cli/project_templates/telco/config.yml +29 -0
- rasa/cli/project_templates/telco/credentials.yml +33 -0
- rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
- rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
- rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
- rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
- rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
- rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
- rasa/cli/project_templates/telco/docs/docs.md +8 -0
- rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
- rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
- rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
- rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
- rasa/cli/project_templates/telco/domain/domain.md +13 -0
- rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
- rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
- rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
- rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
- rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
- rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +74 -0
- rasa/cli/project_templates/telco/domain/shared.yml +129 -0
- rasa/cli/project_templates/telco/endpoints.yml +67 -0
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_not_slow.yml +33 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_slow.yml +47 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/patterns.yml +23 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +8 -10
- rasa/cli/scaffold.py +50 -6
- rasa/cli/shell.py +10 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +44 -30
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +232 -0
- rasa/cli/validation/config_path_validation.py +257 -0
- rasa/cli/x.py +8 -4
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +53 -13
- rasa/core/actions/action_exceptions.py +1 -1
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +22 -2
- rasa/core/available_agents.py +239 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +56 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +29 -16
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +18 -18
- rasa/core/channels/inspector/src/App.tsx +56 -12
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
- rasa/core/channels/inspector/src/types.ts +55 -1
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +82 -32
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_ready/twilio_voice.py +1 -1
- rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
- rasa/core/channels/voice_stream/asr/azure.py +6 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
- rasa/core/channels/voice_stream/audiocodes.py +11 -6
- rasa/core/channels/voice_stream/browser_audio.py +91 -4
- rasa/core/channels/voice_stream/call_state.py +13 -2
- rasa/core/channels/voice_stream/genesys.py +19 -15
- rasa/core/channels/voice_stream/jambonz.py +22 -12
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
- rasa/core/channels/voice_stream/util.py +11 -1
- rasa/core/channels/voice_stream/voice_channel.py +170 -32
- rasa/core/concurrent_lock_store.py +83 -16
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
- rasa/core/config/configuration.py +295 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +17 -0
- rasa/core/exceptions.py +1 -1
- rasa/core/featurizers/tracker_featurizers.py +3 -2
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
- rasa/core/lock_store.py +50 -10
- rasa/core/nlg/contextual_response_rephraser.py +5 -0
- rasa/core/nlg/generator.py +1 -1
- rasa/core/persistor.py +7 -7
- rasa/core/policies/enterprise_search_policy.py +9 -10
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +720 -0
- rasa/core/policies/flows/flow_exceptions.py +5 -2
- rasa/core/policies/flows/flow_executor.py +146 -77
- rasa/core/policies/flows/mcp_tool_executor.py +304 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/rule_policy.py +1 -1
- rasa/core/policies/ted_policy.py +20 -12
- rasa/core/policies/unexpected_intent_policy.py +6 -0
- rasa/core/processor.py +100 -44
- rasa/core/redis_connection_factory.py +474 -0
- rasa/core/run.py +49 -10
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +36 -14
- rasa/core/tracker_stores/sql_tracker_store.py +59 -1
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +20 -18
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +22 -23
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/clarify_command.py +20 -2
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
- rasa/dialogue_understanding/commands/utils.py +135 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
- rasa/dialogue_understanding/processor/command_processor.py +136 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +8 -3
- rasa/e2e_test/e2e_test_runner.py +13 -3
- rasa/engine/caching.py +2 -2
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +5 -1
- rasa/engine/loader.py +12 -0
- rasa/engine/recipes/default_components.py +138 -49
- rasa/engine/recipes/default_recipe.py +108 -11
- rasa/engine/runner/dask.py +8 -5
- rasa/engine/validation.py +25 -8
- rasa/graph_components/validators/default_recipe_validator.py +86 -28
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +2 -2
- rasa/model_manager/socket_bridge.py +21 -17
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/model_manager/warm_rasa_process.py +13 -3
- rasa/model_training.py +60 -47
- rasa/nlu/classifiers/diet_classifier.py +198 -98
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
- rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
- rasa/nlu/extractors/crf_entity_extractor.py +9 -10
- rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
- rasa/nlu/selectors/response_selector.py +10 -2
- rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
- rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
- rasa/nlu/utils/mitie_utils.py +3 -0
- rasa/nlu/utils/spacy_utils.py +3 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_config.py +1 -1
- rasa/privacy/privacy_manager.py +12 -3
- rasa/server.py +15 -3
- rasa/shared/agents/__init__.py +0 -0
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +105 -0
- rasa/shared/agents/auth/agent_auth_manager.py +92 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
- rasa/shared/agents/auth/constants.py +13 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/auth/utils.py +85 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +11 -0
- rasa/shared/core/constants.py +17 -1
- rasa/shared/core/domain.py +62 -22
- rasa/shared/core/events.py +329 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow.py +1 -1
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +57 -6
- rasa/shared/core/flows/steps/collect.py +98 -13
- rasa/shared/core/flows/validation.py +372 -8
- rasa/shared/core/flows/yaml_flows_io.py +19 -10
- rasa/shared/core/slots.py +6 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
- rasa/shared/exceptions.py +39 -2
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +86 -4
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/llm/_base_litellm_client.py +41 -9
- rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/common.py +26 -1
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +92 -19
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +250 -0
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/download.py +3 -0
- rasa/studio/prompts.py +1 -0
- rasa/studio/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +19 -52
- rasa/telemetry.py +166 -28
- rasa/tracing/config.py +45 -12
- rasa/tracing/constants.py +14 -0
- rasa/tracing/instrumentation/attribute_extractors.py +142 -9
- rasa/tracing/instrumentation/instrumentation.py +626 -21
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/tracing/instrumentation/metrics.py +32 -0
- rasa/tracing/metric_instrument_provider.py +68 -0
- rasa/utils/common.py +92 -1
- rasa/utils/endpoints.py +11 -2
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +121 -7
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/plotting.py +1 -1
- rasa/utils/pypred.py +45 -0
- rasa/utils/tensorflow/__init__.py +7 -0
- rasa/utils/tensorflow/callback.py +136 -101
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +21 -11
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +56 -8
- rasa/utils/tensorflow/rasa_layers.py +8 -6
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +54 -24
- rasa/validator.py +149 -16
- rasa/version.py +1 -1
- rasa_pro-3.14.0.dist-info/METADATA +212 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +581 -269
- rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
- rasa_pro-3.13.12.dist-info/METADATA +0 -192
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
|
@@ -61,19 +61,6 @@ class ActionClarifyFlows(action.Action):
|
|
|
61
61
|
"""Return the flow name."""
|
|
62
62
|
return ACTION_CLARIFY_FLOWS
|
|
63
63
|
|
|
64
|
-
@staticmethod
|
|
65
|
-
def assemble_options_string(names: List[str]) -> str:
|
|
66
|
-
"""Concatenate options to a human-readable string."""
|
|
67
|
-
clarification_message = ""
|
|
68
|
-
for i, name in enumerate(names):
|
|
69
|
-
if i == 0:
|
|
70
|
-
clarification_message += name
|
|
71
|
-
elif i == len(names) - 1:
|
|
72
|
-
clarification_message += f" or {name}"
|
|
73
|
-
else:
|
|
74
|
-
clarification_message += f", {name}"
|
|
75
|
-
return clarification_message
|
|
76
|
-
|
|
77
64
|
async def run(
|
|
78
65
|
self,
|
|
79
66
|
output_channel: "OutputChannel",
|
|
@@ -83,6 +70,8 @@ class ActionClarifyFlows(action.Action):
|
|
|
83
70
|
metadata: Optional[Dict[str, Any]] = None,
|
|
84
71
|
) -> List[Event]:
|
|
85
72
|
"""Correct the slots."""
|
|
73
|
+
from rasa.dialogue_understanding.utils import assemble_options_string
|
|
74
|
+
|
|
86
75
|
stack = tracker.stack
|
|
87
76
|
if not (top := stack.top()):
|
|
88
77
|
structlogger.warning("action.clarify_flows.no_active_flow")
|
|
@@ -92,7 +81,7 @@ class ActionClarifyFlows(action.Action):
|
|
|
92
81
|
structlogger.warning("action.clarify_flows.no_clarification_frame")
|
|
93
82
|
return []
|
|
94
83
|
|
|
95
|
-
options_string =
|
|
84
|
+
options_string = assemble_options_string(top.names, conjunction="or")
|
|
96
85
|
top.clarification_options = options_string
|
|
97
86
|
# since we modified the stack frame, we need to update the stack
|
|
98
87
|
return tracker.create_stack_updated_events(stack)
|
|
@@ -1,14 +1,47 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Dict
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Any, Dict, List, Optional, Text, Tuple
|
|
5
5
|
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa.core.actions.action import Action
|
|
9
|
+
from rasa.core.channels import OutputChannel
|
|
10
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
11
|
+
from rasa.dialogue_understanding.commands.utils import (
|
|
12
|
+
resume_flow,
|
|
13
|
+
)
|
|
14
|
+
from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
|
|
15
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
6
16
|
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
17
|
+
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
18
|
+
DialogueStackFrame,
|
|
19
|
+
)
|
|
20
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
21
|
+
AgentStackFrame,
|
|
22
|
+
FlowStackFrameType,
|
|
23
|
+
UserFlowStackFrame,
|
|
24
|
+
)
|
|
25
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
26
|
+
get_active_continue_interrupted_pattern_frame,
|
|
27
|
+
)
|
|
7
28
|
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
29
|
+
from rasa.shared.core.constants import (
|
|
30
|
+
ACTION_CANCEL_INTERRUPTED_FLOWS,
|
|
31
|
+
ACTION_CONTINUE_INTERRUPTED_FLOW,
|
|
32
|
+
)
|
|
33
|
+
from rasa.shared.core.domain import Domain
|
|
34
|
+
from rasa.shared.core.events import AgentCancelled, Event, FlowCancelled, SlotSet
|
|
35
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
8
36
|
|
|
9
37
|
FLOW_PATTERN_CONTINUE_INTERRUPTED = (
|
|
10
38
|
RASA_DEFAULT_FLOW_PATTERN_PREFIX + "continue_interrupted"
|
|
11
39
|
)
|
|
40
|
+
INTERRUPTED_FLOW_TO_CONTINUE_SLOT = "interrupted_flow_to_continue"
|
|
41
|
+
CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT = "continue_interrupted_flow_confirmation"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
structlogger = structlog.get_logger()
|
|
12
45
|
|
|
13
46
|
|
|
14
47
|
@dataclass
|
|
@@ -17,8 +50,14 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
|
17
50
|
|
|
18
51
|
flow_id: str = FLOW_PATTERN_CONTINUE_INTERRUPTED
|
|
19
52
|
"""The ID of the flow."""
|
|
20
|
-
|
|
21
|
-
"""The
|
|
53
|
+
interrupted_flow_names: List[str] = field(default_factory=list)
|
|
54
|
+
"""The names of the previous flows that were interrupted."""
|
|
55
|
+
interrupted_flow_ids: List[str] = field(default_factory=list)
|
|
56
|
+
"""The ids of the previous flows that were interrupted."""
|
|
57
|
+
interrupted_flow_options: str = ""
|
|
58
|
+
"""The options that the user can choose from as a string."""
|
|
59
|
+
multiple_flows_interrupted: bool = False
|
|
60
|
+
"""Whether the user has interrupted multiple flows."""
|
|
22
61
|
|
|
23
62
|
@classmethod
|
|
24
63
|
def type(cls) -> str:
|
|
@@ -38,7 +77,10 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
|
38
77
|
return ContinueInterruptedPatternFlowStackFrame(
|
|
39
78
|
frame_id=data["frame_id"],
|
|
40
79
|
step_id=data["step_id"],
|
|
41
|
-
|
|
80
|
+
interrupted_flow_names=data["interrupted_flow_names"],
|
|
81
|
+
interrupted_flow_ids=data["interrupted_flow_ids"],
|
|
82
|
+
interrupted_flow_options=data["interrupted_flow_options"],
|
|
83
|
+
multiple_flows_interrupted=len(data["interrupted_flow_names"]) > 1,
|
|
42
84
|
)
|
|
43
85
|
|
|
44
86
|
def __eq__(self, other: Any) -> bool:
|
|
@@ -47,5 +89,196 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
|
47
89
|
return (
|
|
48
90
|
self.flow_id == other.flow_id
|
|
49
91
|
and self.step_id == other.step_id
|
|
50
|
-
and self.
|
|
92
|
+
and self.interrupted_flow_names == other.interrupted_flow_names
|
|
93
|
+
and self.interrupted_flow_ids == other.interrupted_flow_ids
|
|
94
|
+
and self.interrupted_flow_options == other.interrupted_flow_options
|
|
51
95
|
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ActionContinueInterruptedFlow(Action):
|
|
99
|
+
def name(self) -> str:
|
|
100
|
+
return ACTION_CONTINUE_INTERRUPTED_FLOW
|
|
101
|
+
|
|
102
|
+
async def run(
|
|
103
|
+
self,
|
|
104
|
+
output_channel: OutputChannel,
|
|
105
|
+
nlg: NaturalLanguageGenerator,
|
|
106
|
+
tracker: DialogueStateTracker,
|
|
107
|
+
domain: Domain,
|
|
108
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
109
|
+
) -> List[Event]:
|
|
110
|
+
# get the pattern frame from the stack
|
|
111
|
+
pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
|
|
112
|
+
|
|
113
|
+
if pattern_frame is None:
|
|
114
|
+
structlogger.warning(
|
|
115
|
+
"action.continue_interrupted_flows.no_continue_interrupted_frame"
|
|
116
|
+
)
|
|
117
|
+
return []
|
|
118
|
+
|
|
119
|
+
interrupted_flow_ids = pattern_frame.interrupted_flow_ids
|
|
120
|
+
interrupted_flow_names = pattern_frame.interrupted_flow_names
|
|
121
|
+
multiple_flows_interrupted = pattern_frame.multiple_flows_interrupted
|
|
122
|
+
|
|
123
|
+
flow_to_continue = None
|
|
124
|
+
if not multiple_flows_interrupted:
|
|
125
|
+
# the user confirmed that they want to continue the flow
|
|
126
|
+
# as only one flow was interrupted, we can just continue the first one
|
|
127
|
+
flow_to_continue = interrupted_flow_ids[0]
|
|
128
|
+
else:
|
|
129
|
+
# the user mentioned the flow they want to continue
|
|
130
|
+
# check if the flow is in the list of interrupted flows
|
|
131
|
+
selected_flow = tracker.get_slot(INTERRUPTED_FLOW_TO_CONTINUE_SLOT)
|
|
132
|
+
if selected_flow in interrupted_flow_ids:
|
|
133
|
+
flow_to_continue = selected_flow
|
|
134
|
+
elif selected_flow in interrupted_flow_names:
|
|
135
|
+
# the user mentioned the flow by name
|
|
136
|
+
# find the flow id for the flow name
|
|
137
|
+
# the list of names and ids are in the same order
|
|
138
|
+
flow_to_continue = interrupted_flow_ids[
|
|
139
|
+
interrupted_flow_names.index(selected_flow)
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
# if the user did not select a valid flow,
|
|
143
|
+
# we need to ask them to select a valid flow
|
|
144
|
+
if flow_to_continue is None:
|
|
145
|
+
await output_channel.send_text_message(
|
|
146
|
+
tracker.sender_id,
|
|
147
|
+
"You haven't selected a valid task to resume. "
|
|
148
|
+
"Please specify the task you would like to continue. "
|
|
149
|
+
"The options are: {{context.interrupted_flow_options}}",
|
|
150
|
+
)
|
|
151
|
+
return []
|
|
152
|
+
|
|
153
|
+
# resume the flow the user selected
|
|
154
|
+
events = resume_flow(flow_to_continue, tracker, tracker.stack)
|
|
155
|
+
|
|
156
|
+
return events + [
|
|
157
|
+
SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
|
|
158
|
+
SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class ActionCancelInterruptedFlows(Action):
|
|
163
|
+
def name(self) -> str:
|
|
164
|
+
return ACTION_CANCEL_INTERRUPTED_FLOWS
|
|
165
|
+
|
|
166
|
+
async def run(
|
|
167
|
+
self,
|
|
168
|
+
output_channel: OutputChannel,
|
|
169
|
+
nlg: NaturalLanguageGenerator,
|
|
170
|
+
tracker: DialogueStateTracker,
|
|
171
|
+
domain: Domain,
|
|
172
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
173
|
+
) -> List[Event]:
|
|
174
|
+
# get the pattern frame from the stack
|
|
175
|
+
pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
|
|
176
|
+
|
|
177
|
+
if pattern_frame is None:
|
|
178
|
+
structlogger.warning(
|
|
179
|
+
"action.continue_interrupted_flows.no_continue_interrupted_frame"
|
|
180
|
+
)
|
|
181
|
+
return []
|
|
182
|
+
|
|
183
|
+
interrupted_flow_ids = pattern_frame.interrupted_flow_ids
|
|
184
|
+
|
|
185
|
+
event_list: List[Event] = []
|
|
186
|
+
|
|
187
|
+
# cancel all interrupted flows
|
|
188
|
+
for flow_id in interrupted_flow_ids:
|
|
189
|
+
event_list.extend(self.cancel_flow(tracker, tracker.stack, flow_id))
|
|
190
|
+
|
|
191
|
+
return event_list + [
|
|
192
|
+
SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
|
|
193
|
+
SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
|
|
194
|
+
]
|
|
195
|
+
|
|
196
|
+
def cancel_flow(
|
|
197
|
+
self,
|
|
198
|
+
tracker: DialogueStateTracker,
|
|
199
|
+
stack: DialogueStack,
|
|
200
|
+
flow_id: str,
|
|
201
|
+
) -> List[Event]:
|
|
202
|
+
"""Cancels a flow by flow id."""
|
|
203
|
+
applied_events: List[Event] = []
|
|
204
|
+
|
|
205
|
+
frames_to_cancel, user_frame_to_cancel = self._collect_frames_to_cancel(
|
|
206
|
+
stack, flow_id
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# if the flow is not on the stack, do nothing
|
|
210
|
+
if user_frame_to_cancel is None:
|
|
211
|
+
structlogger.error(
|
|
212
|
+
"cancel_flow.no_user_frame_to_cancel",
|
|
213
|
+
flow_id=flow_id,
|
|
214
|
+
)
|
|
215
|
+
return []
|
|
216
|
+
|
|
217
|
+
frames_ids_to_cancel = [frame.frame_id for frame in frames_to_cancel]
|
|
218
|
+
|
|
219
|
+
stack.push(
|
|
220
|
+
CancelPatternFlowStackFrame(
|
|
221
|
+
canceled_name=flow_id,
|
|
222
|
+
canceled_frames=frames_ids_to_cancel,
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# create flow cancelled event
|
|
227
|
+
applied_events.extend(
|
|
228
|
+
[
|
|
229
|
+
FlowCancelled(
|
|
230
|
+
user_frame_to_cancel.flow_id, user_frame_to_cancel.step_id
|
|
231
|
+
),
|
|
232
|
+
]
|
|
233
|
+
)
|
|
234
|
+
# create agent cancelled events for any agent frames that are on the stack
|
|
235
|
+
for frame in frames_to_cancel:
|
|
236
|
+
if isinstance(frame, AgentStackFrame):
|
|
237
|
+
applied_events.append(
|
|
238
|
+
AgentCancelled(
|
|
239
|
+
frame.agent_id, frame.flow_id, reason="Flow was cancelled"
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
update_stack_events = tracker.create_stack_updated_events(stack)
|
|
244
|
+
|
|
245
|
+
return applied_events + update_stack_events
|
|
246
|
+
|
|
247
|
+
def _collect_frames_to_cancel(
|
|
248
|
+
self, stack: DialogueStack, target_flow_id: str
|
|
249
|
+
) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
|
|
250
|
+
"""Collect frames that need to be cancelled.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
stack: The stack to collect frames from.
|
|
254
|
+
target_flow_id: The ID of the flow to cancel.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
A tuple containing (frames_to_cancel, frame_to_cancel).
|
|
258
|
+
"""
|
|
259
|
+
frames_to_cancel: List[DialogueStackFrame] = []
|
|
260
|
+
frame_found = False
|
|
261
|
+
frame_to_cancel = None
|
|
262
|
+
|
|
263
|
+
# collect all frames that belong to the target flow
|
|
264
|
+
# i.e. we want to cancel all frames that are on the stack and between
|
|
265
|
+
# the user flow frame that belongs to the target flow and the next user
|
|
266
|
+
# flow frame that belongs to a different flow
|
|
267
|
+
# this includes any pattern frames or agent frames as well
|
|
268
|
+
for frame in stack.frames:
|
|
269
|
+
if isinstance(frame, UserFlowStackFrame) and (
|
|
270
|
+
frame.frame_type == FlowStackFrameType.REGULAR
|
|
271
|
+
or frame.frame_type == FlowStackFrameType.INTERRUPT
|
|
272
|
+
):
|
|
273
|
+
if frame.flow_id == target_flow_id:
|
|
274
|
+
frames_to_cancel.append(frame)
|
|
275
|
+
frame_to_cancel = frame
|
|
276
|
+
frame_found = True
|
|
277
|
+
continue
|
|
278
|
+
elif frame_found:
|
|
279
|
+
break
|
|
280
|
+
|
|
281
|
+
if frame_found:
|
|
282
|
+
frames_to_cancel.append(frame)
|
|
283
|
+
|
|
284
|
+
return list(frames_to_cancel), frame_to_cancel
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
version: "3.1"
|
|
2
2
|
responses:
|
|
3
3
|
|
|
4
|
+
utter_ask_continue_interrupted_flow_confirmation:
|
|
5
|
+
- text: "Would you like to continue with {{context.interrupted_flow_options}}?"
|
|
6
|
+
metadata:
|
|
7
|
+
rephrase: True
|
|
8
|
+
template: jinja
|
|
9
|
+
|
|
10
|
+
utter_ask_interrupted_flow_to_continue:
|
|
11
|
+
- text: "Would you like to resume {{context.interrupted_flow_options}}?"
|
|
12
|
+
metadata:
|
|
13
|
+
rephrase: True
|
|
14
|
+
template: jinja
|
|
15
|
+
|
|
4
16
|
utter_ask_rephrase:
|
|
5
17
|
- text: I’m sorry I am unable to understand you, could you please rephrase?
|
|
6
18
|
|
|
@@ -53,12 +65,6 @@ responses:
|
|
|
53
65
|
rephrase: True
|
|
54
66
|
template: jinja
|
|
55
67
|
|
|
56
|
-
utter_flow_continue_interrupted:
|
|
57
|
-
- text: "Let's continue with {{ context.previous_flow_name }}."
|
|
58
|
-
metadata:
|
|
59
|
-
rephrase: True
|
|
60
|
-
template: jinja
|
|
61
|
-
|
|
62
68
|
utter_free_chitchat_response:
|
|
63
69
|
- text: "Sorry, I'm not able to answer that right now."
|
|
64
70
|
metadata:
|
|
@@ -81,7 +87,7 @@ responses:
|
|
|
81
87
|
rephrase: True
|
|
82
88
|
|
|
83
89
|
utter_inform_hangup:
|
|
84
|
-
- text:
|
|
90
|
+
- text: I haven’t heard from you, so I’ll end our conversation shortly.
|
|
85
91
|
metadata:
|
|
86
92
|
rephrase: True
|
|
87
93
|
|
|
@@ -118,12 +124,20 @@ slots:
|
|
|
118
124
|
- type: from_llm
|
|
119
125
|
silence_timeout:
|
|
120
126
|
type: float
|
|
121
|
-
initial_value:
|
|
127
|
+
initial_value: 7.0
|
|
122
128
|
max_value: 1000000
|
|
123
129
|
consecutive_silence_timeouts:
|
|
124
130
|
type: float
|
|
125
131
|
initial_value: 0.0
|
|
126
132
|
max_value: 1000000
|
|
133
|
+
interrupted_flow_to_continue:
|
|
134
|
+
type: text
|
|
135
|
+
mappings:
|
|
136
|
+
- type: from_llm
|
|
137
|
+
continue_interrupted_flow_confirmation:
|
|
138
|
+
type: bool
|
|
139
|
+
mappings:
|
|
140
|
+
- type: from_llm
|
|
127
141
|
|
|
128
142
|
flows:
|
|
129
143
|
pattern_cancel_flow:
|
|
@@ -210,7 +224,33 @@ flows:
|
|
|
210
224
|
description: Conversation repair flow for managing when users switch between different flows
|
|
211
225
|
name: pattern continue interrupted
|
|
212
226
|
steps:
|
|
213
|
-
-
|
|
227
|
+
- noop: true
|
|
228
|
+
next:
|
|
229
|
+
- if: context.multiple_flows_interrupted
|
|
230
|
+
then: collect_interrupted_flow_to_continue
|
|
231
|
+
- else: collect_continue_interrupted_flow_confirmation
|
|
232
|
+
- id: collect_interrupted_flow_to_continue
|
|
233
|
+
collect: interrupted_flow_to_continue
|
|
234
|
+
description: "Fill this slot with the name of the flow the user wants to continue. If the user does not want to continue any of the interrupted flows, fill this slot with 'none'."
|
|
235
|
+
next:
|
|
236
|
+
- if: slots.interrupted_flow_to_continue != "none"
|
|
237
|
+
then:
|
|
238
|
+
- action: action_continue_interrupted_flow
|
|
239
|
+
next: END
|
|
240
|
+
- else:
|
|
241
|
+
- action: action_cancel_interrupted_flows
|
|
242
|
+
next: END
|
|
243
|
+
- id: collect_continue_interrupted_flow_confirmation
|
|
244
|
+
collect: continue_interrupted_flow_confirmation
|
|
245
|
+
description: "If the user wants to continue the interrupted flow, fill this slot with true. If the user does not want to continue the interrupted flow, fill this slot with false."
|
|
246
|
+
next:
|
|
247
|
+
- if: slots.continue_interrupted_flow_confirmation
|
|
248
|
+
then:
|
|
249
|
+
- action: action_continue_interrupted_flow
|
|
250
|
+
next: END
|
|
251
|
+
- else:
|
|
252
|
+
- action: action_cancel_interrupted_flows
|
|
253
|
+
next: END
|
|
214
254
|
|
|
215
255
|
pattern_correction:
|
|
216
256
|
description: Conversation repair flow for managing user input changes or error corrections
|
|
@@ -2,16 +2,22 @@ from typing import Dict, List, Optional, Set, Type
|
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
4
|
|
|
5
|
+
from rasa.agents.utils import (
|
|
6
|
+
is_agent_completed,
|
|
7
|
+
is_agent_valid,
|
|
8
|
+
)
|
|
5
9
|
from rasa.dialogue_understanding.commands import (
|
|
6
10
|
CancelFlowCommand,
|
|
7
11
|
CannotHandleCommand,
|
|
8
12
|
ChitChatAnswerCommand,
|
|
9
13
|
ClarifyCommand,
|
|
10
14
|
Command,
|
|
15
|
+
ContinueAgentCommand,
|
|
11
16
|
CorrectedSlot,
|
|
12
17
|
CorrectSlotsCommand,
|
|
13
18
|
FreeFormAnswerCommand,
|
|
14
19
|
RepeatBotMessagesCommand,
|
|
20
|
+
RestartAgentCommand,
|
|
15
21
|
SetSlotCommand,
|
|
16
22
|
StartFlowCommand,
|
|
17
23
|
)
|
|
@@ -37,6 +43,7 @@ from rasa.dialogue_understanding.stack.frames import (
|
|
|
37
43
|
BaseFlowStackFrame,
|
|
38
44
|
)
|
|
39
45
|
from rasa.dialogue_understanding.stack.utils import (
|
|
46
|
+
is_continue_interrupted_flow_active,
|
|
40
47
|
top_flow_frame,
|
|
41
48
|
top_user_flow_frame,
|
|
42
49
|
)
|
|
@@ -428,22 +435,9 @@ def clean_up_commands(
|
|
|
428
435
|
)
|
|
429
436
|
|
|
430
437
|
elif isinstance(command, StartFlowCommand):
|
|
431
|
-
|
|
432
|
-
tracker
|
|
438
|
+
clean_commands = clean_up_start_flow_command(
|
|
439
|
+
clean_commands, tracker, command
|
|
433
440
|
)
|
|
434
|
-
top_flow_id = top_user_frame.flow_id if top_user_frame else ""
|
|
435
|
-
|
|
436
|
-
if top_flow_id == command.flow:
|
|
437
|
-
# drop a start flow command if the starting flow is equal
|
|
438
|
-
# to the currently active flow
|
|
439
|
-
structlogger.debug(
|
|
440
|
-
"command_processor.clean_up_commands."
|
|
441
|
-
"skip_command_flow_already_active",
|
|
442
|
-
command=command,
|
|
443
|
-
)
|
|
444
|
-
continue
|
|
445
|
-
|
|
446
|
-
clean_commands.append(command)
|
|
447
441
|
|
|
448
442
|
# handle chitchat command differently from other free-form answer commands
|
|
449
443
|
elif isinstance(command, ChitChatAnswerCommand):
|
|
@@ -473,9 +467,42 @@ def clean_up_commands(
|
|
|
473
467
|
"drop_clarify_given_other_commands",
|
|
474
468
|
command=command,
|
|
475
469
|
)
|
|
470
|
+
|
|
471
|
+
# Keep the Restart agent commands only if the command is referencing
|
|
472
|
+
# a valid agent that was already completed
|
|
473
|
+
elif isinstance(command, RestartAgentCommand):
|
|
474
|
+
if not is_agent_valid(command.agent_id):
|
|
475
|
+
structlogger.debug(
|
|
476
|
+
"command_processor.clean_up_commands.skip_restart_agent_invalid_agent",
|
|
477
|
+
agent_id=command.agent_id,
|
|
478
|
+
command=command,
|
|
479
|
+
)
|
|
480
|
+
elif not is_agent_completed(tracker, command.agent_id):
|
|
481
|
+
structlogger.debug(
|
|
482
|
+
"command_processor.clean_up_commands.skip_restart_agent_not_completed",
|
|
483
|
+
agent_id=command.agent_id,
|
|
484
|
+
command=command,
|
|
485
|
+
)
|
|
486
|
+
else:
|
|
487
|
+
clean_commands.append(command)
|
|
488
|
+
|
|
489
|
+
# Clean up Continue agent commands if there is currently no active agent
|
|
490
|
+
elif isinstance(command, ContinueAgentCommand):
|
|
491
|
+
if not tracker.stack.agent_is_active():
|
|
492
|
+
structlogger.debug(
|
|
493
|
+
"command_processor.clean_up_commands.skip_continue_agent_no_active_agent",
|
|
494
|
+
command=command,
|
|
495
|
+
)
|
|
496
|
+
else:
|
|
497
|
+
clean_commands.append(command)
|
|
498
|
+
|
|
476
499
|
else:
|
|
477
500
|
clean_commands.append(command)
|
|
478
501
|
|
|
502
|
+
# Replace CannotHandleCommands with ContinueAgentCommand when an agent is active
|
|
503
|
+
# to keep the agent running, but preserve chitchat
|
|
504
|
+
clean_commands = _replace_cannot_handle_with_continue_agent(clean_commands, tracker)
|
|
505
|
+
|
|
479
506
|
# when coexistence is enabled, by default there will be a SetSlotCommand
|
|
480
507
|
# for the ROUTE_TO_CALM_SLOT slot.
|
|
481
508
|
if tracker.has_coexistence_routing_slot and len(clean_commands) > 2:
|
|
@@ -486,9 +513,14 @@ def clean_up_commands(
|
|
|
486
513
|
clean_commands = ensure_max_number_of_command_type(
|
|
487
514
|
clean_commands, RepeatBotMessagesCommand, 1
|
|
488
515
|
)
|
|
516
|
+
clean_commands = ensure_max_number_of_command_type(
|
|
517
|
+
clean_commands, ContinueAgentCommand, 1
|
|
518
|
+
)
|
|
489
519
|
structlogger.debug(
|
|
490
520
|
"command_processor.clean_up_commands.final_commands",
|
|
491
521
|
command=clean_commands,
|
|
522
|
+
event_info="Final commands",
|
|
523
|
+
highlight=True,
|
|
492
524
|
)
|
|
493
525
|
|
|
494
526
|
return clean_commands
|
|
@@ -529,6 +561,95 @@ def ensure_max_number_of_command_type(
|
|
|
529
561
|
return filtered
|
|
530
562
|
|
|
531
563
|
|
|
564
|
+
def clean_up_start_flow_command(
|
|
565
|
+
clean_commands: List[Command],
|
|
566
|
+
tracker: DialogueStateTracker,
|
|
567
|
+
command: StartFlowCommand,
|
|
568
|
+
) -> List[Command]:
|
|
569
|
+
"""Clean up a start flow command."""
|
|
570
|
+
continue_interrupted_flow_active = is_continue_interrupted_flow_active(
|
|
571
|
+
tracker.stack
|
|
572
|
+
)
|
|
573
|
+
|
|
574
|
+
top_user_frame = top_user_flow_frame(
|
|
575
|
+
tracker.stack, ignore_call_and_link_frames=False
|
|
576
|
+
)
|
|
577
|
+
top_flow_id = top_user_frame.flow_id if top_user_frame else ""
|
|
578
|
+
|
|
579
|
+
if top_flow_id == command.flow and not continue_interrupted_flow_active:
|
|
580
|
+
# drop a start flow command if the starting flow is equal
|
|
581
|
+
# to the currently active flow
|
|
582
|
+
structlogger.debug(
|
|
583
|
+
"command_processor.clean_up_commands." "skip_command_flow_already_active",
|
|
584
|
+
command=command,
|
|
585
|
+
)
|
|
586
|
+
return clean_commands
|
|
587
|
+
|
|
588
|
+
clean_commands.append(command)
|
|
589
|
+
return clean_commands
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
def _replace_cannot_handle_with_continue_agent(
|
|
593
|
+
clean_commands: List[Command],
|
|
594
|
+
tracker: DialogueStateTracker,
|
|
595
|
+
) -> List[Command]:
|
|
596
|
+
"""Replace CannotHandleCommands with ContinueAgentCommand when agent is active.
|
|
597
|
+
|
|
598
|
+
ContinueAgentCommand is added in the following cases:
|
|
599
|
+
|
|
600
|
+
1. LLM Command Generation Failures:
|
|
601
|
+
- LLM parsing failures (default reason)
|
|
602
|
+
- Force slot filling failures (default reason)
|
|
603
|
+
|
|
604
|
+
2. Invalid Commands During Cleanup:
|
|
605
|
+
- Invalid SetSlot commands:
|
|
606
|
+
- Slot not in domain
|
|
607
|
+
- Incompatible extractor
|
|
608
|
+
(Note: ChitChatAnswer command failures are preserved as CannotHandleCommand)
|
|
609
|
+
|
|
610
|
+
3. Empty Commands List:
|
|
611
|
+
- When all commands are filtered out during cleanup
|
|
612
|
+
|
|
613
|
+
Preserved as CannotHandleCommand (not replaced):
|
|
614
|
+
- Chitchat: CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_CHITCHAT)
|
|
615
|
+
"""
|
|
616
|
+
if not tracker.stack.agent_is_active():
|
|
617
|
+
return clean_commands
|
|
618
|
+
|
|
619
|
+
# If no commands at all and agent is active, add ContinueAgentCommand
|
|
620
|
+
if not clean_commands:
|
|
621
|
+
clean_commands.append(ContinueAgentCommand())
|
|
622
|
+
return clean_commands
|
|
623
|
+
|
|
624
|
+
has_continue_agent = any(
|
|
625
|
+
isinstance(cmd, ContinueAgentCommand) for cmd in clean_commands
|
|
626
|
+
)
|
|
627
|
+
|
|
628
|
+
# Collect CannotHandleCommands that should be replaced with ContinueAgentCommand
|
|
629
|
+
cannot_handle_commands = [
|
|
630
|
+
cmd
|
|
631
|
+
for cmd in clean_commands
|
|
632
|
+
if isinstance(cmd, CannotHandleCommand)
|
|
633
|
+
and cmd.reason != RASA_PATTERN_CANNOT_HANDLE_CHITCHAT
|
|
634
|
+
]
|
|
635
|
+
|
|
636
|
+
if cannot_handle_commands:
|
|
637
|
+
structlogger.debug(
|
|
638
|
+
"command_processor.clean_up_commands"
|
|
639
|
+
".replace_cannot_handle_with_continue_agent",
|
|
640
|
+
original_commands=clean_commands,
|
|
641
|
+
)
|
|
642
|
+
# Remove the CannotHandleCommands we collected
|
|
643
|
+
for cmd in cannot_handle_commands:
|
|
644
|
+
clean_commands.remove(cmd)
|
|
645
|
+
|
|
646
|
+
# Add ContinueAgentCommand if not already present
|
|
647
|
+
if not has_continue_agent:
|
|
648
|
+
clean_commands.append(ContinueAgentCommand())
|
|
649
|
+
|
|
650
|
+
return clean_commands
|
|
651
|
+
|
|
652
|
+
|
|
532
653
|
def clean_up_clarify_command(
|
|
533
654
|
commands_so_far: List[Command],
|
|
534
655
|
all_commands: List[Command],
|