rasa-pro 3.13.11__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/direct_custom_actions_executor.py +9 -2
- 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/licensing.py +21 -10
- 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.11.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +583 -271
- 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.11.dist-info/METADATA +0 -192
- {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import threading
|
|
3
|
+
import time
|
|
4
|
+
from typing import Dict, Optional, Tuple
|
|
5
|
+
from urllib.parse import ParseResult, urlencode, urlunparse
|
|
6
|
+
|
|
7
|
+
import boto3
|
|
8
|
+
import redis
|
|
9
|
+
import structlog
|
|
10
|
+
from aws_msk_iam_sasl_signer import MSKAuthTokenProvider
|
|
11
|
+
from botocore.exceptions import BotoCoreError
|
|
12
|
+
from botocore.model import ServiceId
|
|
13
|
+
from botocore.session import get_session
|
|
14
|
+
from botocore.signers import RequestSigner
|
|
15
|
+
from cachetools import TTLCache, cached
|
|
16
|
+
|
|
17
|
+
from rasa.core.constants import (
|
|
18
|
+
ELASTICACHE_REDIS_AWS_IAM_ENABLED_ENV_VAR_NAME,
|
|
19
|
+
KAFKA_MSK_AWS_IAM_ENABLED_ENV_VAR_NAME,
|
|
20
|
+
KAFKA_SERVICE_NAME,
|
|
21
|
+
RDS_SQL_DB_AWS_IAM_ENABLED_ENV_VAR_NAME,
|
|
22
|
+
REDIS_SERVICE_NAME,
|
|
23
|
+
SQL_SERVICE_NAME,
|
|
24
|
+
)
|
|
25
|
+
from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
|
|
26
|
+
IAMCredentialsProvider,
|
|
27
|
+
IAMCredentialsProviderInput,
|
|
28
|
+
SupportedServiceType,
|
|
29
|
+
TemporaryCredentials,
|
|
30
|
+
)
|
|
31
|
+
from rasa.shared.exceptions import ConnectionException
|
|
32
|
+
|
|
33
|
+
structlogger = structlog.get_logger(__name__)
|
|
34
|
+
|
|
35
|
+
SERVICE_CONFIG: Dict[Tuple[SupportedServiceType, str], str] = {
|
|
36
|
+
(
|
|
37
|
+
SupportedServiceType.TRACKER_STORE,
|
|
38
|
+
SQL_SERVICE_NAME,
|
|
39
|
+
): RDS_SQL_DB_AWS_IAM_ENABLED_ENV_VAR_NAME,
|
|
40
|
+
(
|
|
41
|
+
SupportedServiceType.TRACKER_STORE,
|
|
42
|
+
REDIS_SERVICE_NAME,
|
|
43
|
+
): ELASTICACHE_REDIS_AWS_IAM_ENABLED_ENV_VAR_NAME,
|
|
44
|
+
(
|
|
45
|
+
SupportedServiceType.EVENT_BROKER,
|
|
46
|
+
KAFKA_SERVICE_NAME,
|
|
47
|
+
): KAFKA_MSK_AWS_IAM_ENABLED_ENV_VAR_NAME,
|
|
48
|
+
(
|
|
49
|
+
SupportedServiceType.LOCK_STORE,
|
|
50
|
+
REDIS_SERVICE_NAME,
|
|
51
|
+
): ELASTICACHE_REDIS_AWS_IAM_ENABLED_ENV_VAR_NAME,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class AWSRDSIAMCredentialsProvider(IAMCredentialsProvider):
|
|
56
|
+
"""Generates temporary credentials for AWS RDS using IAM roles."""
|
|
57
|
+
|
|
58
|
+
def __init__(self, username: str, host: str, port: int) -> None:
|
|
59
|
+
"""Initializes the provider."""
|
|
60
|
+
self.username = username
|
|
61
|
+
self.host = host
|
|
62
|
+
self.port = port
|
|
63
|
+
|
|
64
|
+
def get_temporary_credentials(self) -> TemporaryCredentials:
|
|
65
|
+
"""Generates temporary credentials for AWS RDS."""
|
|
66
|
+
structlogger.debug(
|
|
67
|
+
"rasa.core.aws_rds_iam_credentials_provider.get_credentials",
|
|
68
|
+
event_info="IAM authentication for AWS RDS enabled. "
|
|
69
|
+
"Generating temporary auth token...",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
client = boto3.client("rds")
|
|
74
|
+
auth_token = client.generate_db_auth_token(
|
|
75
|
+
DBHostname=self.host,
|
|
76
|
+
Port=self.port,
|
|
77
|
+
DBUsername=self.username,
|
|
78
|
+
)
|
|
79
|
+
structlogger.info(
|
|
80
|
+
"rasa.core.aws_rds_iam_credentials_provider.generated_credentials",
|
|
81
|
+
event_info="Successfully generated temporary auth token for AWS RDS.",
|
|
82
|
+
)
|
|
83
|
+
return TemporaryCredentials(auth_token=auth_token)
|
|
84
|
+
except (BotoCoreError, ValueError) as exc:
|
|
85
|
+
structlogger.error(
|
|
86
|
+
"rasa.core.aws_rds_iam_credentials_provider.error_generating_credentials",
|
|
87
|
+
event_info="Failed to generate temporary auth token for AWS RDS.",
|
|
88
|
+
error=str(exc),
|
|
89
|
+
)
|
|
90
|
+
return TemporaryCredentials(auth_token=None)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class AWSMSKafkaIAMCredentialsProvider(IAMCredentialsProvider):
|
|
94
|
+
"""Generates temporary credentials for AWS MSK using IAM roles."""
|
|
95
|
+
|
|
96
|
+
def __init__(self) -> None:
|
|
97
|
+
self.region = os.getenv("AWS_DEFAULT_REGION", os.getenv("AWS_REGION"))
|
|
98
|
+
self._token: Optional[str] = None
|
|
99
|
+
self._expires_at: float = 0
|
|
100
|
+
self.refresh_margin_seconds = 60 # Refresh 60 seconds before expiry
|
|
101
|
+
# ensure thread safety when refreshing token because the
|
|
102
|
+
# kafka client library we use (confluent-kafka) is multithreaded
|
|
103
|
+
self.lock = threading.Lock()
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def token(self) -> Optional[str]:
|
|
107
|
+
return self._token
|
|
108
|
+
|
|
109
|
+
@token.setter
|
|
110
|
+
def token(self, value: str) -> None:
|
|
111
|
+
self._token = value
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def expires_at(self) -> float:
|
|
115
|
+
return self._expires_at
|
|
116
|
+
|
|
117
|
+
@expires_at.setter
|
|
118
|
+
def expires_at(self, value: float) -> None:
|
|
119
|
+
self._expires_at = value
|
|
120
|
+
|
|
121
|
+
def get_temporary_credentials(self) -> TemporaryCredentials:
|
|
122
|
+
"""Generates temporary credentials for AWS MSK."""
|
|
123
|
+
with self.lock:
|
|
124
|
+
current_time = time.time() # Current time in seconds
|
|
125
|
+
if (
|
|
126
|
+
not self.token
|
|
127
|
+
or current_time >= self.expires_at - self.refresh_margin_seconds
|
|
128
|
+
):
|
|
129
|
+
try:
|
|
130
|
+
auth_token, expiry_ms = MSKAuthTokenProvider.generate_auth_token(
|
|
131
|
+
self.region
|
|
132
|
+
)
|
|
133
|
+
structlogger.debug(
|
|
134
|
+
"rasa.core.aws_msk_iam_credentials_provider.get_credentials",
|
|
135
|
+
event_info="Successfully generated AWS IAM token for "
|
|
136
|
+
"Kafka authentication.",
|
|
137
|
+
)
|
|
138
|
+
self.token = auth_token
|
|
139
|
+
self.expires_at = int(expiry_ms) / 1000 # Convert ms to seconds
|
|
140
|
+
return TemporaryCredentials(
|
|
141
|
+
auth_token=auth_token,
|
|
142
|
+
expiration=self.expires_at,
|
|
143
|
+
)
|
|
144
|
+
except Exception as exc:
|
|
145
|
+
raise ConnectionException(
|
|
146
|
+
f"Failed to generate AWS IAM token "
|
|
147
|
+
f"for MSK authentication. Original exception: {exc}"
|
|
148
|
+
) from exc
|
|
149
|
+
else:
|
|
150
|
+
structlogger.debug(
|
|
151
|
+
"rasa.core.aws_msk_iam_credentials_provider.get_credentials",
|
|
152
|
+
event_info="Using cached AWS IAM token for Kafka authentication.",
|
|
153
|
+
)
|
|
154
|
+
return TemporaryCredentials(
|
|
155
|
+
auth_token=self.token,
|
|
156
|
+
expiration=self.expires_at,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class AWSElasticacheRedisIAMCredentialsProvider(redis.CredentialProvider):
|
|
161
|
+
"""Generates temporary credentials for AWS ElastiCache Redis using IAM roles."""
|
|
162
|
+
|
|
163
|
+
def __init__(self, username: str, cluster_name: Optional[str] = None) -> None:
|
|
164
|
+
"""Initializes the provider."""
|
|
165
|
+
self.username = username
|
|
166
|
+
self.cluster_name = cluster_name
|
|
167
|
+
self.region = os.getenv("AWS_DEFAULT_REGION", os.getenv("AWS_REGION"))
|
|
168
|
+
self.session = get_session()
|
|
169
|
+
self.request_signer = RequestSigner(
|
|
170
|
+
ServiceId("elasticache"),
|
|
171
|
+
self.region,
|
|
172
|
+
"elasticache",
|
|
173
|
+
"v4",
|
|
174
|
+
self.session.get_credentials(),
|
|
175
|
+
self.session.get_component("event_emitter"),
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
# Generated IAM tokens are valid for 15 minutes
|
|
179
|
+
@cached(cache=TTLCache(maxsize=128, ttl=900))
|
|
180
|
+
def get_credentials(self) -> Tuple[str, str]:
|
|
181
|
+
"""Generates temporary credentials for AWS ElastiCache Redis.
|
|
182
|
+
|
|
183
|
+
Required method implementation by redis-py CredentialProvider parent class.
|
|
184
|
+
Used internally by redis-py when connecting to Redis.
|
|
185
|
+
"""
|
|
186
|
+
query_params = {"Action": "connect", "User": self.username}
|
|
187
|
+
url = urlunparse(
|
|
188
|
+
ParseResult(
|
|
189
|
+
scheme="https",
|
|
190
|
+
netloc=self.cluster_name,
|
|
191
|
+
path="/",
|
|
192
|
+
query=urlencode(query_params),
|
|
193
|
+
params="",
|
|
194
|
+
fragment="",
|
|
195
|
+
)
|
|
196
|
+
)
|
|
197
|
+
signed_url = self.request_signer.generate_presigned_url(
|
|
198
|
+
{"method": "GET", "url": url, "body": {}, "headers": {}, "context": {}},
|
|
199
|
+
operation_name="connect",
|
|
200
|
+
expires_in=900,
|
|
201
|
+
region_name=self.region,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
# RequestSigner only seems to work if the URL has a protocol, but
|
|
205
|
+
# Elasticache only accepts the URL without a protocol
|
|
206
|
+
# So strip it off the signed URL before returning
|
|
207
|
+
return self.username, signed_url.removeprefix("https://")
|
|
208
|
+
|
|
209
|
+
def get_temporary_credentials(self) -> TemporaryCredentials:
|
|
210
|
+
"""Generates temporary credentials for AWS ElastiCache Redis.
|
|
211
|
+
|
|
212
|
+
Implemented to comply with the IAMCredentialsProvider rasa-pro interface.
|
|
213
|
+
Calls the get_credentials method which is used internally by redis-py.
|
|
214
|
+
"""
|
|
215
|
+
try:
|
|
216
|
+
username, signed_url = self.get_credentials()
|
|
217
|
+
structlogger.info(
|
|
218
|
+
"rasa.core.aws_elasticache_redis_iam_credentials_provider.generated_credentials",
|
|
219
|
+
event_info="Successfully generated temporary credentials for "
|
|
220
|
+
"AWS ElastiCache Redis.",
|
|
221
|
+
)
|
|
222
|
+
return TemporaryCredentials(username=username, presigned_url=signed_url)
|
|
223
|
+
except Exception as exc:
|
|
224
|
+
structlogger.error(
|
|
225
|
+
"rasa.core.aws_elasticache_redis_iam_credentials_provider.error_generating_credentials",
|
|
226
|
+
event_info="Failed to generate temporary credentials for "
|
|
227
|
+
"AWS ElastiCache Redis.",
|
|
228
|
+
error=str(exc),
|
|
229
|
+
)
|
|
230
|
+
return TemporaryCredentials()
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def is_iam_enabled(provider_input: "IAMCredentialsProviderInput") -> bool:
|
|
234
|
+
"""Checks if IAM authentication is enabled for the given service."""
|
|
235
|
+
service_type = provider_input.service_type
|
|
236
|
+
service_name = provider_input.service_name
|
|
237
|
+
iam_enabled_env_var_name = SERVICE_CONFIG.get((service_type, service_name))
|
|
238
|
+
|
|
239
|
+
if not iam_enabled_env_var_name:
|
|
240
|
+
structlogger.warning(
|
|
241
|
+
"rasa.core.aws_iam_credentials_providers.is_iam_enabled.unsupported_service",
|
|
242
|
+
event_info=f"IAM authentication check requested for unsupported service: "
|
|
243
|
+
f"{service_name}",
|
|
244
|
+
)
|
|
245
|
+
return False
|
|
246
|
+
|
|
247
|
+
return os.getenv(iam_enabled_env_var_name, "false").lower() == "true"
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def create_aws_iam_credentials_provider(
|
|
251
|
+
provider_input: "IAMCredentialsProviderInput",
|
|
252
|
+
) -> Optional["IAMCredentialsProvider"]:
|
|
253
|
+
"""Factory function to create an AWS IAM credentials provider."""
|
|
254
|
+
iam_enabled = is_iam_enabled(provider_input)
|
|
255
|
+
if not iam_enabled:
|
|
256
|
+
structlogger.debug(
|
|
257
|
+
"rasa.core.aws_iam_credentials_providers.create_provider.iam_not_enabled",
|
|
258
|
+
event_info=f"IAM authentication not enabled for service: "
|
|
259
|
+
f"{provider_input.service_type}",
|
|
260
|
+
)
|
|
261
|
+
return None
|
|
262
|
+
|
|
263
|
+
if (
|
|
264
|
+
provider_input.service_type == SupportedServiceType.TRACKER_STORE
|
|
265
|
+
and provider_input.service_name == SQL_SERVICE_NAME
|
|
266
|
+
):
|
|
267
|
+
return AWSRDSIAMCredentialsProvider(
|
|
268
|
+
username=provider_input.username,
|
|
269
|
+
host=provider_input.host,
|
|
270
|
+
port=provider_input.port,
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
if (
|
|
274
|
+
provider_input.service_type == SupportedServiceType.TRACKER_STORE
|
|
275
|
+
and provider_input.service_name == REDIS_SERVICE_NAME
|
|
276
|
+
):
|
|
277
|
+
return AWSElasticacheRedisIAMCredentialsProvider(
|
|
278
|
+
username=provider_input.username,
|
|
279
|
+
cluster_name=provider_input.cluster_name,
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
if provider_input.service_type == SupportedServiceType.EVENT_BROKER:
|
|
283
|
+
return AWSMSKafkaIAMCredentialsProvider()
|
|
284
|
+
|
|
285
|
+
if provider_input.service_type == SupportedServiceType.LOCK_STORE:
|
|
286
|
+
return AWSElasticacheRedisIAMCredentialsProvider(
|
|
287
|
+
username=provider_input.username,
|
|
288
|
+
cluster_name=provider_input.cluster_name,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
return None
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Optional, Protocol, runtime_checkable
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from rasa.core.constants import IAM_CLOUD_PROVIDER_ENV_VAR_NAME
|
|
11
|
+
|
|
12
|
+
structlogger = structlog.get_logger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TemporaryCredentials(BaseModel):
|
|
16
|
+
"""Dataclass storing temporary credentials."""
|
|
17
|
+
|
|
18
|
+
auth_token: Optional[str] = None
|
|
19
|
+
expiration: Optional[float] = None
|
|
20
|
+
username: Optional[str] = None
|
|
21
|
+
presigned_url: Optional[str] = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@runtime_checkable
|
|
25
|
+
class IAMCredentialsProvider(Protocol):
|
|
26
|
+
"""Interface for generating temporary credentials using IAM roles."""
|
|
27
|
+
|
|
28
|
+
def get_temporary_credentials(self) -> TemporaryCredentials:
|
|
29
|
+
"""Generates temporary credentials using IAM roles."""
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class IAMCredentialsProviderType(Enum):
|
|
34
|
+
"""Enum for supported IAM credentials provider types."""
|
|
35
|
+
|
|
36
|
+
AWS = "aws"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class SupportedServiceType(Enum):
|
|
40
|
+
"""Enum for supported services using IAM credentials providers."""
|
|
41
|
+
|
|
42
|
+
TRACKER_STORE = "tracker_store"
|
|
43
|
+
EVENT_BROKER = "event_broker"
|
|
44
|
+
LOCK_STORE = "lock_store"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class IAMCredentialsProviderInput(BaseModel):
|
|
48
|
+
"""Input data for creating an IAM credentials provider."""
|
|
49
|
+
|
|
50
|
+
service_type: SupportedServiceType
|
|
51
|
+
service_name: str
|
|
52
|
+
username: Optional[str] = None
|
|
53
|
+
host: Optional[str] = None
|
|
54
|
+
port: Optional[int] = None
|
|
55
|
+
cluster_name: Optional[str] = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def create_iam_credentials_provider(
|
|
59
|
+
provider_input: IAMCredentialsProviderInput,
|
|
60
|
+
) -> Optional[IAMCredentialsProvider]:
|
|
61
|
+
"""Factory function to create an IAM credentials provider.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
provider_input: Input data for creating an IAM credentials provider.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
An instance of the specified IAM credentials provider or
|
|
68
|
+
None if the type is unsupported.
|
|
69
|
+
"""
|
|
70
|
+
iam_cloud_provider = os.getenv(IAM_CLOUD_PROVIDER_ENV_VAR_NAME)
|
|
71
|
+
|
|
72
|
+
if iam_cloud_provider is None:
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
provider_type = IAMCredentialsProviderType(iam_cloud_provider.lower())
|
|
77
|
+
except ValueError:
|
|
78
|
+
structlogger.warning(
|
|
79
|
+
"rasa.core.iam_credentials_provider.create_iam_credentials_provider.unsupported_provider",
|
|
80
|
+
event_info=f"Unsupported IAM cloud provider: {iam_cloud_provider}",
|
|
81
|
+
)
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
if provider_type == IAMCredentialsProviderType.AWS:
|
|
85
|
+
from rasa.core.iam_credentials_providers.aws_iam_credentials_providers import (
|
|
86
|
+
create_aws_iam_credentials_provider,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return create_aws_iam_credentials_provider(provider_input)
|
|
90
|
+
|
|
91
|
+
return None
|
rasa/core/lock_store.py
CHANGED
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import json
|
|
5
5
|
import os
|
|
6
6
|
from contextlib import asynccontextmanager
|
|
7
|
-
from typing import Any, AsyncGenerator, Dict, Literal, Optional, Text, Union
|
|
7
|
+
from typing import Any, AsyncGenerator, Dict, List, Literal, Optional, Text, Union
|
|
8
8
|
|
|
9
9
|
import structlog
|
|
10
10
|
from pydantic import (
|
|
@@ -12,12 +12,21 @@ from pydantic import (
|
|
|
12
12
|
BaseModel,
|
|
13
13
|
Field,
|
|
14
14
|
NonNegativeInt,
|
|
15
|
+
ValidationError,
|
|
15
16
|
model_validator,
|
|
16
17
|
)
|
|
17
18
|
|
|
18
19
|
import rasa.shared.utils.common
|
|
19
|
-
from rasa.core.constants import DEFAULT_LOCK_LIFETIME
|
|
20
|
+
from rasa.core.constants import DEFAULT_LOCK_LIFETIME, IAM_CLOUD_PROVIDER_ENV_VAR_NAME
|
|
21
|
+
from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
|
|
22
|
+
SupportedServiceType,
|
|
23
|
+
)
|
|
20
24
|
from rasa.core.lock import TicketLock
|
|
25
|
+
from rasa.core.redis_connection_factory import (
|
|
26
|
+
DeploymentMode,
|
|
27
|
+
RedisConfig,
|
|
28
|
+
RedisConnectionFactory,
|
|
29
|
+
)
|
|
21
30
|
from rasa.shared.exceptions import ConnectionException, RasaException
|
|
22
31
|
from rasa.shared.utils.io import raise_deprecation_warning
|
|
23
32
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -221,7 +230,7 @@ class LockStore:
|
|
|
221
230
|
|
|
222
231
|
|
|
223
232
|
class RedisLockStoreConfig(BaseModel):
|
|
224
|
-
host: Union[AnyUrl, Literal["localhost"]] = Field(
|
|
233
|
+
host: Union[AnyUrl, Literal["localhost"], str] = Field(
|
|
225
234
|
default="localhost", description="The host of the redis server."
|
|
226
235
|
)
|
|
227
236
|
port: NonNegativeInt = Field(
|
|
@@ -269,6 +278,18 @@ class RedisLockStoreConfig(BaseModel):
|
|
|
269
278
|
"will be raised in case Redis doesn't respond "
|
|
270
279
|
"within `socket_timeout` seconds.",
|
|
271
280
|
)
|
|
281
|
+
deployment_mode: DeploymentMode = Field(
|
|
282
|
+
default=DeploymentMode.STANDARD,
|
|
283
|
+
description="Redis deployment mode: 'standard', 'cluster', or 'sentinel'",
|
|
284
|
+
)
|
|
285
|
+
endpoints: Optional[List[str]] = Field(
|
|
286
|
+
default=None,
|
|
287
|
+
description="List of endpoints for cluster/sentinel mode in 'host:port' format",
|
|
288
|
+
)
|
|
289
|
+
sentinel_service: Optional[str] = Field(
|
|
290
|
+
default=None,
|
|
291
|
+
description="Sentinel service name",
|
|
292
|
+
)
|
|
272
293
|
|
|
273
294
|
@model_validator(mode="before")
|
|
274
295
|
@classmethod
|
|
@@ -290,7 +311,9 @@ class RedisLockStoreConfig(BaseModel):
|
|
|
290
311
|
|
|
291
312
|
@model_validator(mode="after")
|
|
292
313
|
def verify_username_password(self) -> RedisLockStoreConfig:
|
|
293
|
-
if
|
|
314
|
+
if os.getenv(IAM_CLOUD_PROVIDER_ENV_VAR_NAME) is None and (
|
|
315
|
+
bool(self.username) ^ bool(self.password)
|
|
316
|
+
):
|
|
294
317
|
raise ValueError(
|
|
295
318
|
f"Expected username and password. "
|
|
296
319
|
f"Found: username: {'<has value>' if self.username else '<N/A>'}, "
|
|
@@ -298,9 +321,6 @@ class RedisLockStoreConfig(BaseModel):
|
|
|
298
321
|
)
|
|
299
322
|
return self
|
|
300
323
|
|
|
301
|
-
def to_strict_redis(self) -> Dict[str, Any]:
|
|
302
|
-
return self.model_dump(by_alias=True, exclude={"key_prefix"})
|
|
303
|
-
|
|
304
324
|
|
|
305
325
|
class RedisLockStore(LockStore):
|
|
306
326
|
"""Redis store for ticket locks."""
|
|
@@ -314,10 +334,27 @@ class RedisLockStore(LockStore):
|
|
|
314
334
|
Args:
|
|
315
335
|
config: Redis lock store configuration.
|
|
316
336
|
"""
|
|
317
|
-
import redis
|
|
318
|
-
|
|
319
337
|
self.config = config
|
|
320
|
-
|
|
338
|
+
try:
|
|
339
|
+
redis_config = RedisConfig(
|
|
340
|
+
host=str(self.config.host),
|
|
341
|
+
port=self.config.port,
|
|
342
|
+
service_type=SupportedServiceType.LOCK_STORE,
|
|
343
|
+
db=self.config.db,
|
|
344
|
+
username=self.config.username,
|
|
345
|
+
password=self.config.password,
|
|
346
|
+
use_ssl=self.config.use_ssl,
|
|
347
|
+
ssl_keyfile=self.config.ssl_keyfile,
|
|
348
|
+
ssl_certfile=self.config.ssl_certfile,
|
|
349
|
+
ssl_ca_certs=self.config.ssl_ca_certs,
|
|
350
|
+
deployment_mode=self.config.deployment_mode.value,
|
|
351
|
+
endpoints=self.config.endpoints,
|
|
352
|
+
sentinel_service=self.config.sentinel_service,
|
|
353
|
+
socket_timeout=self.config.socket_timeout,
|
|
354
|
+
)
|
|
355
|
+
self.red = RedisConnectionFactory.create_connection(redis_config)
|
|
356
|
+
except ValidationError as e:
|
|
357
|
+
raise RasaException(f"Invalid Redis configuration: {e}")
|
|
321
358
|
|
|
322
359
|
self.key_prefix = DEFAULT_REDIS_LOCK_STORE_KEY_PREFIX
|
|
323
360
|
if self.config.key_prefix:
|
|
@@ -349,6 +386,9 @@ class RedisLockStore(LockStore):
|
|
|
349
386
|
"""Retrieves lock (see parent docstring for more information)."""
|
|
350
387
|
serialised_lock = self.red.get(self.key_prefix + conversation_id)
|
|
351
388
|
if serialised_lock:
|
|
389
|
+
# Handle bytes to string conversion for JSON parsing
|
|
390
|
+
if isinstance(serialised_lock, bytes):
|
|
391
|
+
serialised_lock = serialised_lock.decode("utf-8")
|
|
352
392
|
return TicketLock.from_dict(json.loads(serialised_lock))
|
|
353
393
|
|
|
354
394
|
return None
|
|
@@ -317,14 +317,18 @@ class ContextualResponseRephraser(
|
|
|
317
317
|
return response
|
|
318
318
|
|
|
319
319
|
prompt_template_text = self._template_for_response_rephrasing(response)
|
|
320
|
+
|
|
321
|
+
# Last user message (=current input) should always be in prompt if available
|
|
320
322
|
last_message_by_user = getattr(tracker.latest_message, "text", "")
|
|
321
323
|
current_input = (
|
|
322
324
|
f"{USER}: {last_message_by_user}" if last_message_by_user else ""
|
|
323
325
|
)
|
|
324
326
|
|
|
327
|
+
# Only summarise conversation history if flagged
|
|
325
328
|
if self.summarize_history:
|
|
326
329
|
history = await self._create_history(tracker)
|
|
327
330
|
else:
|
|
331
|
+
# Count multiple utterances by bot/user as single turn
|
|
328
332
|
turns_wrapper = (
|
|
329
333
|
_count_multiple_utterances_as_single_turn
|
|
330
334
|
if self.count_multiple_utterances_as_single_turn
|
|
@@ -367,6 +371,7 @@ class ContextualResponseRephraser(
|
|
|
367
371
|
)
|
|
368
372
|
|
|
369
373
|
if not (llm_response and llm_response.choices and llm_response.choices[0]):
|
|
374
|
+
# If the LLM fails to generate a response, return the original response.
|
|
370
375
|
return response
|
|
371
376
|
|
|
372
377
|
updated_text = llm_response.choices[0]
|
rasa/core/nlg/generator.py
CHANGED
|
@@ -2,7 +2,6 @@ from typing import Any, Dict, List, Optional, Text, Union
|
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
4
|
from jinja2 import Template
|
|
5
|
-
from pypred import Predicate
|
|
6
5
|
|
|
7
6
|
import rasa.shared.utils.common
|
|
8
7
|
import rasa.shared.utils.io
|
|
@@ -12,6 +11,7 @@ from rasa.shared.constants import CHANNEL, RESPONSE_CONDITION
|
|
|
12
11
|
from rasa.shared.core.domain import Domain
|
|
13
12
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
14
13
|
from rasa.utils.endpoints import EndpointConfig
|
|
14
|
+
from rasa.utils.pypred import Predicate
|
|
15
15
|
|
|
16
16
|
structlogger = structlog.get_logger()
|
|
17
17
|
|
rasa/core/persistor.py
CHANGED
|
@@ -314,7 +314,7 @@ class AWSPersistor(Persistor):
|
|
|
314
314
|
obj = self.s3.Object(self.bucket_name, model_path)
|
|
315
315
|
return obj.content_length
|
|
316
316
|
except Exception:
|
|
317
|
-
raise ModelNotFound()
|
|
317
|
+
raise ModelNotFound("Model not found")
|
|
318
318
|
|
|
319
319
|
def _retrieve_tar(
|
|
320
320
|
self, target_filename: str, target_path: Optional[str] = None
|
|
@@ -349,7 +349,7 @@ class AWSPersistor(Persistor):
|
|
|
349
349
|
target_filename=target_filename,
|
|
350
350
|
event_info=log,
|
|
351
351
|
)
|
|
352
|
-
raise ModelNotFound() from exc
|
|
352
|
+
raise ModelNotFound("Model not found") from exc
|
|
353
353
|
except exceptions.BotoCoreError as exc:
|
|
354
354
|
structlogger.error(
|
|
355
355
|
"aws_persistor.retrieve_tar.model_download_error",
|
|
@@ -357,7 +357,7 @@ class AWSPersistor(Persistor):
|
|
|
357
357
|
target_filename=target_filename,
|
|
358
358
|
event_info=log,
|
|
359
359
|
)
|
|
360
|
-
raise ModelNotFound() from exc
|
|
360
|
+
raise ModelNotFound("Model not found") from exc
|
|
361
361
|
|
|
362
362
|
|
|
363
363
|
class GCSPersistor(Persistor):
|
|
@@ -447,7 +447,7 @@ class GCSPersistor(Persistor):
|
|
|
447
447
|
blob = self.bucket.blob(target_filename)
|
|
448
448
|
return blob.size
|
|
449
449
|
except Exception:
|
|
450
|
-
raise ModelNotFound()
|
|
450
|
+
raise ModelNotFound("Model not found")
|
|
451
451
|
|
|
452
452
|
def _retrieve_tar(
|
|
453
453
|
self, target_filename: str, target_path: Optional[str] = None
|
|
@@ -481,7 +481,7 @@ class GCSPersistor(Persistor):
|
|
|
481
481
|
target_filename=target_filename,
|
|
482
482
|
event_info=log,
|
|
483
483
|
)
|
|
484
|
-
raise ModelNotFound() from exc
|
|
484
|
+
raise ModelNotFound("Model not found") from exc
|
|
485
485
|
|
|
486
486
|
|
|
487
487
|
class AzurePersistor(Persistor):
|
|
@@ -534,7 +534,7 @@ class AzurePersistor(Persistor):
|
|
|
534
534
|
properties = blob_client.get_blob_properties()
|
|
535
535
|
return properties.size
|
|
536
536
|
except Exception:
|
|
537
|
-
raise ModelNotFound()
|
|
537
|
+
raise ModelNotFound("Model not found")
|
|
538
538
|
|
|
539
539
|
def _retrieve_tar(
|
|
540
540
|
self, target_filename: Text, target_path: Optional[str] = None
|
|
@@ -570,4 +570,4 @@ class AzurePersistor(Persistor):
|
|
|
570
570
|
event_info=log,
|
|
571
571
|
exception=exc,
|
|
572
572
|
)
|
|
573
|
-
raise ModelNotFound() from exc
|
|
573
|
+
raise ModelNotFound("Model not found") from exc
|
|
@@ -12,7 +12,7 @@ from jinja2 import Template
|
|
|
12
12
|
from pydantic import ValidationError
|
|
13
13
|
|
|
14
14
|
import rasa.shared.utils.io
|
|
15
|
-
from rasa.core.available_endpoints import AvailableEndpoints
|
|
15
|
+
from rasa.core.config.available_endpoints import AvailableEndpoints
|
|
16
16
|
from rasa.core.constants import (
|
|
17
17
|
UTTER_SOURCE_METADATA_KEY,
|
|
18
18
|
)
|
|
@@ -63,6 +63,8 @@ from rasa.shared.constants import (
|
|
|
63
63
|
)
|
|
64
64
|
from rasa.shared.core.constants import (
|
|
65
65
|
ACTION_CANCEL_FLOW,
|
|
66
|
+
ACTION_METADATA_MESSAGE_KEY,
|
|
67
|
+
ACTION_METADATA_TEXT_KEY,
|
|
66
68
|
ACTION_SEND_TEXT_NAME,
|
|
67
69
|
DEFAULT_SLOT_NAMES,
|
|
68
70
|
)
|
|
@@ -585,8 +587,8 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
585
587
|
return self._create_prediction_internal_error(domain, tracker)
|
|
586
588
|
|
|
587
589
|
action_metadata = {
|
|
588
|
-
|
|
589
|
-
|
|
590
|
+
ACTION_METADATA_MESSAGE_KEY: {
|
|
591
|
+
ACTION_METADATA_TEXT_KEY: response,
|
|
590
592
|
SEARCH_RESULTS_METADATA_KEY: [
|
|
591
593
|
result.text for result in documents.results
|
|
592
594
|
],
|
|
@@ -781,7 +783,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
781
783
|
if not os.path.exists(docs_folder) or not os.path.isdir(docs_folder):
|
|
782
784
|
error_message = (
|
|
783
785
|
f"Document source directory does not exist or is not a "
|
|
784
|
-
f"directory: '{docs_folder}'. "
|
|
786
|
+
f"directory: '{os.path.abspath(docs_folder)}'. "
|
|
785
787
|
"Please specify a valid path to the documents source directory in the "
|
|
786
788
|
"vector_store configuration."
|
|
787
789
|
)
|
|
@@ -1130,8 +1132,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
1130
1132
|
embeddings_config: Dict[Text, Any],
|
|
1131
1133
|
log_source_method: str,
|
|
1132
1134
|
) -> None:
|
|
1133
|
-
"""
|
|
1134
|
-
Perform the health checks using resolved LLM and embeddings configurations.
|
|
1135
|
+
"""Perform the health checks using resolved LLM and embeddings configurations.
|
|
1135
1136
|
Resolved means the configuration is either:
|
|
1136
1137
|
- A reference to a model group that has already been expanded into
|
|
1137
1138
|
its corresponding configuration using the information from
|
|
@@ -1160,8 +1161,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
1160
1161
|
|
|
1161
1162
|
@classmethod
|
|
1162
1163
|
def get_system_default_prompt_based_on_config(cls, config: Dict[str, Any]) -> str:
|
|
1163
|
-
"""
|
|
1164
|
-
Resolves the default prompt template for Enterprise Search Policy based on
|
|
1164
|
+
"""Resolves the default prompt template for Enterprise Search Policy based on
|
|
1165
1165
|
the component's configuration.
|
|
1166
1166
|
|
|
1167
1167
|
- The old prompt is selected when both citation and relevancy check are either
|
|
@@ -1192,8 +1192,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
1192
1192
|
relevancy_check_enabled: bool,
|
|
1193
1193
|
citation_enabled: bool,
|
|
1194
1194
|
) -> str:
|
|
1195
|
-
"""
|
|
1196
|
-
Returns the appropriate default prompt template based on the feature flags.
|
|
1195
|
+
"""Returns the appropriate default prompt template based on the feature flags.
|
|
1197
1196
|
|
|
1198
1197
|
The selection follows this priority:
|
|
1199
1198
|
1. If relevancy check is enabled, return the prompt that includes both relevancy
|