rasa-pro 3.14.0.dev20250825__py3-none-any.whl → 3.14.0.dev20250922__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/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +92 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +31 -0
- rasa/builder/copilot/copilot.py +450 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +500 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +226 -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 +38 -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/constants.py +9 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/lakera.py +206 -0
- rasa/builder/guardrails/models.py +231 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +328 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +282 -0
- rasa/builder/llm_service.py +246 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +234 -0
- rasa/builder/models.py +216 -0
- rasa/builder/project_generator.py +458 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/scrape_rasa_docs.py +97 -0
- rasa/builder/service.py +1350 -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 +194 -0
- rasa/builder/validation_service.py +97 -0
- 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/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 -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/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/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/__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 +75 -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/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/config.yml +2 -1
- rasa/cli/scaffold.py +46 -2
- rasa/core/actions/action.py +0 -1
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +9 -2
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +52 -8
- rasa/core/channels/development_inspector.py +1 -21
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/dist/assets/{arc-1ddec37b.js → arc-35222594.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-18af387c.js → blockDiagram-38ab4fdb-a0efbfd3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-250127a3.js → c4Diagram-3d4e48cf-0584c0f2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-c3388b34.js → classDiagram-70f12bd4-39f40dbe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9c893a82.js → classDiagram-v2-f2320105-1ad755f3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-c111213b.js → createText-2e5e7dd3-b0f4f0fe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-812a729d.js → edges-e0da2a9e-9039bff9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-fd5051bc.js → erDiagram-9861fffd-65c9b127.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-3287ac02.js → flowDb-956e92f1-4f08b38e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-692fb0b2.js → flowDiagram-66a62f08-e95c362a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-008376f1.js → flowchart-elk-definition-4a651766-703c3015.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-df330a69.js → ganttDiagram-c361ad54-699328ea.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-e03676fb.js → gitGraphDiagram-72cf32ee-04cf4b05.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-46fad2ba.js → graph-ee94449e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-a484ac55.js → index-3862675e-940162b4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-a003633f.js → index-c941dcb3.js} +239 -238
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-3f9e6ec2.js → infoDiagram-f8f76790-c79c2866.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-79f72383.js → journeyDiagram-49397b02-84489d30.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-aad098e5.js → layout-a9aa9858.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-219ab7ae.js → line-eb73cf26.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-2cddbe62.js → linear-b3399f9a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-1d41ed99.js → mindmap-definition-fc14e90a-b095bf1a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-cc496ee8.js → pieDiagram-8a3498a8-07644b66.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-84d32884.js → quadrantDiagram-120e2f19-573a3f9c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-c0deb984.js → requirementDiagram-deff3bca-d457e1e1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-b9d7fd62.js → sankeyDiagram-04a897e0-9d26e1a2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-7d517565.js → sequenceDiagram-704730f1-3a9cde10.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-98ef9b27.js → stateDiagram-587899a1-4f3e8cec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-cee70748.js → stateDiagram-v2-d93cdb3a-e617e5bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-3f9d1c96.js → styles-6aaf32cf-eab30d2f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-67471923.js → styles-9a916d00-09994be2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-bd093fb7.js → styles-c10674c1-b7110364.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-675794e8.js → svgDrawCommon-08f97a94-3ebc92ad.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-0ac67617.js → timeline-definition-85554ec2-7d13d2f2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-c018dc37.js → xychartDiagram-e933f94c-488385e1.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +2 -2
- rasa/core/channels/inspector/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +15 -42
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
- rasa/core/channels/inspector/src/types.ts +32 -7
- rasa/core/channels/studio_chat.py +43 -43
- 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 +2 -1
- rasa/core/channels/voice_stream/jambonz.py +9 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
- rasa/core/channels/voice_stream/voice_channel.py +61 -0
- rasa/core/concurrent_lock_store.py +66 -16
- rasa/core/constants.py +7 -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 +4 -7
- rasa/core/policies/flows/flow_executor.py +9 -2
- rasa/core/processor.py +32 -0
- rasa/core/redis_connection_factory.py +469 -0
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -1
- rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
- rasa/engine/graph.py +5 -1
- rasa/engine/loader.py +12 -0
- rasa/engine/storage/local_model_storage.py +83 -3
- rasa/model_manager/model_api.py +1 -2
- rasa/model_manager/runner_service.py +1 -1
- rasa/model_manager/socket_bridge.py +1 -2
- 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/shared/core/constants.py +1 -0
- rasa/shared/core/domain.py +62 -15
- rasa/shared/core/events.py +2 -0
- rasa/shared/core/flows/flow.py +1 -1
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/steps/call.py +8 -1
- rasa/shared/core/flows/yaml_flows_io.py +16 -8
- rasa/shared/core/slots.py +4 -0
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/utils.py +77 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/studio/upload.py +12 -46
- rasa/telemetry.py +97 -23
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +5 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/pypred.py +38 -0
- rasa/validator.py +19 -11
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/METADATA +27 -25
- {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/RECORD +348 -109
- rasa/core/channels/inspector/dist/assets/channel-59f6d54b.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-26177ddb.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-29c03f5a.js +0 -1
- {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import Any, Dict, List, Optional, Text, Tuple, Union
|
|
4
|
+
|
|
5
|
+
import redis
|
|
6
|
+
import structlog
|
|
7
|
+
from pydantic import BaseModel, ConfigDict
|
|
8
|
+
|
|
9
|
+
from rasa.core.constants import AWS_ELASTICACHE_CLUSTER_NAME_ENV_VAR_NAME
|
|
10
|
+
from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
|
|
11
|
+
IAMCredentialsProvider,
|
|
12
|
+
IAMCredentialsProviderInput,
|
|
13
|
+
SupportedServiceType,
|
|
14
|
+
create_iam_credentials_provider,
|
|
15
|
+
)
|
|
16
|
+
from rasa.shared.exceptions import ConnectionException, RasaException
|
|
17
|
+
|
|
18
|
+
structlogger = structlog.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
DEFAULT_SOCKET_TIMEOUT_IN_SECONDS = 10
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class DeploymentMode(Enum):
|
|
24
|
+
"""Supported Redis deployment modes."""
|
|
25
|
+
|
|
26
|
+
STANDARD = "standard"
|
|
27
|
+
CLUSTER = "cluster"
|
|
28
|
+
SENTINEL = "sentinel"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class StandardRedisConfig(BaseModel):
|
|
32
|
+
"""Base configuration for Redis connections."""
|
|
33
|
+
|
|
34
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
35
|
+
|
|
36
|
+
host: Text = "localhost"
|
|
37
|
+
port: int = 6379
|
|
38
|
+
username: Optional[Text] = None
|
|
39
|
+
password: Optional[Text] = None
|
|
40
|
+
use_ssl: bool = False
|
|
41
|
+
ssl_keyfile: Optional[Text] = None
|
|
42
|
+
ssl_certfile: Optional[Text] = None
|
|
43
|
+
ssl_ca_certs: Optional[Text] = None
|
|
44
|
+
db: int = 0
|
|
45
|
+
socket_timeout: float = DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
|
|
46
|
+
decode_responses: bool = False
|
|
47
|
+
iam_credentials_provider: Optional[IAMCredentialsProvider] = None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ClusterRedisConfig(StandardRedisConfig):
|
|
51
|
+
"""Configuration for Redis Cluster connections."""
|
|
52
|
+
|
|
53
|
+
endpoints: List[Tuple[Text, int]]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class SentinelRedisConfig(StandardRedisConfig):
|
|
57
|
+
"""Configuration for Redis Sentinel connections."""
|
|
58
|
+
|
|
59
|
+
endpoints: List[Tuple[Text, int]]
|
|
60
|
+
sentinel_service: Optional[Text] = "mymaster"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class RedisConfig(BaseModel):
|
|
64
|
+
"""Base configuration for Redis connections."""
|
|
65
|
+
|
|
66
|
+
host: Text = "localhost"
|
|
67
|
+
port: int = 6379
|
|
68
|
+
username: Optional[Text] = None
|
|
69
|
+
password: Optional[Text] = None
|
|
70
|
+
use_ssl: bool = False
|
|
71
|
+
ssl_keyfile: Optional[Text] = None
|
|
72
|
+
ssl_certfile: Optional[Text] = None
|
|
73
|
+
ssl_ca_certs: Optional[Text] = None
|
|
74
|
+
db: int = 0
|
|
75
|
+
socket_timeout: float = DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
|
|
76
|
+
decode_responses: bool = False
|
|
77
|
+
deployment_mode: Text = DeploymentMode.STANDARD.value
|
|
78
|
+
endpoints: Optional[List[Text]] = None
|
|
79
|
+
sentinel_service: Optional[Text] = None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class RedisConnectionFactory:
|
|
83
|
+
"""Factory class for creating Redis connections with different modes."""
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def create_connection(
|
|
87
|
+
cls,
|
|
88
|
+
config: RedisConfig,
|
|
89
|
+
) -> Union[redis.Redis, redis.RedisCluster]:
|
|
90
|
+
"""Create a Redis connection based on the configuration.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
config: Redis configuration object containing all connection parameters.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
A Redis connection - either a standard Redis connection, a RedisCluster
|
|
97
|
+
connection, or a Redis master connection managed by Sentinel.
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
RasaException: If configuration is invalid.
|
|
101
|
+
"""
|
|
102
|
+
if config.endpoints is None:
|
|
103
|
+
config.endpoints = []
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
deployment_mode_enum = DeploymentMode(config.deployment_mode)
|
|
107
|
+
except ValueError:
|
|
108
|
+
valid_modes = [mode.value for mode in DeploymentMode]
|
|
109
|
+
raise RasaException(
|
|
110
|
+
f"Invalid deployment_mode '{config.deployment_mode}'. "
|
|
111
|
+
f"Must be one of: {', '.join(valid_modes)}"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
parsed_endpoints = cls._parse_and_validate_endpoints(
|
|
115
|
+
deployment_mode_enum, config.endpoints, config.host, config.port
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
iam_credentials_provider = create_iam_credentials_provider(
|
|
119
|
+
IAMCredentialsProviderInput(
|
|
120
|
+
service_name=SupportedServiceType.LOCK_STORE,
|
|
121
|
+
username=config.username,
|
|
122
|
+
cluster_name=os.getenv(AWS_ELASTICACHE_CLUSTER_NAME_ENV_VAR_NAME),
|
|
123
|
+
)
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
if deployment_mode_enum == DeploymentMode.CLUSTER:
|
|
127
|
+
cls._log_cluster_db_warning(deployment_mode_enum, config.db)
|
|
128
|
+
cluster_config = ClusterRedisConfig(
|
|
129
|
+
username=config.username,
|
|
130
|
+
password=config.password,
|
|
131
|
+
use_ssl=config.use_ssl,
|
|
132
|
+
ssl_certfile=config.ssl_certfile,
|
|
133
|
+
ssl_keyfile=config.ssl_keyfile,
|
|
134
|
+
ssl_ca_certs=config.ssl_ca_certs,
|
|
135
|
+
db=config.db,
|
|
136
|
+
socket_timeout=config.socket_timeout,
|
|
137
|
+
decode_responses=config.decode_responses,
|
|
138
|
+
endpoints=parsed_endpoints,
|
|
139
|
+
iam_credentials_provider=iam_credentials_provider,
|
|
140
|
+
)
|
|
141
|
+
return cls._create_cluster_connection(cluster_config)
|
|
142
|
+
elif deployment_mode_enum == DeploymentMode.SENTINEL:
|
|
143
|
+
sentinel_kwargs = {
|
|
144
|
+
"username": config.username,
|
|
145
|
+
"password": config.password,
|
|
146
|
+
"use_ssl": config.use_ssl,
|
|
147
|
+
"ssl_certfile": config.ssl_certfile,
|
|
148
|
+
"ssl_keyfile": config.ssl_keyfile,
|
|
149
|
+
"ssl_ca_certs": config.ssl_ca_certs,
|
|
150
|
+
"db": config.db,
|
|
151
|
+
"socket_timeout": config.socket_timeout,
|
|
152
|
+
"decode_responses": config.decode_responses,
|
|
153
|
+
"endpoints": parsed_endpoints,
|
|
154
|
+
"iam_credentials_provider": iam_credentials_provider,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if config.sentinel_service is not None:
|
|
158
|
+
sentinel_kwargs["sentinel_service"] = config.sentinel_service
|
|
159
|
+
|
|
160
|
+
sentinel_config = SentinelRedisConfig(**sentinel_kwargs)
|
|
161
|
+
return cls._create_sentinel_connection(sentinel_config)
|
|
162
|
+
else:
|
|
163
|
+
standard_config = StandardRedisConfig(
|
|
164
|
+
host=config.host,
|
|
165
|
+
port=config.port,
|
|
166
|
+
username=config.username,
|
|
167
|
+
password=config.password,
|
|
168
|
+
use_ssl=config.use_ssl,
|
|
169
|
+
ssl_certfile=config.ssl_certfile,
|
|
170
|
+
ssl_keyfile=config.ssl_keyfile,
|
|
171
|
+
ssl_ca_certs=config.ssl_ca_certs,
|
|
172
|
+
db=config.db,
|
|
173
|
+
socket_timeout=config.socket_timeout,
|
|
174
|
+
decode_responses=config.decode_responses,
|
|
175
|
+
iam_credentials_provider=iam_credentials_provider,
|
|
176
|
+
)
|
|
177
|
+
return cls._create_standard_connection(standard_config)
|
|
178
|
+
|
|
179
|
+
@classmethod
|
|
180
|
+
def _parse_and_validate_endpoints(
|
|
181
|
+
cls,
|
|
182
|
+
deployment_mode: DeploymentMode,
|
|
183
|
+
endpoints: List[str],
|
|
184
|
+
host: Text,
|
|
185
|
+
port: int,
|
|
186
|
+
) -> List[Union[Dict[str, Any], Tuple[str, int]]]:
|
|
187
|
+
"""Parse and validate endpoints based on deployment mode."""
|
|
188
|
+
if deployment_mode == DeploymentMode.STANDARD:
|
|
189
|
+
if endpoints:
|
|
190
|
+
structlogger.warning(
|
|
191
|
+
"redis_connection_factory.standard_endpoints_ignored",
|
|
192
|
+
event_info="Parameter `endpoints` ignored in standard mode. "
|
|
193
|
+
"Only 'host' and 'port' are used for standard Redis connections.",
|
|
194
|
+
)
|
|
195
|
+
return []
|
|
196
|
+
|
|
197
|
+
if not endpoints:
|
|
198
|
+
endpoints = cls._get_default_endpoints(deployment_mode, host, port)
|
|
199
|
+
|
|
200
|
+
# Parse endpoints into appropriate format
|
|
201
|
+
parsed_endpoints = cls._parse_all_endpoints(endpoints, deployment_mode)
|
|
202
|
+
|
|
203
|
+
if not parsed_endpoints:
|
|
204
|
+
raise RasaException(
|
|
205
|
+
f"No valid '{deployment_mode.value}' endpoints provided"
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
return parsed_endpoints
|
|
209
|
+
|
|
210
|
+
@classmethod
|
|
211
|
+
def _get_default_endpoints(
|
|
212
|
+
cls,
|
|
213
|
+
deployment_mode: DeploymentMode,
|
|
214
|
+
host: Text,
|
|
215
|
+
port: int,
|
|
216
|
+
) -> List[str]:
|
|
217
|
+
"""Get default endpoints when none provided."""
|
|
218
|
+
if deployment_mode == DeploymentMode.CLUSTER:
|
|
219
|
+
structlogger.warning(
|
|
220
|
+
"redis_connection_factory.cluster_endpoints_not_provided",
|
|
221
|
+
event_info="No endpoints provided for cluster mode. "
|
|
222
|
+
"Using default 'host:port' configuration.",
|
|
223
|
+
)
|
|
224
|
+
return [f"{host}:{port}"]
|
|
225
|
+
elif deployment_mode == DeploymentMode.SENTINEL:
|
|
226
|
+
raise RasaException("Sentinel mode requires endpoints configuration")
|
|
227
|
+
|
|
228
|
+
return []
|
|
229
|
+
|
|
230
|
+
@classmethod
|
|
231
|
+
def _parse_single_endpoint(
|
|
232
|
+
cls, endpoint: str, deployment_mode: DeploymentMode
|
|
233
|
+
) -> Optional[Union[Dict[str, Any], Tuple[str, int]]]:
|
|
234
|
+
"""Parse a single endpoint string into the appropriate format."""
|
|
235
|
+
if not isinstance(endpoint, str):
|
|
236
|
+
structlogger.warning(
|
|
237
|
+
f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint_type",
|
|
238
|
+
event_info=f"Invalid endpoint type for endpoint '{endpoint}'. "
|
|
239
|
+
"Expected string in 'host:port' format.",
|
|
240
|
+
)
|
|
241
|
+
return None
|
|
242
|
+
|
|
243
|
+
if ":" not in endpoint:
|
|
244
|
+
structlogger.warning(
|
|
245
|
+
f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint_format",
|
|
246
|
+
event_info=f"Invalid format for endpoint '{endpoint}'. "
|
|
247
|
+
"Expected 'host:port'.",
|
|
248
|
+
)
|
|
249
|
+
return None
|
|
250
|
+
|
|
251
|
+
host, port_str = endpoint.rsplit(":", 1)
|
|
252
|
+
try:
|
|
253
|
+
port = int(port_str)
|
|
254
|
+
except ValueError:
|
|
255
|
+
structlogger.warning(
|
|
256
|
+
f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint",
|
|
257
|
+
event_info=f"Invalid port in endpoint '{endpoint}'. "
|
|
258
|
+
"Expected format 'host:port'.",
|
|
259
|
+
)
|
|
260
|
+
return None
|
|
261
|
+
|
|
262
|
+
return (host, port)
|
|
263
|
+
|
|
264
|
+
@classmethod
|
|
265
|
+
def _parse_all_endpoints(
|
|
266
|
+
cls,
|
|
267
|
+
endpoints: List[str],
|
|
268
|
+
deployment_mode: DeploymentMode,
|
|
269
|
+
) -> List[Union[Dict[str, Any], Tuple[str, int]]]:
|
|
270
|
+
"""Parse a list of endpoint strings into appropriate format."""
|
|
271
|
+
parsed_endpoints = []
|
|
272
|
+
for endpoint in endpoints:
|
|
273
|
+
parsed = cls._parse_single_endpoint(endpoint, deployment_mode)
|
|
274
|
+
if parsed:
|
|
275
|
+
parsed_endpoints.append(parsed)
|
|
276
|
+
return parsed_endpoints
|
|
277
|
+
|
|
278
|
+
@classmethod
|
|
279
|
+
def _create_cluster_connection(
|
|
280
|
+
cls,
|
|
281
|
+
config: ClusterRedisConfig,
|
|
282
|
+
) -> redis.RedisCluster:
|
|
283
|
+
"""Create a Redis Cluster connection.
|
|
284
|
+
|
|
285
|
+
Note: Database parameter is ignored in cluster mode (always uses db=0).
|
|
286
|
+
|
|
287
|
+
Args:
|
|
288
|
+
config: Cluster configuration containing all connection parameters.
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
redis.RedisCluster: Configured cluster connection.
|
|
292
|
+
|
|
293
|
+
Raises:
|
|
294
|
+
ConnectionException: If cluster initialization fails.
|
|
295
|
+
"""
|
|
296
|
+
from redis.cluster import ClusterNode
|
|
297
|
+
|
|
298
|
+
structlogger.info(
|
|
299
|
+
"redis_connection_factory.cluster_mode",
|
|
300
|
+
event_info=f"Initializing Redis Cluster with {len(config.endpoints)} nodes",
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
cluster_nodes = [ClusterNode(host, port) for host, port in config.endpoints]
|
|
304
|
+
|
|
305
|
+
common_config_kwargs = {
|
|
306
|
+
"startup_nodes": cluster_nodes,
|
|
307
|
+
"ssl": config.use_ssl,
|
|
308
|
+
"ssl_certfile": config.ssl_certfile,
|
|
309
|
+
"ssl_keyfile": config.ssl_keyfile,
|
|
310
|
+
"ssl_ca_certs": config.ssl_ca_certs,
|
|
311
|
+
"socket_timeout": config.socket_timeout,
|
|
312
|
+
"decode_responses": config.decode_responses,
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
try:
|
|
316
|
+
if config.iam_credentials_provider is not None:
|
|
317
|
+
structlogger.debug("redis_connection_factory.cluster_iam_auth_enabled")
|
|
318
|
+
|
|
319
|
+
redis_cluster: redis.RedisCluster = redis.RedisCluster(
|
|
320
|
+
credential_provider=config.iam_credentials_provider,
|
|
321
|
+
**common_config_kwargs,
|
|
322
|
+
)
|
|
323
|
+
else:
|
|
324
|
+
redis_cluster = redis.RedisCluster(
|
|
325
|
+
username=config.username,
|
|
326
|
+
password=config.password,
|
|
327
|
+
**common_config_kwargs,
|
|
328
|
+
)
|
|
329
|
+
except Exception as e:
|
|
330
|
+
raise ConnectionException(f"Error initializing Redis Cluster: {e}")
|
|
331
|
+
|
|
332
|
+
return redis_cluster
|
|
333
|
+
|
|
334
|
+
@classmethod
|
|
335
|
+
def _create_sentinel_connection(
|
|
336
|
+
cls,
|
|
337
|
+
config: SentinelRedisConfig,
|
|
338
|
+
) -> redis.Redis:
|
|
339
|
+
"""Create a Sentinel-managed Redis connection.
|
|
340
|
+
|
|
341
|
+
Connects to Redis master through Sentinel service discovery.
|
|
342
|
+
Tests connection with ping() before returning.
|
|
343
|
+
|
|
344
|
+
Args:
|
|
345
|
+
config: Sentinel configuration containing all connection parameters.
|
|
346
|
+
|
|
347
|
+
Returns:
|
|
348
|
+
redis.Redis: Connection to the Redis master via sentinel.
|
|
349
|
+
|
|
350
|
+
Raises:
|
|
351
|
+
ConnectionException: If sentinel initialization or connection test fails.
|
|
352
|
+
"""
|
|
353
|
+
from redis.sentinel import Sentinel
|
|
354
|
+
|
|
355
|
+
structlogger.info(
|
|
356
|
+
"redis_connection_factory.sentinel_mode",
|
|
357
|
+
event_info=f"Initializing Redis Sentinel with {len(config.endpoints)} "
|
|
358
|
+
f"sentinel endpoints and service: {config.sentinel_service}",
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
# Configuration for Sentinel connection
|
|
362
|
+
connection_kwargs: Dict[str, Any] = {
|
|
363
|
+
"socket_timeout": config.socket_timeout,
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
sentinel_kwargs: Optional[Dict] = None
|
|
367
|
+
if config.iam_credentials_provider is not None:
|
|
368
|
+
structlogger.debug("redis_connection_factory.sentinel_iam_auth_enabled")
|
|
369
|
+
sentinel_kwargs = {"credential_provider": config.iam_credentials_provider}
|
|
370
|
+
else:
|
|
371
|
+
connection_kwargs.update(
|
|
372
|
+
{
|
|
373
|
+
"username": config.username,
|
|
374
|
+
"password": config.password,
|
|
375
|
+
}
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
# SSL configuration
|
|
379
|
+
if config.use_ssl:
|
|
380
|
+
connection_kwargs.update(
|
|
381
|
+
{
|
|
382
|
+
"ssl": config.use_ssl,
|
|
383
|
+
"ssl_certfile": config.ssl_certfile,
|
|
384
|
+
"ssl_keyfile": config.ssl_keyfile,
|
|
385
|
+
"ssl_ca_certs": config.ssl_ca_certs,
|
|
386
|
+
}
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
# Configuration for Redis client (master/replica)
|
|
390
|
+
client_kwargs = {
|
|
391
|
+
"db": config.db,
|
|
392
|
+
"decode_responses": config.decode_responses,
|
|
393
|
+
"socket_timeout": config.socket_timeout,
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
# Create Sentinel instance
|
|
397
|
+
try:
|
|
398
|
+
sentinel = Sentinel(
|
|
399
|
+
config.endpoints, sentinel_kwargs=sentinel_kwargs, **connection_kwargs
|
|
400
|
+
)
|
|
401
|
+
master = sentinel.master_for(config.sentinel_service, **client_kwargs)
|
|
402
|
+
|
|
403
|
+
# Test the connection
|
|
404
|
+
master.ping()
|
|
405
|
+
|
|
406
|
+
except Exception as e:
|
|
407
|
+
raise ConnectionException(f"Error initializing Redis Sentinel: {e}")
|
|
408
|
+
|
|
409
|
+
return master
|
|
410
|
+
|
|
411
|
+
@classmethod
|
|
412
|
+
def _create_standard_connection(
|
|
413
|
+
cls,
|
|
414
|
+
config: StandardRedisConfig,
|
|
415
|
+
) -> redis.Redis:
|
|
416
|
+
"""Create a standard Redis connection.
|
|
417
|
+
|
|
418
|
+
Args:
|
|
419
|
+
config: Standard configuration containing all connection parameters.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
redis.Redis: Configured Redis connection.
|
|
423
|
+
"""
|
|
424
|
+
structlogger.info(
|
|
425
|
+
"redis_connection_factory.standard_mode",
|
|
426
|
+
event_info="Initializing Redis connection",
|
|
427
|
+
)
|
|
428
|
+
# Build connection arguments
|
|
429
|
+
connection_args: Dict[str, Any] = {
|
|
430
|
+
"host": config.host,
|
|
431
|
+
"port": int(config.port),
|
|
432
|
+
"db": config.db,
|
|
433
|
+
"socket_timeout": float(config.socket_timeout),
|
|
434
|
+
"ssl": config.use_ssl,
|
|
435
|
+
"ssl_certfile": config.ssl_certfile,
|
|
436
|
+
"ssl_keyfile": config.ssl_keyfile,
|
|
437
|
+
"ssl_ca_certs": config.ssl_ca_certs,
|
|
438
|
+
"decode_responses": config.decode_responses,
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
if config.iam_credentials_provider is not None:
|
|
442
|
+
structlogger.debug("redis_connection_factory.standard_iam_auth_enabled")
|
|
443
|
+
connection_args.update(
|
|
444
|
+
{"credential_provider": config.iam_credentials_provider}
|
|
445
|
+
)
|
|
446
|
+
else:
|
|
447
|
+
connection_args.update(
|
|
448
|
+
{
|
|
449
|
+
"password": config.password,
|
|
450
|
+
"username": config.username,
|
|
451
|
+
}
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
try:
|
|
455
|
+
standard_redis = redis.StrictRedis(**connection_args)
|
|
456
|
+
except Exception as e:
|
|
457
|
+
raise ConnectionException(f"Error initializing Redis connection: {e}")
|
|
458
|
+
|
|
459
|
+
return standard_redis
|
|
460
|
+
|
|
461
|
+
@classmethod
|
|
462
|
+
def _log_cluster_db_warning(cls, deployment_mode: DeploymentMode, db: int) -> None:
|
|
463
|
+
"""Log warning if db parameter is set in cluster mode."""
|
|
464
|
+
if deployment_mode == DeploymentMode.CLUSTER and db != 0:
|
|
465
|
+
structlogger.warning(
|
|
466
|
+
"redis_connection_factory.cluster_db_ignored",
|
|
467
|
+
event_info=f"Database parameter 'db={db}' ignored in cluster mode. "
|
|
468
|
+
"Redis Cluster only supports database 0.",
|
|
469
|
+
)
|
|
@@ -4,12 +4,19 @@ from datetime import datetime
|
|
|
4
4
|
from typing import Any, Dict, Iterable, Optional, Text
|
|
5
5
|
|
|
6
6
|
import structlog
|
|
7
|
+
from pydantic import ValidationError
|
|
7
8
|
|
|
8
9
|
import rasa.shared
|
|
9
10
|
from rasa.core.brokers.broker import EventBroker
|
|
11
|
+
from rasa.core.redis_connection_factory import (
|
|
12
|
+
DeploymentMode,
|
|
13
|
+
RedisConfig,
|
|
14
|
+
RedisConnectionFactory,
|
|
15
|
+
)
|
|
10
16
|
from rasa.core.tracker_stores.tracker_store import SerializedTrackerAsText, TrackerStore
|
|
11
17
|
from rasa.shared.core.domain import Domain
|
|
12
18
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
19
|
+
from rasa.shared.exceptions import RasaException
|
|
13
20
|
|
|
14
21
|
structlogger = structlog.get_logger(__name__)
|
|
15
22
|
|
|
@@ -35,23 +42,34 @@ class RedisTrackerStore(TrackerStore, SerializedTrackerAsText):
|
|
|
35
42
|
ssl_keyfile: Optional[Text] = None,
|
|
36
43
|
ssl_certfile: Optional[Text] = None,
|
|
37
44
|
ssl_ca_certs: Optional[Text] = None,
|
|
45
|
+
deployment_mode: Text = DeploymentMode.STANDARD.value,
|
|
46
|
+
endpoints: Optional[list] = None,
|
|
47
|
+
sentinel_service: Optional[Text] = None,
|
|
38
48
|
**kwargs: Dict[Text, Any],
|
|
39
49
|
) -> None:
|
|
40
50
|
"""Initializes the tracker store."""
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
|
|
52
|
+
# Create Redis connection using the factory directly
|
|
53
|
+
try:
|
|
54
|
+
config = RedisConfig(
|
|
55
|
+
host=host,
|
|
56
|
+
port=port,
|
|
57
|
+
db=db,
|
|
58
|
+
username=username,
|
|
59
|
+
password=password,
|
|
60
|
+
use_ssl=use_ssl,
|
|
61
|
+
ssl_keyfile=ssl_keyfile,
|
|
62
|
+
ssl_certfile=ssl_certfile,
|
|
63
|
+
ssl_ca_certs=ssl_ca_certs,
|
|
64
|
+
deployment_mode=deployment_mode,
|
|
65
|
+
endpoints=endpoints,
|
|
66
|
+
sentinel_service=sentinel_service,
|
|
67
|
+
decode_responses=True,
|
|
68
|
+
)
|
|
69
|
+
self.red = RedisConnectionFactory.create_connection(config)
|
|
70
|
+
except ValidationError as e:
|
|
71
|
+
raise RasaException(f"Invalid Redis configuration: {e}")
|
|
72
|
+
|
|
55
73
|
self.record_exp = record_exp
|
|
56
74
|
|
|
57
75
|
self.key_prefix = DEFAULT_REDIS_TRACKER_STORE_KEY_PREFIX
|
|
@@ -27,6 +27,13 @@ from rasa.core.constants import (
|
|
|
27
27
|
POSTGRESQL_MAX_OVERFLOW,
|
|
28
28
|
POSTGRESQL_POOL_SIZE,
|
|
29
29
|
POSTGRESQL_SCHEMA,
|
|
30
|
+
SQL_TRACKER_STORE_SSL_MODE_ENV_VAR_NAME,
|
|
31
|
+
SQL_TRACKER_STORE_SSL_ROOT_CERTIFICATE_ENV_VAR_NAME,
|
|
32
|
+
)
|
|
33
|
+
from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
|
|
34
|
+
IAMCredentialsProviderInput,
|
|
35
|
+
SupportedServiceType,
|
|
36
|
+
create_iam_credentials_provider,
|
|
30
37
|
)
|
|
31
38
|
from rasa.core.tracker_stores.tracker_store import (
|
|
32
39
|
SerializedTrackerAsText,
|
|
@@ -85,6 +92,21 @@ def is_postgresql_url(url: Union[Text, "URL"]) -> bool:
|
|
|
85
92
|
return url.drivername == "postgresql"
|
|
86
93
|
|
|
87
94
|
|
|
95
|
+
def get_ssl_args() -> Dict[str, Any]:
|
|
96
|
+
"""Get SSL arguments for PostgreSQL connection from environment variables."""
|
|
97
|
+
ssl_mode = os.getenv(SQL_TRACKER_STORE_SSL_MODE_ENV_VAR_NAME)
|
|
98
|
+
ssl_root_cert = os.getenv(SQL_TRACKER_STORE_SSL_ROOT_CERTIFICATE_ENV_VAR_NAME)
|
|
99
|
+
ssl_args = {}
|
|
100
|
+
|
|
101
|
+
if ssl_mode:
|
|
102
|
+
ssl_args["sslmode"] = ssl_mode
|
|
103
|
+
|
|
104
|
+
if ssl_root_cert:
|
|
105
|
+
ssl_args["sslrootcert"] = ssl_root_cert
|
|
106
|
+
|
|
107
|
+
return ssl_args
|
|
108
|
+
|
|
109
|
+
|
|
88
110
|
def create_engine_kwargs(url: Union[Text, "URL"]) -> Dict[Text, Any]:
|
|
89
111
|
"""Get `sqlalchemy.create_engine()` kwargs.
|
|
90
112
|
|
|
@@ -119,6 +141,14 @@ def create_engine_kwargs(url: Union[Text, "URL"]) -> Dict[Text, Any]:
|
|
|
119
141
|
os.environ.get(POSTGRESQL_MAX_OVERFLOW, POSTGRESQL_DEFAULT_MAX_OVERFLOW)
|
|
120
142
|
)
|
|
121
143
|
|
|
144
|
+
ssl_args = get_ssl_args()
|
|
145
|
+
|
|
146
|
+
if ssl_args:
|
|
147
|
+
if "connect_args" in kwargs:
|
|
148
|
+
kwargs["connect_args"].update(ssl_args)
|
|
149
|
+
else:
|
|
150
|
+
kwargs["connect_args"] = ssl_args
|
|
151
|
+
|
|
122
152
|
return kwargs
|
|
123
153
|
|
|
124
154
|
|
|
@@ -197,6 +227,32 @@ class SQLTrackerStore(TrackerStore, SerializedTrackerAsText):
|
|
|
197
227
|
|
|
198
228
|
port = validate_port(port)
|
|
199
229
|
|
|
230
|
+
iam_credentials_provider = create_iam_credentials_provider(
|
|
231
|
+
IAMCredentialsProviderInput(
|
|
232
|
+
service_name=SupportedServiceType.TRACKER_STORE,
|
|
233
|
+
username=username,
|
|
234
|
+
host=host,
|
|
235
|
+
port=port,
|
|
236
|
+
)
|
|
237
|
+
)
|
|
238
|
+
if iam_credentials_provider is not None:
|
|
239
|
+
credentials = iam_credentials_provider.get_temporary_credentials()
|
|
240
|
+
if credentials.auth_token:
|
|
241
|
+
password = credentials.auth_token
|
|
242
|
+
structlogger.debug(
|
|
243
|
+
"sql_tracker_store.iam_credentials_provider",
|
|
244
|
+
event_info="Using temporary auth token from "
|
|
245
|
+
"IAM credentials provider.",
|
|
246
|
+
)
|
|
247
|
+
else:
|
|
248
|
+
structlogger.warning(
|
|
249
|
+
"sql_tracker_store.iam_credentials_provider.no_auth_token",
|
|
250
|
+
event_info=(
|
|
251
|
+
"IAM credentials provider did not return an auth token. "
|
|
252
|
+
"Falling back to provided password or no password."
|
|
253
|
+
),
|
|
254
|
+
)
|
|
255
|
+
|
|
200
256
|
engine_url = self.get_db_url(
|
|
201
257
|
dialect, host, port, db, username, password, login_db, query
|
|
202
258
|
)
|
|
@@ -272,7 +328,7 @@ class SQLTrackerStore(TrackerStore, SerializedTrackerAsText):
|
|
|
272
328
|
host: Database network host.
|
|
273
329
|
port: Database network port.
|
|
274
330
|
db: Database name.
|
|
275
|
-
username:
|
|
331
|
+
username: Username to use when connecting to the database.
|
|
276
332
|
password: Password for database user.
|
|
277
333
|
login_db: Alternative database name to which initially connect, and create
|
|
278
334
|
the database specified by `db` (PostgreSQL only).
|
|
@@ -219,11 +219,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
|
|
|
219
219
|
if self.vector_store is not None:
|
|
220
220
|
with self._model_storage.write_to(self._resource) as model_path:
|
|
221
221
|
self.vector_store.save_local(model_path)
|
|
222
|
-
else:
|
|
223
|
-
structlogger.warning(
|
|
224
|
-
"flow_retrieval.persist_vector_store.not_initialized",
|
|
225
|
-
event_info="Vector store is None, not persisted.",
|
|
226
|
-
)
|
|
227
222
|
|
|
228
223
|
def _persist_config(self) -> None:
|
|
229
224
|
with self._model_storage.write_to(self._resource) as path:
|
|
@@ -249,6 +244,16 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
|
|
|
249
244
|
)
|
|
250
245
|
|
|
251
246
|
flows_to_embedd = flows.exclude_link_only_flows()
|
|
247
|
+
|
|
248
|
+
if not flows_to_embedd:
|
|
249
|
+
structlogger.debug(
|
|
250
|
+
"flow_retrieval.populate_vector_store.no_flows_to_embed",
|
|
251
|
+
event_info=(
|
|
252
|
+
"No flows to embed in the vector store, skipping population."
|
|
253
|
+
),
|
|
254
|
+
)
|
|
255
|
+
return
|
|
256
|
+
|
|
252
257
|
embeddings = self._create_embedder(self.config)
|
|
253
258
|
documents = self._generate_flow_documents(flows_to_embedd, domain)
|
|
254
259
|
try:
|
|
@@ -420,10 +425,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
|
|
|
420
425
|
The top k documents with similarity scores.
|
|
421
426
|
"""
|
|
422
427
|
if self.vector_store is None:
|
|
423
|
-
structlogger.error(
|
|
424
|
-
"flow_retrieval.query_vector_store.vector_store_not_configured",
|
|
425
|
-
event_info="Vector store is not configured",
|
|
426
|
-
)
|
|
427
428
|
return []
|
|
428
429
|
try:
|
|
429
430
|
documents_with_scores = (
|