rasa-pro 3.14.0.dev6__py3-none-any.whl → 3.14.0.dev8__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/agents/agent_manager.py +1 -1
- rasa/agents/constants.py +2 -2
- rasa/agents/exceptions.py +31 -1
- rasa/agents/protocol/a2a/a2a_agent.py +385 -227
- rasa/agents/protocol/mcp/mcp_base_agent.py +37 -19
- rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
- rasa/agents/protocol/mcp/mcp_task_agent.py +33 -10
- rasa/agents/schemas/agent_output.py +1 -1
- rasa/agents/utils.py +95 -1
- rasa/agents/validation.py +484 -0
- rasa/api.py +9 -6
- rasa/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +92 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +31 -0
- rasa/builder/copilot/copilot.py +450 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +500 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +210 -0
- rasa/builder/copilot/templated_messages/__init__.py +0 -0
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
- rasa/builder/document_retrieval/__init__.py +0 -0
- rasa/builder/document_retrieval/constants.py +15 -0
- rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
- rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
- rasa/builder/document_retrieval/models.py +62 -0
- rasa/builder/download.py +140 -0
- rasa/builder/exceptions.py +91 -0
- rasa/builder/guardrails/__init__.py +1 -0
- rasa/builder/guardrails/constants.py +9 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/lakera.py +206 -0
- rasa/builder/guardrails/models.py +231 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +328 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +282 -0
- rasa/builder/llm_service.py +246 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +243 -0
- rasa/builder/models.py +216 -0
- rasa/builder/project_generator.py +458 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/scrape_rasa_docs.py +97 -0
- rasa/builder/service.py +1345 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/template_cache.py +244 -0
- rasa/builder/training_service.py +194 -0
- rasa/builder/validation_service.py +97 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/interactive.py +2 -0
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/__init__ +0 -0
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +29 -0
- rasa/cli/project_templates/basic/credentials.yml +33 -0
- rasa/cli/project_templates/basic/data/data.md +9 -0
- rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
- rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
- rasa/cli/project_templates/basic/data/general/help.yml +6 -0
- rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/basic/docs/docs.md +5 -0
- rasa/cli/project_templates/basic/docs/template.txt +28 -0
- rasa/cli/project_templates/basic/domain/domain.md +8 -0
- rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
- rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
- rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
- rasa/cli/project_templates/basic/endpoints.yml +67 -0
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/finance/README.md +25 -0
- rasa/cli/project_templates/finance/actions/__init__.py +46 -0
- rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
- rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
- rasa/cli/project_templates/finance/actions/database.py +277 -0
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
- rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
- rasa/cli/project_templates/finance/config.yml +23 -0
- rasa/cli/project_templates/finance/credentials.yml +32 -0
- rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
- rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
- rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
- rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
- rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
- rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
- rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
- rasa/cli/project_templates/finance/csvs/users.csv +4 -0
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
- rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
- rasa/cli/project_templates/finance/data/data.md +11 -0
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
- rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
- rasa/cli/project_templates/finance/data/general/help.yml +9 -0
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
- rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
- rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
- rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
- rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
- rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
- rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
- rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
- rasa/cli/project_templates/finance/domain/domain.md +10 -0
- rasa/cli/project_templates/finance/domain/general/agent_details.yml +12 -0
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
- rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
- rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
- rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
- rasa/cli/project_templates/finance/endpoints.yml +66 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
- rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
- rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
- rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
- rasa/cli/project_templates/telco/config.yml +29 -0
- rasa/cli/project_templates/telco/credentials.yml +33 -0
- rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
- rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
- rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
- rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
- rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
- rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
- rasa/cli/project_templates/telco/docs/docs.md +5 -0
- rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
- rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
- rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
- rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
- rasa/cli/project_templates/telco/domain/domain.md +14 -0
- rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
- rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
- rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
- rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
- rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
- rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
- rasa/cli/project_templates/telco/domain/shared.yml +129 -0
- rasa/cli/project_templates/telco/endpoints.yml +67 -0
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/scaffold.py +46 -2
- rasa/cli/train.py +2 -0
- rasa/cli/utils.py +85 -1
- rasa/core/actions/action.py +2 -7
- rasa/core/available_agents.py +49 -26
- rasa/core/available_endpoints.py +17 -2
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +2 -22
- rasa/core/channels/inspector/README.md +26 -14
- rasa/core/channels/inspector/dist/assets/{arc-63212852.js → arc-edef10dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-eecf6b13.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-8f798a9a.js → c4Diagram-3d4e48cf-313c08e6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-63aa27d1.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-df71a04c.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9b275968.js → classDiagram-v2-f2320105-f346068d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-5566bae8.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-1c669cad.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b1553799.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-112388d6.js → erDiagram-9861fffd-9813e81c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-fdebec47.js → flowDb-956e92f1-d8ba0870.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-6280ede1.js → flowDiagram-66a62f08-51f0db4d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-32936074.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-e1dc03e5.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-83f68c51.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-22f8666f.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-ca9e6217.js → graph-790ef78b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-c5ceb692.js → index-3862675e-ecdce073.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-d705da80.js +1352 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-faa9999b.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c4dda8d9.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-d4307784.js → layout-837fd3aa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-0567aaa7.js → line-7e05afcb.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-c11b95cf.js → linear-162eb295.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-0c7d3ca9.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-34b433fa.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-4cab816e.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-8c22fa9e.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-70ce9e8e.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-fbcd7fc9.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-45f05ea6.js → stateDiagram-587899a1-41529fd5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-beab1ea6.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-2f29dbd5.js → styles-6aaf32cf-b5b53234.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-951eac83.js → styles-9a916d00-13d138e5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-897fbfdd.js → styles-c10674c1-94cbde3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d667fac1.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e3205144.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-4abeb0e2.js → xychartDiagram-e933f94c-376af5f0.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +2 -2
- rasa/core/channels/inspector/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +42 -44
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +8 -8
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/types.ts +49 -7
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +59 -57
- rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
- rasa/core/channels/voice_stream/asr/azure.py +6 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
- rasa/core/channels/voice_stream/audiocodes.py +3 -0
- rasa/core/channels/voice_stream/browser_audio.py +53 -3
- rasa/core/channels/voice_stream/genesys.py +2 -1
- rasa/core/channels/voice_stream/jambonz.py +9 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
- rasa/core/channels/voice_stream/voice_channel.py +66 -3
- rasa/core/constants.py +6 -0
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +66 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
- rasa/core/policies/enterprise_search_policy.py +4 -7
- rasa/core/policies/flows/flow_executor.py +66 -36
- rasa/core/policies/ted_policy.py +7 -5
- rasa/core/processor.py +32 -0
- rasa/core/redis_connection_factory.py +411 -0
- rasa/core/run.py +13 -3
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +2 -81
- rasa/dialogue_understanding/commands/start_flow_command.py +18 -113
- rasa/dialogue_understanding/commands/utils.py +118 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +10 -5
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +10 -5
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +20 -12
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +19 -12
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +6 -35
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +185 -114
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +18 -24
- rasa/dialogue_understanding/processor/command_processor.py +35 -0
- rasa/dialogue_understanding/stack/utils.py +43 -4
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/engine/graph.py +5 -1
- rasa/engine/recipes/default_components.py +78 -10
- rasa/engine/recipes/default_recipe.py +41 -1
- rasa/engine/storage/local_model_storage.py +83 -3
- rasa/graph_components/validators/default_recipe_validator.py +153 -135
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +1 -1
- rasa/model_manager/socket_bridge.py +20 -15
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/model_manager/warm_rasa_process.py +1 -1
- rasa/model_training.py +22 -6
- rasa/nlu/classifiers/diet_classifier.py +22 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +18 -0
- rasa/nlu/extractors/extractor.py +1 -2
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +74 -0
- rasa/shared/agents/auth/agent_auth_manager.py +86 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +159 -0
- rasa/shared/agents/auth/constants.py +11 -0
- rasa/shared/agents/auth/types.py +11 -0
- rasa/shared/constants.py +3 -0
- rasa/shared/core/constants.py +6 -6
- rasa/shared/core/domain.py +58 -11
- rasa/shared/core/events.py +2 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +6 -0
- rasa/shared/core/flows/steps/call.py +15 -12
- rasa/shared/core/flows/validation.py +238 -44
- rasa/shared/core/flows/yaml_flows_io.py +15 -6
- rasa/shared/core/slots.py +4 -0
- rasa/shared/exceptions.py +12 -0
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/utils.py +77 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/_utils.py +60 -44
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
- rasa/shared/providers/llm/_base_litellm_client.py +2 -2
- rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
- rasa/shared/providers/llm/llm_response.py +4 -4
- rasa/shared/utils/common.py +24 -0
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +2 -1
- rasa/shared/utils/mcp/server_connection.py +108 -27
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/studio/upload.py +16 -47
- rasa/telemetry.py +97 -23
- rasa/tracing/config.py +38 -12
- rasa/tracing/instrumentation/attribute_extractors.py +5 -1
- rasa/tracing/instrumentation/instrumentation.py +85 -8
- rasa/utils/common.py +1 -1
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +5 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/tensorflow/__init__.py +29 -0
- rasa/utils/tensorflow/callback.py +1 -1
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +11 -4
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +41 -6
- rasa/utils/tensorflow/rasa_layers.py +6 -4
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +68 -38
- rasa/validator.py +18 -16
- rasa/version.py +1 -1
- rasa_pro-3.14.0.dev8.dist-info/METADATA +199 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +486 -173
- rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-3e293924.js +0 -1353
- rasa_pro-3.14.0.dev6.dist-info/METADATA +0 -190
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
version: "3.1"
|
|
2
2
|
responses:
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
- text: "Would you like to continue with {{
|
|
4
|
+
utter_ask_continue_interrupted_flow_confirmation:
|
|
5
|
+
- text: "Would you like to continue with {{context.interrupted_flow_options}}?"
|
|
6
|
+
metadata:
|
|
7
|
+
rephrase: True
|
|
8
|
+
template: jinja
|
|
9
|
+
|
|
10
|
+
utter_ask_interrupted_flow_to_continue:
|
|
11
|
+
- text: "Would you like to resume {{context.interrupted_flow_options}}?"
|
|
6
12
|
metadata:
|
|
7
13
|
rephrase: True
|
|
8
14
|
template: jinja
|
|
9
|
-
buttons:
|
|
10
|
-
- title: "Yes"
|
|
11
|
-
payload: "/SetSlots(confirmation_continue_interrupted_flow=true)"
|
|
12
|
-
- title: "No"
|
|
13
|
-
payload: "/SetSlots(confirmation_continue_interrupted_flow=false)"
|
|
14
15
|
|
|
15
16
|
utter_ask_rephrase:
|
|
16
17
|
- text: I’m sorry I am unable to understand you, could you please rephrase?
|
|
@@ -86,7 +87,7 @@ responses:
|
|
|
86
87
|
rephrase: True
|
|
87
88
|
|
|
88
89
|
utter_inform_hangup:
|
|
89
|
-
- text:
|
|
90
|
+
- text: I haven’t heard from you, so I’ll end our conversation shortly.
|
|
90
91
|
metadata:
|
|
91
92
|
rephrase: True
|
|
92
93
|
|
|
@@ -129,19 +130,14 @@ slots:
|
|
|
129
130
|
type: float
|
|
130
131
|
initial_value: 0.0
|
|
131
132
|
max_value: 1000000
|
|
132
|
-
interrupted_flows:
|
|
133
|
-
type: list
|
|
134
|
-
multiple_flows_interrupted:
|
|
135
|
-
type: bool
|
|
136
|
-
initial_value: false
|
|
137
|
-
confirmation_continue_interrupted_flow:
|
|
138
|
-
type: bool
|
|
139
|
-
mappings:
|
|
140
|
-
- type: from_llm
|
|
141
133
|
interrupted_flow_to_continue:
|
|
142
134
|
type: text
|
|
143
135
|
mappings:
|
|
144
136
|
- type: from_llm
|
|
137
|
+
continue_interrupted_flow_confirmation:
|
|
138
|
+
type: bool
|
|
139
|
+
mappings:
|
|
140
|
+
- type: from_llm
|
|
145
141
|
|
|
146
142
|
flows:
|
|
147
143
|
pattern_cancel_flow:
|
|
@@ -228,10 +224,9 @@ flows:
|
|
|
228
224
|
description: Conversation repair flow for managing when users switch between different flows
|
|
229
225
|
name: pattern continue interrupted
|
|
230
226
|
steps:
|
|
231
|
-
- action: action_set_interrupted_flows
|
|
232
227
|
- noop: true
|
|
233
228
|
next:
|
|
234
|
-
- if:
|
|
229
|
+
- if: context.multiple_flows_interrupted
|
|
235
230
|
then:
|
|
236
231
|
- collect: interrupted_flow_to_continue
|
|
237
232
|
description: "Fill this slot with the name of the flow the user wants to continue. If the user does not want to continue any of the interrupted flows, fill this slot with 'none'."
|
|
@@ -241,19 +236,18 @@ flows:
|
|
|
241
236
|
- action: action_continue_interrupted_flow
|
|
242
237
|
next: END
|
|
243
238
|
- else:
|
|
244
|
-
- action:
|
|
239
|
+
- action: action_cancel_interrupted_flows
|
|
245
240
|
next: END
|
|
246
241
|
- else:
|
|
247
|
-
- collect:
|
|
242
|
+
- collect: continue_interrupted_flow_confirmation
|
|
248
243
|
description: "If the user wants to continue the interrupted flow, fill this slot with true. If the user does not want to continue the interrupted flow, fill this slot with false."
|
|
249
|
-
utter: utter_ask_continue_interrupted_flow
|
|
250
244
|
next:
|
|
251
|
-
- if: slots.
|
|
245
|
+
- if: slots.continue_interrupted_flow_confirmation
|
|
252
246
|
then:
|
|
253
247
|
- action: action_continue_interrupted_flow
|
|
254
248
|
next: END
|
|
255
249
|
- else:
|
|
256
|
-
- action:
|
|
250
|
+
- action: action_cancel_interrupted_flows
|
|
257
251
|
next: END
|
|
258
252
|
|
|
259
253
|
pattern_correction:
|
|
@@ -2,16 +2,22 @@ from typing import Dict, List, Optional, Set, Type
|
|
|
2
2
|
|
|
3
3
|
import structlog
|
|
4
4
|
|
|
5
|
+
from rasa.agents.utils import (
|
|
6
|
+
is_agent_completed,
|
|
7
|
+
is_agent_valid,
|
|
8
|
+
)
|
|
5
9
|
from rasa.dialogue_understanding.commands import (
|
|
6
10
|
CancelFlowCommand,
|
|
7
11
|
CannotHandleCommand,
|
|
8
12
|
ChitChatAnswerCommand,
|
|
9
13
|
ClarifyCommand,
|
|
10
14
|
Command,
|
|
15
|
+
ContinueAgentCommand,
|
|
11
16
|
CorrectedSlot,
|
|
12
17
|
CorrectSlotsCommand,
|
|
13
18
|
FreeFormAnswerCommand,
|
|
14
19
|
RepeatBotMessagesCommand,
|
|
20
|
+
RestartAgentCommand,
|
|
15
21
|
SetSlotCommand,
|
|
16
22
|
StartFlowCommand,
|
|
17
23
|
)
|
|
@@ -461,6 +467,35 @@ def clean_up_commands(
|
|
|
461
467
|
"drop_clarify_given_other_commands",
|
|
462
468
|
command=command,
|
|
463
469
|
)
|
|
470
|
+
|
|
471
|
+
# Keep the Restart agent commands only if the command is referencing
|
|
472
|
+
# a valid agent that was already completed
|
|
473
|
+
elif isinstance(command, RestartAgentCommand):
|
|
474
|
+
if not is_agent_valid(command.agent_id):
|
|
475
|
+
structlogger.debug(
|
|
476
|
+
"command_processor.clean_up_commands.skip_restart_agent_invalid_agent",
|
|
477
|
+
agent_id=command.agent_id,
|
|
478
|
+
command=command,
|
|
479
|
+
)
|
|
480
|
+
elif not is_agent_completed(tracker, command.agent_id):
|
|
481
|
+
structlogger.debug(
|
|
482
|
+
"command_processor.clean_up_commands.skip_restart_agent_not_completed",
|
|
483
|
+
agent_id=command.agent_id,
|
|
484
|
+
command=command,
|
|
485
|
+
)
|
|
486
|
+
else:
|
|
487
|
+
clean_commands.append(command)
|
|
488
|
+
|
|
489
|
+
# Clean up Continue agent commands if there is currently no active agent
|
|
490
|
+
elif isinstance(command, ContinueAgentCommand):
|
|
491
|
+
if not tracker.stack.agent_is_active():
|
|
492
|
+
structlogger.debug(
|
|
493
|
+
"command_processor.clean_up_commands.skip_continue_agent_no_active_agent",
|
|
494
|
+
command=command,
|
|
495
|
+
)
|
|
496
|
+
else:
|
|
497
|
+
clean_commands.append(command)
|
|
498
|
+
|
|
464
499
|
else:
|
|
465
500
|
clean_commands.append(command)
|
|
466
501
|
|
|
@@ -17,6 +17,9 @@ from rasa.shared.core.flows.steps.constants import END_STEP
|
|
|
17
17
|
from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
|
|
18
18
|
|
|
19
19
|
if typing.TYPE_CHECKING:
|
|
20
|
+
from rasa.dialogue_understanding.patterns.continue_interrupted import (
|
|
21
|
+
ContinueInterruptedPatternFlowStackFrame,
|
|
22
|
+
)
|
|
20
23
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
21
24
|
|
|
22
25
|
|
|
@@ -171,10 +174,40 @@ def user_flows_on_the_stack(dialogue_stack: DialogueStack) -> Set[str]:
|
|
|
171
174
|
All user flows that are currently on the stack.
|
|
172
175
|
"""
|
|
173
176
|
return {
|
|
174
|
-
|
|
177
|
+
frame.flow_id
|
|
178
|
+
for frame in user_frames_on_the_stack(
|
|
179
|
+
dialogue_stack, ignore_call_and_link_frames=False
|
|
180
|
+
)
|
|
175
181
|
}
|
|
176
182
|
|
|
177
183
|
|
|
184
|
+
def user_frames_on_the_stack(
|
|
185
|
+
dialogue_stack: DialogueStack, ignore_call_and_link_frames: bool = True
|
|
186
|
+
) -> List[UserFlowStackFrame]:
|
|
187
|
+
"""Get all user frames that are currently on the stack.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
dialogue_stack: The dialogue stack.
|
|
191
|
+
ignore_call_and_link_frames: Whether to ignore user frames of type `call`
|
|
192
|
+
and `link`. By default, these frames are ignored.
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
All user frames that are currently on the stack.
|
|
196
|
+
"""
|
|
197
|
+
return [
|
|
198
|
+
frame
|
|
199
|
+
for frame in dialogue_stack.frames
|
|
200
|
+
if isinstance(frame, UserFlowStackFrame)
|
|
201
|
+
and (
|
|
202
|
+
not ignore_call_and_link_frames
|
|
203
|
+
or (
|
|
204
|
+
frame.frame_type != FlowStackFrameType.CALL
|
|
205
|
+
and frame.frame_type != FlowStackFrameType.LINK
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
|
|
178
211
|
def end_top_user_flow(stack: DialogueStack) -> DialogueStack:
|
|
179
212
|
"""Ends all frames on top of the stack including the topmost user frame.
|
|
180
213
|
|
|
@@ -235,13 +268,19 @@ def get_collect_steps_excluding_ask_before_filling_for_active_flow(
|
|
|
235
268
|
|
|
236
269
|
def is_continue_interrupted_flow_active(stack: DialogueStack) -> bool:
|
|
237
270
|
"""Check if the continue interrupted flow is active."""
|
|
271
|
+
return get_active_continue_interrupted_pattern_frame(stack) is not None
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def get_active_continue_interrupted_pattern_frame(
|
|
275
|
+
stack: DialogueStack,
|
|
276
|
+
) -> Optional["ContinueInterruptedPatternFlowStackFrame"]:
|
|
238
277
|
from rasa.dialogue_understanding.patterns.continue_interrupted import (
|
|
239
278
|
ContinueInterruptedPatternFlowStackFrame,
|
|
240
279
|
)
|
|
241
280
|
|
|
242
281
|
for frame in reversed(stack.frames):
|
|
243
282
|
if isinstance(frame, ContinueInterruptedPatternFlowStackFrame):
|
|
244
|
-
return
|
|
283
|
+
return frame
|
|
245
284
|
if isinstance(frame, UserFlowStackFrame):
|
|
246
|
-
return
|
|
247
|
-
return
|
|
285
|
+
return None
|
|
286
|
+
return None
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import typing
|
|
1
2
|
from contextlib import contextmanager
|
|
2
3
|
from typing import Any, Dict, Generator, List, Optional, Text
|
|
3
4
|
|
|
4
5
|
import structlog
|
|
5
6
|
|
|
6
|
-
from rasa.dialogue_understanding.commands import Command, NoopCommand, SetSlotCommand
|
|
7
7
|
from rasa.dialogue_understanding.constants import (
|
|
8
8
|
RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME,
|
|
9
9
|
)
|
|
@@ -23,6 +23,9 @@ from rasa.shared.nlu.training_data.message import Message
|
|
|
23
23
|
from rasa.shared.providers.llm.llm_response import LLMResponse
|
|
24
24
|
from rasa.utils.common import get_bool_env_variable
|
|
25
25
|
|
|
26
|
+
if typing.TYPE_CHECKING:
|
|
27
|
+
from rasa.dialogue_understanding.commands import Command
|
|
28
|
+
|
|
26
29
|
record_commands_and_prompts = get_bool_env_variable(
|
|
27
30
|
RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME, False
|
|
28
31
|
)
|
|
@@ -41,7 +44,7 @@ def set_record_commands_and_prompts() -> Generator:
|
|
|
41
44
|
|
|
42
45
|
|
|
43
46
|
def add_commands_to_message_parse_data(
|
|
44
|
-
message: Message, component_name: str, commands: List[Command]
|
|
47
|
+
message: Message, component_name: str, commands: List["Command"]
|
|
45
48
|
) -> None:
|
|
46
49
|
"""Add commands to the message parse data.
|
|
47
50
|
|
|
@@ -144,6 +147,11 @@ def _handle_via_nlu_in_coexistence(
|
|
|
144
147
|
tracker: Optional[DialogueStateTracker], message: Message
|
|
145
148
|
) -> bool:
|
|
146
149
|
"""Check if the message should be handled by the NLU subsystem in coexistence mode.""" # noqa: E501
|
|
150
|
+
from rasa.dialogue_understanding.commands import (
|
|
151
|
+
NoopCommand,
|
|
152
|
+
SetSlotCommand,
|
|
153
|
+
)
|
|
154
|
+
|
|
147
155
|
if not tracker:
|
|
148
156
|
return False
|
|
149
157
|
|
|
@@ -156,8 +164,7 @@ def _handle_via_nlu_in_coexistence(
|
|
|
156
164
|
"utils.handle_via_nlu_in_coexistence"
|
|
157
165
|
".tracker_missing_route_session_to_calm_slot",
|
|
158
166
|
event_info=(
|
|
159
|
-
f"Tracker doesn't have the '{ROUTE_TO_CALM_SLOT}' slot."
|
|
160
|
-
f"Routing to CALM."
|
|
167
|
+
f"Tracker doesn't have the '{ROUTE_TO_CALM_SLOT}' slot.Routing to CALM."
|
|
161
168
|
),
|
|
162
169
|
route_session_to_calm=commands,
|
|
163
170
|
)
|
|
@@ -218,3 +225,16 @@ def _handle_via_nlu_in_coexistence(
|
|
|
218
225
|
commands=commands,
|
|
219
226
|
)
|
|
220
227
|
return False
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def assemble_options_string(names: List[str], conjunction: str = "and") -> str:
|
|
231
|
+
"""Concatenate options to a human-readable string."""
|
|
232
|
+
option_message = ""
|
|
233
|
+
for i, name in enumerate(names):
|
|
234
|
+
if i == 0:
|
|
235
|
+
option_message += name
|
|
236
|
+
elif i == len(names) - 1:
|
|
237
|
+
option_message += f" {conjunction} {name}"
|
|
238
|
+
else:
|
|
239
|
+
option_message += f", {name}"
|
|
240
|
+
return option_message
|
rasa/engine/graph.py
CHANGED
|
@@ -69,6 +69,7 @@ class SchemaNode:
|
|
|
69
69
|
|
|
70
70
|
def matches_type(self, node_type: Type, include_subtypes: bool = True) -> bool:
|
|
71
71
|
"""Checks if schema node's 'uses' is of specified node type.
|
|
72
|
+
|
|
72
73
|
By default, it also checks for subtypes of the specified node type.
|
|
73
74
|
"""
|
|
74
75
|
return (self.uses is node_type) or (
|
|
@@ -171,6 +172,7 @@ class GraphSchema:
|
|
|
171
172
|
|
|
172
173
|
def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
|
|
173
174
|
"""Checks if the graph schema contains a node of the specified node type.
|
|
175
|
+
|
|
174
176
|
By default, it also checks for subtypes of the specified node type.
|
|
175
177
|
"""
|
|
176
178
|
for node in self.nodes.values():
|
|
@@ -181,7 +183,7 @@ class GraphSchema:
|
|
|
181
183
|
def count_nodes_of_a_given_type(
|
|
182
184
|
self, node_type: Type, include_subtypes: bool = True
|
|
183
185
|
) -> int:
|
|
184
|
-
"""Counts the number of the nodes of specified class"""
|
|
186
|
+
"""Counts the number of the nodes of specified class."""
|
|
185
187
|
counter = 0
|
|
186
188
|
for node in self.nodes.values():
|
|
187
189
|
if (node.uses is node_type) or (
|
|
@@ -353,6 +355,7 @@ class ExecutionContext:
|
|
|
353
355
|
|
|
354
356
|
def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
|
|
355
357
|
"""Checks if the graph node of the given type is present in the graph schema.
|
|
358
|
+
|
|
356
359
|
By default, it also checks for subtypes of the specified node type.
|
|
357
360
|
"""
|
|
358
361
|
return self.graph_schema.has_node(node_type, include_subtypes)
|
|
@@ -555,6 +558,7 @@ class GraphNode:
|
|
|
555
558
|
structlogger.error(
|
|
556
559
|
"graph.node.error_running_component",
|
|
557
560
|
node_name=self._node_name,
|
|
561
|
+
error=str(e),
|
|
558
562
|
)
|
|
559
563
|
raise
|
|
560
564
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from rasa.core.policies.enterprise_search_policy import EnterpriseSearchPolicy
|
|
2
2
|
from rasa.core.policies.flow_policy import FlowPolicy
|
|
3
3
|
from rasa.core.policies.intentless_policy import IntentlessPolicy
|
|
4
|
-
from rasa.core.policies.memoization import AugmentedMemoizationPolicy
|
|
4
|
+
from rasa.core.policies.memoization import AugmentedMemoizationPolicy, MemoizationPolicy
|
|
5
|
+
from rasa.core.policies.rule_policy import RulePolicy
|
|
5
6
|
from rasa.dialogue_understanding.coexistence.intent_based_router import (
|
|
6
7
|
IntentBasedRouter,
|
|
7
8
|
)
|
|
@@ -10,6 +11,7 @@ from rasa.dialogue_understanding.generator import (
|
|
|
10
11
|
LLMCommandGenerator,
|
|
11
12
|
)
|
|
12
13
|
from rasa.dialogue_understanding.generator.nlu_command_adapter import NLUCommandAdapter
|
|
14
|
+
from rasa.engine.graph import GraphComponent
|
|
13
15
|
from rasa.nlu.classifiers.fallback_classifier import FallbackClassifier
|
|
14
16
|
from rasa.nlu.classifiers.keyword_intent_classifier import KeywordIntentClassifier
|
|
15
17
|
from rasa.nlu.classifiers.logistic_regression_classifier import (
|
|
@@ -17,6 +19,7 @@ from rasa.nlu.classifiers.logistic_regression_classifier import (
|
|
|
17
19
|
)
|
|
18
20
|
from rasa.nlu.classifiers.mitie_intent_classifier import MitieIntentClassifier
|
|
19
21
|
from rasa.nlu.classifiers.sklearn_intent_classifier import SklearnIntentClassifier
|
|
22
|
+
from rasa.nlu.extractors.crf_entity_extractor import CRFEntityExtractor
|
|
20
23
|
from rasa.nlu.extractors.duckling_entity_extractor import DucklingEntityExtractor
|
|
21
24
|
from rasa.nlu.extractors.entity_synonyms import EntitySynonymMapper
|
|
22
25
|
from rasa.nlu.extractors.mitie_entity_extractor import MitieEntityExtractor
|
|
@@ -37,10 +40,30 @@ from rasa.nlu.tokenizers.spacy_tokenizer import SpacyTokenizer
|
|
|
37
40
|
from rasa.nlu.tokenizers.whitespace_tokenizer import WhitespaceTokenizer
|
|
38
41
|
from rasa.nlu.utils.mitie_utils import MitieNLP
|
|
39
42
|
from rasa.nlu.utils.spacy_utils import SpacyNLP
|
|
43
|
+
from rasa.shared.utils.common import conditional_import
|
|
44
|
+
|
|
45
|
+
# Conditional imports for TensorFlow-dependent components
|
|
46
|
+
TEDPolicy, TED_POLICY_AVAILABLE = conditional_import(
|
|
47
|
+
"rasa.core.policies.ted_policy", "TEDPolicy"
|
|
48
|
+
)
|
|
49
|
+
UnexpecTEDIntentPolicy, UNEXPECTED_INTENT_POLICY_AVAILABLE = conditional_import(
|
|
50
|
+
"rasa.core.policies.unexpected_intent_policy", "UnexpecTEDIntentPolicy"
|
|
51
|
+
)
|
|
52
|
+
DIETClassifier, DIET_CLASSIFIER_AVAILABLE = conditional_import(
|
|
53
|
+
"rasa.nlu.classifiers.diet_classifier", "DIETClassifier"
|
|
54
|
+
)
|
|
55
|
+
ConveRTFeaturizer, CONVERT_FEATURIZER_AVAILABLE = conditional_import(
|
|
56
|
+
"rasa.nlu.featurizers.dense_featurizer.convert_featurizer", "ConveRTFeaturizer"
|
|
57
|
+
)
|
|
58
|
+
LanguageModelFeaturizer, LANGUAGE_MODEL_FEATURIZER_AVAILABLE = conditional_import(
|
|
59
|
+
"rasa.nlu.featurizers.dense_featurizer.lm_featurizer", "LanguageModelFeaturizer"
|
|
60
|
+
)
|
|
61
|
+
ResponseSelector, RESPONSE_SELECTOR_AVAILABLE = conditional_import(
|
|
62
|
+
"rasa.nlu.selectors.response_selector", "ResponseSelector"
|
|
63
|
+
)
|
|
40
64
|
|
|
41
65
|
DEFAULT_COMPONENTS = [
|
|
42
66
|
# Message Classifiers
|
|
43
|
-
# DIETClassifier,
|
|
44
67
|
FallbackClassifier,
|
|
45
68
|
KeywordIntentClassifier,
|
|
46
69
|
MitieIntentClassifier,
|
|
@@ -51,9 +74,8 @@ DEFAULT_COMPONENTS = [
|
|
|
51
74
|
LLMBasedRouter,
|
|
52
75
|
IntentBasedRouter,
|
|
53
76
|
# Response Selectors
|
|
54
|
-
# ResponseSelector,
|
|
55
77
|
# Message Entity Extractors
|
|
56
|
-
|
|
78
|
+
CRFEntityExtractor,
|
|
57
79
|
DucklingEntityExtractor,
|
|
58
80
|
EntitySynonymMapper,
|
|
59
81
|
MitieEntityExtractor,
|
|
@@ -61,11 +83,9 @@ DEFAULT_COMPONENTS = [
|
|
|
61
83
|
RegexEntityExtractor,
|
|
62
84
|
# Message Feauturizers
|
|
63
85
|
LexicalSyntacticFeaturizer,
|
|
64
|
-
# ConveRTFeaturizer,
|
|
65
86
|
MitieFeaturizer,
|
|
66
87
|
SpacyFeaturizer,
|
|
67
88
|
CountVectorsFeaturizer,
|
|
68
|
-
# LanguageModelFeaturizer,
|
|
69
89
|
RegexFeaturizer,
|
|
70
90
|
# Tokenizers
|
|
71
91
|
JiebaTokenizer,
|
|
@@ -76,12 +96,60 @@ DEFAULT_COMPONENTS = [
|
|
|
76
96
|
MitieNLP,
|
|
77
97
|
SpacyNLP,
|
|
78
98
|
# Dialogue Management Policies
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
# RulePolicy,
|
|
82
|
-
# MemoizationPolicy,
|
|
99
|
+
RulePolicy,
|
|
100
|
+
MemoizationPolicy,
|
|
83
101
|
AugmentedMemoizationPolicy,
|
|
84
102
|
FlowPolicy,
|
|
85
103
|
EnterpriseSearchPolicy,
|
|
86
104
|
IntentlessPolicy,
|
|
87
105
|
]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class ComponentInserter:
|
|
109
|
+
"""Manages insertion of components at specific positions with index adjustment."""
|
|
110
|
+
|
|
111
|
+
def __init__(self, insertion_points: dict[str, int]):
|
|
112
|
+
self.insertion_points = insertion_points
|
|
113
|
+
self.insertion_counts = {category: 0 for category in insertion_points}
|
|
114
|
+
|
|
115
|
+
def insert_if_available(
|
|
116
|
+
self, component: GraphComponent, is_available: bool, category: str
|
|
117
|
+
) -> None:
|
|
118
|
+
"""Insert a component at the appropriate position if available."""
|
|
119
|
+
if is_available and component is not None:
|
|
120
|
+
# Calculate the adjusted index based on insertions in earlier categories
|
|
121
|
+
adjusted_index = self.insertion_points[category]
|
|
122
|
+
for cat, count in self.insertion_counts.items():
|
|
123
|
+
if self.insertion_points[cat] < self.insertion_points[category]:
|
|
124
|
+
adjusted_index += count
|
|
125
|
+
|
|
126
|
+
DEFAULT_COMPONENTS.insert(adjusted_index, component)
|
|
127
|
+
self.insertion_counts[category] += 1
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# Define insertion points by component category to preserve order
|
|
131
|
+
INSERTION_POINTS = {
|
|
132
|
+
"classifiers": 1,
|
|
133
|
+
"response_selectors": 11,
|
|
134
|
+
"featurizers": 20,
|
|
135
|
+
"policies": 35,
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
# Create inserter instance
|
|
139
|
+
inserter = ComponentInserter(INSERTION_POINTS)
|
|
140
|
+
|
|
141
|
+
# Conditionally add TensorFlow-dependent components
|
|
142
|
+
inserter.insert_if_available(DIETClassifier, DIET_CLASSIFIER_AVAILABLE, "classifiers")
|
|
143
|
+
inserter.insert_if_available(
|
|
144
|
+
ResponseSelector, RESPONSE_SELECTOR_AVAILABLE, "response_selectors"
|
|
145
|
+
)
|
|
146
|
+
inserter.insert_if_available(
|
|
147
|
+
ConveRTFeaturizer, CONVERT_FEATURIZER_AVAILABLE, "featurizers"
|
|
148
|
+
)
|
|
149
|
+
inserter.insert_if_available(
|
|
150
|
+
LanguageModelFeaturizer, LANGUAGE_MODEL_FEATURIZER_AVAILABLE, "featurizers"
|
|
151
|
+
)
|
|
152
|
+
inserter.insert_if_available(TEDPolicy, TED_POLICY_AVAILABLE, "policies")
|
|
153
|
+
inserter.insert_if_available(
|
|
154
|
+
UnexpecTEDIntentPolicy, UNEXPECTED_INTENT_POLICY_AVAILABLE, "policies"
|
|
155
|
+
)
|
|
@@ -5,6 +5,7 @@ import dataclasses
|
|
|
5
5
|
import enum
|
|
6
6
|
import logging
|
|
7
7
|
import math
|
|
8
|
+
import sys
|
|
8
9
|
from enum import Enum
|
|
9
10
|
from typing import Any, Callable, Dict, List, Optional, Set, Text, Tuple, Type, Union
|
|
10
11
|
|
|
@@ -180,7 +181,14 @@ class DefaultV1Recipe(Recipe):
|
|
|
180
181
|
@classmethod
|
|
181
182
|
def _from_registry(cls, name: Text) -> RegisteredComponent:
|
|
182
183
|
# Importing all the default Rasa components will automatically register them
|
|
183
|
-
from rasa.engine.recipes.default_components import
|
|
184
|
+
from rasa.engine.recipes.default_components import (
|
|
185
|
+
CONVERT_FEATURIZER_AVAILABLE,
|
|
186
|
+
DIET_CLASSIFIER_AVAILABLE,
|
|
187
|
+
LANGUAGE_MODEL_FEATURIZER_AVAILABLE,
|
|
188
|
+
RESPONSE_SELECTOR_AVAILABLE,
|
|
189
|
+
TED_POLICY_AVAILABLE,
|
|
190
|
+
UNEXPECTED_INTENT_POLICY_AVAILABLE,
|
|
191
|
+
)
|
|
184
192
|
|
|
185
193
|
if name in cls._registered_components:
|
|
186
194
|
return cls._registered_components[name]
|
|
@@ -190,6 +198,38 @@ class DefaultV1Recipe(Recipe):
|
|
|
190
198
|
if clazz.__name__ in cls._registered_components:
|
|
191
199
|
return cls._registered_components[clazz.__name__]
|
|
192
200
|
|
|
201
|
+
# Check Python version compatibility for TensorFlow components
|
|
202
|
+
# TensorFlow support was removed for Python 3.12+ due to compatibility issues
|
|
203
|
+
if sys.version_info >= (3, 12):
|
|
204
|
+
raise InvalidConfigException(
|
|
205
|
+
f"{name} is not available on Python 3.12+. "
|
|
206
|
+
"TensorFlow support has been removed for Python 3.12+ versions. "
|
|
207
|
+
"Please use Python 3.11 or earlier for TensorFlow-based components. "
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# Check for TensorFlow components that failed to load
|
|
211
|
+
# because conditional module import of those components did not succeed
|
|
212
|
+
tensorflow_component_availability = {
|
|
213
|
+
"DIETClassifier": DIET_CLASSIFIER_AVAILABLE,
|
|
214
|
+
"TEDPolicy": TED_POLICY_AVAILABLE,
|
|
215
|
+
"UnexpecTEDIntentPolicy": UNEXPECTED_INTENT_POLICY_AVAILABLE,
|
|
216
|
+
"ResponseSelector": RESPONSE_SELECTOR_AVAILABLE,
|
|
217
|
+
"ConveRTFeaturizer": CONVERT_FEATURIZER_AVAILABLE,
|
|
218
|
+
"LanguageModelFeaturizer": LANGUAGE_MODEL_FEATURIZER_AVAILABLE,
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if name in tensorflow_component_availability:
|
|
222
|
+
# TensorFlow-dependent component failed to load
|
|
223
|
+
# if TensorFlow is not available
|
|
224
|
+
if not tensorflow_component_availability[name]:
|
|
225
|
+
raise InvalidConfigException(
|
|
226
|
+
f"{name} requires TensorFlow. "
|
|
227
|
+
"Please install it with: "
|
|
228
|
+
"`pip install rasa[tensorflow]`. "
|
|
229
|
+
"If using poetry, install it with "
|
|
230
|
+
"`poetry install --extras tensorflow`."
|
|
231
|
+
)
|
|
232
|
+
|
|
193
233
|
raise InvalidConfigException(
|
|
194
234
|
f"Can't load class for name '{name}'. Please make sure to provide "
|
|
195
235
|
f"a valid name or module path and to register it using the "
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
import os
|
|
4
5
|
import shutil
|
|
5
6
|
import sys
|
|
7
|
+
import tarfile
|
|
6
8
|
import tempfile
|
|
7
9
|
import uuid
|
|
8
10
|
from contextlib import contextmanager
|
|
9
11
|
from datetime import datetime
|
|
10
12
|
from pathlib import Path
|
|
11
|
-
from typing import Generator, Optional, Text, Tuple, Union
|
|
13
|
+
from typing import Callable, Generator, List, Optional, Text, Tuple, Union
|
|
12
14
|
|
|
13
15
|
from tarsafe import TarSafe
|
|
14
16
|
|
|
@@ -57,6 +59,35 @@ def windows_safe_temporary_directory(
|
|
|
57
59
|
yield temporary_directory
|
|
58
60
|
|
|
59
61
|
|
|
62
|
+
def filter_normpath(member: tarfile.TarInfo, dest_path: str) -> tarfile.TarInfo:
|
|
63
|
+
"""Normalize tar member paths for safe extraction"""
|
|
64
|
+
if member.name:
|
|
65
|
+
member.name = os.path.normpath(member.name)
|
|
66
|
+
return member
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
FilterFunction = Callable[[tarfile.TarInfo, str], Optional[tarfile.TarInfo]]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def create_combined_filter(existing_filter: Optional[FilterFunction]) -> FilterFunction:
|
|
73
|
+
"""Create a filter that combines existing filter with path normalization"""
|
|
74
|
+
|
|
75
|
+
def combined_filter(
|
|
76
|
+
member: tarfile.TarInfo, dest_path: str
|
|
77
|
+
) -> Optional[tarfile.TarInfo]:
|
|
78
|
+
"""Apply existing filter first, then path normalization"""
|
|
79
|
+
if existing_filter is not None:
|
|
80
|
+
filtered_member = existing_filter(member, dest_path)
|
|
81
|
+
if filtered_member is None:
|
|
82
|
+
return None # Rejected by existing filter
|
|
83
|
+
member = filtered_member # Use the filtered result
|
|
84
|
+
|
|
85
|
+
# Apply our path normalization
|
|
86
|
+
return filter_normpath(member, dest_path)
|
|
87
|
+
|
|
88
|
+
return combined_filter
|
|
89
|
+
|
|
90
|
+
|
|
60
91
|
class LocalModelStorage(ModelStorage):
|
|
61
92
|
"""Stores and provides output of `GraphComponents` on local disk."""
|
|
62
93
|
|
|
@@ -122,9 +153,29 @@ class LocalModelStorage(ModelStorage):
|
|
|
122
153
|
# this restriction in environments where it's not possible
|
|
123
154
|
# to override this behavior, mostly for internal policy reasons
|
|
124
155
|
# reference: https://stackoverflow.com/a/49102229
|
|
125
|
-
|
|
156
|
+
try:
|
|
157
|
+
# Use extraction filter to normalize paths for compatibility
|
|
158
|
+
# before trying the \\?\ prefix approach first
|
|
159
|
+
prev_filter = getattr(tar, "extraction_filter", None)
|
|
160
|
+
tar.extraction_filter = create_combined_filter(prev_filter)
|
|
161
|
+
tar.extractall(
|
|
162
|
+
f"\\\\?\\{temporary_directory}",
|
|
163
|
+
members=yield_safe_members(tar.getmembers()),
|
|
164
|
+
)
|
|
165
|
+
except Exception:
|
|
166
|
+
# Fallback for Python versions with tarfile security fix
|
|
167
|
+
logger.warning(
|
|
168
|
+
"Failed to extract model archive with long path support. "
|
|
169
|
+
"Falling back to regular extraction."
|
|
170
|
+
)
|
|
171
|
+
tar.extractall(
|
|
172
|
+
temporary_directory,
|
|
173
|
+
members=yield_safe_members(tar.getmembers()),
|
|
174
|
+
)
|
|
126
175
|
else:
|
|
127
|
-
tar.extractall(
|
|
176
|
+
tar.extractall(
|
|
177
|
+
temporary_directory, members=yield_safe_members(tar.getmembers())
|
|
178
|
+
)
|
|
128
179
|
LocalModelStorage._assert_not_rasa2_archive(temporary_directory)
|
|
129
180
|
|
|
130
181
|
@staticmethod
|
|
@@ -244,3 +295,32 @@ class LocalModelStorage(ModelStorage):
|
|
|
244
295
|
core_target=model_configuration.core_target,
|
|
245
296
|
nlu_target=model_configuration.nlu_target,
|
|
246
297
|
)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def yield_safe_members(
|
|
301
|
+
members: List[tarfile.TarInfo],
|
|
302
|
+
) -> Generator[tarfile.TarInfo, None, None]:
|
|
303
|
+
"""
|
|
304
|
+
Filter function for tar.extractall members parameter.
|
|
305
|
+
Validates each member and yields only safe ones.
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
members: Iterator of TarInfo objects from tar.getmembers()
|
|
309
|
+
|
|
310
|
+
Yields:
|
|
311
|
+
TarInfo: Safe members to extract
|
|
312
|
+
"""
|
|
313
|
+
for member in members:
|
|
314
|
+
# Skip absolute paths
|
|
315
|
+
if Path(member.name).is_absolute():
|
|
316
|
+
continue
|
|
317
|
+
|
|
318
|
+
# Skip paths with directory traversal sequences
|
|
319
|
+
if ".." in member.name or "\\.." in member.name:
|
|
320
|
+
continue
|
|
321
|
+
|
|
322
|
+
# Skip special file types unless you need them
|
|
323
|
+
if member.isdev() or member.issym():
|
|
324
|
+
continue
|
|
325
|
+
|
|
326
|
+
yield member
|