rasa-pro 3.14.0.dev20250901__py3-none-any.whl → 3.14.0rc1__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 +211 -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 +879 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +726 -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 +206 -0
- rasa/agents/validation.py +485 -0
- rasa/api.py +24 -9
- rasa/builder/config.py +7 -2
- rasa/builder/copilot/constants.py +3 -0
- rasa/builder/copilot/copilot.py +128 -54
- rasa/builder/copilot/models.py +39 -3
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +183 -188
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/telemetry.py +46 -20
- rasa/builder/document_retrieval/models.py +3 -3
- rasa/builder/download.py +1 -8
- rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
- rasa/builder/guardrails/constants.py +3 -0
- rasa/builder/guardrails/models.py +45 -10
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/utils.py +42 -276
- rasa/builder/jobs.py +33 -21
- rasa/builder/llm_service.py +32 -5
- rasa/builder/main.py +38 -62
- rasa/builder/models.py +8 -7
- rasa/builder/project_generator.py +149 -148
- rasa/builder/service.py +58 -40
- rasa/builder/template_cache.py +69 -0
- rasa/builder/training_service.py +84 -20
- rasa/builder/validation_service.py +1 -1
- 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 +10 -8
- rasa/cli/dialogue_understanding_test.py +10 -7
- rasa/cli/e2e_test.py +9 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +8 -4
- rasa/cli/interactive.py +5 -4
- rasa/cli/llm_fine_tuning.py +11 -6
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +6 -4
- rasa/cli/project_templates/basic/data/data.md +5 -6
- rasa/cli/project_templates/basic/domain/domain.md +7 -5
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +1 -1
- rasa/cli/project_templates/basic/endpoints.yml +5 -1
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -46
- 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/{transfers/action_process_immediate_payment.py → cards/check_that_card_exists.py} +6 -3
- 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/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 +8 -0
- rasa/cli/project_templates/finance/credentials.yml +7 -6
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +3 -4
- 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 +37 -58
- 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/goodbye.yml +1 -1
- rasa/cli/project_templates/finance/data/general/hello.yml +1 -2
- rasa/cli/project_templates/finance/data/general/help.yml +2 -2
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +2 -2
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +1 -1
- 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 +29 -62
- 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 +9 -5
- 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 +33 -90
- 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 +5 -2
- rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -3
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +6 -6
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +10 -9
- rasa/cli/project_templates/finance/domain/general/welcome.yml +33 -2
- 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 +203 -61
- rasa/cli/project_templates/finance/endpoints.yml +8 -4
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +31 -12
- rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/config.yml +6 -4
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +1 -1
- rasa/cli/project_templates/telco/docs/docs.md +3 -0
- rasa/cli/project_templates/telco/domain/domain.md +13 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +3 -6
- rasa/cli/project_templates/telco/endpoints.yml +5 -1
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +1 -1
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +12 -10
- rasa/cli/scaffold.py +4 -4
- rasa/cli/shell.py +9 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +41 -28
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +223 -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 +51 -10
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +9 -2
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +19 -2
- rasa/core/available_agents.py +229 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +52 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/development_inspector.py +4 -24
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.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-81efba3e.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.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-31422447.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.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-cb4d8723.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.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-64154b83.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.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 +34 -35
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- 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 +9 -1
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +20 -3
- 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 +53 -7
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/studio_chat.py +29 -47
- rasa/core/channels/telegram.py +4 -9
- 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 +3 -0
- rasa/core/channels/voice_stream/browser_audio.py +55 -3
- rasa/core/channels/voice_stream/genesys.py +3 -2
- rasa/core/channels/voice_stream/jambonz.py +9 -1
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +21 -1
- rasa/core/channels/voice_stream/voice_channel.py +64 -0
- rasa/core/concurrent_lock_store.py +66 -16
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
- rasa/core/config/configuration.py +260 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +11 -0
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +226 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +90 -0
- rasa/core/lock_store.py +46 -10
- rasa/core/nlg/generator.py +1 -1
- rasa/core/policies/enterprise_search_policy.py +5 -3
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +632 -0
- rasa/core/policies/flows/flow_executor.py +137 -76
- rasa/core/policies/flows/mcp_tool_executor.py +298 -0
- rasa/core/policies/intentless_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 +469 -0
- rasa/core/run.py +37 -8
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -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 +19 -5
- 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 +68 -7
- rasa/dialogue_understanding/commands/utils.py +124 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -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 +46 -8
- 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/storage/local_model_storage.py +41 -4
- rasa/engine/validation.py +19 -6
- 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/socket_bridge.py +1 -2
- 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_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 +167 -0
- rasa/shared/agents/auth/constants.py +12 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +8 -0
- rasa/shared/core/constants.py +17 -1
- rasa/shared/core/domain.py +0 -7
- 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/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +49 -5
- 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 +3 -2
- rasa/shared/core/slots.py +2 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/exceptions.py +16 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +9 -3
- 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 +8 -4
- 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 +24 -0
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +39 -16
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +247 -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/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +3 -6
- rasa/telemetry.py +69 -5
- 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/log_utils.py +96 -5
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/pypred.py +38 -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 +17 -13
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/METADATA +59 -51
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/RECORD +452 -428
- rasa/builder/scrape_rasa_docs.py +0 -97
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
- rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
- rasa/cli/project_templates/finance/actions/database.py +0 -277
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
- rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
- rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
- rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
- rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
- rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
- rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
- rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
- rasa/cli/project_templates/finance/csvs/users.csv +0 -4
- rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
- rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
- rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
- rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
- rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
- rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
- rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
- rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
- rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
- rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
- /rasa/cli/project_templates/telco/domain/billing/{domain_undertand_bill.yml → understand_bill.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reboot_router.yml → reboot_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reset_router.yml → reset_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_run_speed_test.yml → run_speed_test.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_solve_internet_issue.yml → solve_internet_issue.yml} +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/entry_points.txt +0 -0
|
@@ -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:
|
|
@@ -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,31 @@ 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:
|
|
231
|
+
- collect: interrupted_flow_to_continue
|
|
232
|
+
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'."
|
|
233
|
+
next:
|
|
234
|
+
- if: slots.interrupted_flow_to_continue != "none"
|
|
235
|
+
then:
|
|
236
|
+
- action: action_continue_interrupted_flow
|
|
237
|
+
next: END
|
|
238
|
+
- else:
|
|
239
|
+
- action: action_cancel_interrupted_flows
|
|
240
|
+
next: END
|
|
241
|
+
- else:
|
|
242
|
+
- collect: continue_interrupted_flow_confirmation
|
|
243
|
+
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."
|
|
244
|
+
next:
|
|
245
|
+
- if: slots.continue_interrupted_flow_confirmation
|
|
246
|
+
then:
|
|
247
|
+
- action: action_continue_interrupted_flow
|
|
248
|
+
next: END
|
|
249
|
+
- else:
|
|
250
|
+
- action: action_cancel_interrupted_flows
|
|
251
|
+
next: END
|
|
214
252
|
|
|
215
253
|
pattern_correction:
|
|
216
254
|
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],
|
|
@@ -8,6 +8,13 @@ from typing import Any, Callable, Dict, List, Optional
|
|
|
8
8
|
import jsonpatch
|
|
9
9
|
import structlog
|
|
10
10
|
|
|
11
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
12
|
+
AgentStackFrame,
|
|
13
|
+
AgentState,
|
|
14
|
+
FlowStackFrameType,
|
|
15
|
+
UserFlowStackFrame,
|
|
16
|
+
)
|
|
17
|
+
|
|
11
18
|
if typing.TYPE_CHECKING:
|
|
12
19
|
from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
|
|
13
20
|
|
|
@@ -91,6 +98,42 @@ class DialogueStack:
|
|
|
91
98
|
"""
|
|
92
99
|
return self.frames.pop()
|
|
93
100
|
|
|
101
|
+
def move_frames_to_top(self, frames_to_move: List["DialogueStackFrame"]) -> None:
|
|
102
|
+
"""Moves specified frames to top of stack while preserving their relative order.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
frames_to_move: The frames to move to the top of the stack.
|
|
106
|
+
"""
|
|
107
|
+
# Get frames that are not being moved
|
|
108
|
+
frames_to_keep = [frame for frame in self.frames if frame not in frames_to_move]
|
|
109
|
+
|
|
110
|
+
# Reorder: keep frames first, then moved frames
|
|
111
|
+
self.frames = frames_to_keep + frames_to_move
|
|
112
|
+
|
|
113
|
+
# set all frames to interrupt except for LINK and CALL
|
|
114
|
+
for frame in self.frames:
|
|
115
|
+
if (
|
|
116
|
+
isinstance(frame, UserFlowStackFrame)
|
|
117
|
+
and frame.frame_type == FlowStackFrameType.LINK
|
|
118
|
+
):
|
|
119
|
+
continue
|
|
120
|
+
if (
|
|
121
|
+
isinstance(frame, UserFlowStackFrame)
|
|
122
|
+
and frame.frame_type == FlowStackFrameType.CALL
|
|
123
|
+
):
|
|
124
|
+
continue
|
|
125
|
+
if (
|
|
126
|
+
isinstance(frame, UserFlowStackFrame)
|
|
127
|
+
and frame.frame_type == FlowStackFrameType.REGULAR
|
|
128
|
+
):
|
|
129
|
+
frame.frame_type = FlowStackFrameType.INTERRUPT
|
|
130
|
+
|
|
131
|
+
# set the first frame to regular
|
|
132
|
+
for frame in self.frames:
|
|
133
|
+
if isinstance(frame, UserFlowStackFrame):
|
|
134
|
+
frame.frame_type = FlowStackFrameType.REGULAR
|
|
135
|
+
return
|
|
136
|
+
|
|
94
137
|
def current_context(self) -> Dict[str, Any]:
|
|
95
138
|
"""Returns the context of the topmost frame.
|
|
96
139
|
|
|
@@ -109,7 +152,7 @@ class DialogueStack:
|
|
|
109
152
|
"""Returns the topmost frame from the stack.
|
|
110
153
|
|
|
111
154
|
Args:
|
|
112
|
-
|
|
155
|
+
ignore: The ID of the flow to ignore. Picks the top most
|
|
113
156
|
frame that has a different flow ID.
|
|
114
157
|
|
|
115
158
|
Returns:
|
|
@@ -136,7 +179,8 @@ class DialogueStack:
|
|
|
136
179
|
patch_dump: The patch to apply to the stack.
|
|
137
180
|
|
|
138
181
|
Returns:
|
|
139
|
-
|
|
182
|
+
The updated stack.
|
|
183
|
+
"""
|
|
140
184
|
patch = jsonpatch.JsonPatch.from_string(patch_dump)
|
|
141
185
|
dialogue_stack_dump = patch.apply(self.as_dict())
|
|
142
186
|
return DialogueStack.from_dict(dialogue_stack_dump)
|
|
@@ -177,3 +221,55 @@ class DialogueStack:
|
|
|
177
221
|
if patch:
|
|
178
222
|
return patch.to_string()
|
|
179
223
|
return None
|
|
224
|
+
|
|
225
|
+
def _find_agent_frame_by_predicate(
|
|
226
|
+
self, predicate: Callable[[AgentStackFrame], bool]
|
|
227
|
+
) -> List[AgentStackFrame]:
|
|
228
|
+
stack_frames: List[AgentStackFrame] = []
|
|
229
|
+
for stack_frame in reversed(self.frames):
|
|
230
|
+
if isinstance(stack_frame, AgentStackFrame) and predicate(stack_frame):
|
|
231
|
+
stack_frames.append(stack_frame)
|
|
232
|
+
return stack_frames
|
|
233
|
+
|
|
234
|
+
def find_active_agent_frame(self) -> Optional[AgentStackFrame]:
|
|
235
|
+
stack_frames = self._find_agent_frame_by_predicate(
|
|
236
|
+
lambda frame: frame.state == AgentState.WAITING_FOR_INPUT
|
|
237
|
+
)
|
|
238
|
+
if stack_frames:
|
|
239
|
+
return stack_frames[0]
|
|
240
|
+
return None
|
|
241
|
+
|
|
242
|
+
def find_agent_stack_frame_by_agent(
|
|
243
|
+
self, agent_id: str
|
|
244
|
+
) -> Optional[AgentStackFrame]:
|
|
245
|
+
"""Get the agent stack frame for a specific agent ID.
|
|
246
|
+
|
|
247
|
+
May also include the agent stack frame in the INTERRUPTED state.
|
|
248
|
+
"""
|
|
249
|
+
stack_frames = self._find_agent_frame_by_predicate(
|
|
250
|
+
lambda frame: frame.agent_id == agent_id
|
|
251
|
+
)
|
|
252
|
+
if stack_frames:
|
|
253
|
+
return stack_frames[0]
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
def find_active_agent_stack_frame_for_flow(
|
|
257
|
+
self, flow_id: str
|
|
258
|
+
) -> Optional[AgentStackFrame]:
|
|
259
|
+
"""Get the agent stack frame of a specific flow."""
|
|
260
|
+
stack_frames = self._find_agent_frame_by_predicate(
|
|
261
|
+
lambda frame: frame.flow_id == flow_id
|
|
262
|
+
)
|
|
263
|
+
for stack_frame in stack_frames:
|
|
264
|
+
if stack_frame.state == AgentState.WAITING_FOR_INPUT:
|
|
265
|
+
return stack_frame
|
|
266
|
+
return None
|
|
267
|
+
|
|
268
|
+
def get_active_agent_id(self) -> Optional[typing.Text]:
|
|
269
|
+
agent_frame = self.find_active_agent_frame()
|
|
270
|
+
if agent_frame:
|
|
271
|
+
return agent_frame.agent_id
|
|
272
|
+
return None
|
|
273
|
+
|
|
274
|
+
def agent_is_active(self) -> bool:
|
|
275
|
+
return self.find_active_agent_frame() is not None
|