rasa-pro 3.14.0.dev9__py3-none-any.whl → 3.14.0.dev11__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/agent_factory.py +2 -2
- rasa/agents/agent_manager.py +50 -2
- rasa/agents/constants.py +3 -0
- rasa/agents/core/types.py +11 -0
- rasa/agents/protocol/a2a/a2a_agent.py +76 -17
- rasa/agents/protocol/mcp/mcp_base_agent.py +29 -5
- rasa/agents/protocol/mcp/mcp_open_agent.py +27 -13
- rasa/agents/protocol/mcp/mcp_task_agent.py +46 -31
- rasa/agents/schemas/__init__.py +2 -1
- rasa/agents/schemas/agent_tool_result.py +0 -2
- rasa/agents/schemas/agent_tool_schema.py +55 -3
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +6 -1
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +5 -0
- rasa/agents/utils.py +42 -3
- rasa/agents/validation.py +4 -4
- rasa/builder/copilot/telemetry.py +35 -19
- rasa/builder/main.py +5 -14
- rasa/builder/project_generator.py +1 -1
- rasa/builder/service.py +5 -0
- rasa/builder/template_cache.py +9 -184
- rasa/cli/project_templates/basic/data/data.md +5 -6
- rasa/cli/project_templates/basic/domain/domain.md +5 -2
- rasa/cli/project_templates/finance/README.md +8 -7
- 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/{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/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 +6 -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 +6 -3
- rasa/cli/project_templates/finance/data/general/agent_details.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +1 -2
- rasa/cli/project_templates/finance/data/general/human_handoff.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/_system/patterns/pattern_session_start.yml +11 -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 +9 -1
- rasa/cli/project_templates/finance/domain/general/_shared.yml +53 -0
- rasa/cli/project_templates/finance/domain/general/agent_details.yml +19 -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/human_handoff.yml +7 -3
- rasa/cli/project_templates/finance/domain/general/welcome.yml +5 -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 +3 -2
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +31 -12
- rasa/cli/project_templates/telco/data/data.md +1 -1
- rasa/cli/project_templates/telco/docs/docs.md +3 -0
- rasa/cli/project_templates/telco/domain/domain.md +1 -2
- rasa/constants.py +1 -1
- rasa/core/actions/direct_custom_actions_executor.py +9 -2
- rasa/core/agent.py +2 -3
- rasa/core/available_agents.py +8 -6
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +52 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/inspector/README.md +1 -1
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_stream/twilio_media_streams.py +5 -1
- rasa/core/concurrent_lock_store.py +66 -16
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +76 -1
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +1 -1
- rasa/core/lock_store.py +41 -7
- rasa/core/policies/flows/agent_executor.py +632 -0
- rasa/core/policies/flows/flow_executor.py +3 -418
- rasa/core/policies/flows/mcp_tool_executor.py +35 -14
- rasa/core/processor.py +49 -28
- rasa/core/run.py +22 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +1 -1
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -3
- rasa/dialogue_understanding/commands/clarify_command.py +11 -3
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -3
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +3 -3
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +3 -3
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +3 -3
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +3 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +2 -0
- rasa/dialogue_understanding/processor/command_processor.py +70 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +0 -25
- rasa/engine/loader.py +12 -0
- rasa/engine/recipes/default_components.py +111 -82
- rasa/engine/recipes/default_recipe.py +79 -22
- rasa/engine/runner/dask.py +8 -5
- rasa/graph_components/validators/default_recipe_validator.py +59 -19
- rasa/model_manager/warm_rasa_process.py +13 -3
- rasa/model_training.py +0 -14
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -22
- 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/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/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/shared/agents/auth/agent_auth_manager.py +6 -3
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +13 -5
- rasa/shared/core/constants.py +5 -1
- rasa/shared/utils/mcp/server_connection.py +1 -1
- rasa/telemetry.py +63 -0
- rasa/utils/log_utils.py +95 -4
- rasa/utils/tensorflow/__init__.py +0 -22
- rasa/utils/tensorflow/callback.py +17 -7
- rasa/utils/tensorflow/layers.py +10 -7
- rasa/utils/tensorflow/rasa_layers.py +1 -1
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev9.dist-info → rasa_pro-3.14.0.dev11.dist-info}/METADATA +99 -89
- {rasa_pro-3.14.0.dev9.dist-info → rasa_pro-3.14.0.dev11.dist-info}/RECORD +171 -242
- 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/bot_identity.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
- 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_pro-3.14.0.dev9.dist-info → rasa_pro-3.14.0.dev11.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev9.dist-info → rasa_pro-3.14.0.dev11.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev9.dist-info → rasa_pro-3.14.0.dev11.dist-info}/entry_points.txt +0 -0
rasa/builder/template_cache.py
CHANGED
|
@@ -1,83 +1,26 @@
|
|
|
1
|
-
import asyncio
|
|
2
1
|
import os
|
|
3
|
-
import shutil
|
|
4
|
-
import tarfile
|
|
5
|
-
import tempfile
|
|
6
2
|
from pathlib import Path
|
|
7
|
-
from typing import Generator
|
|
8
3
|
|
|
9
4
|
import aiofiles
|
|
10
|
-
import
|
|
5
|
+
import aiofiles.os
|
|
6
|
+
import aioshutil
|
|
11
7
|
import structlog
|
|
12
|
-
from sanic import Sanic
|
|
13
8
|
|
|
14
|
-
import rasa.version
|
|
15
|
-
from rasa.builder.logging_utils import capture_exception_with_context
|
|
16
9
|
from rasa.cli.scaffold import ProjectTemplateName
|
|
17
10
|
|
|
18
11
|
structlogger = structlog.get_logger()
|
|
19
12
|
|
|
20
|
-
CACHE_BUCKET_URL = "https://trained-templates.s3.us-east-1.amazonaws.com"
|
|
21
13
|
|
|
22
14
|
# Root directory for storing downloaded template caches on disk.
|
|
23
|
-
_CACHE_ROOT_DIR = Path(
|
|
24
|
-
os.getenv(
|
|
25
|
-
"RASA_TEMPLATE_CACHE_DIR",
|
|
26
|
-
Path.home().joinpath(".rasa", "template-cache").as_posix(),
|
|
27
|
-
)
|
|
28
|
-
)
|
|
15
|
+
_CACHE_ROOT_DIR = Path(os.getenv("RASA_TEMPLATE_CACHE_DIR", "/templates"))
|
|
29
16
|
|
|
30
17
|
|
|
31
18
|
def _template_cache_dir(template: ProjectTemplateName) -> Path:
|
|
32
19
|
"""Return the local cache directory for a given template and version."""
|
|
33
|
-
return _CACHE_ROOT_DIR /
|
|
20
|
+
return _CACHE_ROOT_DIR / template.value
|
|
34
21
|
|
|
35
22
|
|
|
36
|
-
def
|
|
37
|
-
return Path(
|
|
38
|
-
os.getenv(
|
|
39
|
-
"RASA_TEMPLATE_CACHE_DIR",
|
|
40
|
-
Path.home().joinpath(".rasa", "template-cache").as_posix(),
|
|
41
|
-
)
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def _safe_tar_members(
|
|
46
|
-
tar: tarfile.TarFile, destination_directory: Path
|
|
47
|
-
) -> Generator[tarfile.TarInfo, None, None]:
|
|
48
|
-
"""Yield safe members for extraction to prevent path traversal and links.
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
tar: Open tar file handle
|
|
52
|
-
destination_directory: Directory to which files will be extracted
|
|
53
|
-
|
|
54
|
-
Yields:
|
|
55
|
-
Members that are safe to extract within destination_directory
|
|
56
|
-
"""
|
|
57
|
-
base_path = destination_directory.resolve()
|
|
58
|
-
|
|
59
|
-
for member in tar.getmembers():
|
|
60
|
-
name = member.name
|
|
61
|
-
# Skip empty names and absolute paths
|
|
62
|
-
if not name or name.startswith("/") or name.startswith("\\"):
|
|
63
|
-
continue
|
|
64
|
-
|
|
65
|
-
# Disallow symlinks and hardlinks
|
|
66
|
-
if member.issym() or member.islnk():
|
|
67
|
-
continue
|
|
68
|
-
|
|
69
|
-
# Compute the final path and ensure it's within base_path
|
|
70
|
-
target_path = (base_path / name).resolve()
|
|
71
|
-
try:
|
|
72
|
-
target_path.relative_to(base_path)
|
|
73
|
-
except ValueError:
|
|
74
|
-
# Member would escape the destination directory
|
|
75
|
-
continue
|
|
76
|
-
|
|
77
|
-
yield member
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def _copytree(src: Path, dst: Path) -> None:
|
|
23
|
+
async def _copytree(src: Path, dst: Path) -> None:
|
|
81
24
|
"""Copy directory tree from src to dst, merging into dst.
|
|
82
25
|
|
|
83
26
|
Existing files are overwritten. Hidden files and directories are included, as
|
|
@@ -87,132 +30,14 @@ def _copytree(src: Path, dst: Path) -> None:
|
|
|
87
30
|
for root, dirs, files in os.walk(src):
|
|
88
31
|
rel_path = Path(root).relative_to(src)
|
|
89
32
|
target_dir = dst / rel_path
|
|
90
|
-
|
|
33
|
+
await aiofiles.os.makedirs(target_dir, exist_ok=True)
|
|
91
34
|
for filename in files:
|
|
92
35
|
src_file = Path(root) / filename
|
|
93
36
|
dst_file = target_dir / filename
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
async def download_cache_for_template(
|
|
98
|
-
template: ProjectTemplateName, target_dir: str
|
|
99
|
-
) -> None:
|
|
100
|
-
# get a temp path for the cache file download
|
|
101
|
-
temporary_cache_file = tempfile.NamedTemporaryFile(suffix=".tar.gz", delete=False)
|
|
102
|
-
|
|
103
|
-
try:
|
|
104
|
-
url = f"{CACHE_BUCKET_URL}/{rasa.version.__version__}-{template.value}.tar.gz"
|
|
105
|
-
async with aiohttp.ClientSession() as session:
|
|
106
|
-
async with session.get(url) as response:
|
|
107
|
-
response.raise_for_status()
|
|
108
|
-
async with aiofiles.open(temporary_cache_file.name, "wb") as f:
|
|
109
|
-
async for chunk in response.content.iter_chunked(1024 * 1024):
|
|
110
|
-
await f.write(chunk)
|
|
111
|
-
|
|
112
|
-
# extract the cache to the project folder using safe member filtering
|
|
113
|
-
with tarfile.open(temporary_cache_file.name, "r:gz") as tar:
|
|
114
|
-
destination = Path(target_dir)
|
|
115
|
-
destination.mkdir(parents=True, exist_ok=True)
|
|
116
|
-
tar.extractall(
|
|
117
|
-
path=destination,
|
|
118
|
-
members=_safe_tar_members(tar, destination),
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
structlogger.info(
|
|
122
|
-
"project_generator.download_cache_for_template.success",
|
|
123
|
-
template=template,
|
|
124
|
-
event_info=(
|
|
125
|
-
"Downloaded cache for template, extracted to target directory."
|
|
126
|
-
),
|
|
127
|
-
target_dir=target_dir,
|
|
128
|
-
)
|
|
129
|
-
except aiohttp.ClientResponseError as e:
|
|
130
|
-
if e.status == 403:
|
|
131
|
-
structlogger.debug(
|
|
132
|
-
"project_generator.download_cache_for_template.no_cache_found",
|
|
133
|
-
template=template,
|
|
134
|
-
event_info=("No cache found for template, continuing without it."),
|
|
135
|
-
target_dir=target_dir,
|
|
136
|
-
)
|
|
137
|
-
else:
|
|
138
|
-
capture_exception_with_context(
|
|
139
|
-
e,
|
|
140
|
-
"project_generator.download_cache_for_template.response_error",
|
|
141
|
-
extra={
|
|
142
|
-
"template": template.value,
|
|
143
|
-
"status": str(e.status),
|
|
144
|
-
"target_dir": target_dir,
|
|
145
|
-
},
|
|
146
|
-
)
|
|
147
|
-
except Exception as exc:
|
|
148
|
-
capture_exception_with_context(
|
|
149
|
-
exc,
|
|
150
|
-
"project_generator.download_cache_for_template.unexpected_error",
|
|
151
|
-
extra={"template": template.value, "target_dir": target_dir},
|
|
152
|
-
)
|
|
153
|
-
finally:
|
|
154
|
-
# Clean up the temporary file
|
|
155
|
-
try:
|
|
156
|
-
Path(temporary_cache_file.name).unlink(missing_ok=True)
|
|
157
|
-
except Exception as exc:
|
|
158
|
-
structlogger.debug(
|
|
159
|
-
"project_generator.download_cache_for_template.cleanup_error",
|
|
160
|
-
error=str(exc),
|
|
161
|
-
template=template,
|
|
162
|
-
event_info=("Failed to cleanup cache for template, ignoring."),
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
async def background_download_template_caches(
|
|
167
|
-
app: Sanic, loop: asyncio.AbstractEventLoop
|
|
168
|
-
) -> None:
|
|
169
|
-
"""Kick off background downloads of template caches if enabled."""
|
|
170
|
-
try:
|
|
171
|
-
structlogger.info(
|
|
172
|
-
"builder.main.background_cache_download.start",
|
|
173
|
-
event_info=(
|
|
174
|
-
"Starting background download of template caches for this " "version"
|
|
175
|
-
),
|
|
176
|
-
)
|
|
177
|
-
|
|
178
|
-
# Ensure cache root exists
|
|
179
|
-
_cache_root_dir().mkdir(parents=True, exist_ok=True)
|
|
180
|
-
|
|
181
|
-
async def _download(template: ProjectTemplateName) -> None:
|
|
182
|
-
try:
|
|
183
|
-
target_dir = _template_cache_dir(template)
|
|
184
|
-
if target_dir.exists() and any(target_dir.iterdir()):
|
|
185
|
-
structlogger.debug(
|
|
186
|
-
"builder.main.background_cache_download.skipped",
|
|
187
|
-
template=template,
|
|
188
|
-
event_info=(
|
|
189
|
-
"Skipping download of template cache because it "
|
|
190
|
-
"already exists."
|
|
191
|
-
),
|
|
192
|
-
target_dir=target_dir,
|
|
193
|
-
)
|
|
194
|
-
return
|
|
195
|
-
|
|
196
|
-
target_dir.mkdir(parents=True, exist_ok=True)
|
|
197
|
-
await download_cache_for_template(template, target_dir.as_posix())
|
|
198
|
-
except Exception as exc:
|
|
199
|
-
structlogger.debug(
|
|
200
|
-
"builder.main.background_cache_download.error",
|
|
201
|
-
template=template,
|
|
202
|
-
error=str(exc),
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
# schedule downloads concurrently without blocking startup
|
|
206
|
-
for template in ProjectTemplateName:
|
|
207
|
-
loop.create_task(_download(template))
|
|
208
|
-
except Exception as exc:
|
|
209
|
-
structlogger.debug(
|
|
210
|
-
"builder.main.background_cache_download.unexpected_error",
|
|
211
|
-
error=str(exc),
|
|
212
|
-
)
|
|
37
|
+
await aioshutil.copy2(src_file, dst_file)
|
|
213
38
|
|
|
214
39
|
|
|
215
|
-
def copy_cache_for_template_if_available(
|
|
40
|
+
async def copy_cache_for_template_if_available(
|
|
216
41
|
template: ProjectTemplateName, project_folder: Path
|
|
217
42
|
) -> None:
|
|
218
43
|
"""Copy a previously downloaded cache for `template` into `project_folder`.
|
|
@@ -222,7 +47,7 @@ def copy_cache_for_template_if_available(
|
|
|
222
47
|
try:
|
|
223
48
|
cache_dir = _template_cache_dir(template)
|
|
224
49
|
if cache_dir.exists() and any(cache_dir.iterdir()):
|
|
225
|
-
_copytree(cache_dir, project_folder)
|
|
50
|
+
await _copytree(cache_dir, project_folder)
|
|
226
51
|
structlogger.info(
|
|
227
52
|
"project_generator.copy_cache_for_template.success",
|
|
228
53
|
template=template,
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
## 📂 `data/` – The
|
|
1
|
+
## 📂 `data/` – The Agent's Business Logic
|
|
2
2
|
|
|
3
|
-
This folder holds files that define your agent’s skills using "flows". Each flow is a step-by-step conversation pattern (like a recipe) for handling a user goal (e.g., checking a balance, updating an address).
|
|
3
|
+
This folder holds files that define your agent’s skills using "flows". [1](https://rasa.com/docs/pro/build/writing-flows) Each flow is a step-by-step conversation pattern (like a recipe) for handling a user goal (e.g., checking a balance, updating an address).
|
|
4
4
|
|
|
5
|
-
**What you
|
|
6
|
-
-
|
|
7
|
-
- Flows are made of steps: collecting info, calling actions, and responding.
|
|
5
|
+
**What you'll find:**
|
|
6
|
+
- **general/**: Basic conversational flows (greetings, help, feedback, human handoff)
|
|
8
7
|
|
|
9
|
-
**Edit
|
|
8
|
+
**Edit YAML files in this folder** to add new skills, change existing flows, or adjust what the agent asks.
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
## 📂 `domain/` – The Agent's Brain
|
|
2
2
|
|
|
3
3
|
This folder contains YAML files that define the agent's:
|
|
4
|
-
- **Slots**: The agent's memory (e.g., user's name,
|
|
4
|
+
- **Slots**: The agent's memory (e.g., user's name, session info) [1](https://rasa.com/docs/reference/primitives/slots/).
|
|
5
5
|
- **Responses**: The messages your agent can say to users (e.g., greetings, confirmations) [2](https://rasa.com/docs/reference/primitives/responses).
|
|
6
|
-
- **Actions**: Custom logic your agent can run (e.g.,
|
|
6
|
+
- **Actions**: Custom logic your agent can run (e.g., handling feedback, human handoff) [3](https://rasa.com/docs/reference/primitives/custom-actions).
|
|
7
|
+
|
|
8
|
+
**What you'll find:**
|
|
9
|
+
- **general/**: Basic conversational domain elements (greetings, help, feedback)
|
|
7
10
|
|
|
8
11
|
You can organize the domain as one big file or many small ones. Rasa will automatically merge everything during training [1](https://rasa.com/docs/reference/config/domain).
|
|
@@ -5,11 +5,12 @@ A lightweight banking conversational agent template for the fictional **Fenlo Ba
|
|
|
5
5
|
## 🚀 What's Included
|
|
6
6
|
|
|
7
7
|
This template provides a banking assistant with:
|
|
8
|
-
- **Account Management**: Balance checking
|
|
9
|
-
- **Card Services**: Card blocking,
|
|
10
|
-
- **Money Transfers**:
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
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
|
|
13
14
|
|
|
14
15
|
## 📁 Directory Structure
|
|
15
16
|
|
|
@@ -17,8 +18,8 @@ This template provides a banking assistant with:
|
|
|
17
18
|
├── actions/ # Custom Python logic for banking operations
|
|
18
19
|
├── data/ # Banking conversation flows and training data
|
|
19
20
|
├── domain/ # Banking agent configuration
|
|
20
|
-
├──
|
|
21
|
-
├── docs/ #
|
|
21
|
+
├── db/ # Mock JSON database for testing
|
|
22
|
+
├── docs/ # Fenlo Bank knowledge base and FAQ documents
|
|
22
23
|
├── prompts/ # LLM prompts for enhanced banking responses
|
|
23
24
|
└── config.yml # Training pipeline configuration
|
|
24
25
|
```
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# Account actions
|
|
2
|
-
from actions.accounts.action_ask_account import ActionAskAccount
|
|
3
|
-
from actions.accounts.action_check_balance import ActionCheckBalance
|
|
4
|
-
|
|
5
|
-
# General actions
|
|
6
|
-
from actions.action_session_start import ActionSessionStart
|
|
7
|
-
|
|
8
|
-
# Card actions
|
|
9
|
-
from actions.cards.action_ask_card import ActionAskCard
|
|
10
|
-
from actions.cards.action_check_card_existence import ActionCheckCardExistence
|
|
11
|
-
from actions.cards.action_update_card_status import ActionUpdateCardStatus
|
|
12
|
-
|
|
13
|
-
# Transfer actions
|
|
14
|
-
from actions.transfers.action_add_payee import ActionAddPayee
|
|
15
|
-
from actions.transfers.action_ask_account_from import ActionAskAccountFrom
|
|
16
|
-
from actions.transfers.action_check_payee_existence import ActionCheckPayeeExistence
|
|
17
|
-
from actions.transfers.action_check_sufficient_funds import ActionCheckSufficientFunds
|
|
18
|
-
from actions.transfers.action_list_payees import ActionListPayees
|
|
19
|
-
from actions.transfers.action_process_immediate_payment import (
|
|
20
|
-
ActionProcessImmediatePayment,
|
|
21
|
-
)
|
|
22
|
-
from actions.transfers.action_remove_payee import ActionRemovePayee
|
|
23
|
-
from actions.transfers.action_schedule_payment import ActionSchedulePayment
|
|
24
|
-
from actions.transfers.action_validate_payment_date import ActionValidatePaymentDate
|
|
25
|
-
|
|
26
|
-
__all__ = [
|
|
27
|
-
# General actions
|
|
28
|
-
"ActionSessionStart",
|
|
29
|
-
# Account actions
|
|
30
|
-
"ActionAskAccount",
|
|
31
|
-
"ActionCheckBalance",
|
|
32
|
-
# Card actions
|
|
33
|
-
"ActionAskCard",
|
|
34
|
-
"ActionCheckCardExistence",
|
|
35
|
-
"ActionUpdateCardStatus",
|
|
36
|
-
# Transfer actions
|
|
37
|
-
"ActionAddPayee",
|
|
38
|
-
"ActionAskAccountFrom",
|
|
39
|
-
"ActionCheckPayeeExistence",
|
|
40
|
-
"ActionCheckSufficientFunds",
|
|
41
|
-
"ActionListPayees",
|
|
42
|
-
"ActionProcessImmediatePayment",
|
|
43
|
-
"ActionRemovePayee",
|
|
44
|
-
"ActionSchedulePayment",
|
|
45
|
-
"ActionValidatePaymentDate",
|
|
46
|
-
]
|
|
@@ -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)]
|
|
@@ -5,9 +5,9 @@ from rasa_sdk.events import SlotSet
|
|
|
5
5
|
from rasa_sdk.executor import CollectingDispatcher
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class
|
|
8
|
+
class ActionCheckThatCardExists(Action):
|
|
9
9
|
def name(self) -> Text:
|
|
10
|
-
return "
|
|
10
|
+
return "check_that_card_exists"
|
|
11
11
|
|
|
12
12
|
def run(
|
|
13
13
|
self,
|
|
@@ -15,4 +15,7 @@ class ActionProcessImmediatePayment(Action):
|
|
|
15
15
|
tracker: Tracker,
|
|
16
16
|
domain: Dict[Text, Any],
|
|
17
17
|
) -> List[Dict[Text, Any]]:
|
|
18
|
-
|
|
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])
|
|
@@ -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
|
+
]
|