rasa-pro 3.14.0.dev10__py3-none-any.whl β 3.14.0.dev12__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 +1 -1
- rasa/agents/agent_manager.py +52 -3
- rasa/agents/constants.py +3 -0
- rasa/agents/core/types.py +11 -0
- rasa/agents/protocol/__init__.py +11 -3
- rasa/agents/protocol/a2a/a2a_agent.py +45 -5
- rasa/agents/protocol/mcp/mcp_base_agent.py +14 -5
- rasa/agents/protocol/mcp/mcp_open_agent.py +27 -13
- rasa/agents/protocol/mcp/mcp_task_agent.py +42 -31
- 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 -6
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +5 -5
- rasa/agents/utils.py +42 -3
- 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/actions/grpc_custom_action_executor.py +9 -4
- rasa/core/agent.py +2 -3
- rasa/core/available_agents.py +1 -1
- 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 -417
- rasa/core/policies/flows/mcp_tool_executor.py +32 -12
- 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/telemetry.py +63 -0
- rasa/tracing/instrumentation/attribute_extractors.py +6 -1
- 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.dev10.dist-info β rasa_pro-3.14.0.dev12.dist-info}/METADATA +96 -89
- {rasa_pro-3.14.0.dev10.dist-info β rasa_pro-3.14.0.dev12.dist-info}/RECORD +168 -239
- 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.dev10.dist-info β rasa_pro-3.14.0.dev12.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev10.dist-info β rasa_pro-3.14.0.dev12.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev10.dist-info β rasa_pro-3.14.0.dev12.dist-info}/entry_points.txt +0 -0
|
@@ -7,6 +7,7 @@ from rasa.agents.constants import (
|
|
|
7
7
|
TOOL_ADDITIONAL_PROPERTIES_KEY,
|
|
8
8
|
TOOL_DESCRIPTION_KEY,
|
|
9
9
|
TOOL_EXECUTOR_KEY,
|
|
10
|
+
TOOL_INPUT_SCHEMA_KEY,
|
|
10
11
|
TOOL_NAME_KEY,
|
|
11
12
|
TOOL_PARAMETERS_KEY,
|
|
12
13
|
TOOL_PROPERTIES_KEY,
|
|
@@ -42,9 +43,60 @@ class AgentToolSchema(BaseModel):
|
|
|
42
43
|
)
|
|
43
44
|
|
|
44
45
|
@classmethod
|
|
45
|
-
def
|
|
46
|
+
def from_litellm_json_format(cls, tool: Dict[str, Any]) -> "AgentToolSchema":
|
|
46
47
|
"""Convert OpenAI dict format to AgentToolSchema."""
|
|
48
|
+
references = (
|
|
49
|
+
"Refer: \n"
|
|
50
|
+
"- LiteLLM JSON Format - https://docs.litellm.ai/docs/completion/function_call#full-code---parallel-function-calling-with-gpt-35-turbo-1106\n"
|
|
51
|
+
"- OpenAI Tool JSON Format - https://platform.openai.com/docs/guides/tools?tool-type=function-calling\n"
|
|
52
|
+
)
|
|
53
|
+
expected_structure = (
|
|
54
|
+
"{\n"
|
|
55
|
+
" 'type': 'function',\n"
|
|
56
|
+
" 'function': {\n"
|
|
57
|
+
" 'name': 'string',\n"
|
|
58
|
+
" 'description': 'string',\n"
|
|
59
|
+
" 'parameters': {\n"
|
|
60
|
+
" 'type': 'object',\n"
|
|
61
|
+
" 'properties': {'string': 'string'},\n"
|
|
62
|
+
" 'required': ['string']\n"
|
|
63
|
+
" }\n"
|
|
64
|
+
" }\n"
|
|
65
|
+
"}"
|
|
66
|
+
)
|
|
67
|
+
if (
|
|
68
|
+
TOOL_NAME_KEY in tool
|
|
69
|
+
and TOOL_DESCRIPTION_KEY in tool
|
|
70
|
+
and TOOL_INPUT_SCHEMA_KEY in tool
|
|
71
|
+
):
|
|
72
|
+
raise ValueError(
|
|
73
|
+
"Anthropic Tool format is not supported yet. Please use the LiteLLM "
|
|
74
|
+
"Tool format, which is based on OpenAI's format.\n"
|
|
75
|
+
"The expected structure is:\n"
|
|
76
|
+
f"{expected_structure}\n"
|
|
77
|
+
f"{references}"
|
|
78
|
+
)
|
|
79
|
+
if not (TOOL_TYPE_FUNCTION_KEY in tool and TOOL_TYPE_KEY in tool):
|
|
80
|
+
raise ValueError(
|
|
81
|
+
"Invalid tool format. Expected a dictionary with 'type' and "
|
|
82
|
+
"'function' keys. Expected LiteLLM Tool format that is based on OpenAI "
|
|
83
|
+
"format which has the following structure: \n"
|
|
84
|
+
f"{expected_structure}\n"
|
|
85
|
+
f"{references}"
|
|
86
|
+
)
|
|
87
|
+
|
|
47
88
|
function_data = tool[TOOL_TYPE_FUNCTION_KEY]
|
|
89
|
+
|
|
90
|
+
if not (
|
|
91
|
+
TOOL_NAME_KEY in function_data and TOOL_DESCRIPTION_KEY in function_data
|
|
92
|
+
):
|
|
93
|
+
raise ValueError(
|
|
94
|
+
"Invalid tool format. 'function' must contain 'name' and "
|
|
95
|
+
"'description' keys. Expected LiteLLM Tool format that is based on "
|
|
96
|
+
"OpenAI format which has the following structure: \n"
|
|
97
|
+
f"{expected_structure}\n"
|
|
98
|
+
f"{references}"
|
|
99
|
+
)
|
|
48
100
|
parameters = function_data.get(TOOL_PARAMETERS_KEY, {})
|
|
49
101
|
|
|
50
102
|
if parameters:
|
|
@@ -104,7 +156,7 @@ class AgentToolSchema(BaseModel):
|
|
|
104
156
|
if TOOL_REQUIRED_KEY not in prop_schema:
|
|
105
157
|
prop_schema[TOOL_REQUIRED_KEY] = []
|
|
106
158
|
|
|
107
|
-
def
|
|
159
|
+
def to_litellm_json_format(self) -> Dict[str, Any]:
|
|
108
160
|
"""Convert AgentToolSchema to OpenAI format."""
|
|
109
161
|
# Ensure the schema is valid before conversion
|
|
110
162
|
return {
|
|
@@ -123,7 +175,7 @@ class CustomToolSchema(BaseModel):
|
|
|
123
175
|
@classmethod
|
|
124
176
|
def from_dict(cls, config: Dict[str, Any]) -> "CustomToolSchema":
|
|
125
177
|
"""Convert a custom tool config to CustomToolSchema."""
|
|
126
|
-
agent_tool_schema = AgentToolSchema.
|
|
178
|
+
agent_tool_schema = AgentToolSchema.from_litellm_json_format(config)
|
|
127
179
|
if TOOL_EXECUTOR_KEY not in config:
|
|
128
180
|
raise ValueError("Custom tool executor is required.")
|
|
129
181
|
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
You are a helpful assistant that should assist the user in the best possible way.
|
|
2
2
|
|
|
3
|
-
### Context
|
|
4
|
-
- Current date: {{ current_date }} (YYYY-MM-DD)
|
|
5
|
-
- Current time: {{ current_time }} (HH:MM:SS, 24-hour format)
|
|
6
|
-
- Current day: {{ current_day }} (Day of week)
|
|
7
|
-
|
|
8
3
|
### Primary Task
|
|
9
4
|
{{ description }}
|
|
10
5
|
|
|
@@ -16,5 +11,10 @@ You are a helpful assistant that should assist the user in the best possible way
|
|
|
16
11
|
* Do NOT call the `task_completed` tool unless you're absolutely certain that your primary task (NOT the slot corrections, updates, etc), described above, is fully completed. Focus on the task given in the task description above.
|
|
17
12
|
* Strictly avoid making up information or ability to take some action which is not available in `tool` provided.
|
|
18
13
|
|
|
14
|
+
### Context
|
|
15
|
+
- Current date: {{ current_date }} (YYYY-MM-DD)
|
|
16
|
+
- Current time: {{ current_time }} (HH:MM:SS, 24-hour format)
|
|
17
|
+
- Current day: {{ current_day }} (Day of week)
|
|
18
|
+
|
|
19
19
|
### Conversation history
|
|
20
|
-
{{ conversation_history }}
|
|
20
|
+
{{ conversation_history }}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
You are a helpful assistant that should assist the user in the best possible way.
|
|
2
2
|
|
|
3
|
-
### Context
|
|
4
|
-
- Current date: {{ current_date }} (YYYY-MM-DD)
|
|
5
|
-
- Current time: {{ current_time }} (HH:MM:SS, 24-hour format)
|
|
6
|
-
- Current day: {{ current_day }} (Day of week)
|
|
7
|
-
|
|
8
3
|
### Description of your capabilities
|
|
9
4
|
{{ description }}
|
|
10
5
|
|
|
@@ -18,5 +13,10 @@ You are a helpful assistant that should assist the user in the best possible way
|
|
|
18
13
|
* Always avoid making assumptions about what values to pass into tools. Ask for clarification if a user's request is ambiguous.
|
|
19
14
|
* Strictly avoid making up information or ability to take some action which is not available in `tool` provided.
|
|
20
15
|
|
|
16
|
+
### Context
|
|
17
|
+
- Current date: {{ current_date }} (YYYY-MM-DD)
|
|
18
|
+
- Current time: {{ current_time }} (HH:MM:SS, 24-hour format)
|
|
19
|
+
- Current day: {{ current_day }} (Day of week)
|
|
20
|
+
|
|
21
21
|
### Conversation history
|
|
22
22
|
{{ conversation_history }}
|
rasa/agents/utils.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from typing import Dict, List, Optional
|
|
2
2
|
|
|
3
|
+
import structlog
|
|
4
|
+
|
|
3
5
|
from rasa.agents.agent_manager import AgentManager
|
|
4
6
|
from rasa.agents.exceptions import AgentNotFoundException
|
|
5
7
|
from rasa.agents.validation import validate_agent_names_not_conflicting_with_flows
|
|
@@ -10,12 +12,13 @@ from rasa.core.available_agents import (
|
|
|
10
12
|
)
|
|
11
13
|
from rasa.core.available_endpoints import AvailableEndpoints
|
|
12
14
|
from rasa.shared.agents.utils import get_protocol_type
|
|
13
|
-
from rasa.shared.core.
|
|
14
|
-
from rasa.shared.core.events import AgentCompleted
|
|
15
|
+
from rasa.shared.core.events import AgentCompleted, AgentStarted
|
|
15
16
|
from rasa.shared.core.flows import FlowsList
|
|
16
17
|
from rasa.shared.core.flows.steps import CallFlowStep
|
|
17
18
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
18
19
|
|
|
20
|
+
structlogger = structlog.get_logger()
|
|
21
|
+
|
|
19
22
|
|
|
20
23
|
def resolve_agent_config(
|
|
21
24
|
agent_config: AgentConfig,
|
|
@@ -43,13 +46,15 @@ def resolve_agent_config(
|
|
|
43
46
|
|
|
44
47
|
async def initialize_agents(
|
|
45
48
|
flows: FlowsList,
|
|
46
|
-
domain: Domain,
|
|
47
49
|
sub_agents: AvailableAgents,
|
|
48
50
|
) -> None:
|
|
49
51
|
"""Iterate over flows and create/connect the referenced agents."""
|
|
50
52
|
agent_manager: AgentManager = AgentManager()
|
|
51
53
|
endpoints = AvailableEndpoints.get_instance()
|
|
52
54
|
|
|
55
|
+
agent_used = False
|
|
56
|
+
mcp_tool_used = False
|
|
57
|
+
|
|
53
58
|
# Validate agent names don't conflict with flow names
|
|
54
59
|
flow_names = {flow.id for flow in flows.underlying_flows}
|
|
55
60
|
validate_agent_names_not_conflicting_with_flows(sub_agents.agents, flow_names)
|
|
@@ -63,11 +68,14 @@ async def initialize_agents(
|
|
|
63
68
|
if step.is_calling_mcp_tool():
|
|
64
69
|
# The call step is calling an MCP tool, so we don't need to
|
|
65
70
|
# initialize any agent.
|
|
71
|
+
mcp_tool_used = True
|
|
66
72
|
continue
|
|
67
73
|
|
|
68
74
|
if not step.is_calling_agent():
|
|
69
75
|
raise AgentNotFoundException(step.call)
|
|
70
76
|
|
|
77
|
+
agent_used = True
|
|
78
|
+
|
|
71
79
|
agent_name = step.call
|
|
72
80
|
agent_config = sub_agents.get_agent_config(agent_name)
|
|
73
81
|
resolved_agent_config = resolve_agent_config(agent_config, endpoints)
|
|
@@ -79,6 +87,35 @@ async def initialize_agents(
|
|
|
79
87
|
resolved_agent_config,
|
|
80
88
|
)
|
|
81
89
|
|
|
90
|
+
_log_beta_feature_warning(mcp_tool_used, agent_used)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _log_beta_feature_warning(mcp_tool_used: bool, agent_used: bool) -> None:
|
|
94
|
+
"""Log a warning if an agent or MCP tool is used in the flow(s)."""
|
|
95
|
+
if mcp_tool_used:
|
|
96
|
+
structlogger.info(
|
|
97
|
+
"rasa.agents.utils.initialize_agents",
|
|
98
|
+
event_info="Beta Feature",
|
|
99
|
+
message=(
|
|
100
|
+
"An MCP tool is being called in at least one of the flows. "
|
|
101
|
+
"This feature is currently under beta development. "
|
|
102
|
+
"It might undergo upgrades / breaking changes in future "
|
|
103
|
+
"releases to graduate it to GA."
|
|
104
|
+
),
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
if agent_used:
|
|
108
|
+
structlogger.info(
|
|
109
|
+
"rasa.agents.utils.initialize_agents",
|
|
110
|
+
event_info="Beta Feature",
|
|
111
|
+
message=(
|
|
112
|
+
"A sub-agent is being called from a flow. "
|
|
113
|
+
"This feature is currently under beta development. "
|
|
114
|
+
"It might undergo upgrades / breaking changes in future "
|
|
115
|
+
"releases to graduate it to GA."
|
|
116
|
+
),
|
|
117
|
+
)
|
|
118
|
+
|
|
82
119
|
|
|
83
120
|
def is_agent_valid(agent_id: str) -> bool:
|
|
84
121
|
"""Check if an agent ID references a valid agent.
|
|
@@ -107,6 +144,8 @@ def is_agent_completed(tracker: DialogueStateTracker, agent_id: str) -> bool:
|
|
|
107
144
|
for event in reversed(tracker.events):
|
|
108
145
|
if isinstance(event, AgentCompleted) and event.agent_id == agent_id:
|
|
109
146
|
return True
|
|
147
|
+
elif isinstance(event, AgentStarted) and event.agent_id == agent_id:
|
|
148
|
+
return False
|
|
110
149
|
return False
|
|
111
150
|
|
|
112
151
|
|
|
@@ -99,7 +99,7 @@ class CopilotTelemetry:
|
|
|
99
99
|
total_tokens: Optional[int] = None,
|
|
100
100
|
system_message: Optional[dict[str, Any]] = None,
|
|
101
101
|
chat_history: Optional[list[dict[str, Any]]] = None,
|
|
102
|
-
last_user_message: Optional[
|
|
102
|
+
last_user_message: Optional[str] = None,
|
|
103
103
|
) -> None:
|
|
104
104
|
"""Track a copilot message in the conversation.
|
|
105
105
|
|
|
@@ -112,28 +112,44 @@ class CopilotTelemetry:
|
|
|
112
112
|
input_tokens: Number of input tokens used (optional).
|
|
113
113
|
output_tokens: Number of output tokens generated (optional).
|
|
114
114
|
total_tokens: Total number of tokens used (input + output) (optional).
|
|
115
|
+
system_message: The system message used (optional).
|
|
116
|
+
chat_history: The chat history messages used (optional).
|
|
117
|
+
last_user_message: The last user message used (optional).
|
|
115
118
|
"""
|
|
116
119
|
structlogger.debug("builder.telemetry.log_copilot_turn", text=text)
|
|
120
|
+
|
|
121
|
+
# FIXME: Temporarily remove the system_message from telemetry payload.
|
|
122
|
+
# Reason: It often exceeds Segment payload size limits, causing the request
|
|
123
|
+
# to be rejected and the event to be absent in Segment. Instead, temporarily
|
|
124
|
+
# log the system_message so it's visible in Grafana.
|
|
125
|
+
telemetry_data = {
|
|
126
|
+
"project_id": self._project_id,
|
|
127
|
+
"message_id": uuid.uuid4().hex,
|
|
128
|
+
"text": text,
|
|
129
|
+
"prompt_version": self._prompt_version,
|
|
130
|
+
"source_urls": list(source_urls),
|
|
131
|
+
"flags": list(flags),
|
|
132
|
+
"latency_ms": latency_ms,
|
|
133
|
+
"model": model,
|
|
134
|
+
"input_tokens": input_tokens,
|
|
135
|
+
"output_tokens": output_tokens,
|
|
136
|
+
"total_tokens": total_tokens,
|
|
137
|
+
"chat_history": chat_history,
|
|
138
|
+
"last_user_message": last_user_message,
|
|
139
|
+
"timestamp": dt.datetime.utcnow().isoformat(),
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# Log all telemetry data plus system_message for debugging
|
|
143
|
+
log_data = telemetry_data.copy()
|
|
144
|
+
if system_message:
|
|
145
|
+
log_data["system_message"] = system_message
|
|
146
|
+
|
|
147
|
+
structlogger.info("builder.telemetry.copilot_turn", **log_data)
|
|
148
|
+
|
|
117
149
|
_track(
|
|
118
150
|
COPILOT_BOT_MESSAGE_EVENT,
|
|
119
151
|
self._user_id,
|
|
120
|
-
|
|
121
|
-
"project_id": self._project_id,
|
|
122
|
-
"message_id": uuid.uuid4().hex,
|
|
123
|
-
"text": text,
|
|
124
|
-
"prompt_version": self._prompt_version,
|
|
125
|
-
"source_urls": list(source_urls),
|
|
126
|
-
"flags": list(flags),
|
|
127
|
-
"latency_ms": latency_ms,
|
|
128
|
-
"model": model,
|
|
129
|
-
"input_tokens": input_tokens,
|
|
130
|
-
"output_tokens": output_tokens,
|
|
131
|
-
"total_tokens": total_tokens,
|
|
132
|
-
"system_message": system_message,
|
|
133
|
-
"chat_history": chat_history,
|
|
134
|
-
"last_user_message": last_user_message,
|
|
135
|
-
"timestamp": dt.datetime.utcnow().isoformat(),
|
|
136
|
-
},
|
|
152
|
+
telemetry_data,
|
|
137
153
|
)
|
|
138
154
|
|
|
139
155
|
@staticmethod
|
|
@@ -177,7 +193,7 @@ class CopilotTelemetry:
|
|
|
177
193
|
total_tokens: int,
|
|
178
194
|
system_message: dict[str, Any],
|
|
179
195
|
chat_history: list[dict[str, Any]],
|
|
180
|
-
last_user_message:
|
|
196
|
+
last_user_message: Optional[str],
|
|
181
197
|
) -> None:
|
|
182
198
|
"""Log a copilot message from the response handler.
|
|
183
199
|
|
rasa/builder/main.py
CHANGED
|
@@ -22,11 +22,9 @@ from rasa.builder.logging_utils import (
|
|
|
22
22
|
log_request_start,
|
|
23
23
|
)
|
|
24
24
|
from rasa.builder.service import bp, setup_project_generator
|
|
25
|
-
from rasa.builder.template_cache import (
|
|
26
|
-
background_download_template_caches,
|
|
27
|
-
)
|
|
28
25
|
from rasa.builder.training_service import try_load_existing_agent, update_agent
|
|
29
26
|
from rasa.core.channels.studio_chat import StudioChatInput
|
|
27
|
+
from rasa.model_manager.warm_rasa_process import warmup
|
|
30
28
|
from rasa.server import configure_cors
|
|
31
29
|
from rasa.utils.common import configure_logging_and_warnings
|
|
32
30
|
from rasa.utils.log_utils import configure_structlog
|
|
@@ -150,16 +148,6 @@ def create_app(project_folder: str) -> Sanic:
|
|
|
150
148
|
except Exception as e:
|
|
151
149
|
structlogger.warning("Failed to load agent on server startup", error=str(e))
|
|
152
150
|
|
|
153
|
-
if config.HELLO_RASA_PROJECT_ID and app.ctx.project_generator.is_empty():
|
|
154
|
-
app.register_listener(background_download_template_caches, "after_server_start")
|
|
155
|
-
else:
|
|
156
|
-
structlogger.debug(
|
|
157
|
-
"builder.main.background_cache_download.disabled",
|
|
158
|
-
event_info=(
|
|
159
|
-
"No hello rasa project id set; skipping background cache download"
|
|
160
|
-
),
|
|
161
|
-
)
|
|
162
|
-
|
|
163
151
|
return app
|
|
164
152
|
|
|
165
153
|
|
|
@@ -200,9 +188,12 @@ def main(project_folder: Optional[str] = None) -> None:
|
|
|
200
188
|
rasa.telemetry.initialize_telemetry()
|
|
201
189
|
rasa.telemetry.initialize_error_reporting(private_mode=False)
|
|
202
190
|
|
|
203
|
-
# TODO: don't do this when running locally
|
|
204
191
|
_apply_llm_overrides_from_builder_env()
|
|
205
192
|
|
|
193
|
+
if config.HELLO_RASA_PROJECT_ID:
|
|
194
|
+
# ensures long import times for modules are ahead of time
|
|
195
|
+
warmup()
|
|
196
|
+
|
|
206
197
|
# working directory needs to be the project folder, e.g.
|
|
207
198
|
# for relative paths (./docs) in a projects config to work
|
|
208
199
|
if not project_folder:
|
|
@@ -62,7 +62,7 @@ class ProjectGenerator:
|
|
|
62
62
|
create_initial_project(self.project_folder.as_posix(), template)
|
|
63
63
|
# If a local cache for this template exists, copy it into the project.
|
|
64
64
|
# We no longer download here to avoid blocking project creation.
|
|
65
|
-
copy_cache_for_template_if_available(template, self.project_folder)
|
|
65
|
+
await copy_cache_for_template_if_available(template, self.project_folder)
|
|
66
66
|
# needs to happen after caching, as we download/copy .rasa and that would
|
|
67
67
|
# overwrite the project info file in .rasa
|
|
68
68
|
ensure_first_used(self.project_folder)
|
rasa/builder/service.py
CHANGED
|
@@ -1155,6 +1155,11 @@ async def copilot(request: Request) -> None:
|
|
|
1155
1155
|
latency_ms=int((time.perf_counter() - start_timestamp) * 1000),
|
|
1156
1156
|
system_message=generation_context.system_message,
|
|
1157
1157
|
chat_history=generation_context.chat_history,
|
|
1158
|
+
last_user_message=(
|
|
1159
|
+
req.last_message.get_text_content()
|
|
1160
|
+
if (req.last_message and req.last_message.role == ROLE_USER)
|
|
1161
|
+
else None
|
|
1162
|
+
),
|
|
1158
1163
|
**copilot_client.usage_statistics.model_dump(),
|
|
1159
1164
|
)
|
|
1160
1165
|
)
|
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
|
```
|