rasa-pro 3.14.0.dev20250901__py3-none-any.whl → 3.14.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/__main__.py +15 -3
- rasa/agents/__init__.py +0 -0
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +211 -0
- rasa/agents/constants.py +43 -0
- rasa/agents/core/__init__.py +0 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +81 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/__init__.py +0 -0
- rasa/agents/protocol/a2a/a2a_agent.py +879 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +726 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
- rasa/agents/schemas/__init__.py +13 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +65 -0
- rasa/agents/schemas/agent_tool_schema.py +186 -0
- rasa/agents/templates/__init__.py +0 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
- rasa/agents/utils.py +206 -0
- rasa/agents/validation.py +485 -0
- rasa/api.py +24 -9
- rasa/builder/config.py +7 -2
- rasa/builder/copilot/constants.py +3 -0
- rasa/builder/copilot/copilot.py +128 -54
- rasa/builder/copilot/models.py +39 -3
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +183 -188
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/telemetry.py +46 -20
- rasa/builder/document_retrieval/models.py +3 -3
- rasa/builder/download.py +1 -8
- rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
- rasa/builder/guardrails/constants.py +3 -0
- rasa/builder/guardrails/models.py +45 -10
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/utils.py +42 -276
- rasa/builder/jobs.py +33 -21
- rasa/builder/llm_service.py +32 -5
- rasa/builder/main.py +38 -62
- rasa/builder/models.py +8 -7
- rasa/builder/project_generator.py +149 -148
- rasa/builder/service.py +58 -40
- rasa/builder/template_cache.py +69 -0
- rasa/builder/training_service.py +84 -20
- rasa/builder/validation_service.py +1 -1
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +10 -8
- rasa/cli/dialogue_understanding_test.py +10 -7
- rasa/cli/e2e_test.py +9 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +8 -4
- rasa/cli/interactive.py +5 -4
- rasa/cli/llm_fine_tuning.py +11 -6
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +6 -4
- rasa/cli/project_templates/basic/data/data.md +5 -6
- rasa/cli/project_templates/basic/domain/domain.md +7 -5
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +1 -1
- rasa/cli/project_templates/basic/endpoints.yml +5 -1
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -46
- rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/{transfers/action_process_immediate_payment.py → cards/check_that_card_exists.py} +6 -3
- rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
- rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
- rasa/cli/project_templates/finance/actions/db.py +117 -0
- rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
- rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
- rasa/cli/project_templates/finance/config.yml +8 -0
- rasa/cli/project_templates/finance/credentials.yml +7 -6
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +3 -4
- rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
- rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
- rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +37 -58
- rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
- rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
- rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
- rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
- rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
- rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
- rasa/cli/project_templates/finance/data/data.md +14 -0
- rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +1 -1
- rasa/cli/project_templates/finance/data/general/hello.yml +1 -2
- rasa/cli/project_templates/finance/data/general/help.yml +2 -2
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +2 -2
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +1 -1
- rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
- rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
- rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +29 -62
- rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
- rasa/cli/project_templates/finance/db/cards.json +18 -0
- rasa/cli/project_templates/finance/db/contacts.json +10 -0
- rasa/cli/project_templates/finance/db/my_account.json +6 -0
- rasa/cli/project_templates/finance/db/transactions.json +22 -0
- rasa/cli/project_templates/finance/docs/docs.md +8 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +9 -5
- rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
- rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
- rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +33 -90
- rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
- rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
- rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
- rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
- rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
- rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
- rasa/cli/project_templates/finance/domain/domain.md +18 -0
- rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
- rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -2
- rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -3
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +6 -6
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +10 -9
- rasa/cli/project_templates/finance/domain/general/welcome.yml +33 -2
- rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
- rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
- rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +203 -61
- rasa/cli/project_templates/finance/endpoints.yml +8 -4
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +31 -12
- rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/config.yml +6 -4
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +1 -1
- rasa/cli/project_templates/telco/docs/docs.md +3 -0
- rasa/cli/project_templates/telco/domain/domain.md +13 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +3 -6
- rasa/cli/project_templates/telco/endpoints.yml +5 -1
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +1 -1
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +12 -10
- rasa/cli/scaffold.py +4 -4
- rasa/cli/shell.py +9 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +41 -28
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +223 -0
- rasa/cli/validation/config_path_validation.py +257 -0
- rasa/cli/x.py +8 -4
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +51 -10
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +9 -2
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +19 -2
- rasa/core/available_agents.py +229 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +52 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/development_inspector.py +4 -24
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-7610671a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +18 -18
- rasa/core/channels/inspector/src/App.tsx +34 -35
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +9 -1
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +20 -3
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
- rasa/core/channels/inspector/src/types.ts +53 -7
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/studio_chat.py +29 -47
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
- rasa/core/channels/voice_stream/asr/azure.py +6 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
- rasa/core/channels/voice_stream/audiocodes.py +3 -0
- rasa/core/channels/voice_stream/browser_audio.py +55 -3
- rasa/core/channels/voice_stream/genesys.py +3 -2
- rasa/core/channels/voice_stream/jambonz.py +9 -1
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +21 -1
- rasa/core/channels/voice_stream/voice_channel.py +64 -0
- rasa/core/concurrent_lock_store.py +66 -16
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
- rasa/core/config/configuration.py +260 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +11 -0
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +226 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +90 -0
- rasa/core/lock_store.py +46 -10
- rasa/core/nlg/generator.py +1 -1
- rasa/core/policies/enterprise_search_policy.py +5 -3
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +632 -0
- rasa/core/policies/flows/flow_executor.py +137 -76
- rasa/core/policies/flows/mcp_tool_executor.py +298 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/ted_policy.py +20 -12
- rasa/core/policies/unexpected_intent_policy.py +6 -0
- rasa/core/processor.py +100 -44
- rasa/core/redis_connection_factory.py +469 -0
- rasa/core/run.py +37 -8
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -1
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +20 -18
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +22 -23
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/clarify_command.py +20 -2
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
- rasa/dialogue_understanding/commands/utils.py +124 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
- rasa/dialogue_understanding/processor/command_processor.py +136 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +8 -3
- rasa/e2e_test/e2e_test_runner.py +13 -3
- rasa/engine/caching.py +2 -2
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +5 -1
- rasa/engine/loader.py +12 -0
- rasa/engine/recipes/default_components.py +138 -49
- rasa/engine/recipes/default_recipe.py +108 -11
- rasa/engine/runner/dask.py +8 -5
- rasa/engine/storage/local_model_storage.py +41 -4
- rasa/engine/validation.py +19 -6
- rasa/graph_components/validators/default_recipe_validator.py +86 -28
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/socket_bridge.py +1 -2
- rasa/model_manager/warm_rasa_process.py +13 -3
- rasa/model_training.py +60 -47
- rasa/nlu/classifiers/diet_classifier.py +198 -98
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
- rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
- rasa/nlu/extractors/crf_entity_extractor.py +9 -10
- rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
- rasa/nlu/selectors/response_selector.py +10 -2
- rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
- rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
- rasa/nlu/utils/mitie_utils.py +3 -0
- rasa/nlu/utils/spacy_utils.py +3 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_manager.py +12 -3
- rasa/server.py +15 -3
- rasa/shared/agents/__init__.py +0 -0
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +105 -0
- rasa/shared/agents/auth/agent_auth_manager.py +92 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
- rasa/shared/agents/auth/constants.py +12 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +8 -0
- rasa/shared/core/constants.py +17 -1
- rasa/shared/core/domain.py +0 -7
- rasa/shared/core/events.py +329 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow.py +1 -1
- rasa/shared/core/flows/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +49 -5
- rasa/shared/core/flows/steps/collect.py +98 -13
- rasa/shared/core/flows/validation.py +372 -8
- rasa/shared/core/flows/yaml_flows_io.py +3 -2
- rasa/shared/core/slots.py +2 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/exceptions.py +16 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +9 -3
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/llm/_base_litellm_client.py +41 -9
- rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/common.py +24 -0
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +39 -16
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +247 -0
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +3 -6
- rasa/telemetry.py +69 -5
- rasa/tracing/config.py +45 -12
- rasa/tracing/constants.py +14 -0
- rasa/tracing/instrumentation/attribute_extractors.py +142 -9
- rasa/tracing/instrumentation/instrumentation.py +626 -21
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/tracing/instrumentation/metrics.py +32 -0
- rasa/tracing/metric_instrument_provider.py +68 -0
- rasa/utils/common.py +92 -1
- rasa/utils/endpoints.py +11 -2
- rasa/utils/log_utils.py +96 -5
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/pypred.py +38 -0
- rasa/utils/tensorflow/__init__.py +7 -0
- rasa/utils/tensorflow/callback.py +136 -101
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +21 -11
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +56 -8
- rasa/utils/tensorflow/rasa_layers.py +8 -6
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +54 -24
- rasa/validator.py +17 -13
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/METADATA +59 -51
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/RECORD +452 -428
- rasa/builder/scrape_rasa_docs.py +0 -97
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
- rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
- rasa/cli/project_templates/finance/actions/database.py +0 -277
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
- rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
- rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
- rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
- rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
- rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
- rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
- rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
- rasa/cli/project_templates/finance/csvs/users.csv +0 -4
- rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
- rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
- rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
- rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
- rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
- rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
- rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
- rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
- rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
- rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
- /rasa/cli/project_templates/telco/domain/billing/{domain_undertand_bill.yml → understand_bill.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reboot_router.yml → reboot_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_reset_router.yml → reset_router.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_run_speed_test.yml → run_speed_test.yml} +0 -0
- /rasa/cli/project_templates/telco/domain/network/{domain_solve_internet_issue.yml → solve_internet_issue.yml} +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/entry_points.txt +0 -0
rasa/builder/scrape_rasa_docs.py
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import os
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from urllib.parse import urljoin, urlparse
|
|
5
|
-
|
|
6
|
-
import requests
|
|
7
|
-
from bs4 import BeautifulSoup
|
|
8
|
-
|
|
9
|
-
BASE_URL = "https://rasa.com"
|
|
10
|
-
DOCS_ROOT = "https://rasa.com/docs"
|
|
11
|
-
OUTPUT_DIR = "rasa_docs_md"
|
|
12
|
-
MAX_PAGES = 100 # Optional limit for safety
|
|
13
|
-
|
|
14
|
-
visited = set()
|
|
15
|
-
to_visit = [DOCS_ROOT]
|
|
16
|
-
|
|
17
|
-
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def is_valid_doc_url(url: str) -> bool:
|
|
21
|
-
return url.startswith(DOCS_ROOT) and not any(
|
|
22
|
-
[url.endswith(".pdf"), "#" in url, "mailto:" in url]
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def slugify_url(url: str) -> str:
|
|
27
|
-
path = urlparse(url).path.strip("/").replace("/", "_")
|
|
28
|
-
return path if path else "index"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def clean_text(html: str) -> str:
|
|
32
|
-
soup = BeautifulSoup(html, "html.parser")
|
|
33
|
-
|
|
34
|
-
# Remove navs, footers, and code tabs (customize if needed)
|
|
35
|
-
for tag in soup(["nav", "footer", "script", "style", "form", "button"]):
|
|
36
|
-
tag.decompose()
|
|
37
|
-
|
|
38
|
-
main = soup.find("main") or soup.body
|
|
39
|
-
if not main:
|
|
40
|
-
return ""
|
|
41
|
-
|
|
42
|
-
# Replace <code> with backticks
|
|
43
|
-
for code in main.find_all("code"):
|
|
44
|
-
code.string = f"`{code.get_text(strip=True)}`"
|
|
45
|
-
|
|
46
|
-
text = main.get_text(separator="\n", strip=True)
|
|
47
|
-
return text
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def save_as_markdown(text: str, url: str) -> str:
|
|
51
|
-
slug = slugify_url(url)
|
|
52
|
-
file_name = f"{slug}.md"
|
|
53
|
-
md_path = Path(OUTPUT_DIR) / file_name
|
|
54
|
-
with open(md_path, "w", encoding="utf-8") as f:
|
|
55
|
-
f.write(text)
|
|
56
|
-
|
|
57
|
-
print(f"✅ Saved: {md_path}")
|
|
58
|
-
return file_name
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
pages_scraped = 0
|
|
62
|
-
markdown_to_url = {}
|
|
63
|
-
|
|
64
|
-
while to_visit and pages_scraped < MAX_PAGES:
|
|
65
|
-
url = to_visit.pop(0)
|
|
66
|
-
if url in visited:
|
|
67
|
-
continue
|
|
68
|
-
|
|
69
|
-
try:
|
|
70
|
-
print(f"Scraping: {url}")
|
|
71
|
-
response = requests.get(url)
|
|
72
|
-
response.raise_for_status()
|
|
73
|
-
|
|
74
|
-
html = response.text
|
|
75
|
-
text = clean_text(html)
|
|
76
|
-
if len(text) < 200: # skip very short pages
|
|
77
|
-
print("⏭️ Skipped (too short)")
|
|
78
|
-
continue
|
|
79
|
-
|
|
80
|
-
file_name = save_as_markdown(text, url)
|
|
81
|
-
markdown_to_url[file_name] = url
|
|
82
|
-
pages_scraped += 1
|
|
83
|
-
|
|
84
|
-
soup = BeautifulSoup(html, "html.parser")
|
|
85
|
-
for link_tag in soup.find_all("a", href=True):
|
|
86
|
-
link = urljoin(url, link_tag["href"])
|
|
87
|
-
if is_valid_doc_url(link) and link not in visited:
|
|
88
|
-
to_visit.append(link)
|
|
89
|
-
|
|
90
|
-
visited.add(url)
|
|
91
|
-
|
|
92
|
-
except Exception as e:
|
|
93
|
-
print(f"⚠️ Failed to scrape {url}: {e}")
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
with open("markdown_to_url.json", "w") as f:
|
|
97
|
-
json.dump(markdown_to_url, f, indent=2)
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Text
|
|
2
|
-
|
|
3
|
-
from rasa_sdk import Action, Tracker
|
|
4
|
-
from rasa_sdk.executor import CollectingDispatcher
|
|
5
|
-
|
|
6
|
-
from actions.database import Database
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ActionAskAccount(Action):
|
|
10
|
-
def name(self) -> Text:
|
|
11
|
-
return "action_ask_account"
|
|
12
|
-
|
|
13
|
-
def run(
|
|
14
|
-
self,
|
|
15
|
-
dispatcher: CollectingDispatcher,
|
|
16
|
-
tracker: Tracker,
|
|
17
|
-
domain: Dict[Text, Any],
|
|
18
|
-
) -> List[Dict[Text, Any]]:
|
|
19
|
-
name = tracker.get_slot("name")
|
|
20
|
-
|
|
21
|
-
db = Database()
|
|
22
|
-
|
|
23
|
-
# Get user information
|
|
24
|
-
user = db.get_user_by_name(name)
|
|
25
|
-
if not user:
|
|
26
|
-
dispatcher.utter_message(text="User not found.")
|
|
27
|
-
return []
|
|
28
|
-
|
|
29
|
-
# Get all accounts for the user
|
|
30
|
-
user_id = int(user["id"])
|
|
31
|
-
accounts = db.get_accounts_by_user(user_id)
|
|
32
|
-
|
|
33
|
-
if not accounts:
|
|
34
|
-
dispatcher.utter_message(text="No accounts found for this user.")
|
|
35
|
-
return []
|
|
36
|
-
|
|
37
|
-
buttons = [
|
|
38
|
-
{
|
|
39
|
-
"title": f"{account['number']} ({account['type'].title()})",
|
|
40
|
-
"payload": account["number"],
|
|
41
|
-
}
|
|
42
|
-
for account in accounts
|
|
43
|
-
]
|
|
44
|
-
message = "Which account would you like the balance for?"
|
|
45
|
-
dispatcher.utter_message(text=message, buttons=buttons)
|
|
46
|
-
|
|
47
|
-
return []
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Text
|
|
2
|
-
|
|
3
|
-
from rasa_sdk import Action, Tracker
|
|
4
|
-
from rasa_sdk.executor import CollectingDispatcher
|
|
5
|
-
|
|
6
|
-
from actions.database import Database
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ActionCheckBalance(Action):
|
|
10
|
-
def name(self) -> Text:
|
|
11
|
-
return "action_check_balance"
|
|
12
|
-
|
|
13
|
-
def run(
|
|
14
|
-
self,
|
|
15
|
-
dispatcher: CollectingDispatcher,
|
|
16
|
-
tracker: Tracker,
|
|
17
|
-
domain: Dict[Text, Any],
|
|
18
|
-
) -> List[Dict[Text, Any]]:
|
|
19
|
-
name = tracker.get_slot("name")
|
|
20
|
-
account_number = tracker.get_slot("account")
|
|
21
|
-
|
|
22
|
-
db = Database()
|
|
23
|
-
|
|
24
|
-
# Get user information
|
|
25
|
-
user = db.get_user_by_name(name)
|
|
26
|
-
if not user:
|
|
27
|
-
dispatcher.utter_message(text="User not found.")
|
|
28
|
-
return []
|
|
29
|
-
|
|
30
|
-
# Get account information
|
|
31
|
-
account = db.get_account_by_user_and_number(int(user["id"]), account_number)
|
|
32
|
-
if not account:
|
|
33
|
-
dispatcher.utter_message(text="Account not found.")
|
|
34
|
-
return []
|
|
35
|
-
|
|
36
|
-
current_balance = float(account["balance"])
|
|
37
|
-
|
|
38
|
-
message = f"The balance on that account is: ${current_balance}"
|
|
39
|
-
dispatcher.utter_message(text=message)
|
|
40
|
-
return []
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
from datetime import datetime
|
|
2
|
-
from typing import Any, Dict, List, Text
|
|
3
|
-
|
|
4
|
-
from rasa_sdk import Action, Tracker
|
|
5
|
-
from rasa_sdk.events import ActionExecuted, SlotSet
|
|
6
|
-
from rasa_sdk.executor import CollectingDispatcher
|
|
7
|
-
|
|
8
|
-
from actions.database import Database
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class ActionSessionStart(Action):
|
|
12
|
-
def name(self) -> Text:
|
|
13
|
-
return "action_session_start"
|
|
14
|
-
|
|
15
|
-
def set_current_date(self) -> List[Dict[Text, Any]]:
|
|
16
|
-
current_date = datetime.now().strftime("%d/%m/%Y")
|
|
17
|
-
return [SlotSet("current_date", current_date)]
|
|
18
|
-
|
|
19
|
-
def set_user_profile(self, name: str) -> List[Dict[Text, Any]]:
|
|
20
|
-
db = Database()
|
|
21
|
-
|
|
22
|
-
# Get user information
|
|
23
|
-
user = db.get_user_by_name(name)
|
|
24
|
-
|
|
25
|
-
if user:
|
|
26
|
-
return [
|
|
27
|
-
SlotSet("name", user["name"]),
|
|
28
|
-
SlotSet("username", user["username"]),
|
|
29
|
-
SlotSet("segment", user["segment"]),
|
|
30
|
-
SlotSet("email_address", user["email"]),
|
|
31
|
-
SlotSet("physical_address", user["address"]),
|
|
32
|
-
]
|
|
33
|
-
else:
|
|
34
|
-
return []
|
|
35
|
-
|
|
36
|
-
def run(
|
|
37
|
-
self,
|
|
38
|
-
dispatcher: CollectingDispatcher,
|
|
39
|
-
tracker: Tracker,
|
|
40
|
-
domain: Dict[Text, Any],
|
|
41
|
-
) -> List[Dict[Text, Any]]:
|
|
42
|
-
current_date_events = self.set_current_date()
|
|
43
|
-
|
|
44
|
-
# Advanced option: It is possible to enable the chatbot with multiple
|
|
45
|
-
# user profiles.
|
|
46
|
-
# This option influences the interactions with the assistant.
|
|
47
|
-
# The bot randomly assigns a user profile at the start of each session.
|
|
48
|
-
# With this advance option: The demo bot will include three user profiles
|
|
49
|
-
# with different payees:
|
|
50
|
-
# John Smith: Payees: Robert (friend), James (son), Food Market (groceries)
|
|
51
|
-
# Mary Brown: Payees: Richard (business partner), Susan (friend),
|
|
52
|
-
# Electric Company (utilities)
|
|
53
|
-
# Dan Young: Payees: Amy (colleague), Fitness Gym (gym), William (friend)
|
|
54
|
-
#
|
|
55
|
-
# The default profile is John Smith
|
|
56
|
-
#
|
|
57
|
-
# Each profile also has its own accounts—Current (Checking), Savings,
|
|
58
|
-
# and Business
|
|
59
|
-
#
|
|
60
|
-
# Intructions: Just toggle the comments of the following 2 lines.
|
|
61
|
-
name = "John Smith"
|
|
62
|
-
# username = random.choice(["John Smith", "Mary Brown", "Dan Young"])
|
|
63
|
-
|
|
64
|
-
user_profile_events = self.set_user_profile(name)
|
|
65
|
-
|
|
66
|
-
events = (
|
|
67
|
-
current_date_events
|
|
68
|
-
+ user_profile_events
|
|
69
|
-
+ [
|
|
70
|
-
ActionExecuted("action_listen"),
|
|
71
|
-
]
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
return events
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Text
|
|
2
|
-
|
|
3
|
-
from rasa_sdk import Action, Tracker
|
|
4
|
-
from rasa_sdk.executor import CollectingDispatcher
|
|
5
|
-
|
|
6
|
-
from actions.database import Database
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ActionAskCard(Action):
|
|
10
|
-
def name(self) -> Text:
|
|
11
|
-
return "action_ask_card"
|
|
12
|
-
|
|
13
|
-
def run(
|
|
14
|
-
self,
|
|
15
|
-
dispatcher: CollectingDispatcher,
|
|
16
|
-
tracker: Tracker,
|
|
17
|
-
domain: Dict[Text, Any],
|
|
18
|
-
) -> List[Dict[Text, Any]]:
|
|
19
|
-
name = tracker.get_slot("name")
|
|
20
|
-
|
|
21
|
-
db = Database()
|
|
22
|
-
|
|
23
|
-
# Get user information
|
|
24
|
-
user = db.get_user_by_name(name)
|
|
25
|
-
if not user:
|
|
26
|
-
dispatcher.utter_message(text="User not found.")
|
|
27
|
-
return []
|
|
28
|
-
|
|
29
|
-
# Get all cards for the user
|
|
30
|
-
user_id = int(user["id"])
|
|
31
|
-
cards = db.get_cards_by_user(user_id)
|
|
32
|
-
|
|
33
|
-
if not cards:
|
|
34
|
-
dispatcher.utter_message(text="No cards found for this user.")
|
|
35
|
-
return []
|
|
36
|
-
|
|
37
|
-
buttons = [
|
|
38
|
-
{
|
|
39
|
-
"content_type": "text",
|
|
40
|
-
"title": f"{i + 1}: x{card['number'][-4:]} ({card['type'].title()})",
|
|
41
|
-
"payload": f"/SetSlots(card_selection={card['number']!s})",
|
|
42
|
-
}
|
|
43
|
-
for i, card in enumerate(cards)
|
|
44
|
-
]
|
|
45
|
-
message = "Select the card you require assistance with:"
|
|
46
|
-
dispatcher.utter_message(text=message, buttons=buttons)
|
|
47
|
-
|
|
48
|
-
return []
|
|
@@ -1,36 +0,0 @@
|
|
|
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.database import Database
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class ActionCheckCardExistence(Action):
|
|
11
|
-
def name(self) -> str:
|
|
12
|
-
return "action_check_card_existence"
|
|
13
|
-
|
|
14
|
-
def run(
|
|
15
|
-
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
16
|
-
) -> List[Dict[Text, Any]]:
|
|
17
|
-
name = tracker.get_slot("name")
|
|
18
|
-
card_number = tracker.get_slot("card_number")
|
|
19
|
-
|
|
20
|
-
db = Database()
|
|
21
|
-
|
|
22
|
-
# Get user information
|
|
23
|
-
user = db.get_user_by_name(name)
|
|
24
|
-
if not user:
|
|
25
|
-
dispatcher.utter_message(text="User not found.")
|
|
26
|
-
return []
|
|
27
|
-
|
|
28
|
-
# Get all cards for the user
|
|
29
|
-
user_id = int(user["id"])
|
|
30
|
-
cards = db.get_cards_by_user(user_id)
|
|
31
|
-
card_numbers = [card["number"] for card in cards]
|
|
32
|
-
|
|
33
|
-
if card_number in card_numbers:
|
|
34
|
-
return [SlotSet("card_found", True)]
|
|
35
|
-
else:
|
|
36
|
-
return [SlotSet("card_found", False)]
|
|
@@ -1,54 +0,0 @@
|
|
|
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.database import Database
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class ActionUpdateCardStatus(Action):
|
|
11
|
-
def name(self) -> str:
|
|
12
|
-
return "action_update_card_status"
|
|
13
|
-
|
|
14
|
-
def run(
|
|
15
|
-
self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[str, Any]
|
|
16
|
-
) -> List[Dict[Text, Any]]:
|
|
17
|
-
name = tracker.get_slot("name")
|
|
18
|
-
card_number = tracker.get_slot("card")
|
|
19
|
-
new_status = "inactive"
|
|
20
|
-
|
|
21
|
-
db = Database()
|
|
22
|
-
|
|
23
|
-
# Get user information
|
|
24
|
-
user = db.get_user_by_name(name)
|
|
25
|
-
if not user:
|
|
26
|
-
dispatcher.utter_message(text="User not found.")
|
|
27
|
-
return []
|
|
28
|
-
|
|
29
|
-
# Get card information to verify it belongs to the user
|
|
30
|
-
card = db.get_card_by_number(card_number)
|
|
31
|
-
if not card:
|
|
32
|
-
dispatcher.utter_message(text="I can't find the card within your account.")
|
|
33
|
-
return []
|
|
34
|
-
|
|
35
|
-
# Check if card belongs to the user
|
|
36
|
-
try:
|
|
37
|
-
if int(card["user_id"]) != int(user["id"]):
|
|
38
|
-
dispatcher.utter_message(
|
|
39
|
-
text="That card is not associated with your account."
|
|
40
|
-
)
|
|
41
|
-
return []
|
|
42
|
-
except (ValueError, TypeError, KeyError):
|
|
43
|
-
dispatcher.utter_message(text="Error verifying card ownership.")
|
|
44
|
-
return []
|
|
45
|
-
|
|
46
|
-
# Update card status
|
|
47
|
-
success = db.update_card_status(card_number, new_status)
|
|
48
|
-
|
|
49
|
-
if success:
|
|
50
|
-
return [SlotSet("card_status", new_status)]
|
|
51
|
-
else:
|
|
52
|
-
# Log the error but don't show technical error to user
|
|
53
|
-
print(f"Error: Failed to update card status for card {card_number}")
|
|
54
|
-
return []
|
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
import csv
|
|
2
|
-
import logging
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from typing import Any, Dict, List, Optional
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Database:
|
|
9
|
-
def __init__(self, csv_path: Optional[Path] = None) -> None:
|
|
10
|
-
"""Initialize the database with CSV file paths."""
|
|
11
|
-
self.project_root_path = Path(__file__).resolve().parent.parent
|
|
12
|
-
self.csv_path = csv_path or self.project_root_path / "csvs"
|
|
13
|
-
self.logger = self.setup_logger()
|
|
14
|
-
|
|
15
|
-
def setup_logger(self) -> logging.Logger:
|
|
16
|
-
"""Set up logging configuration."""
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
logger.setLevel(logging.DEBUG)
|
|
19
|
-
|
|
20
|
-
formatter = logging.Formatter(
|
|
21
|
-
"%(asctime)s %(levelname)8s %(name)s - %(message)s"
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
console_handler = logging.StreamHandler()
|
|
25
|
-
console_handler.setLevel(logging.DEBUG)
|
|
26
|
-
console_handler.setFormatter(formatter)
|
|
27
|
-
logger.addHandler(console_handler)
|
|
28
|
-
|
|
29
|
-
return logger
|
|
30
|
-
|
|
31
|
-
def _read_csv(self, filename: str) -> List[Dict[str, Any]]:
|
|
32
|
-
"""Read CSV file and return list of dictionaries."""
|
|
33
|
-
try:
|
|
34
|
-
with open(self.csv_path / filename, "r", newline="") as csvfile:
|
|
35
|
-
reader = csv.DictReader(csvfile)
|
|
36
|
-
return list(reader)
|
|
37
|
-
except Exception as e:
|
|
38
|
-
self.logger.error(f"Error reading CSV file {filename}: {e}")
|
|
39
|
-
return []
|
|
40
|
-
|
|
41
|
-
def _write_csv(self, filename: str, data: List[Dict[str, Any]]) -> bool:
|
|
42
|
-
"""Write list of dictionaries to CSV file."""
|
|
43
|
-
try:
|
|
44
|
-
if not data:
|
|
45
|
-
return True
|
|
46
|
-
|
|
47
|
-
with open(self.csv_path / filename, "w", newline="") as csvfile:
|
|
48
|
-
writer = csv.DictWriter(csvfile, fieldnames=data[0].keys())
|
|
49
|
-
writer.writeheader()
|
|
50
|
-
writer.writerows(data)
|
|
51
|
-
return True
|
|
52
|
-
except Exception as e:
|
|
53
|
-
self.logger.error(f"Error writing CSV file {filename}: {e}")
|
|
54
|
-
return False
|
|
55
|
-
|
|
56
|
-
def get_user_by_name(self, username: str) -> Optional[Dict[str, Any]]:
|
|
57
|
-
"""Get user information by username."""
|
|
58
|
-
try:
|
|
59
|
-
users = self._read_csv("users.csv")
|
|
60
|
-
for user in users:
|
|
61
|
-
if user["name"] == username:
|
|
62
|
-
return user
|
|
63
|
-
return None
|
|
64
|
-
except Exception as e:
|
|
65
|
-
self.logger.error(f"Error getting user by name: {e}")
|
|
66
|
-
return None
|
|
67
|
-
|
|
68
|
-
def get_user_by_id(self, user_id: int) -> Optional[Dict[str, Any]]:
|
|
69
|
-
"""Get user information by user_id."""
|
|
70
|
-
try:
|
|
71
|
-
users = self._read_csv("users.csv")
|
|
72
|
-
for user in users:
|
|
73
|
-
if int(user["id"]) == user_id:
|
|
74
|
-
return user
|
|
75
|
-
return None
|
|
76
|
-
except Exception as e:
|
|
77
|
-
self.logger.error(f"Error getting user by id: {e}")
|
|
78
|
-
return None
|
|
79
|
-
|
|
80
|
-
def get_account_by_user_and_number(
|
|
81
|
-
self, user_id: int, account_number: str
|
|
82
|
-
) -> Optional[Dict[str, Any]]:
|
|
83
|
-
"""Get account information by user_id and account number."""
|
|
84
|
-
try:
|
|
85
|
-
accounts = self._read_csv("accounts.csv")
|
|
86
|
-
for account in accounts:
|
|
87
|
-
if (
|
|
88
|
-
int(account["user_id"]) == user_id
|
|
89
|
-
and account["number"] == account_number
|
|
90
|
-
):
|
|
91
|
-
return account
|
|
92
|
-
return None
|
|
93
|
-
except Exception as e:
|
|
94
|
-
self.logger.error(f"Error getting account: {e}")
|
|
95
|
-
return None
|
|
96
|
-
|
|
97
|
-
def get_accounts_by_user(self, user_id: int) -> List[Dict[str, Any]]:
|
|
98
|
-
"""Get all accounts for a user."""
|
|
99
|
-
try:
|
|
100
|
-
accounts = self._read_csv("accounts.csv")
|
|
101
|
-
return [
|
|
102
|
-
account for account in accounts if int(account["user_id"]) == user_id
|
|
103
|
-
]
|
|
104
|
-
|
|
105
|
-
except Exception as e:
|
|
106
|
-
self.logger.error(f"Error getting accounts by user: {e}")
|
|
107
|
-
return []
|
|
108
|
-
|
|
109
|
-
def get_payees_by_user(self, user_id: int) -> List[Dict[str, Any]]:
|
|
110
|
-
"""Get all payees for a user."""
|
|
111
|
-
try:
|
|
112
|
-
payees = self._read_csv("payees.csv")
|
|
113
|
-
return [payee for payee in payees if int(payee["user_id"]) == user_id]
|
|
114
|
-
except Exception as e:
|
|
115
|
-
self.logger.error(f"Error getting payees by user: {e}")
|
|
116
|
-
return []
|
|
117
|
-
|
|
118
|
-
def get_payee_by_name_and_user(
|
|
119
|
-
self, payee_name: str, user_id: int
|
|
120
|
-
) -> Optional[Dict[str, Any]]:
|
|
121
|
-
"""Get payee information by name and user_id."""
|
|
122
|
-
try:
|
|
123
|
-
payees = self._read_csv("payees.csv")
|
|
124
|
-
for payee in payees:
|
|
125
|
-
if payee["name"] == payee_name and int(payee["user_id"]) == user_id:
|
|
126
|
-
return payee
|
|
127
|
-
return None
|
|
128
|
-
except Exception as e:
|
|
129
|
-
self.logger.error(f"Error getting payee by name and user: {e}")
|
|
130
|
-
return None
|
|
131
|
-
|
|
132
|
-
def get_cards_by_user(self, user_id: int) -> List[Dict[str, Any]]:
|
|
133
|
-
"""Get all cards for a user."""
|
|
134
|
-
try:
|
|
135
|
-
cards = self._read_csv("cards.csv")
|
|
136
|
-
return [card for card in cards if int(card["user_id"]) == user_id]
|
|
137
|
-
except Exception as e:
|
|
138
|
-
self.logger.error(f"Error getting cards by user: {e}")
|
|
139
|
-
return []
|
|
140
|
-
|
|
141
|
-
def get_card_by_number(self, card_number: str) -> Optional[Dict[str, Any]]:
|
|
142
|
-
"""Get card information by card number."""
|
|
143
|
-
try:
|
|
144
|
-
cards = self._read_csv("cards.csv")
|
|
145
|
-
for card in cards:
|
|
146
|
-
if card["number"] == card_number:
|
|
147
|
-
return card
|
|
148
|
-
return None
|
|
149
|
-
except Exception as e:
|
|
150
|
-
self.logger.error(f"Error getting card by number: {e}")
|
|
151
|
-
return None
|
|
152
|
-
|
|
153
|
-
def update_card_status(self, card_number: str, status: str) -> bool:
|
|
154
|
-
"""Update card status."""
|
|
155
|
-
try:
|
|
156
|
-
cards = self._read_csv("cards.csv")
|
|
157
|
-
for card in cards:
|
|
158
|
-
if card["number"] == card_number:
|
|
159
|
-
card["status"] = status
|
|
160
|
-
break
|
|
161
|
-
return self._write_csv("cards.csv", cards)
|
|
162
|
-
except Exception as e:
|
|
163
|
-
self.logger.error(f"Error updating card status: {e}")
|
|
164
|
-
return False
|
|
165
|
-
|
|
166
|
-
def add_payee(
|
|
167
|
-
self,
|
|
168
|
-
user_id: int,
|
|
169
|
-
name: str,
|
|
170
|
-
sort_code: str,
|
|
171
|
-
account_number: str,
|
|
172
|
-
payee_type: str,
|
|
173
|
-
reference: str = "",
|
|
174
|
-
) -> bool:
|
|
175
|
-
"""Add a new payee."""
|
|
176
|
-
try:
|
|
177
|
-
payees = self._read_csv("payees.csv")
|
|
178
|
-
|
|
179
|
-
# Get the next ID
|
|
180
|
-
next_id = 1
|
|
181
|
-
if payees:
|
|
182
|
-
next_id = max(int(payee["id"]) for payee in payees) + 1
|
|
183
|
-
|
|
184
|
-
# Create new payee record
|
|
185
|
-
new_payee = {
|
|
186
|
-
"id": str(next_id),
|
|
187
|
-
"user_id": str(user_id),
|
|
188
|
-
"name": name,
|
|
189
|
-
"sort_code": sort_code,
|
|
190
|
-
"account_number": account_number,
|
|
191
|
-
"type": payee_type,
|
|
192
|
-
"reference": reference,
|
|
193
|
-
"added_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
# Add to list and save
|
|
197
|
-
payees.append(new_payee)
|
|
198
|
-
return self._write_csv("payees.csv", payees)
|
|
199
|
-
except Exception as e:
|
|
200
|
-
self.logger.error(f"Error adding payee: {e}")
|
|
201
|
-
return False
|
|
202
|
-
|
|
203
|
-
def remove_payee(self, payee_name: str, user_id: int) -> bool:
|
|
204
|
-
"""Remove a payee."""
|
|
205
|
-
try:
|
|
206
|
-
payees = self._read_csv("payees.csv")
|
|
207
|
-
payees = [
|
|
208
|
-
payee
|
|
209
|
-
for payee in payees
|
|
210
|
-
if not (
|
|
211
|
-
payee["name"] == payee_name and int(payee["user_id"]) == user_id
|
|
212
|
-
)
|
|
213
|
-
]
|
|
214
|
-
return self._write_csv("payees.csv", payees)
|
|
215
|
-
except Exception as e:
|
|
216
|
-
self.logger.error(f"Error removing payee: {e}")
|
|
217
|
-
return False
|
|
218
|
-
|
|
219
|
-
def check_sufficient_funds(
|
|
220
|
-
self, user_id: int, account_number: str, amount: float
|
|
221
|
-
) -> bool:
|
|
222
|
-
"""Check if account has sufficient funds."""
|
|
223
|
-
try:
|
|
224
|
-
account = self.get_account_by_user_and_number(user_id, account_number)
|
|
225
|
-
if not account:
|
|
226
|
-
return False
|
|
227
|
-
return float(account["balance"]) >= amount
|
|
228
|
-
except Exception as e:
|
|
229
|
-
self.logger.error(f"Error checking sufficient funds: {e}")
|
|
230
|
-
return False
|
|
231
|
-
|
|
232
|
-
def get_branches(self) -> List[Dict[str, Any]]:
|
|
233
|
-
"""Get all branches."""
|
|
234
|
-
try:
|
|
235
|
-
return self._read_csv("branches.csv")
|
|
236
|
-
except Exception as e:
|
|
237
|
-
self.logger.error(f"Error getting branches: {e}")
|
|
238
|
-
return []
|
|
239
|
-
|
|
240
|
-
def get_advisors_by_branch(self, branch_id: int) -> List[Dict[str, Any]]:
|
|
241
|
-
"""Get all advisors for a branch."""
|
|
242
|
-
try:
|
|
243
|
-
advisors = self._read_csv("advisors.csv")
|
|
244
|
-
return [
|
|
245
|
-
advisor
|
|
246
|
-
for advisor in advisors
|
|
247
|
-
if int(advisor["branch_id"]) == branch_id
|
|
248
|
-
]
|
|
249
|
-
except Exception as e:
|
|
250
|
-
self.logger.error(f"Error getting advisors by branch: {e}")
|
|
251
|
-
return []
|
|
252
|
-
|
|
253
|
-
def get_appointments_by_advisor(self, advisor_id: int) -> List[Dict[str, Any]]:
|
|
254
|
-
"""Get all appointments for an advisor."""
|
|
255
|
-
try:
|
|
256
|
-
appointments = self._read_csv("appointments.csv")
|
|
257
|
-
return [
|
|
258
|
-
appointment
|
|
259
|
-
for appointment in appointments
|
|
260
|
-
if int(appointment["advisor_id"]) == advisor_id
|
|
261
|
-
]
|
|
262
|
-
except Exception as e:
|
|
263
|
-
self.logger.error(f"Error getting appointments by advisor: {e}")
|
|
264
|
-
return []
|
|
265
|
-
|
|
266
|
-
def __enter__(self) -> "Database":
|
|
267
|
-
"""Enter the runtime context related to this object."""
|
|
268
|
-
return self
|
|
269
|
-
|
|
270
|
-
def __exit__(
|
|
271
|
-
self,
|
|
272
|
-
exc_type: Optional[type],
|
|
273
|
-
exc_value: Optional[BaseException],
|
|
274
|
-
traceback: Optional[Any],
|
|
275
|
-
) -> None:
|
|
276
|
-
"""Exit the runtime context related to this object."""
|
|
277
|
-
self.logger.info("Database connection closed")
|