rasa-pro 3.14.0.dev7__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/protocol/a2a/a2a_agent.py +385 -227
- rasa/agents/protocol/mcp/mcp_base_agent.py +30 -13
- rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
- rasa/agents/protocol/mcp/mcp_task_agent.py +32 -9
- rasa/agents/schemas/agent_output.py +1 -1
- rasa/agents/utils.py +90 -1
- 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/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/core/actions/action.py +0 -1
- rasa/core/available_agents.py +2 -0
- 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-cce7e0a8.js → arc-edef10dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-e2a49be7.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-3def7895.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-e66fe4df.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-eb874aaa.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-cf934643.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-8fdf9155.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-6106fb96.js → erDiagram-9861fffd-9813e81c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4c2bb040.js → flowDb-956e92f1-d8ba0870.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f0ff96af.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-a21707ec.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-c165acb1.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-b0564cf1.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-e557e67a.js → graph-790ef78b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-1ce60e9e.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-893569e2.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c29c864f.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-649a5eae.js → layout-837fd3aa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-0e5685ed.js → line-7e05afcb.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-eaa320bd.js → linear-162eb295.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-f35df9e6.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78339e96.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-9b5f2f14.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d05ddb3a.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-d9be5dfd.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0f1c4348.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-9ddf63b3.js → stateDiagram-587899a1-41529fd5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-bc2b81ed.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0a287936.js → styles-6aaf32cf-b5b53234.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-e3941990.js → styles-9a916d00-13d138e5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-ce4eca24.js → styles-c10674c1-94cbde3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d822b1a8.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e144c7a7.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-ab7f4e14.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 +16 -42
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- rasa/core/channels/inspector/src/components/DialogueHistoryStack.tsx +1 -0
- 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/types.ts +32 -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 +14 -5
- 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/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/default_flows_for_patterns.yml +1 -1
- rasa/dialogue_understanding/processor/command_processor.py +35 -0
- 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 +14 -0
- 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/core/constants.py +1 -0
- 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/llm.py +2 -1
- rasa/shared/utils/mcp/server_connection.py +84 -23
- 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.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +466 -156
- rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-996fe816.js +0 -1353
- rasa_pro-3.14.0.dev7.dist-info/METADATA +0 -190
- {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
rasa/shared/core/domain.py
CHANGED
|
@@ -98,6 +98,8 @@ IS_RETRIEVAL_INTENT_KEY = "is_retrieval_intent"
|
|
|
98
98
|
ENTITY_ROLES_KEY = "roles"
|
|
99
99
|
ENTITY_GROUPS_KEY = "groups"
|
|
100
100
|
ENTITY_FEATURIZATION_KEY = "influence_conversation"
|
|
101
|
+
STORE_ENTITIES_AS_SLOTS_KEY = "store_entities_as_slots"
|
|
102
|
+
DOMAIN_CONFIG_KEY = "config"
|
|
101
103
|
|
|
102
104
|
KEY_SLOTS = "slots"
|
|
103
105
|
KEY_INTENTS = "intents"
|
|
@@ -146,6 +148,8 @@ MERGE_FUNC_MAPPING: Dict[Text, Callable[..., Any]] = {
|
|
|
146
148
|
KEY_FORMS: rasa.shared.utils.common.merge_dicts,
|
|
147
149
|
}
|
|
148
150
|
|
|
151
|
+
DEFAULT_STORE_ENTITIES_AS_SLOTS = True
|
|
152
|
+
|
|
149
153
|
DICT_DATA_KEYS = [
|
|
150
154
|
key
|
|
151
155
|
for key, value in MERGE_FUNC_MAPPING.items()
|
|
@@ -318,7 +322,7 @@ class Domain:
|
|
|
318
322
|
actions = cls._collect_action_names(domain_actions)
|
|
319
323
|
|
|
320
324
|
additional_arguments = {
|
|
321
|
-
**data.get(
|
|
325
|
+
**data.get(DOMAIN_CONFIG_KEY, {}),
|
|
322
326
|
"actions_which_explicitly_need_domain": (
|
|
323
327
|
cls._collect_actions_which_explicitly_need_domain(domain_actions)
|
|
324
328
|
),
|
|
@@ -468,9 +472,9 @@ class Domain:
|
|
|
468
472
|
return domain_dict
|
|
469
473
|
|
|
470
474
|
if override:
|
|
471
|
-
config = domain_dict.get(
|
|
475
|
+
config = domain_dict.get(DOMAIN_CONFIG_KEY, {})
|
|
472
476
|
for key, val in config.items():
|
|
473
|
-
combined[
|
|
477
|
+
combined[DOMAIN_CONFIG_KEY][key] = val
|
|
474
478
|
|
|
475
479
|
if (
|
|
476
480
|
override
|
|
@@ -510,8 +514,8 @@ class Domain:
|
|
|
510
514
|
def partial_merge(self, other: Domain) -> Domain:
|
|
511
515
|
"""Returns a new Domain with intersection-based merging.
|
|
512
516
|
|
|
513
|
-
|
|
514
|
-
|
|
517
|
+
For each domain section only overwrite items that already exist in self.
|
|
518
|
+
Brand-new items in `other` are ignored.
|
|
515
519
|
|
|
516
520
|
Args:
|
|
517
521
|
other: The domain to merge with.
|
|
@@ -545,7 +549,7 @@ class Domain:
|
|
|
545
549
|
def difference(self, other: Domain) -> Domain:
|
|
546
550
|
"""Returns a new Domain containing items in `self` that are NOT in `other`.
|
|
547
551
|
|
|
548
|
-
|
|
552
|
+
Uses simple equality checks for dict/list items.
|
|
549
553
|
|
|
550
554
|
Args:
|
|
551
555
|
other: The domain to compare with.
|
|
@@ -598,9 +602,16 @@ class Domain:
|
|
|
598
602
|
) -> Dict:
|
|
599
603
|
# add the config, session_config and training data version defaults
|
|
600
604
|
# if not included in the original domain dict
|
|
601
|
-
if
|
|
605
|
+
if (
|
|
606
|
+
DOMAIN_CONFIG_KEY not in data
|
|
607
|
+
and store_entities_as_slots != DEFAULT_STORE_ENTITIES_AS_SLOTS
|
|
608
|
+
):
|
|
602
609
|
data.update(
|
|
603
|
-
{
|
|
610
|
+
{
|
|
611
|
+
DOMAIN_CONFIG_KEY: {
|
|
612
|
+
STORE_ENTITIES_AS_SLOTS_KEY: store_entities_as_slots
|
|
613
|
+
}
|
|
614
|
+
}
|
|
604
615
|
)
|
|
605
616
|
|
|
606
617
|
if SESSION_CONFIG_KEY not in data:
|
|
@@ -937,7 +948,7 @@ class Domain:
|
|
|
937
948
|
forms: Union[Dict[Text, Any], List[Text]],
|
|
938
949
|
data: Dict,
|
|
939
950
|
action_texts: Optional[List[Text]] = None,
|
|
940
|
-
store_entities_as_slots: bool =
|
|
951
|
+
store_entities_as_slots: bool = DEFAULT_STORE_ENTITIES_AS_SLOTS,
|
|
941
952
|
session_config: SessionConfig = SessionConfig.default(),
|
|
942
953
|
**kwargs: Any,
|
|
943
954
|
) -> None:
|
|
@@ -1711,9 +1722,45 @@ class Domain:
|
|
|
1711
1722
|
else:
|
|
1712
1723
|
return True
|
|
1713
1724
|
|
|
1714
|
-
def
|
|
1725
|
+
def _uses_custom_session_config(self) -> bool:
|
|
1726
|
+
"""Check if the domain uses a custom session config."""
|
|
1727
|
+
return self._data.get(SESSION_CONFIG_KEY) != SessionConfig.default().as_dict()
|
|
1728
|
+
|
|
1729
|
+
def _uses_custom_domain_config(self) -> bool:
|
|
1730
|
+
"""Check if the domain uses a custom domain config."""
|
|
1731
|
+
return self._data.get(DOMAIN_CONFIG_KEY) != {
|
|
1732
|
+
STORE_ENTITIES_AS_SLOTS_KEY: DEFAULT_STORE_ENTITIES_AS_SLOTS
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
def _cleaned_json_data(self) -> Dict[Text, Any]:
|
|
1736
|
+
"""Remove default values from the domain data.
|
|
1737
|
+
|
|
1738
|
+
Only retains data that was customized by the user.
|
|
1739
|
+
|
|
1740
|
+
Returns:
|
|
1741
|
+
A cleaned dictionary version of the domain.
|
|
1742
|
+
"""
|
|
1743
|
+
cleaned_data = copy.deepcopy(self._data)
|
|
1744
|
+
|
|
1745
|
+
# Remove default config if it only contains store_entities_as_slots: False
|
|
1746
|
+
if DOMAIN_CONFIG_KEY in cleaned_data and not self._uses_custom_domain_config():
|
|
1747
|
+
del cleaned_data[DOMAIN_CONFIG_KEY]
|
|
1748
|
+
|
|
1749
|
+
# Remove default session config if it matches the default values
|
|
1750
|
+
if (
|
|
1751
|
+
SESSION_CONFIG_KEY in cleaned_data
|
|
1752
|
+
and not self._uses_custom_session_config()
|
|
1753
|
+
):
|
|
1754
|
+
del cleaned_data[SESSION_CONFIG_KEY]
|
|
1755
|
+
|
|
1756
|
+
return cleaned_data
|
|
1757
|
+
|
|
1758
|
+
def as_dict(self, should_clean_json: bool = False) -> Dict[Text, Any]:
|
|
1715
1759
|
"""Return serialized `Domain`."""
|
|
1716
|
-
|
|
1760
|
+
if should_clean_json:
|
|
1761
|
+
return self._cleaned_json_data()
|
|
1762
|
+
else:
|
|
1763
|
+
return self._data
|
|
1717
1764
|
|
|
1718
1765
|
@staticmethod
|
|
1719
1766
|
def get_responses_with_multilines(
|
rasa/shared/core/events.py
CHANGED
|
@@ -35,6 +35,7 @@ from rasa.shared.core.constants import (
|
|
|
35
35
|
ACTION_LISTEN_NAME,
|
|
36
36
|
ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
|
|
37
37
|
ACTION_METADATA_EXECUTION_SUCCESS,
|
|
38
|
+
ACTION_METADATA_EXECUTION_TIME,
|
|
38
39
|
ACTION_NAME_SENDER_ID_CONNECTOR_STR,
|
|
39
40
|
ACTION_SESSION_START_NAME,
|
|
40
41
|
ENTITY_LABEL_SEPARATOR,
|
|
@@ -1815,6 +1816,7 @@ class ActionExecuted(Event):
|
|
|
1815
1816
|
items_to_ignore = [
|
|
1816
1817
|
ACTION_METADATA_EXECUTION_SUCCESS,
|
|
1817
1818
|
ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
|
|
1819
|
+
ACTION_METADATA_EXECUTION_TIME,
|
|
1818
1820
|
]
|
|
1819
1821
|
meta_no_nones = {
|
|
1820
1822
|
k: v
|
|
@@ -11,3 +11,8 @@ KEY_RUN_PATTERN_COMPLETED = "run_pattern_completed"
|
|
|
11
11
|
KEY_TRANSLATION = "translation"
|
|
12
12
|
KEY_CALLED_FLOW = "called_flow"
|
|
13
13
|
KEY_LINKED_FLOW = "linked_flow"
|
|
14
|
+
|
|
15
|
+
# MCP mapping field names
|
|
16
|
+
KEY_MAPPING_INPUT = "input"
|
|
17
|
+
KEY_MAPPING_OUTPUT = "output"
|
|
18
|
+
KEY_MAPPING_SLOT = "slot"
|
|
@@ -52,7 +52,13 @@ def step_from_json(flow_id: Text, data: Dict[Text, Any]) -> FlowStep:
|
|
|
52
52
|
return SetSlotsFlowStep.from_json(flow_id, data)
|
|
53
53
|
if "noop" in data:
|
|
54
54
|
return NoOperationFlowStep.from_json(flow_id, data)
|
|
55
|
-
|
|
55
|
+
|
|
56
|
+
required_properties = ["action", "collect", "link", "call", "set_slots", "noop"]
|
|
57
|
+
raise RasaException(
|
|
58
|
+
f"Failed to parse step from json. Unknown type for {data}. "
|
|
59
|
+
f"At least one of the following properties is required: "
|
|
60
|
+
f"{', '.join(required_properties)}"
|
|
61
|
+
)
|
|
56
62
|
|
|
57
63
|
|
|
58
64
|
@dataclass
|
|
@@ -11,9 +11,12 @@ from rasa.shared.core.flows.validation import (
|
|
|
11
11
|
DuplicatedFlowIdException,
|
|
12
12
|
validate_call_steps,
|
|
13
13
|
validate_exit_if_conditions,
|
|
14
|
+
validate_exit_if_exclusivity,
|
|
14
15
|
validate_flow,
|
|
15
16
|
validate_link_in_call_restriction,
|
|
16
17
|
validate_linked_flows_exists,
|
|
18
|
+
validate_mcp_mapping_slots,
|
|
19
|
+
validate_mcp_server_references,
|
|
17
20
|
validate_nlu_trigger,
|
|
18
21
|
validate_patterns_are_not_called_or_linked,
|
|
19
22
|
validate_patterns_are_not_calling_or_linking_other_flows,
|
|
@@ -176,11 +179,14 @@ class FlowsList:
|
|
|
176
179
|
validate_nlu_trigger(self.underlying_flows)
|
|
177
180
|
validate_link_in_call_restriction(self)
|
|
178
181
|
validate_call_steps(self)
|
|
182
|
+
validate_mcp_server_references(self)
|
|
183
|
+
validate_mcp_mapping_slots(self, domain)
|
|
179
184
|
validate_linked_flows_exists(self)
|
|
180
185
|
validate_patterns_are_not_called_or_linked(self)
|
|
181
186
|
validate_patterns_are_not_calling_or_linking_other_flows(self)
|
|
182
187
|
validate_step_ids_are_unique(self)
|
|
183
188
|
validate_exit_if_conditions(self, domain)
|
|
189
|
+
validate_exit_if_exclusivity(self)
|
|
184
190
|
|
|
185
191
|
@property
|
|
186
192
|
def user_flow_ids(self) -> Set[str]:
|
|
@@ -4,7 +4,6 @@ from dataclasses import dataclass
|
|
|
4
4
|
from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Text
|
|
5
5
|
|
|
6
6
|
from rasa.core.available_agents import AvailableAgents
|
|
7
|
-
from rasa.core.available_endpoints import AvailableEndpoints
|
|
8
7
|
from rasa.shared.core.flows.flow_step import FlowStep
|
|
9
8
|
|
|
10
9
|
if TYPE_CHECKING:
|
|
@@ -74,7 +73,14 @@ class CallFlowStep(FlowStep):
|
|
|
74
73
|
|
|
75
74
|
if should_resolve_calls and self.is_calling_flow():
|
|
76
75
|
if not self.called_flow_reference:
|
|
77
|
-
raise ValueError(
|
|
76
|
+
raise ValueError(
|
|
77
|
+
f"Flow step '{self.id}' in flow '{self.flow_id}' is trying "
|
|
78
|
+
f"to call flow '{self.call}', but the flow reference could "
|
|
79
|
+
f"not be resolved. Please ensure that:\n"
|
|
80
|
+
f"1. A flow named '{self.call}' is defined in your domain\n"
|
|
81
|
+
f"2. The flow name is spelled correctly (case-sensitive)\n"
|
|
82
|
+
f"3. The called flow is properly formatted with valid YAML syntax"
|
|
83
|
+
)
|
|
78
84
|
|
|
79
85
|
yield from self.called_flow_reference.steps_with_calls_resolved
|
|
80
86
|
|
|
@@ -86,16 +92,13 @@ class CallFlowStep(FlowStep):
|
|
|
86
92
|
|
|
87
93
|
def is_calling_mcp_tool(self) -> bool:
|
|
88
94
|
"""Returns True if the call references an MCP tool of an existing MCP server."""
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
and self.mapping is not None
|
|
97
|
-
and self.mcp_server in mcp_server_names
|
|
98
|
-
)
|
|
95
|
+
from rasa.shared.utils.mcp.utils import mcp_server_exists
|
|
96
|
+
|
|
97
|
+
return self.has_mcp_tool_properties() and mcp_server_exists(self.mcp_server)
|
|
98
|
+
|
|
99
|
+
def has_mcp_tool_properties(self) -> bool:
|
|
100
|
+
"""Returns True if the call step has MCP tool properties."""
|
|
101
|
+
return self.mcp_server is not None and self.mapping is not None
|
|
99
102
|
|
|
100
103
|
def is_calling_agent(self) -> bool:
|
|
101
104
|
"""Returns True if the call references an agent."""
|
|
@@ -4,7 +4,7 @@ import re
|
|
|
4
4
|
import typing
|
|
5
5
|
from collections import defaultdict
|
|
6
6
|
from dataclasses import dataclass
|
|
7
|
-
from typing import List, Optional, Set, Text
|
|
7
|
+
from typing import Iterator, List, Optional, Set, Text, Tuple
|
|
8
8
|
|
|
9
9
|
from jinja2 import Template
|
|
10
10
|
|
|
@@ -14,6 +14,11 @@ from rasa.shared.constants import (
|
|
|
14
14
|
RASA_PATTERN_HUMAN_HANDOFF,
|
|
15
15
|
RASA_PATTERN_INTERNAL_ERROR,
|
|
16
16
|
)
|
|
17
|
+
from rasa.shared.core.flows.constants import (
|
|
18
|
+
KEY_MAPPING_INPUT,
|
|
19
|
+
KEY_MAPPING_OUTPUT,
|
|
20
|
+
KEY_MAPPING_SLOT,
|
|
21
|
+
)
|
|
17
22
|
from rasa.shared.core.flows.flow import Flow
|
|
18
23
|
from rasa.shared.core.flows.flow_step import (
|
|
19
24
|
FlowStep,
|
|
@@ -130,6 +135,27 @@ class InvalidExitIfConditionException(RasaException):
|
|
|
130
135
|
)
|
|
131
136
|
|
|
132
137
|
|
|
138
|
+
class ExitIfExclusivityException(RasaException):
|
|
139
|
+
"""Raised when a call step with exit_if has other properties."""
|
|
140
|
+
|
|
141
|
+
def __init__(
|
|
142
|
+
self, step_id: str, flow_id: str, conflicting_properties: List[str]
|
|
143
|
+
) -> None:
|
|
144
|
+
"""Initializes the exception."""
|
|
145
|
+
self.step_id = step_id
|
|
146
|
+
self.flow_id = flow_id
|
|
147
|
+
self.conflicting_properties = conflicting_properties
|
|
148
|
+
|
|
149
|
+
def __str__(self) -> str:
|
|
150
|
+
"""Return a string representation of the exception."""
|
|
151
|
+
conflicting_properties_str = ", ".join(self.conflicting_properties)
|
|
152
|
+
return (
|
|
153
|
+
f"Call step '{self.step_id}' in flow '{self.flow_id}' has an 'exit_if' "
|
|
154
|
+
f"property but also has other properties: {conflicting_properties_str}. "
|
|
155
|
+
f"A call step with 'exit_if' cannot have any other properties."
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
133
159
|
class DuplicatedFlowIdException(RasaException):
|
|
134
160
|
"""Raised when a flow is using the same id as another flow."""
|
|
135
161
|
|
|
@@ -304,9 +330,7 @@ class UnresolvedLinkFlowException(RasaException):
|
|
|
304
330
|
|
|
305
331
|
|
|
306
332
|
class UnresolvedCallStepException(RasaException):
|
|
307
|
-
"""
|
|
308
|
-
Raised when it does not.
|
|
309
|
-
"""
|
|
333
|
+
"""Raised when a call step doesn't have a reference to an existing flow or agent."""
|
|
310
334
|
|
|
311
335
|
def __init__(
|
|
312
336
|
self, call_step_argument: str, calling_flow_id: str, step_id: str
|
|
@@ -327,6 +351,62 @@ class UnresolvedCallStepException(RasaException):
|
|
|
327
351
|
)
|
|
328
352
|
|
|
329
353
|
|
|
354
|
+
class InvalidMCPServerReferenceException(RasaException):
|
|
355
|
+
"""Raised when a call step references a non-existent MCP server."""
|
|
356
|
+
|
|
357
|
+
def __init__(
|
|
358
|
+
self, mcp_server_name: str, calling_flow_id: str, step_id: str
|
|
359
|
+
) -> None:
|
|
360
|
+
"""Initializes the exception."""
|
|
361
|
+
self.mcp_server_name = mcp_server_name
|
|
362
|
+
self.calling_flow_id = calling_flow_id
|
|
363
|
+
self.step_id = step_id
|
|
364
|
+
|
|
365
|
+
def __str__(self) -> str:
|
|
366
|
+
"""Return a string representation of the exception."""
|
|
367
|
+
return (
|
|
368
|
+
f"Call step '{self.step_id}' in flow '{self.calling_flow_id}' "
|
|
369
|
+
f"references MCP server '{self.mcp_server_name}' which does not exist "
|
|
370
|
+
f"in endpoints.yml. Please make sure that the MCP server is properly "
|
|
371
|
+
f"configured in endpoints.yml."
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class InvalidMCPMappingSlotException(RasaException):
|
|
376
|
+
"""Raised when MCP tool mapping references non-existent slots."""
|
|
377
|
+
|
|
378
|
+
def __init__(
|
|
379
|
+
self,
|
|
380
|
+
step_id: str,
|
|
381
|
+
flow_id: str,
|
|
382
|
+
invalid_input_slots: Set[str],
|
|
383
|
+
invalid_output_slots: Set[str],
|
|
384
|
+
) -> None:
|
|
385
|
+
"""Initializes the exception."""
|
|
386
|
+
self.step_id = step_id
|
|
387
|
+
self.flow_id = flow_id
|
|
388
|
+
self.invalid_input_slots = invalid_input_slots
|
|
389
|
+
self.invalid_output_slots = invalid_output_slots
|
|
390
|
+
|
|
391
|
+
def __str__(self) -> str:
|
|
392
|
+
"""Return a string representation of the exception."""
|
|
393
|
+
error_parts = []
|
|
394
|
+
|
|
395
|
+
if self.invalid_input_slots:
|
|
396
|
+
input_slots_str = ", ".join(sorted(self.invalid_input_slots))
|
|
397
|
+
error_parts.append(f"input slots: {input_slots_str}")
|
|
398
|
+
|
|
399
|
+
if self.invalid_output_slots:
|
|
400
|
+
output_slots_str = ", ".join(sorted(self.invalid_output_slots))
|
|
401
|
+
error_parts.append(f"output slots: {output_slots_str}")
|
|
402
|
+
|
|
403
|
+
slots_info = " ".join(error_parts)
|
|
404
|
+
return (
|
|
405
|
+
f"Call step '{self.step_id}' in flow '{self.flow_id}' has slots not "
|
|
406
|
+
f"defined in the domain: {slots_info}"
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
|
|
330
410
|
class UnresolvedFlowStepIdException(RasaException):
|
|
331
411
|
"""Raised when a flow step is referenced, but its id can not be resolved."""
|
|
332
412
|
|
|
@@ -610,19 +690,19 @@ def validate_link_in_call_restriction(flows: "FlowsList") -> None:
|
|
|
610
690
|
|
|
611
691
|
|
|
612
692
|
def validate_call_steps(flows: "FlowsList") -> None:
|
|
613
|
-
"""Validates that all called flows/agents exist and
|
|
614
|
-
are valid.
|
|
615
|
-
"""
|
|
693
|
+
"""Validates that all called flows/agents exist and properties are valid."""
|
|
616
694
|
for flow in flows.underlying_flows:
|
|
617
695
|
for step in flow.steps:
|
|
618
696
|
if not isinstance(step, CallFlowStep):
|
|
619
697
|
continue
|
|
620
698
|
|
|
621
699
|
_is_step_calling_agent = step.is_calling_agent()
|
|
700
|
+
_is_step_calling_mcp_tool = step.has_mcp_tool_properties()
|
|
701
|
+
|
|
622
702
|
if (
|
|
623
703
|
not _is_step_calling_agent
|
|
624
704
|
and flows.flow_by_id(step.call) is None
|
|
625
|
-
and not
|
|
705
|
+
and not _is_step_calling_mcp_tool
|
|
626
706
|
):
|
|
627
707
|
raise UnresolvedCallStepException(step.call, flow.id, step.id)
|
|
628
708
|
|
|
@@ -635,6 +715,97 @@ def validate_call_steps(flows: "FlowsList") -> None:
|
|
|
635
715
|
)
|
|
636
716
|
|
|
637
717
|
|
|
718
|
+
def validate_mcp_server_references(flows: "FlowsList") -> None:
|
|
719
|
+
"""Validates that MCP server references in call steps are valid."""
|
|
720
|
+
for flow in flows.underlying_flows:
|
|
721
|
+
for step in flow.steps:
|
|
722
|
+
if not isinstance(step, CallFlowStep):
|
|
723
|
+
continue
|
|
724
|
+
|
|
725
|
+
# Only validate call steps that are trying to call MCP tools
|
|
726
|
+
if step.has_mcp_tool_properties():
|
|
727
|
+
# Check if the referenced MCP server exists
|
|
728
|
+
from rasa.shared.utils.mcp.utils import mcp_server_exists
|
|
729
|
+
|
|
730
|
+
if not mcp_server_exists(step.mcp_server):
|
|
731
|
+
raise InvalidMCPServerReferenceException(
|
|
732
|
+
step.mcp_server, flow.id, step.id
|
|
733
|
+
)
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
def validate_mcp_mapping_slots(
|
|
737
|
+
flows: "FlowsList", domain: Optional["Domain"] = None
|
|
738
|
+
) -> None:
|
|
739
|
+
"""Validates that slots referenced in MCP tool mapping are defined in the domain.
|
|
740
|
+
|
|
741
|
+
This function validates that all slots referenced in the input and output
|
|
742
|
+
mapping of MCP tool calls are defined in the domain.
|
|
743
|
+
|
|
744
|
+
Args:
|
|
745
|
+
flows: The flows to validate.
|
|
746
|
+
domain: The domain with slot definitions. If None, slot validation is skipped.
|
|
747
|
+
|
|
748
|
+
Raises:
|
|
749
|
+
InvalidMCPMappingSlotException: If any MCP mapping references undefined slots.
|
|
750
|
+
"""
|
|
751
|
+
if domain is None:
|
|
752
|
+
return
|
|
753
|
+
|
|
754
|
+
domain_slots = {slot.name for slot in domain.slots}
|
|
755
|
+
|
|
756
|
+
for flow in flows.underlying_flows:
|
|
757
|
+
for step in flow.steps:
|
|
758
|
+
if not isinstance(step, CallFlowStep):
|
|
759
|
+
continue
|
|
760
|
+
|
|
761
|
+
# Only validate call steps that are calling MCP tools
|
|
762
|
+
if not step.has_mcp_tool_properties() or step.mapping is None:
|
|
763
|
+
continue
|
|
764
|
+
|
|
765
|
+
# Extract slot names from input mapping
|
|
766
|
+
input_slots = set()
|
|
767
|
+
if KEY_MAPPING_INPUT in step.mapping and isinstance(
|
|
768
|
+
step.mapping[KEY_MAPPING_INPUT], list
|
|
769
|
+
):
|
|
770
|
+
for input_item in step.mapping[KEY_MAPPING_INPUT]:
|
|
771
|
+
input_slots.add(input_item[KEY_MAPPING_SLOT])
|
|
772
|
+
|
|
773
|
+
# Extract slot names from output mapping
|
|
774
|
+
output_slots = set()
|
|
775
|
+
if KEY_MAPPING_OUTPUT in step.mapping and isinstance(
|
|
776
|
+
step.mapping[KEY_MAPPING_OUTPUT], list
|
|
777
|
+
):
|
|
778
|
+
for output_item in step.mapping[KEY_MAPPING_OUTPUT]:
|
|
779
|
+
output_slots.add(output_item[KEY_MAPPING_SLOT])
|
|
780
|
+
|
|
781
|
+
# Check for invalid slots in both input and output
|
|
782
|
+
invalid_input_slots = input_slots - domain_slots
|
|
783
|
+
invalid_output_slots = output_slots - domain_slots
|
|
784
|
+
|
|
785
|
+
# Raise exception if any invalid slots are found
|
|
786
|
+
if invalid_input_slots or invalid_output_slots:
|
|
787
|
+
raise InvalidMCPMappingSlotException(
|
|
788
|
+
step.id, flow.id, invalid_input_slots, invalid_output_slots
|
|
789
|
+
)
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
def _get_call_steps_with_exit_if(
|
|
793
|
+
flows: "FlowsList",
|
|
794
|
+
) -> Iterator[Tuple["CallFlowStep", "Flow"]]:
|
|
795
|
+
"""Helper function to get all call steps with exit_if properties.
|
|
796
|
+
|
|
797
|
+
Args:
|
|
798
|
+
flows: The flows to search through.
|
|
799
|
+
|
|
800
|
+
Yields:
|
|
801
|
+
Tuples of (call_step, flow) for steps that have exit_if properties.
|
|
802
|
+
"""
|
|
803
|
+
for flow in flows.underlying_flows:
|
|
804
|
+
for step in flow.steps:
|
|
805
|
+
if isinstance(step, CallFlowStep) and step.exit_if:
|
|
806
|
+
yield step, flow
|
|
807
|
+
|
|
808
|
+
|
|
638
809
|
def validate_exit_if_conditions(
|
|
639
810
|
flows: "FlowsList", domain: Optional["Domain"] = None
|
|
640
811
|
) -> None:
|
|
@@ -652,47 +823,69 @@ def validate_exit_if_conditions(
|
|
|
652
823
|
Raises:
|
|
653
824
|
InvalidExitIfConditionException: If any exit_if condition is invalid.
|
|
654
825
|
"""
|
|
655
|
-
for flow in flows
|
|
656
|
-
for
|
|
657
|
-
if not isinstance(
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
if not isinstance(condition, str):
|
|
662
|
-
raise InvalidExitIfConditionException(
|
|
663
|
-
step.id, flow.id, str(condition), "Condition must be a string"
|
|
664
|
-
)
|
|
826
|
+
for step, flow in _get_call_steps_with_exit_if(flows):
|
|
827
|
+
for condition in step.exit_if: # type: ignore[union-attr]
|
|
828
|
+
if not isinstance(condition, str):
|
|
829
|
+
raise InvalidExitIfConditionException(
|
|
830
|
+
step.id, flow.id, str(condition), "Condition must be a string"
|
|
831
|
+
)
|
|
665
832
|
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
)
|
|
833
|
+
# Check if condition contains at least one slot reference
|
|
834
|
+
slot_references_regex = re.compile(r"\bslots\.\w+")
|
|
835
|
+
slot_references = slot_references_regex.findall(condition)
|
|
836
|
+
if not slot_references:
|
|
837
|
+
raise InvalidExitIfConditionException(
|
|
838
|
+
step.id,
|
|
839
|
+
flow.id,
|
|
840
|
+
condition,
|
|
841
|
+
"Condition must contain at least one slot reference "
|
|
842
|
+
"(e.g., 'slots.slot_name')",
|
|
843
|
+
)
|
|
676
844
|
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
_validate_predicate_syntax_with_pypred(
|
|
692
|
-
step.id, flow.id, condition
|
|
845
|
+
# Validate predicate syntax using pypred (always, regardless of domain)
|
|
846
|
+
_validate_predicate_syntax_with_pypred(step.id, flow.id, condition)
|
|
847
|
+
|
|
848
|
+
# Validate slot names if domain is provided
|
|
849
|
+
if domain:
|
|
850
|
+
domain_slots = {slot.name: slot for slot in domain.slots}
|
|
851
|
+
for slot_ref in slot_references:
|
|
852
|
+
slot_name = slot_ref.split(".")[1]
|
|
853
|
+
if slot_name not in domain_slots:
|
|
854
|
+
raise InvalidExitIfConditionException(
|
|
855
|
+
step.id,
|
|
856
|
+
flow.id,
|
|
857
|
+
condition,
|
|
858
|
+
f"Slot '{slot_name}' is not defined in the domain",
|
|
693
859
|
)
|
|
694
860
|
|
|
695
861
|
|
|
862
|
+
def validate_exit_if_exclusivity(flows: "FlowsList") -> None:
|
|
863
|
+
"""Validates that call steps with exit_if don't have other properties.
|
|
864
|
+
|
|
865
|
+
This function validates that call steps with an exit_if property cannot have
|
|
866
|
+
any other properties besides the required 'call' property and standard flow
|
|
867
|
+
step properties (id, next, metadata, description).
|
|
868
|
+
|
|
869
|
+
Args:
|
|
870
|
+
flows: The flows to validate.
|
|
871
|
+
|
|
872
|
+
Raises:
|
|
873
|
+
ExitIfExclusivityException: If a call step with exit_if has other properties.
|
|
874
|
+
"""
|
|
875
|
+
for step, flow in _get_call_steps_with_exit_if(flows):
|
|
876
|
+
# Check for conflicting properties
|
|
877
|
+
conflicting_properties = []
|
|
878
|
+
|
|
879
|
+
# Check for MCP-related properties
|
|
880
|
+
if step.mcp_server is not None:
|
|
881
|
+
conflicting_properties.append("mcp_server")
|
|
882
|
+
if step.mapping is not None:
|
|
883
|
+
conflicting_properties.append("mapping")
|
|
884
|
+
|
|
885
|
+
if conflicting_properties:
|
|
886
|
+
raise ExitIfExclusivityException(step.id, flow.id, conflicting_properties)
|
|
887
|
+
|
|
888
|
+
|
|
696
889
|
def validate_linked_flows_exists(flows: "FlowsList") -> None:
|
|
697
890
|
"""Validates that all linked flows exist."""
|
|
698
891
|
for flow in flows.underlying_flows:
|
|
@@ -814,6 +1007,7 @@ def validate_slot_names_to_be_collected(flow: Flow) -> None:
|
|
|
814
1007
|
|
|
815
1008
|
def validate_flow_id(flow: Flow) -> None:
|
|
816
1009
|
"""Validates if the flow id comply with a specified regex.
|
|
1010
|
+
|
|
817
1011
|
Flow IDs can start with an alphanumeric character or an underscore.
|
|
818
1012
|
Followed by zero or more alphanumeric characters, hyphens, or underscores.
|
|
819
1013
|
|
|
@@ -262,12 +262,9 @@ class YamlFlowsWriter:
|
|
|
262
262
|
Returns:
|
|
263
263
|
The dumped YAML.
|
|
264
264
|
"""
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
del dumped_flow["id"]
|
|
269
|
-
dump[flow.id] = dumped_flow
|
|
270
|
-
return dump_obj_as_yaml_to_string({KEY_FLOWS: dump})
|
|
265
|
+
return dump_obj_as_yaml_to_string(
|
|
266
|
+
{KEY_FLOWS: get_flows_as_json(flows, should_clean_json)}
|
|
267
|
+
)
|
|
271
268
|
|
|
272
269
|
@staticmethod
|
|
273
270
|
def dump(
|
|
@@ -425,6 +422,18 @@ def process_yaml_content(yaml_content: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
425
422
|
return yaml_content
|
|
426
423
|
|
|
427
424
|
|
|
425
|
+
def get_flows_as_json(
|
|
426
|
+
flows: FlowsList, should_clean_json: bool = False
|
|
427
|
+
) -> Dict[str, Any]:
|
|
428
|
+
"""Get the flows as a JSON dictionary."""
|
|
429
|
+
dump = {}
|
|
430
|
+
for flow in flows:
|
|
431
|
+
dumped_flow = get_flow_as_json(flow, should_clean_json)
|
|
432
|
+
del dumped_flow["id"]
|
|
433
|
+
dump[flow.id] = dumped_flow
|
|
434
|
+
return dump
|
|
435
|
+
|
|
436
|
+
|
|
428
437
|
def get_flow_as_json(flow: Flow, should_clean_json: bool = False) -> Dict[str, Any]:
|
|
429
438
|
"""Clean the Flow JSON by removing default values and empty fields.
|
|
430
439
|
|
rasa/shared/core/slots.py
CHANGED
|
@@ -273,10 +273,14 @@ class Slot(ABC):
|
|
|
273
273
|
try:
|
|
274
274
|
return rasa.shared.utils.common.class_from_module_path(type_name)
|
|
275
275
|
except (ImportError, AttributeError):
|
|
276
|
+
known_types = [
|
|
277
|
+
cls.type_name for cls in rasa.shared.utils.common.all_subclasses(Slot)
|
|
278
|
+
]
|
|
276
279
|
raise InvalidSlotTypeException(
|
|
277
280
|
f"Failed to find slot type, '{type_name}' is neither a known type nor "
|
|
278
281
|
f"user-defined. If you are creating your own slot type, make "
|
|
279
282
|
f"sure its module path is correct. "
|
|
283
|
+
f"Known types: {', '.join(known_types)} "
|
|
280
284
|
f"You can find all build in types at {DOCS_URL_SLOTS}"
|
|
281
285
|
)
|
|
282
286
|
|