rasa-pro 3.13.12__py3-none-any.whl → 3.14.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/__main__.py +15 -3
- rasa/agents/__init__.py +0 -0
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +213 -0
- rasa/agents/constants.py +43 -0
- rasa/agents/core/__init__.py +0 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +81 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/__init__.py +0 -0
- rasa/agents/protocol/a2a/a2a_agent.py +889 -0
- rasa/agents/protocol/mcp/__init__.py +0 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +778 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
- rasa/agents/schemas/__init__.py +13 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +65 -0
- rasa/agents/schemas/agent_tool_schema.py +186 -0
- rasa/agents/templates/__init__.py +0 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
- rasa/agents/utils.py +228 -0
- rasa/agents/validation.py +538 -0
- rasa/api.py +23 -9
- rasa/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +96 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +38 -0
- rasa/builder/copilot/copilot.py +562 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +81 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +690 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +787 -0
- rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +91 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +234 -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 +41 -0
- rasa/builder/copilot/templated_messages/copilot_welcome_messages.yml +56 -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/clients.py +256 -0
- rasa/builder/guardrails/constants.py +12 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/models.py +266 -0
- rasa/builder/guardrails/policy_checker.py +324 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +94 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +609 -0
- rasa/builder/llm_service.py +273 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +234 -0
- rasa/builder/models.py +229 -0
- rasa/builder/project_generator.py +463 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/service.py +1367 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/template_cache.py +69 -0
- rasa/builder/training_service.py +188 -0
- rasa/builder/validation_service.py +101 -0
- rasa/cli/arguments/data.py +9 -0
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/data.py +78 -10
- rasa/cli/dialogue_understanding_test.py +11 -7
- rasa/cli/e2e_test.py +10 -6
- rasa/cli/evaluate.py +4 -2
- rasa/cli/export.py +5 -2
- rasa/cli/inspect.py +9 -4
- rasa/cli/interactive.py +8 -4
- rasa/cli/llm_fine_tuning.py +12 -6
- 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 +8 -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 +11 -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/basic/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/help.yml +8 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/human_handoff.yml +41 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/patterns.yml +32 -0
- rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/show_faqs.yml +8 -0
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/defaults.py +1 -0
- rasa/cli/project_templates/finance/README.md +26 -0
- rasa/cli/project_templates/finance/actions/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/cards/check_that_card_exists.py +21 -0
- rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
- rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
- rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
- rasa/cli/project_templates/finance/actions/db.py +117 -0
- rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
- rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
- rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
- rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
- rasa/cli/project_templates/finance/config.yml +29 -0
- rasa/cli/project_templates/finance/credentials.yml +33 -0
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
- rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
- rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +45 -0
- rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
- rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
- rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
- rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
- rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
- rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
- rasa/cli/project_templates/finance/data/data.md +14 -0
- rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +6 -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_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/transfers/check_transfer_limit.yml +18 -0
- rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
- rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +34 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
- rasa/cli/project_templates/finance/db/cards.json +18 -0
- rasa/cli/project_templates/finance/db/contacts.json +10 -0
- rasa/cli/project_templates/finance/db/my_account.json +6 -0
- rasa/cli/project_templates/finance/db/transactions.json +22 -0
- rasa/cli/project_templates/finance/docs/docs.md +8 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
- rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +15 -0
- rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
- rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
- rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +44 -0
- rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
- rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
- rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
- rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
- rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
- rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
- rasa/cli/project_templates/finance/domain/domain.md +18 -0
- rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
- rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +8 -0
- rasa/cli/project_templates/finance/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -0
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +31 -0
- rasa/cli/project_templates/finance/domain/general/welcome.yml +39 -0
- rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
- rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
- rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +221 -0
- rasa/cli/project_templates/finance/endpoints.yml +67 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/check_balance.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/download_statements.yml +43 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/cards/block_card.yml +55 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/patterns.yml +22 -0
- rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/transfers/transfer_money.yml +56 -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 +8 -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 +13 -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 +74 -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/with_stub/network/solve_internet_not_slow.yml +33 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_slow.yml +47 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/patterns.yml +23 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/project_templates/tutorial/credentials.yml +10 -0
- rasa/cli/run.py +8 -10
- rasa/cli/scaffold.py +50 -6
- rasa/cli/shell.py +10 -5
- rasa/cli/studio/studio.py +1 -1
- rasa/cli/test.py +34 -14
- rasa/cli/train.py +44 -30
- rasa/cli/utils.py +1 -393
- rasa/cli/validation/__init__.py +0 -0
- rasa/cli/validation/bot_config.py +232 -0
- rasa/cli/validation/config_path_validation.py +257 -0
- rasa/cli/x.py +8 -4
- rasa/constants.py +7 -1
- rasa/core/actions/action.py +53 -13
- rasa/core/actions/action_exceptions.py +1 -1
- rasa/core/actions/action_run_slot_rejections.py +1 -1
- rasa/core/actions/grpc_custom_action_executor.py +1 -1
- rasa/core/agent.py +22 -2
- rasa/core/available_agents.py +239 -0
- rasa/core/brokers/broker.py +1 -1
- rasa/core/brokers/kafka.py +56 -8
- rasa/core/channels/__init__.py +82 -35
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +29 -16
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/README.md +25 -13
- rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +18 -18
- rasa/core/channels/inspector/src/App.tsx +56 -12
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
- rasa/core/channels/inspector/src/types.ts +55 -1
- rasa/core/channels/inspector/yarn.lock +336 -189
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +82 -32
- rasa/core/channels/telegram.py +4 -9
- rasa/core/channels/voice_ready/twilio_voice.py +1 -1
- 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 +11 -6
- rasa/core/channels/voice_stream/browser_audio.py +91 -4
- rasa/core/channels/voice_stream/call_state.py +13 -2
- rasa/core/channels/voice_stream/genesys.py +19 -15
- rasa/core/channels/voice_stream/jambonz.py +22 -12
- rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
- rasa/core/channels/voice_stream/util.py +11 -1
- rasa/core/channels/voice_stream/voice_channel.py +170 -32
- rasa/core/concurrent_lock_store.py +83 -16
- rasa/core/config/__init__.py +0 -0
- rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
- rasa/core/config/configuration.py +295 -0
- rasa/core/config/credentials.py +19 -0
- rasa/core/config/message_procesing_config.py +34 -0
- rasa/core/constants.py +17 -0
- rasa/core/exceptions.py +1 -1
- rasa/core/featurizers/tracker_featurizers.py +3 -2
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
- rasa/core/lock_store.py +50 -10
- rasa/core/nlg/contextual_response_rephraser.py +5 -0
- rasa/core/nlg/generator.py +1 -1
- rasa/core/persistor.py +7 -7
- rasa/core/policies/enterprise_search_policy.py +9 -10
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/agent_executor.py +720 -0
- rasa/core/policies/flows/flow_exceptions.py +5 -2
- rasa/core/policies/flows/flow_executor.py +146 -77
- rasa/core/policies/flows/mcp_tool_executor.py +304 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/rule_policy.py +1 -1
- rasa/core/policies/ted_policy.py +20 -12
- rasa/core/policies/unexpected_intent_policy.py +6 -0
- rasa/core/processor.py +100 -44
- rasa/core/redis_connection_factory.py +474 -0
- rasa/core/run.py +49 -10
- rasa/core/test.py +4 -0
- rasa/core/tracker_stores/redis_tracker_store.py +36 -14
- rasa/core/tracker_stores/sql_tracker_store.py +59 -1
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +20 -18
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +22 -23
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/clarify_command.py +20 -2
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
- rasa/dialogue_understanding/commands/utils.py +135 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
- rasa/dialogue_understanding/processor/command_processor.py +136 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +8 -3
- rasa/e2e_test/e2e_test_runner.py +13 -3
- rasa/engine/caching.py +2 -2
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +5 -1
- rasa/engine/loader.py +12 -0
- rasa/engine/recipes/default_components.py +138 -49
- rasa/engine/recipes/default_recipe.py +108 -11
- rasa/engine/runner/dask.py +8 -5
- rasa/engine/validation.py +25 -8
- rasa/graph_components/validators/default_recipe_validator.py +86 -28
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +2 -2
- rasa/model_manager/socket_bridge.py +21 -17
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/model_manager/warm_rasa_process.py +13 -3
- rasa/model_training.py +60 -47
- rasa/nlu/classifiers/diet_classifier.py +198 -98
- rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
- rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
- rasa/nlu/extractors/crf_entity_extractor.py +9 -10
- rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
- rasa/nlu/selectors/response_selector.py +10 -2
- rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
- rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
- rasa/nlu/utils/mitie_utils.py +3 -0
- rasa/nlu/utils/spacy_utils.py +3 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_config.py +1 -1
- rasa/privacy/privacy_manager.py +12 -3
- rasa/server.py +15 -3
- rasa/shared/agents/__init__.py +0 -0
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +105 -0
- rasa/shared/agents/auth/agent_auth_manager.py +92 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
- rasa/shared/agents/auth/constants.py +13 -0
- rasa/shared/agents/auth/types.py +12 -0
- rasa/shared/agents/auth/utils.py +85 -0
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +11 -0
- rasa/shared/core/constants.py +17 -1
- rasa/shared/core/domain.py +62 -22
- rasa/shared/core/events.py +329 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow.py +1 -1
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +21 -5
- rasa/shared/core/flows/flows_yaml_schema.json +119 -184
- rasa/shared/core/flows/steps/call.py +57 -6
- rasa/shared/core/flows/steps/collect.py +98 -13
- rasa/shared/core/flows/validation.py +372 -8
- rasa/shared/core/flows/yaml_flows_io.py +19 -10
- rasa/shared/core/slots.py +6 -2
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
- rasa/shared/exceptions.py +39 -2
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +86 -4
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/llm/_base_litellm_client.py +41 -9
- rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/common.py +26 -1
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +92 -19
- rasa/shared/utils/mcp/__init__.py +0 -0
- rasa/shared/utils/mcp/server_connection.py +250 -0
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/download.py +3 -0
- rasa/studio/prompts.py +1 -0
- rasa/studio/pull/pull.py +3 -2
- rasa/studio/train.py +8 -7
- rasa/studio/upload.py +19 -52
- rasa/telemetry.py +166 -28
- rasa/tracing/config.py +45 -12
- rasa/tracing/constants.py +14 -0
- rasa/tracing/instrumentation/attribute_extractors.py +142 -9
- rasa/tracing/instrumentation/instrumentation.py +626 -21
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/tracing/instrumentation/metrics.py +32 -0
- rasa/tracing/metric_instrument_provider.py +68 -0
- rasa/utils/common.py +92 -1
- rasa/utils/endpoints.py +11 -2
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +121 -7
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/plotting.py +1 -1
- rasa/utils/pypred.py +45 -0
- rasa/utils/tensorflow/__init__.py +7 -0
- rasa/utils/tensorflow/callback.py +136 -101
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +21 -11
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +56 -8
- rasa/utils/tensorflow/rasa_layers.py +8 -6
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +54 -24
- rasa/validator.py +149 -16
- rasa/version.py +1 -1
- rasa_pro-3.14.0.dist-info/METADATA +212 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +581 -269
- rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
- rasa_pro-3.13.12.dist-info/METADATA +0 -192
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
rasa/shared/utils/common.py
CHANGED
|
@@ -17,6 +17,7 @@ from typing import (
|
|
|
17
17
|
Optional,
|
|
18
18
|
Sequence,
|
|
19
19
|
Text,
|
|
20
|
+
Tuple,
|
|
20
21
|
Type,
|
|
21
22
|
)
|
|
22
23
|
|
|
@@ -102,9 +103,12 @@ def sort_list_of_dicts_by_first_key(dicts: List[Dict]) -> List[Dict]:
|
|
|
102
103
|
|
|
103
104
|
def cached_method(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
104
105
|
"""Caches method calls based on the call's `args` and `kwargs`.
|
|
106
|
+
|
|
105
107
|
Works for `async` and `sync` methods. Don't apply this to functions.
|
|
108
|
+
|
|
106
109
|
Args:
|
|
107
110
|
f: The decorated method whose return value should be cached.
|
|
111
|
+
|
|
108
112
|
Returns:
|
|
109
113
|
The return value which the method gives for the first call with the given
|
|
110
114
|
arguments.
|
|
@@ -358,6 +362,7 @@ def validate_environment(
|
|
|
358
362
|
component_name: str,
|
|
359
363
|
) -> None:
|
|
360
364
|
"""Make sure all needed requirements for a component are met.
|
|
365
|
+
|
|
361
366
|
Args:
|
|
362
367
|
required_env_vars: List of environment variables that should be set
|
|
363
368
|
required_packages: List of packages that should be installed
|
|
@@ -373,7 +378,8 @@ def validate_environment(
|
|
|
373
378
|
importlib.import_module(p)
|
|
374
379
|
except ImportError:
|
|
375
380
|
raise MissingDependencyException(
|
|
376
|
-
f"Missing
|
|
381
|
+
f"Missing dependency for {component_name}: {p}. "
|
|
382
|
+
f"Please ensure the correct package is installed."
|
|
377
383
|
)
|
|
378
384
|
|
|
379
385
|
|
|
@@ -388,3 +394,22 @@ Sign up at: https://feedback.rasa.com
|
|
|
388
394
|
{separator}
|
|
389
395
|
"""
|
|
390
396
|
print_success(message)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def conditional_import(module_name: str, class_name: str) -> Tuple[Any, bool]:
|
|
400
|
+
"""Conditionally import a class, returning (class, is_available) tuple.
|
|
401
|
+
|
|
402
|
+
Args:
|
|
403
|
+
module_name: The module path to import from
|
|
404
|
+
class_name: The class name to import
|
|
405
|
+
|
|
406
|
+
Returns:
|
|
407
|
+
A tuple of (class, is_available) where class is the imported class
|
|
408
|
+
or None if import failed, and is_available is a boolean indicating
|
|
409
|
+
whether the import was successful.
|
|
410
|
+
"""
|
|
411
|
+
try:
|
|
412
|
+
module = __import__(module_name, fromlist=[class_name])
|
|
413
|
+
return getattr(module, class_name), True
|
|
414
|
+
except ImportError:
|
|
415
|
+
return None, False
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import Any, Dict, Optional
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional
|
|
3
3
|
|
|
4
4
|
from rasa.exceptions import HealthCheckError
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
pass
|
|
5
8
|
from rasa.shared.constants import (
|
|
6
9
|
LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
|
|
7
10
|
LLM_API_HEALTH_CHECK_ENV_VAR,
|
|
@@ -63,6 +66,7 @@ def perform_llm_health_check(
|
|
|
63
66
|
log_source_component: str,
|
|
64
67
|
) -> None:
|
|
65
68
|
"""Try to instantiate the LLM Client to validate the provided config.
|
|
69
|
+
|
|
66
70
|
If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
|
|
67
71
|
to the LLM API. If config contains multiple models, perform a test call for each
|
|
68
72
|
model in the model group.
|
|
@@ -125,6 +129,7 @@ def perform_embeddings_health_check(
|
|
|
125
129
|
log_source_component: str,
|
|
126
130
|
) -> None:
|
|
127
131
|
"""Try to instantiate the Embedder to validate the provided config.
|
|
132
|
+
|
|
128
133
|
If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
|
|
129
134
|
to the Embeddings API. If config contains multiple models, perform a test call for
|
|
130
135
|
each model in the model group.
|
|
@@ -240,8 +245,7 @@ def send_test_embeddings_api_request(
|
|
|
240
245
|
|
|
241
246
|
|
|
242
247
|
def is_api_health_check_enabled() -> bool:
|
|
243
|
-
"""Determines whether the API health check is enabled
|
|
244
|
-
variable.
|
|
248
|
+
"""Determines whether the API health check is enabled.
|
|
245
249
|
|
|
246
250
|
Returns:
|
|
247
251
|
bool: True if the API health check is enabled, False otherwise.
|
rasa/shared/utils/llm.py
CHANGED
|
@@ -23,13 +23,15 @@ from typing import (
|
|
|
23
23
|
)
|
|
24
24
|
|
|
25
25
|
import structlog
|
|
26
|
+
from jinja2 import Environment, select_autoescape
|
|
26
27
|
from pydantic import BaseModel, Field
|
|
27
28
|
|
|
28
29
|
import rasa.cli.telemetry
|
|
29
30
|
import rasa.cli.utils
|
|
30
31
|
import rasa.shared.utils.cli
|
|
31
32
|
import rasa.shared.utils.io
|
|
32
|
-
from rasa.core.available_endpoints import AvailableEndpoints
|
|
33
|
+
from rasa.core.config.available_endpoints import AvailableEndpoints
|
|
34
|
+
from rasa.core.config.configuration import Configuration
|
|
33
35
|
from rasa.shared.constants import (
|
|
34
36
|
CONFIG_NAME_KEY,
|
|
35
37
|
CONFIG_PIPELINE_KEY,
|
|
@@ -49,7 +51,15 @@ from rasa.shared.constants import (
|
|
|
49
51
|
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
|
|
50
52
|
ROUTER_CONFIG_KEY,
|
|
51
53
|
)
|
|
52
|
-
from rasa.shared.core.events import
|
|
54
|
+
from rasa.shared.core.events import (
|
|
55
|
+
AgentCancelled,
|
|
56
|
+
AgentCompleted,
|
|
57
|
+
AgentInterrupted,
|
|
58
|
+
AgentResumed,
|
|
59
|
+
AgentStarted,
|
|
60
|
+
BotUttered,
|
|
61
|
+
UserUttered,
|
|
62
|
+
)
|
|
53
63
|
from rasa.shared.core.slots import BooleanSlot, CategoricalSlot, Slot
|
|
54
64
|
from rasa.shared.engine.caching import get_local_cache_location
|
|
55
65
|
from rasa.shared.exceptions import (
|
|
@@ -112,7 +122,7 @@ DEPLOYMENT_CENTRIC_PROVIDERS = [AZURE_OPENAI_PROVIDER]
|
|
|
112
122
|
|
|
113
123
|
# Placeholder messages used in the transcript for
|
|
114
124
|
# instances where user input results in an error
|
|
115
|
-
ERROR_PLACEHOLDER = {
|
|
125
|
+
ERROR_PLACEHOLDER: Dict[str, str] = {
|
|
116
126
|
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG: "[User sent really long message]",
|
|
117
127
|
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY: "",
|
|
118
128
|
"default": "[User input triggered an error]",
|
|
@@ -225,6 +235,7 @@ def tracker_as_readable_transcript(
|
|
|
225
235
|
ai_prefix: str = AI,
|
|
226
236
|
max_turns: Optional[int] = 20,
|
|
227
237
|
turns_wrapper: Optional[Callable[[List[str]], List[str]]] = None,
|
|
238
|
+
highlight_agent_turns: bool = False,
|
|
228
239
|
) -> str:
|
|
229
240
|
"""Creates a readable dialogue from a tracker.
|
|
230
241
|
|
|
@@ -234,6 +245,7 @@ def tracker_as_readable_transcript(
|
|
|
234
245
|
ai_prefix: the prefix to use for ai utterances
|
|
235
246
|
max_turns: the maximum number of turns to include in the transcript
|
|
236
247
|
turns_wrapper: optional function to wrap the turns in a custom way
|
|
248
|
+
highlight_agent_turns: whether to highlight agent turns in the transcript
|
|
237
249
|
|
|
238
250
|
Example:
|
|
239
251
|
>>> tracker = Tracker(
|
|
@@ -251,7 +263,9 @@ def tracker_as_readable_transcript(
|
|
|
251
263
|
Returns:
|
|
252
264
|
A string representing the transcript of the tracker
|
|
253
265
|
"""
|
|
254
|
-
transcript = []
|
|
266
|
+
transcript: List[str] = []
|
|
267
|
+
|
|
268
|
+
current_ai_prefix = ai_prefix
|
|
255
269
|
|
|
256
270
|
# using `applied_events` rather than `events` means that only events after the
|
|
257
271
|
# most recent `Restart` or `SessionStarted` are included in the transcript
|
|
@@ -266,9 +280,20 @@ def tracker_as_readable_transcript(
|
|
|
266
280
|
else:
|
|
267
281
|
message = sanitize_message_for_prompt(event.text)
|
|
268
282
|
transcript.append(f"{human_prefix}: {message}")
|
|
269
|
-
|
|
270
283
|
elif isinstance(event, BotUttered):
|
|
271
|
-
transcript.append(
|
|
284
|
+
transcript.append(
|
|
285
|
+
f"{current_ai_prefix}: {sanitize_message_for_prompt(event.text)}"
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
if highlight_agent_turns:
|
|
289
|
+
if isinstance(event, AgentStarted) or isinstance(event, AgentResumed):
|
|
290
|
+
current_ai_prefix = event.agent_id
|
|
291
|
+
elif (
|
|
292
|
+
isinstance(event, AgentCompleted)
|
|
293
|
+
or isinstance(event, AgentCancelled)
|
|
294
|
+
or isinstance(event, AgentInterrupted)
|
|
295
|
+
):
|
|
296
|
+
current_ai_prefix = ai_prefix
|
|
272
297
|
|
|
273
298
|
# turns_wrapper to count multiple utterances by bot/user as single turn
|
|
274
299
|
if turns_wrapper:
|
|
@@ -694,6 +719,38 @@ def embedder_client_factory(
|
|
|
694
719
|
return client
|
|
695
720
|
|
|
696
721
|
|
|
722
|
+
def validate_jinja2_template(template_content: Text) -> None:
|
|
723
|
+
"""Validate that a template string has valid Jinja2 syntax.
|
|
724
|
+
|
|
725
|
+
Args:
|
|
726
|
+
template_content: The template content to validate
|
|
727
|
+
|
|
728
|
+
Raises:
|
|
729
|
+
jinja2.exceptions.TemplateSyntaxError: If the template has invalid syntax
|
|
730
|
+
Exception: If there's an error during validation
|
|
731
|
+
"""
|
|
732
|
+
# Create environment with custom filters
|
|
733
|
+
env = Environment(
|
|
734
|
+
autoescape=select_autoescape(
|
|
735
|
+
disabled_extensions=["jinja2"],
|
|
736
|
+
default_for_string=False,
|
|
737
|
+
default=True,
|
|
738
|
+
)
|
|
739
|
+
)
|
|
740
|
+
# Register filters - lazy import to avoid circular dependencies
|
|
741
|
+
from rasa.dialogue_understanding.generator._jinja_filters import (
|
|
742
|
+
to_json_escaped_string,
|
|
743
|
+
)
|
|
744
|
+
from rasa.dialogue_understanding.generator.constants import (
|
|
745
|
+
TO_JSON_ESCAPED_STRING_JINJA_FILTER,
|
|
746
|
+
)
|
|
747
|
+
|
|
748
|
+
env.filters[TO_JSON_ESCAPED_STRING_JINJA_FILTER] = to_json_escaped_string
|
|
749
|
+
|
|
750
|
+
# Validate Jinja2 syntax
|
|
751
|
+
env.from_string(template_content)
|
|
752
|
+
|
|
753
|
+
|
|
697
754
|
def get_prompt_template(
|
|
698
755
|
jinja_file_path: Optional[Text],
|
|
699
756
|
default_prompt_template: Text,
|
|
@@ -739,7 +796,7 @@ def get_prompt_template(
|
|
|
739
796
|
log_source_method=log_source_method,
|
|
740
797
|
)
|
|
741
798
|
return prompt_template
|
|
742
|
-
except (FileIOException, FileNotFoundException):
|
|
799
|
+
except (FileIOException, FileNotFoundException) as e:
|
|
743
800
|
structlogger.warning(
|
|
744
801
|
"utils.llm.get_prompt_template" ".failed_to_read_custom_prompt_template",
|
|
745
802
|
event_info=(
|
|
@@ -747,6 +804,7 @@ def get_prompt_template(
|
|
|
747
804
|
),
|
|
748
805
|
log_source_component=log_source_component,
|
|
749
806
|
log_source_method=log_source_method,
|
|
807
|
+
error=str(e),
|
|
750
808
|
)
|
|
751
809
|
return default_prompt_template
|
|
752
810
|
|
|
@@ -899,7 +957,7 @@ def resolve_model_client_config(
|
|
|
899
957
|
if model_groups:
|
|
900
958
|
endpoints = AvailableEndpoints(model_groups=model_groups)
|
|
901
959
|
else:
|
|
902
|
-
endpoints =
|
|
960
|
+
endpoints = Configuration.get_instance().endpoints
|
|
903
961
|
if endpoints.model_groups is None:
|
|
904
962
|
_raise_invalid_config_exception(
|
|
905
963
|
reason=(
|
|
@@ -1015,26 +1073,24 @@ def _get_llm_command_generator_config(
|
|
|
1015
1073
|
return None
|
|
1016
1074
|
|
|
1017
1075
|
|
|
1018
|
-
def
|
|
1019
|
-
config: Dict[Text, Any],
|
|
1076
|
+
def _get_compact_llm_command_generator_prompt(
|
|
1077
|
+
config: Dict[Text, Any], model_groups: Dict[Text, Any]
|
|
1020
1078
|
) -> Text:
|
|
1021
1079
|
"""Get the command generator prompt based on the config."""
|
|
1022
1080
|
from rasa.dialogue_understanding.generator.single_step.compact_llm_command_generator import ( # noqa: E501
|
|
1023
|
-
|
|
1024
|
-
FALLBACK_COMMAND_PROMPT_TEMPLATE_FILE_NAME,
|
|
1025
|
-
MODEL_PROMPT_MAPPER,
|
|
1081
|
+
CompactLLMCommandGenerator,
|
|
1026
1082
|
)
|
|
1027
1083
|
|
|
1028
1084
|
model_config = _get_llm_command_generator_config(config)
|
|
1029
1085
|
llm_config = resolve_model_client_config(
|
|
1030
1086
|
model_config=model_config,
|
|
1031
|
-
model_groups=
|
|
1087
|
+
model_groups=model_groups,
|
|
1032
1088
|
)
|
|
1033
1089
|
return get_default_prompt_template_based_on_model(
|
|
1034
1090
|
llm_config=llm_config or {},
|
|
1035
|
-
model_prompt_mapping=
|
|
1036
|
-
default_prompt_path=
|
|
1037
|
-
fallback_prompt_path=
|
|
1091
|
+
model_prompt_mapping=CompactLLMCommandGenerator.get_model_prompt_mapper(),
|
|
1092
|
+
default_prompt_path=CompactLLMCommandGenerator.get_default_prompt_template_file_name(),
|
|
1093
|
+
fallback_prompt_path=CompactLLMCommandGenerator.get_fallback_prompt_template_file_name(),
|
|
1038
1094
|
)
|
|
1039
1095
|
|
|
1040
1096
|
|
|
@@ -1063,7 +1119,7 @@ def get_system_default_prompts(
|
|
|
1063
1119
|
|
|
1064
1120
|
Args:
|
|
1065
1121
|
config: The config.yml file data.
|
|
1066
|
-
endpoints: The endpoints
|
|
1122
|
+
endpoints: The endpoints configuration dictionary.
|
|
1067
1123
|
|
|
1068
1124
|
Returns:
|
|
1069
1125
|
SystemPrompts: A Pydantic model containing all default prompts.
|
|
@@ -1072,8 +1128,25 @@ def get_system_default_prompts(
|
|
|
1072
1128
|
DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE,
|
|
1073
1129
|
)
|
|
1074
1130
|
|
|
1131
|
+
# The Model Manager / Model API service receives the endpoints configuration
|
|
1132
|
+
# as raw YAML text rather than as a file path. However, both
|
|
1133
|
+
# Configuration.initialise_endpoints() and AvailableEndpoints.read_endpoints()
|
|
1134
|
+
# currently only accept a Path input and do not support loading from in-memory
|
|
1135
|
+
# YAML content.
|
|
1136
|
+
|
|
1137
|
+
# Since these classes only support file-based initialization today, we need
|
|
1138
|
+
# to bootstrap the Configuration with an empty AvailableEndpoints instance for now.
|
|
1139
|
+
|
|
1140
|
+
# IMPORTANT: This configuration must be properly initialized with valid endpoints
|
|
1141
|
+
# and available agents once Studio introduces full support for Agent configurations
|
|
1142
|
+
# (A2A and MCP).
|
|
1143
|
+
Configuration.initialise_empty()
|
|
1144
|
+
|
|
1145
|
+
model_groups = endpoints.get(MODEL_GROUPS_CONFIG_KEY)
|
|
1075
1146
|
return SystemPrompts(
|
|
1076
|
-
command_generator=
|
|
1147
|
+
command_generator=_get_compact_llm_command_generator_prompt(
|
|
1148
|
+
config, model_groups
|
|
1149
|
+
),
|
|
1077
1150
|
enterprise_search=_get_enterprise_search_prompt(config),
|
|
1078
1151
|
contextual_response_rephraser=DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE,
|
|
1079
1152
|
)
|
|
File without changes
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"""MCP server connection utilities."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import warnings
|
|
5
|
+
from contextlib import AsyncExitStack, asynccontextmanager
|
|
6
|
+
from typing import Any, AsyncIterator, ClassVar, Dict, List, Optional
|
|
7
|
+
|
|
8
|
+
import structlog
|
|
9
|
+
from httpx import HTTPStatusError
|
|
10
|
+
from mcp import ClientSession
|
|
11
|
+
from mcp.client.streamable_http import streamablehttp_client
|
|
12
|
+
|
|
13
|
+
from rasa.shared.agents.auth.agent_auth_manager import AgentAuthManager
|
|
14
|
+
from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
|
|
15
|
+
from rasa.shared.exceptions import AuthenticationError
|
|
16
|
+
|
|
17
|
+
structlogger = structlog.get_logger()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# Suppress RuntimeWarning about unawaited coroutines when MCP server is not reachable.
|
|
21
|
+
warnings.filterwarnings(
|
|
22
|
+
"ignore",
|
|
23
|
+
message=".*BaseEventLoop.create_server.*was never awaited.*",
|
|
24
|
+
category=RuntimeWarning,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MCPServerConnection:
|
|
29
|
+
"""
|
|
30
|
+
Manages connection to an MCP server, with optional authentication.
|
|
31
|
+
|
|
32
|
+
This class handles:
|
|
33
|
+
- Connection establishment and cleanup
|
|
34
|
+
- Session lifecycle management
|
|
35
|
+
- Authentication via AgentAuthManager (API Key, OAuth2, mTLS, etc.)
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# Timeout for ping operations in seconds
|
|
39
|
+
PING_TIMEOUT_SECONDS = 3.0
|
|
40
|
+
|
|
41
|
+
_SUPPORTED_SERVER_TYPES: ClassVar[List[str]] = ["http", "https"]
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
server_name: str,
|
|
46
|
+
server_url: str,
|
|
47
|
+
server_type: str,
|
|
48
|
+
auth_manager: Optional[AgentAuthManager] = None,
|
|
49
|
+
):
|
|
50
|
+
"""
|
|
51
|
+
Initialize the MCP server connection.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
server_name: Server name to identify the server
|
|
55
|
+
server_url: Server URL
|
|
56
|
+
server_type: Server type (currently only 'http' is supported)
|
|
57
|
+
auth_manager: Optional AgentAuthManager instance for this connection
|
|
58
|
+
"""
|
|
59
|
+
self.server_name = server_name
|
|
60
|
+
self.server_url = server_url
|
|
61
|
+
self.server_type = server_type
|
|
62
|
+
self._auth_manager = auth_manager
|
|
63
|
+
self.session: Optional[ClientSession] = None
|
|
64
|
+
self.exit_stack: Optional[AsyncExitStack] = None
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def from_config(cls, server_config: Dict[str, Any]) -> "MCPServerConnection":
|
|
68
|
+
"""Initialize the MCP server connection from a configuration dictionary."""
|
|
69
|
+
auth_config = server_config.get("additional_params")
|
|
70
|
+
_auth_manager = AgentAuthManager.load_auth(auth_config)
|
|
71
|
+
return cls(
|
|
72
|
+
server_config["name"],
|
|
73
|
+
server_config["url"],
|
|
74
|
+
server_config.get("type", "http"),
|
|
75
|
+
_auth_manager,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
@staticmethod
|
|
79
|
+
@asynccontextmanager
|
|
80
|
+
async def open_mcp_session(
|
|
81
|
+
url: str, auth_strategy: Optional[AgentAuthStrategy] = None
|
|
82
|
+
) -> AsyncIterator[ClientSession]:
|
|
83
|
+
"""
|
|
84
|
+
Open a streamable MCP session, ensuring that initialization
|
|
85
|
+
completes before yielding.
|
|
86
|
+
"""
|
|
87
|
+
async with streamablehttp_client(url, auth=auth_strategy) as (
|
|
88
|
+
read_stream,
|
|
89
|
+
write_stream,
|
|
90
|
+
_,
|
|
91
|
+
):
|
|
92
|
+
async with ClientSession(read_stream, write_stream) as session:
|
|
93
|
+
await session.initialize() # handshake done here
|
|
94
|
+
yield session
|
|
95
|
+
|
|
96
|
+
async def connect(self) -> None:
|
|
97
|
+
"""Establish connection to the MCP server.
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
ValueError: If the server type is not supported.
|
|
101
|
+
ConnectionError: If connection fails.
|
|
102
|
+
AuthenticationError: If authentication fails.
|
|
103
|
+
"""
|
|
104
|
+
if self.server_type not in self._SUPPORTED_SERVER_TYPES:
|
|
105
|
+
raise ValueError(f"Unsupported server type: {self.server_type}")
|
|
106
|
+
|
|
107
|
+
# Create a new exit stack for this connection to avoid task boundary issues
|
|
108
|
+
self.exit_stack = AsyncExitStack()
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
# Get authentication strategy that adheres to httpx.Auth.
|
|
112
|
+
auth_strategy = (
|
|
113
|
+
self._auth_manager.get_auth() if self._auth_manager else None
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Register the wrapped context manager in the stack
|
|
117
|
+
self.session = await self.exit_stack.enter_async_context(
|
|
118
|
+
self.open_mcp_session(self.server_url, auth_strategy)
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
except Exception as eg:
|
|
122
|
+
for exc in getattr(eg, "exceptions", [eg]):
|
|
123
|
+
event_info = (
|
|
124
|
+
f"Failed to connect to MCP server `{self.server_name}`. \nOriginal "
|
|
125
|
+
f"error: {exc!s}"
|
|
126
|
+
)
|
|
127
|
+
if isinstance(exc, HTTPStatusError):
|
|
128
|
+
status_code = exc.response.status_code
|
|
129
|
+
structlogger.error(
|
|
130
|
+
"mcp_server_connection.connect.http_status_error",
|
|
131
|
+
event_info=event_info,
|
|
132
|
+
server_name=self.server_name,
|
|
133
|
+
server_url=self.server_url,
|
|
134
|
+
status_code=status_code,
|
|
135
|
+
response_text=exc.response.reason_phrase,
|
|
136
|
+
)
|
|
137
|
+
await self._cleanup()
|
|
138
|
+
if status_code in [400, 401, 403]:
|
|
139
|
+
raise AuthenticationError(str(exc)) from eg
|
|
140
|
+
elif status_code == 404:
|
|
141
|
+
raise Exception(str(exc)) from eg
|
|
142
|
+
else:
|
|
143
|
+
raise ConnectionError(str(exc)) from eg
|
|
144
|
+
else:
|
|
145
|
+
structlogger.error(
|
|
146
|
+
"mcp_server_connection.connect.other_exception",
|
|
147
|
+
event_info=event_info,
|
|
148
|
+
server_name=self.server_name,
|
|
149
|
+
server_url=self.server_url,
|
|
150
|
+
error=str(exc),
|
|
151
|
+
)
|
|
152
|
+
await self._cleanup()
|
|
153
|
+
raise ConnectionError(str(exc)) from eg
|
|
154
|
+
|
|
155
|
+
except asyncio.CancelledError as e:
|
|
156
|
+
event_info = f"Connection to MCP server `{self.server_name}` was cancelled."
|
|
157
|
+
structlogger.error(
|
|
158
|
+
"mcp_server_connection.connect.connection_cancelled",
|
|
159
|
+
event_info=event_info,
|
|
160
|
+
server_name=self.server_name,
|
|
161
|
+
server_url=self.server_url,
|
|
162
|
+
)
|
|
163
|
+
# Clean up on cancellation
|
|
164
|
+
await self._cleanup()
|
|
165
|
+
raise ConnectionError(e) from e
|
|
166
|
+
|
|
167
|
+
async def ensure_active_session(self) -> ClientSession:
|
|
168
|
+
"""
|
|
169
|
+
Ensure an active session is available.
|
|
170
|
+
|
|
171
|
+
If no session exists or the current session is inactive,
|
|
172
|
+
a new connection will be established.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
Active ClientSession instance.
|
|
176
|
+
"""
|
|
177
|
+
if self.session is None:
|
|
178
|
+
await self.connect()
|
|
179
|
+
structlogger.info(
|
|
180
|
+
"mcp_server_connection.ensure_active_session.no_session",
|
|
181
|
+
server_name=self.server_name,
|
|
182
|
+
server_url=self.server_url,
|
|
183
|
+
event_info=(
|
|
184
|
+
"No session found, connecting to the server "
|
|
185
|
+
f"`{self.server_name}` @ `{self.server_url}`"
|
|
186
|
+
),
|
|
187
|
+
)
|
|
188
|
+
if self.session:
|
|
189
|
+
try:
|
|
190
|
+
# Add timeout to prevent hanging when MCP server is down
|
|
191
|
+
await asyncio.wait_for(
|
|
192
|
+
self.session.send_ping(), timeout=self.PING_TIMEOUT_SECONDS
|
|
193
|
+
)
|
|
194
|
+
except asyncio.TimeoutError as e:
|
|
195
|
+
structlogger.error(
|
|
196
|
+
"mcp_server_connection.ensure_active_session.ping_timeout",
|
|
197
|
+
server_name=self.server_name,
|
|
198
|
+
server_url=self.server_url,
|
|
199
|
+
event_info=(
|
|
200
|
+
"Ping timed out, Server not reachable - "
|
|
201
|
+
f"`{self.server_name}` @ `{self.server_url}`"
|
|
202
|
+
),
|
|
203
|
+
)
|
|
204
|
+
raise e
|
|
205
|
+
except Exception as e:
|
|
206
|
+
structlogger.warning(
|
|
207
|
+
"mcp_server_connection.ensure_active_session.ping_failed",
|
|
208
|
+
error=str(e),
|
|
209
|
+
server_name=self.server_name,
|
|
210
|
+
server_url=self.server_url,
|
|
211
|
+
event_info=(
|
|
212
|
+
"Ping failed, trying to reconnect to the server "
|
|
213
|
+
f"`{self.server_name}` @ `{self.server_url}`"
|
|
214
|
+
),
|
|
215
|
+
)
|
|
216
|
+
# Cleanup existing session
|
|
217
|
+
await self.close()
|
|
218
|
+
# Attempt to reconnect now
|
|
219
|
+
await self.connect()
|
|
220
|
+
structlogger.info(
|
|
221
|
+
"mcp_server_connection.ensure_active_session.reconnected",
|
|
222
|
+
server_name=self.server_name,
|
|
223
|
+
server_url=self.server_url,
|
|
224
|
+
event_info=(
|
|
225
|
+
"Reconnected to the server "
|
|
226
|
+
f"`{self.server_name}` @ `{self.server_url}`"
|
|
227
|
+
),
|
|
228
|
+
)
|
|
229
|
+
assert self.session is not None # Ensures type for mypy
|
|
230
|
+
return self.session
|
|
231
|
+
|
|
232
|
+
async def close(self) -> None:
|
|
233
|
+
"""Close the connection and clean up resources."""
|
|
234
|
+
await self._cleanup()
|
|
235
|
+
|
|
236
|
+
async def _cleanup(self) -> None:
|
|
237
|
+
"""Internal cleanup method to safely close resources."""
|
|
238
|
+
if self.exit_stack:
|
|
239
|
+
try:
|
|
240
|
+
await self.exit_stack.aclose()
|
|
241
|
+
except Exception as e:
|
|
242
|
+
# Log cleanup errors but don't raise them
|
|
243
|
+
structlogger.warning(
|
|
244
|
+
"mcp_server_connection.cleanup.failed",
|
|
245
|
+
server_name=self.server_name,
|
|
246
|
+
error=str(e),
|
|
247
|
+
)
|
|
248
|
+
finally:
|
|
249
|
+
self.exit_stack = None
|
|
250
|
+
self.session = None
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""MCP utilities."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def mcp_server_exists(mcp_server: str) -> bool:
|
|
5
|
+
"""Check if an MCP server exists in the configured endpoints.
|
|
6
|
+
|
|
7
|
+
Args:
|
|
8
|
+
mcp_server: The name of the MCP server to check.
|
|
9
|
+
|
|
10
|
+
Returns:
|
|
11
|
+
True if the MCP server exists, False otherwise.
|
|
12
|
+
"""
|
|
13
|
+
from rasa.core.config.configuration import Configuration
|
|
14
|
+
|
|
15
|
+
endpoints = Configuration.get_instance().endpoints
|
|
16
|
+
if (mcp_server_list := endpoints.mcp_servers) is None:
|
|
17
|
+
return False
|
|
18
|
+
|
|
19
|
+
mcp_server_names = [server.name for server in mcp_server_list]
|
|
20
|
+
return mcp_server in mcp_server_names
|
|
@@ -160,6 +160,43 @@ FLOW_CANCELLED = {
|
|
|
160
160
|
"step_id": {"type": "string"},
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
+
AGENT_STARTED = {
|
|
164
|
+
"properties": {
|
|
165
|
+
"event": {"const": "agent_started"},
|
|
166
|
+
"agent_id": {"type": "string"},
|
|
167
|
+
"flow_id": {"type": "string"},
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
AGENT_COMPLETED = {
|
|
171
|
+
"properties": {
|
|
172
|
+
"event": {"const": "agent_completed"},
|
|
173
|
+
"agent_id": {"type": "string"},
|
|
174
|
+
"flow_id": {"type": "string"},
|
|
175
|
+
"status": {"type": "string"},
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
AGENT_INTERRUPTED = {
|
|
179
|
+
"properties": {
|
|
180
|
+
"event": {"const": "agent_interrupted"},
|
|
181
|
+
"agent_id": {"type": "string"},
|
|
182
|
+
"flow_id": {"type": "string"},
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
AGENT_RESUMED = {
|
|
186
|
+
"properties": {
|
|
187
|
+
"event": {"const": "agent_resumed"},
|
|
188
|
+
"agent_id": {"type": "string"},
|
|
189
|
+
"flow_id": {"type": "string"},
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
AGENT_CANCELLED = {
|
|
193
|
+
"properties": {
|
|
194
|
+
"event": {"const": "agent_cancelled"},
|
|
195
|
+
"agent_id": {"type": "string"},
|
|
196
|
+
"flow_id": {"type": "string"},
|
|
197
|
+
"reason": {"type": "string"},
|
|
198
|
+
}
|
|
199
|
+
}
|
|
163
200
|
DIALOGUE_STACK_UPDATED = {
|
|
164
201
|
"properties": {"event": {"const": "stack"}, "update": {"type": "string"}}
|
|
165
202
|
}
|
|
@@ -204,6 +241,11 @@ EVENT_SCHEMA = {
|
|
|
204
241
|
FLOW_RESUMED,
|
|
205
242
|
FLOW_COMPLETED,
|
|
206
243
|
FLOW_CANCELLED,
|
|
244
|
+
AGENT_STARTED,
|
|
245
|
+
AGENT_COMPLETED,
|
|
246
|
+
AGENT_INTERRUPTED,
|
|
247
|
+
AGENT_RESUMED,
|
|
248
|
+
AGENT_CANCELLED,
|
|
207
249
|
DIALOGUE_STACK_UPDATED,
|
|
208
250
|
ROUTING_SESSION_ENDED,
|
|
209
251
|
SESSION_ENDED,
|
rasa/shared/utils/yaml.py
CHANGED
|
@@ -335,7 +335,9 @@ class YamlValidationException(YamlException, ValueError):
|
|
|
335
335
|
)
|
|
336
336
|
if found_lc:
|
|
337
337
|
return line_offset
|
|
338
|
-
|
|
338
|
+
if this_line is not None:
|
|
339
|
+
return this_line + line_offset
|
|
340
|
+
return line_offset
|
|
339
341
|
return line
|
|
340
342
|
elif isinstance(current, list) and head.isdigit():
|
|
341
343
|
return (
|
rasa/studio/download.py
CHANGED
|
@@ -10,6 +10,7 @@ from ruamel.yaml.scalarstring import LiteralScalarString
|
|
|
10
10
|
|
|
11
11
|
import rasa.cli.utils
|
|
12
12
|
import rasa.shared.utils.cli
|
|
13
|
+
from rasa.core.config.configuration import Configuration
|
|
13
14
|
from rasa.shared.constants import (
|
|
14
15
|
DEFAULT_CONFIG_PATH,
|
|
15
16
|
DEFAULT_DATA_PATH,
|
|
@@ -116,6 +117,8 @@ def _handle_endpoints(handler: StudioDataHandler, root: Path) -> None:
|
|
|
116
117
|
endpoints_path = root / DEFAULT_ENDPOINTS_PATH
|
|
117
118
|
endpoints_path.write_text(endpoints_data, encoding="utf-8")
|
|
118
119
|
|
|
120
|
+
Configuration.initialise_endpoints(endpoints_path=endpoints_path)
|
|
121
|
+
|
|
119
122
|
|
|
120
123
|
def _handle_domain(handler: StudioDataHandler, root: Path) -> None:
|
|
121
124
|
"""Persist the assistant’s domain file.
|
rasa/studio/prompts.py
CHANGED
|
@@ -43,6 +43,7 @@ def handle_prompts(prompts: Dict[Text, Text], root: Path) -> None:
|
|
|
43
43
|
config: Dict = read_yaml(config_path)
|
|
44
44
|
endpoints: Dict = read_yaml(endpoints_path)
|
|
45
45
|
|
|
46
|
+
# System default prompts are dependent on the endpoints
|
|
46
47
|
system_prompts = get_system_default_prompts(config, endpoints)
|
|
47
48
|
|
|
48
49
|
_handle_contextual_response_rephraser(
|