rasa-pro 3.13.12__py3-none-any.whl → 3.14.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/__main__.py +15 -3
- rasa/agents/__init__.py +0 -0
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +213 -0
- rasa/agents/constants.py +43 -0
- rasa/agents/core/__init__.py +0 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +81 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/__init__.py +0 -0
- rasa/agents/protocol/a2a/a2a_agent.py +889 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +778 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
- rasa/agents/schemas/__init__.py +13 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +65 -0
- rasa/agents/schemas/agent_tool_schema.py +186 -0
- rasa/agents/templates/__init__.py +0 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
- rasa/agents/utils.py +228 -0
- rasa/agents/validation.py +538 -0
- rasa/api.py +23 -9
- rasa/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +96 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +38 -0
- rasa/builder/copilot/copilot.py +562 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +81 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +690 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +787 -0
- rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +91 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +234 -0
- rasa/builder/copilot/templated_messages/__init__.py +0 -0
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +41 -0
- rasa/builder/copilot/templated_messages/copilot_welcome_messages.yml +56 -0
- rasa/builder/document_retrieval/__init__.py +0 -0
- rasa/builder/document_retrieval/constants.py +15 -0
- rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
- rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
- rasa/builder/document_retrieval/models.py +62 -0
- rasa/builder/download.py +140 -0
- rasa/builder/exceptions.py +91 -0
- rasa/builder/guardrails/__init__.py +1 -0
- rasa/builder/guardrails/clients.py +256 -0
- rasa/builder/guardrails/constants.py +12 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/models.py +266 -0
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +94 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +609 -0
- rasa/builder/llm_service.py +273 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +234 -0
- rasa/builder/models.py +229 -0
- rasa/builder/project_generator.py +463 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/service.py +1367 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/template_cache.py +69 -0
- rasa/builder/training_service.py +188 -0
- rasa/builder/validation_service.py +101 -0
- rasa/cli/arguments/data.py +9 -0
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +78 -10
- rasa/cli/dialogue_understanding_test.py +11 -7
- rasa/cli/e2e_test.py +10 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +9 -4
- rasa/cli/interactive.py +8 -4
- rasa/cli/llm_fine_tuning.py +12 -6
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/__init__ +0 -0
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +29 -0
- rasa/cli/project_templates/basic/credentials.yml +33 -0
- rasa/cli/project_templates/basic/data/data.md +8 -0
- rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
- rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
- rasa/cli/project_templates/basic/data/general/help.yml +6 -0
- rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/basic/docs/docs.md +5 -0
- rasa/cli/project_templates/basic/docs/template.txt +28 -0
- rasa/cli/project_templates/basic/domain/domain.md +11 -0
- rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
- rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
- rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
- rasa/cli/project_templates/basic/endpoints.yml +67 -0
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/help.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/human_handoff.yml +41 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/patterns.yml +32 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/show_faqs.yml +8 -0
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/defaults.py +1 -0
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/cards/check_that_card_exists.py +21 -0
- rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
- rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
- rasa/cli/project_templates/finance/actions/db.py +117 -0
- rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
- rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
- rasa/cli/project_templates/finance/config.yml +29 -0
- rasa/cli/project_templates/finance/credentials.yml +33 -0
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
- rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
- rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +45 -0
- rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
- rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
- rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
- rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
- rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
- rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
- rasa/cli/project_templates/finance/data/data.md +14 -0
- rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +6 -0
- rasa/cli/project_templates/finance/data/general/help.yml +9 -0
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
- rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
- rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +34 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
- rasa/cli/project_templates/finance/db/cards.json +18 -0
- rasa/cli/project_templates/finance/db/contacts.json +10 -0
- rasa/cli/project_templates/finance/db/my_account.json +6 -0
- rasa/cli/project_templates/finance/db/transactions.json +22 -0
- rasa/cli/project_templates/finance/docs/docs.md +8 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +15 -0
- rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
- rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
- rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +44 -0
- rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
- rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
- rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
- rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
- rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
- rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
- rasa/cli/project_templates/finance/domain/domain.md +18 -0
- rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
- rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +8 -0
- rasa/cli/project_templates/finance/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -0
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +31 -0
- rasa/cli/project_templates/finance/domain/general/welcome.yml +39 -0
- rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
- rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
- rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +221 -0
- rasa/cli/project_templates/finance/endpoints.yml +67 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/download_statements.yml +43 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/cards/block_card.yml +55 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/patterns.yml +22 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/transfers/transfer_money.yml +56 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
- rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
- rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
- rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
- rasa/cli/project_templates/telco/config.yml +29 -0
- rasa/cli/project_templates/telco/credentials.yml +33 -0
- rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
- rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
- rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
- rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
- rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
- rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
- rasa/cli/project_templates/telco/docs/docs.md +8 -0
- rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
- rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
- rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
- rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
- rasa/cli/project_templates/telco/domain/domain.md +13 -0
- rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
- rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
- rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
- rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
- rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
- rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +74 -0
- rasa/cli/project_templates/telco/domain/shared.yml +129 -0
- rasa/cli/project_templates/telco/endpoints.yml +67 -0
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_not_slow.yml +33 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_slow.yml +47 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/patterns.yml +23 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +8 -10
- rasa/cli/scaffold.py +50 -6
- rasa/cli/shell.py +10 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +44 -30
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +232 -0
- rasa/cli/validation/config_path_validation.py +257 -0
- rasa/cli/x.py +8 -4
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +53 -13
- rasa/core/actions/action_exceptions.py +1 -1
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +22 -2
- rasa/core/available_agents.py +239 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +56 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +29 -16
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +18 -18
- rasa/core/channels/inspector/src/App.tsx +56 -12
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
- rasa/core/channels/inspector/src/types.ts +55 -1
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +82 -32
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_ready/twilio_voice.py +1 -1
- rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
- rasa/core/channels/voice_stream/asr/azure.py +6 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
- rasa/core/channels/voice_stream/audiocodes.py +11 -6
- rasa/core/channels/voice_stream/browser_audio.py +91 -4
- rasa/core/channels/voice_stream/call_state.py +13 -2
- rasa/core/channels/voice_stream/genesys.py +19 -15
- rasa/core/channels/voice_stream/jambonz.py +22 -12
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
- rasa/core/channels/voice_stream/util.py +11 -1
- rasa/core/channels/voice_stream/voice_channel.py +170 -32
- rasa/core/concurrent_lock_store.py +83 -16
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
- rasa/core/config/configuration.py +295 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +17 -0
- rasa/core/exceptions.py +1 -1
- rasa/core/featurizers/tracker_featurizers.py +3 -2
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
- rasa/core/lock_store.py +50 -10
- rasa/core/nlg/contextual_response_rephraser.py +5 -0
- rasa/core/nlg/generator.py +1 -1
- rasa/core/persistor.py +7 -7
- rasa/core/policies/enterprise_search_policy.py +9 -10
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +720 -0
- rasa/core/policies/flows/flow_exceptions.py +5 -2
- rasa/core/policies/flows/flow_executor.py +146 -77
- rasa/core/policies/flows/mcp_tool_executor.py +304 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/rule_policy.py +1 -1
- rasa/core/policies/ted_policy.py +20 -12
- rasa/core/policies/unexpected_intent_policy.py +6 -0
- rasa/core/processor.py +100 -44
- rasa/core/redis_connection_factory.py +474 -0
- rasa/core/run.py +49 -10
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +36 -14
- rasa/core/tracker_stores/sql_tracker_store.py +59 -1
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +20 -18
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +22 -23
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/clarify_command.py +20 -2
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
- rasa/dialogue_understanding/commands/utils.py +135 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
- rasa/dialogue_understanding/processor/command_processor.py +136 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +8 -3
- rasa/e2e_test/e2e_test_runner.py +13 -3
- rasa/engine/caching.py +2 -2
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +5 -1
- rasa/engine/loader.py +12 -0
- rasa/engine/recipes/default_components.py +138 -49
- rasa/engine/recipes/default_recipe.py +108 -11
- rasa/engine/runner/dask.py +8 -5
- rasa/engine/validation.py +25 -8
- rasa/graph_components/validators/default_recipe_validator.py +86 -28
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +2 -2
- rasa/model_manager/socket_bridge.py +21 -17
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/model_manager/warm_rasa_process.py +13 -3
- rasa/model_training.py +60 -47
- rasa/nlu/classifiers/diet_classifier.py +198 -98
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
- rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
- rasa/nlu/extractors/crf_entity_extractor.py +9 -10
- rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
- rasa/nlu/selectors/response_selector.py +10 -2
- rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
- rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
- rasa/nlu/utils/mitie_utils.py +3 -0
- rasa/nlu/utils/spacy_utils.py +3 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_config.py +1 -1
- rasa/privacy/privacy_manager.py +12 -3
- rasa/server.py +15 -3
- rasa/shared/agents/__init__.py +0 -0
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +105 -0
- rasa/shared/agents/auth/agent_auth_manager.py +92 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
- rasa/shared/agents/auth/constants.py +13 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/auth/utils.py +85 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +11 -0
- rasa/shared/core/constants.py +17 -1
- rasa/shared/core/domain.py +62 -22
- rasa/shared/core/events.py +329 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow.py +1 -1
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +57 -6
- rasa/shared/core/flows/steps/collect.py +98 -13
- rasa/shared/core/flows/validation.py +372 -8
- rasa/shared/core/flows/yaml_flows_io.py +19 -10
- rasa/shared/core/slots.py +6 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
- rasa/shared/exceptions.py +39 -2
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +86 -4
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/llm/_base_litellm_client.py +41 -9
- rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/common.py +26 -1
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +92 -19
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +250 -0
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/download.py +3 -0
- rasa/studio/prompts.py +1 -0
- rasa/studio/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +19 -52
- rasa/telemetry.py +166 -28
- rasa/tracing/config.py +45 -12
- rasa/tracing/constants.py +14 -0
- rasa/tracing/instrumentation/attribute_extractors.py +142 -9
- rasa/tracing/instrumentation/instrumentation.py +626 -21
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/tracing/instrumentation/metrics.py +32 -0
- rasa/tracing/metric_instrument_provider.py +68 -0
- rasa/utils/common.py +92 -1
- rasa/utils/endpoints.py +11 -2
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +121 -7
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/plotting.py +1 -1
- rasa/utils/pypred.py +45 -0
- rasa/utils/tensorflow/__init__.py +7 -0
- rasa/utils/tensorflow/callback.py +136 -101
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +21 -11
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +56 -8
- rasa/utils/tensorflow/rasa_layers.py +8 -6
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +54 -24
- rasa/validator.py +149 -16
- rasa/version.py +1 -1
- rasa_pro-3.14.0.dist-info/METADATA +212 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +581 -269
- rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
- rasa_pro-3.13.12.dist-info/METADATA +0 -192
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
test_cases:
|
|
2
|
+
- test_case: human handoff happy path
|
|
3
|
+
steps:
|
|
4
|
+
- user: "I would like to speak with a human"
|
|
5
|
+
assertions:
|
|
6
|
+
- flow_started: "human_handoff"
|
|
7
|
+
- bot_uttered:
|
|
8
|
+
utter_name: "utter_ask_confirm_human_handoff"
|
|
9
|
+
buttons:
|
|
10
|
+
- payload: "/SetSlots(confirm_human_handoff=Yes)"
|
|
11
|
+
title: "Yes"
|
|
12
|
+
- payload: "/SetSlots(confirm_human_handoff=No)"
|
|
13
|
+
title: "No"
|
|
14
|
+
- user: "/SetSlots(confirm_human_handoff=Yes)"
|
|
15
|
+
assertions:
|
|
16
|
+
- slot_was_set:
|
|
17
|
+
- name: "confirm_human_handoff"
|
|
18
|
+
value: "Yes"
|
|
19
|
+
- bot_uttered:
|
|
20
|
+
utter_name: "utter_transferring_to_human"
|
|
21
|
+
- action_executed: action_human_handoff
|
|
22
|
+
# ====================================================>
|
|
23
|
+
- test_case: human handoff unhappy path
|
|
24
|
+
steps:
|
|
25
|
+
- user: "I would like to speak with a human"
|
|
26
|
+
assertions:
|
|
27
|
+
- flow_started: "human_handoff"
|
|
28
|
+
- bot_uttered:
|
|
29
|
+
utter_name: "utter_ask_confirm_human_handoff"
|
|
30
|
+
buttons:
|
|
31
|
+
- payload: "/SetSlots(confirm_human_handoff=Yes)"
|
|
32
|
+
title: "Yes"
|
|
33
|
+
- payload: "/SetSlots(confirm_human_handoff=No)"
|
|
34
|
+
title: "No"
|
|
35
|
+
- user: "/SetSlots(confirm_human_handoff=No)"
|
|
36
|
+
assertions:
|
|
37
|
+
- slot_was_set:
|
|
38
|
+
- name: "confirm_human_handoff"
|
|
39
|
+
value: "No"
|
|
40
|
+
- bot_uttered:
|
|
41
|
+
utter_name: "utter_human_handoff_cancelled"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
test_cases:
|
|
2
|
+
- test_case: test pattern session start
|
|
3
|
+
steps:
|
|
4
|
+
- user: "/session_start"
|
|
5
|
+
assertions:
|
|
6
|
+
- flow_started: "pattern_session_start"
|
|
7
|
+
- bot_uttered:
|
|
8
|
+
utter_name: "utter_welcome"
|
|
9
|
+
#
|
|
10
|
+
- test_case: test basic conversation flow
|
|
11
|
+
steps:
|
|
12
|
+
- user: "hello"
|
|
13
|
+
assertions:
|
|
14
|
+
- flow_started: "hello"
|
|
15
|
+
- bot_uttered:
|
|
16
|
+
utter_name: "utter_hello"
|
|
17
|
+
- user: "what can you help me with?"
|
|
18
|
+
assertions:
|
|
19
|
+
- flow_started: "help"
|
|
20
|
+
- bot_uttered:
|
|
21
|
+
utter_name: "utter_what_can_you_do"
|
|
22
|
+
- user: "show me faqs"
|
|
23
|
+
assertions:
|
|
24
|
+
- flow_started: "show_faqs"
|
|
25
|
+
- bot_uttered:
|
|
26
|
+
utter_name: "utter_top_faqs"
|
|
27
|
+
- user: "goodbye"
|
|
28
|
+
assertions:
|
|
29
|
+
- flow_started: "goodbye_flow"
|
|
30
|
+
- bot_uttered:
|
|
31
|
+
utter_name: "utter_goodbye"
|
|
32
|
+
- flow_started: "leave_feedback"
|
|
@@ -138,6 +138,7 @@ def get_rasa_defaults(config_yaml: Text, endpoints_yaml: Text) -> RasaDefaults:
|
|
|
138
138
|
A RasaDefaults object containing the default values for the project.
|
|
139
139
|
"""
|
|
140
140
|
config = read_yaml(config_yaml)
|
|
141
|
+
# Does not read from file, it converts the YAML content to a dictionary.
|
|
141
142
|
endpoints = read_yaml(endpoints_yaml)
|
|
142
143
|
|
|
143
144
|
prompts = get_system_default_prompts(config, endpoints)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Finance Banking Agent Template
|
|
2
|
+
|
|
3
|
+
A lightweight banking conversational agent template for the fictional **Fenlo Bank** that handles account management, card services, and money transfers.
|
|
4
|
+
|
|
5
|
+
## 🚀 What's Included
|
|
6
|
+
|
|
7
|
+
This template provides a banking assistant with:
|
|
8
|
+
- **Account Management**: Balance checking and statement downloads
|
|
9
|
+
- **Card Services**: Card activation, blocking, replacement, and listing
|
|
10
|
+
- **Money Transfers**: Account-to-account transfers and third-party payments
|
|
11
|
+
- **Contact Management**: Add, list, and remove trusted contacts
|
|
12
|
+
- **Bill Management**: Bill payment reminders and scheduling
|
|
13
|
+
- **Banking Knowledge**: FAQ system with Fenlo Bank documentation
|
|
14
|
+
|
|
15
|
+
## 📁 Directory Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
├── actions/ # Custom Python logic for banking operations
|
|
19
|
+
├── data/ # Banking conversation flows and training data
|
|
20
|
+
├── domain/ # Banking agent configuration
|
|
21
|
+
├── db/ # Mock JSON database for testing
|
|
22
|
+
├── docs/ # Fenlo Bank knowledge base and FAQ documents
|
|
23
|
+
├── prompts/ # LLM prompts for enhanced banking responses
|
|
24
|
+
└── config.yml # Training pipeline configuration
|
|
25
|
+
```
|
|
26
|
+
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
|
|
7
|
+
from actions.db import get_account
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CheckBalance(Action):
|
|
11
|
+
def name(self) -> str:
|
|
12
|
+
return "check_balance"
|
|
13
|
+
|
|
14
|
+
def run(
|
|
15
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
16
|
+
) -> List[Dict[str, Any]]:
|
|
17
|
+
account = get_account(tracker.sender_id)
|
|
18
|
+
return [SlotSet("current_balance", account.funds)]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
## 📂 `actions/` – The Agent's Toolkit
|
|
2
|
+
|
|
3
|
+
This folder contains Python files that define custom banking actions your agent can perform. Actions handle complex banking operations, database interactions, and business logic validation.
|
|
4
|
+
|
|
5
|
+
**What you'll find:**
|
|
6
|
+
- **accounts/**: Account-related actions (balance checking, account validation)
|
|
7
|
+
- **cards/**: Card management actions (card existence checks, status updates)
|
|
8
|
+
- **transfers/**: Payment and transfer actions (payee management, fund transfers, scheduling)
|
|
9
|
+
- **contacts/**: Contact and advisor management
|
|
10
|
+
- `database.py`: Core database interactions with banking data
|
|
11
|
+
- `action_session_start.py`: Session initialization for banking context
|
|
12
|
+
|
|
13
|
+
**Edit Python files in this folder** to add new banking features, modify business rules, or integrate with external banking APIs and systems.
|
|
14
|
+
|
|
15
|
+
Learn more about custom actions in the [Rasa documentation](https://rasa.com/docs/pro/build/custom-actions).
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Text
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ActionCheckThatCardExists(Action):
|
|
9
|
+
def name(self) -> Text:
|
|
10
|
+
return "check_that_card_exists"
|
|
11
|
+
|
|
12
|
+
def run(
|
|
13
|
+
self,
|
|
14
|
+
dispatcher: CollectingDispatcher,
|
|
15
|
+
tracker: Tracker,
|
|
16
|
+
domain: Dict[Text, Any],
|
|
17
|
+
) -> List[Dict[Text, Any]]:
|
|
18
|
+
# For example purposes, we assume the card exists; in a real situation,
|
|
19
|
+
# fetch this info from a database or service.
|
|
20
|
+
# card_number = tracker.get_slot("bank_card_number")
|
|
21
|
+
return [SlotSet("return_value", True)]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
|
|
7
|
+
from actions.db import get_cards
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ListCards(Action):
|
|
11
|
+
def name(self) -> str:
|
|
12
|
+
return "list_cards"
|
|
13
|
+
|
|
14
|
+
def run(
|
|
15
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
16
|
+
) -> List[Dict[str, Any]]:
|
|
17
|
+
cards = get_cards(tracker.sender_id)
|
|
18
|
+
if len(cards) > 0:
|
|
19
|
+
cards_list = "".join([f"- {c.name} ({c.handle}) \n" for c in cards])
|
|
20
|
+
return [SlotSet("cards_list", cards_list)]
|
|
21
|
+
else:
|
|
22
|
+
return [SlotSet("cards_list", None)]
|
|
File without changes
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
|
|
7
|
+
from actions.db import Contact, add_contact, get_contacts
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AddContact(Action):
|
|
11
|
+
def name(self) -> str:
|
|
12
|
+
return "add_contact"
|
|
13
|
+
|
|
14
|
+
def run(
|
|
15
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
16
|
+
) -> List[Dict[str, Any]]:
|
|
17
|
+
contacts = get_contacts(tracker.sender_id)
|
|
18
|
+
name = tracker.get_slot("add_contact_name")
|
|
19
|
+
handle = tracker.get_slot("add_contact_handle")
|
|
20
|
+
|
|
21
|
+
if name is None or handle is None:
|
|
22
|
+
return [SlotSet("return_value", "data_not_present")]
|
|
23
|
+
|
|
24
|
+
existing_handles = {c.handle for c in contacts}
|
|
25
|
+
if handle in existing_handles:
|
|
26
|
+
return [SlotSet("return_value", "already_exists")]
|
|
27
|
+
|
|
28
|
+
new_contact = Contact(name=name, handle=handle)
|
|
29
|
+
add_contact(tracker.sender_id, new_contact)
|
|
30
|
+
return [SlotSet("return_value", "success")]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
|
|
7
|
+
from actions.db import get_contacts
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ListContacts(Action):
|
|
11
|
+
def name(self) -> str:
|
|
12
|
+
return "list_contacts"
|
|
13
|
+
|
|
14
|
+
def run(
|
|
15
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
16
|
+
) -> List[Dict[str, Any]]:
|
|
17
|
+
contacts = get_contacts(tracker.sender_id)
|
|
18
|
+
if len(contacts) > 0:
|
|
19
|
+
contacts_list = "".join([f"- {c.name} ({c.handle}) \n" for c in contacts])
|
|
20
|
+
return [SlotSet("contacts_list", contacts_list)]
|
|
21
|
+
else:
|
|
22
|
+
return [SlotSet("contacts_list", None)]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
|
|
7
|
+
from actions.db import get_contacts, write_contacts
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RemoveContact(Action):
|
|
11
|
+
def name(self) -> str:
|
|
12
|
+
return "remove_contact"
|
|
13
|
+
|
|
14
|
+
def run(
|
|
15
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
16
|
+
) -> List[Dict[str, Any]]:
|
|
17
|
+
contacts = get_contacts(tracker.sender_id)
|
|
18
|
+
handle = tracker.get_slot("remove_contact_handle")
|
|
19
|
+
|
|
20
|
+
if handle is not None:
|
|
21
|
+
contact_indices_with_handle = [
|
|
22
|
+
i for i, c in enumerate(contacts) if c.handle == handle
|
|
23
|
+
]
|
|
24
|
+
if len(contact_indices_with_handle) == 0:
|
|
25
|
+
return [SlotSet("return_value", "not_found")]
|
|
26
|
+
else:
|
|
27
|
+
removed_contact = contacts.pop(contact_indices_with_handle[0])
|
|
28
|
+
write_contacts(tracker.sender_id, contacts)
|
|
29
|
+
return [
|
|
30
|
+
SlotSet("return_value", "success"),
|
|
31
|
+
SlotSet("remove_contact_name", removed_contact.name),
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
else:
|
|
35
|
+
return [SlotSet("return_value", "missing_handle")]
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
import tempfile
|
|
4
|
+
from typing import Any, List
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
|
|
8
|
+
from rasa.nlu.utils import write_json_to_file
|
|
9
|
+
from rasa.shared.utils.io import read_json_file
|
|
10
|
+
|
|
11
|
+
ORIGIN_DB_PATH = "db"
|
|
12
|
+
CONTACTS = "contacts.json"
|
|
13
|
+
TRANSACTIONS = "transactions.json"
|
|
14
|
+
MY_ACCOUNT = "my_account.json"
|
|
15
|
+
CARDS = "cards.json"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class MyAccount(BaseModel):
|
|
19
|
+
account: str
|
|
20
|
+
funds: int
|
|
21
|
+
daily_limit: int
|
|
22
|
+
monthly_limit: int
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Transaction(BaseModel):
|
|
26
|
+
datetime: str
|
|
27
|
+
recipient: str
|
|
28
|
+
sender: str
|
|
29
|
+
amount: str
|
|
30
|
+
description: str
|
|
31
|
+
|
|
32
|
+
def stringify(self) -> str:
|
|
33
|
+
from datetime import datetime
|
|
34
|
+
|
|
35
|
+
parsed_date = datetime.strptime(self.datetime, "%Y-%m-%dT%H:%M:%S.%f")
|
|
36
|
+
formatted_date = parsed_date.strftime("%Y-%m-%d %H:%M:%S")
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
f"- {self.amount} from {self.sender} to "
|
|
40
|
+
f"{self.recipient}: {self.description} ({formatted_date})"
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Contact(BaseModel):
|
|
45
|
+
name: str
|
|
46
|
+
handle: str
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class Card(BaseModel):
|
|
50
|
+
name: str
|
|
51
|
+
number: str
|
|
52
|
+
expiration_date: str
|
|
53
|
+
cvv: str
|
|
54
|
+
handle: str
|
|
55
|
+
status: str
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def get_session_db_path(session_id: str) -> str:
|
|
59
|
+
tempdir = tempfile.gettempdir()
|
|
60
|
+
project_name = "rasa-calm-demo"
|
|
61
|
+
return os.path.join(tempdir, project_name, session_id)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def prepare_db_file(session_id: str, db: str) -> str:
|
|
65
|
+
session_db_path = get_session_db_path(session_id)
|
|
66
|
+
os.makedirs(session_db_path, exist_ok=True)
|
|
67
|
+
destination_file = os.path.join(session_db_path, db)
|
|
68
|
+
if not os.path.exists(destination_file):
|
|
69
|
+
origin_file = os.path.join(ORIGIN_DB_PATH, db)
|
|
70
|
+
shutil.copy(origin_file, destination_file)
|
|
71
|
+
return destination_file
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def read_db(session_id: str, db: str) -> Any:
|
|
75
|
+
db_file = prepare_db_file(session_id, db)
|
|
76
|
+
return read_json_file(db_file)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def write_db(session_id: str, db: str, data: Any) -> None:
|
|
80
|
+
db_file = prepare_db_file(session_id, db)
|
|
81
|
+
write_json_to_file(db_file, data)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def get_contacts(session_id: str) -> List[Contact]:
|
|
85
|
+
return [Contact(**item) for item in read_db(session_id, CONTACTS)]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def get_cards(session_id: str) -> List[Card]:
|
|
89
|
+
return [Card(**item) for item in read_db(session_id, CARDS)]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def get_transactions(session_id: str) -> List[Transaction]:
|
|
93
|
+
return [Transaction(**item) for item in read_db(session_id, TRANSACTIONS)]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def get_account(session_id: str) -> MyAccount:
|
|
97
|
+
return MyAccount(**read_db(session_id, MY_ACCOUNT))
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def write_account(session_id: str, account: MyAccount) -> None:
|
|
101
|
+
write_db(session_id, MY_ACCOUNT, account.dict())
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def add_contact(session_id: str, contact: Contact) -> None:
|
|
105
|
+
contacts = get_contacts(session_id)
|
|
106
|
+
contacts.append(contact)
|
|
107
|
+
write_db(session_id, CONTACTS, [c.dict() for c in contacts])
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def add_transaction(session_id: str, transaction: Transaction) -> None:
|
|
111
|
+
transactions = get_transactions(session_id)
|
|
112
|
+
transactions.append(transaction)
|
|
113
|
+
write_db(session_id, TRANSACTIONS, [t.dict() for t in transactions])
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def write_contacts(session_id: str, contacts: List[Contact]) -> None:
|
|
117
|
+
write_db(session_id, CONTACTS, [c.dict() for c in contacts])
|
|
File without changes
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Text
|
|
2
|
+
|
|
3
|
+
from openai import AsyncOpenAI
|
|
4
|
+
from rasa_sdk import Action, Tracker
|
|
5
|
+
from rasa_sdk.events import BotUttered
|
|
6
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
7
|
+
from rasa_sdk.types import DomainDict
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ActionHumanHandoff(Action):
|
|
11
|
+
def __init__(self) -> None:
|
|
12
|
+
super().__init__()
|
|
13
|
+
self.client = AsyncOpenAI()
|
|
14
|
+
|
|
15
|
+
def name(self) -> Text:
|
|
16
|
+
return "action_human_handoff"
|
|
17
|
+
|
|
18
|
+
async def run(
|
|
19
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: DomainDict
|
|
20
|
+
) -> List[Dict[Text, Any]]:
|
|
21
|
+
# Collect conversation
|
|
22
|
+
convo = []
|
|
23
|
+
for event in tracker.events:
|
|
24
|
+
if event.get("event") == "user":
|
|
25
|
+
user_text = "{}".format(event.get("text"))
|
|
26
|
+
user_text2 = "user - " + user_text
|
|
27
|
+
convo.append(user_text2)
|
|
28
|
+
if event.get("event") == "bot":
|
|
29
|
+
bot_text = "{}".format(event.get("text"))
|
|
30
|
+
bot_text2 = "bot - " + bot_text
|
|
31
|
+
# print(bot_text)
|
|
32
|
+
convo.append(bot_text2)
|
|
33
|
+
prompt = (
|
|
34
|
+
f"The following is a conversation between a bot and a human user, "
|
|
35
|
+
f"please summarise so that a human agent can easily understand "
|
|
36
|
+
f"the important context. Conversation: {convo}"
|
|
37
|
+
)
|
|
38
|
+
response = await self.client.chat.completions.create(
|
|
39
|
+
model="gpt-4", # or "gpt-3.5-turbo"
|
|
40
|
+
messages=[{"role": "user", "content": prompt}],
|
|
41
|
+
)
|
|
42
|
+
summarised_conversation = response.choices[0].message.content or ""
|
|
43
|
+
return [
|
|
44
|
+
BotUttered(
|
|
45
|
+
f"I will transfer the following summary of our conversation "
|
|
46
|
+
f"to the Callback Manager:\n"
|
|
47
|
+
f"{summarised_conversation}"
|
|
48
|
+
)
|
|
49
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
|
|
4
|
+
from rasa_sdk import Action, Tracker
|
|
5
|
+
from rasa_sdk.events import SlotSet
|
|
6
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
7
|
+
|
|
8
|
+
from actions.db import get_account
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CheckTransferFunds(Action):
|
|
12
|
+
def name(self) -> str:
|
|
13
|
+
return "check_transfer_funds"
|
|
14
|
+
|
|
15
|
+
def run(
|
|
16
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
17
|
+
) -> List[Dict[str, Any]]:
|
|
18
|
+
account = get_account(tracker.sender_id)
|
|
19
|
+
amount_of_money = tracker.get_slot("amount_of_money")
|
|
20
|
+
if not amount_of_money:
|
|
21
|
+
has_sufficient_funds = False
|
|
22
|
+
else:
|
|
23
|
+
if isinstance(amount_of_money, str):
|
|
24
|
+
# Remove any non-numeric characters (except for the decimal point)
|
|
25
|
+
amount_of_money = float(re.sub(r"[^0-9.]", "", amount_of_money))
|
|
26
|
+
has_sufficient_funds = account.funds >= amount_of_money
|
|
27
|
+
return [SlotSet("has_sufficient_funds", has_sufficient_funds)]
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Text
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
|
|
7
|
+
from actions.db import get_account
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CheckTransferLimit(Action):
|
|
11
|
+
def name(self) -> Text:
|
|
12
|
+
return "check_transfer_limit"
|
|
13
|
+
|
|
14
|
+
def run(
|
|
15
|
+
self,
|
|
16
|
+
dispatcher: CollectingDispatcher,
|
|
17
|
+
tracker: Tracker,
|
|
18
|
+
domain: Dict[Text, Any],
|
|
19
|
+
) -> List[Dict[Text, Any]]:
|
|
20
|
+
limit_type = tracker.get_slot("transfer_limit_type")
|
|
21
|
+
|
|
22
|
+
account = get_account(tracker.sender_id)
|
|
23
|
+
daily_limit = account.daily_limit
|
|
24
|
+
monthly_limit = account.monthly_limit
|
|
25
|
+
|
|
26
|
+
transfer_limit = None
|
|
27
|
+
|
|
28
|
+
if limit_type == "daily":
|
|
29
|
+
transfer_limit = daily_limit
|
|
30
|
+
elif limit_type == "monthly":
|
|
31
|
+
transfer_limit = monthly_limit
|
|
32
|
+
|
|
33
|
+
return [
|
|
34
|
+
SlotSet("transfer_limit", transfer_limit),
|
|
35
|
+
SlotSet("return_value", transfer_limit is not None),
|
|
36
|
+
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from rasa_sdk import Action, Tracker
|
|
4
|
+
from rasa_sdk.events import EventType, SlotSet
|
|
5
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
6
|
+
from rasa_sdk.types import DomainDict
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ExecutePayment(Action):
|
|
10
|
+
def name(self) -> str:
|
|
11
|
+
return "action_execute_recurrent_payment"
|
|
12
|
+
|
|
13
|
+
def run(
|
|
14
|
+
self,
|
|
15
|
+
dispatcher: CollectingDispatcher,
|
|
16
|
+
tracker: Tracker,
|
|
17
|
+
domain: DomainDict,
|
|
18
|
+
) -> List[EventType]:
|
|
19
|
+
# Set-up payment logic and additional checks here
|
|
20
|
+
return [SlotSet("setup_recurrent_payment_successful", True)]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Any, Dict, List
|
|
4
|
+
|
|
5
|
+
from rasa_sdk import Action, Tracker
|
|
6
|
+
from rasa_sdk.events import SlotSet
|
|
7
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
8
|
+
|
|
9
|
+
from actions.db import Transaction, add_transaction, get_account, write_account
|
|
10
|
+
|
|
11
|
+
AMOUNT_OF_MONEY_REGEX = re.compile(r"\d*[.,]*\d+")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ExecuteTransfer(Action):
|
|
15
|
+
def name(self) -> str:
|
|
16
|
+
return "execute_transfer"
|
|
17
|
+
|
|
18
|
+
def run(
|
|
19
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
20
|
+
) -> List[Dict[str, Any]]:
|
|
21
|
+
account = get_account(tracker.sender_id)
|
|
22
|
+
|
|
23
|
+
recipient = tracker.get_slot("recipient_account")
|
|
24
|
+
amount_of_money = tracker.get_slot("amount_of_money")
|
|
25
|
+
|
|
26
|
+
if recipient is None or amount_of_money is None:
|
|
27
|
+
return [SlotSet("transfer_successful", False)]
|
|
28
|
+
|
|
29
|
+
# just as a play case
|
|
30
|
+
if recipient == "Jack":
|
|
31
|
+
return [SlotSet("transfer_successful", False)]
|
|
32
|
+
|
|
33
|
+
if isinstance(amount_of_money, str):
|
|
34
|
+
amount_of_money = float(re.sub(r"[^0-9.]", "", amount_of_money))
|
|
35
|
+
account.funds -= amount_of_money
|
|
36
|
+
new_transaction = Transaction(
|
|
37
|
+
datetime=datetime.now().isoformat(),
|
|
38
|
+
recipient=recipient or "unknown",
|
|
39
|
+
sender="self",
|
|
40
|
+
amount=str(amount_of_money),
|
|
41
|
+
description="",
|
|
42
|
+
)
|
|
43
|
+
add_transaction(tracker.sender_id, new_transaction)
|
|
44
|
+
write_account(tracker.sender_id, account)
|
|
45
|
+
return [SlotSet("transfer_successful", True)]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
|
|
4
|
+
from rasa_sdk import Action, Tracker
|
|
5
|
+
from rasa_sdk.events import SlotSet
|
|
6
|
+
from rasa_sdk.executor import CollectingDispatcher
|
|
7
|
+
|
|
8
|
+
from actions.db import get_transactions
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ListTransactions(Action):
|
|
12
|
+
def name(self) -> str:
|
|
13
|
+
return "list_transactions"
|
|
14
|
+
|
|
15
|
+
def run(
|
|
16
|
+
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
17
|
+
) -> List[Dict[str, Any]]:
|
|
18
|
+
full_transaction_list = tracker.get_slot("full_transaction_list")
|
|
19
|
+
|
|
20
|
+
transactions = get_transactions(tracker.sender_id)
|
|
21
|
+
|
|
22
|
+
# sort by date
|
|
23
|
+
transactions.sort(
|
|
24
|
+
key=lambda x: datetime.strptime(x.datetime, "%Y-%m-%dT%H:%M:%S.%f"),
|
|
25
|
+
reverse=True,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
if not full_transaction_list:
|
|
29
|
+
transactions = transactions[:5]
|
|
30
|
+
|
|
31
|
+
transactions_list = "\n".join([t.stringify() for t in transactions])
|
|
32
|
+
return [SlotSet("transactions_list", transactions_list)]
|