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
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
from pydantic import BaseModel, Field, model_validator
|
|
9
|
+
from ruamel import yaml as yaml
|
|
10
|
+
|
|
11
|
+
from rasa.exceptions import ValidationError
|
|
12
|
+
from rasa.shared.utils.yaml import read_config_file
|
|
13
|
+
|
|
14
|
+
DEFAULT_AGENTS_CONFIG_FOLDER = "sub_agents"
|
|
15
|
+
|
|
16
|
+
structlogger = structlog.get_logger()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ProtocolConfig(str, Enum):
|
|
20
|
+
"""Supported protocols for agents."""
|
|
21
|
+
|
|
22
|
+
RASA = "RASA"
|
|
23
|
+
A2A = "A2A"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class AgentInfo(BaseModel):
|
|
27
|
+
"""Configuration for an agent."""
|
|
28
|
+
|
|
29
|
+
name: str = Field(..., description="Agent name")
|
|
30
|
+
protocol: ProtocolConfig = Field(
|
|
31
|
+
default=ProtocolConfig.RASA,
|
|
32
|
+
description="Protocol used to communicate with the agent.",
|
|
33
|
+
)
|
|
34
|
+
description: str = Field(..., description="Agent description")
|
|
35
|
+
|
|
36
|
+
@model_validator(mode="before")
|
|
37
|
+
@classmethod
|
|
38
|
+
def validate_protocol(cls, values: Any) -> Any:
|
|
39
|
+
"""Validate and normalize protocol values to support lowercase input."""
|
|
40
|
+
if isinstance(values, dict) and "protocol" in values:
|
|
41
|
+
protocol_value = values["protocol"]
|
|
42
|
+
if isinstance(protocol_value, str):
|
|
43
|
+
# Map lowercase protocol names to uppercase enum values
|
|
44
|
+
protocol_mapping = {
|
|
45
|
+
"rasa": ProtocolConfig.RASA,
|
|
46
|
+
"a2a": ProtocolConfig.A2A,
|
|
47
|
+
"RASA": ProtocolConfig.RASA,
|
|
48
|
+
"A2A": ProtocolConfig.A2A,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if protocol_value.lower() in protocol_mapping:
|
|
52
|
+
values["protocol"] = protocol_mapping[protocol_value.lower()]
|
|
53
|
+
else:
|
|
54
|
+
# If it's not a recognized protocol, let Pydantic handle the
|
|
55
|
+
# validation
|
|
56
|
+
# This will raise a proper validation error
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
return values
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AgentConfiguration(BaseModel):
|
|
63
|
+
llm: Optional[Dict[str, Any]] = None
|
|
64
|
+
prompt_template: Optional[str] = None
|
|
65
|
+
module: Optional[str] = None
|
|
66
|
+
timeout: Optional[int] = None # timeout in seconds
|
|
67
|
+
max_retries: Optional[int] = None
|
|
68
|
+
agent_card: Optional[str] = None
|
|
69
|
+
auth: Optional[Dict[str, Any]] = None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class AgentConnections(BaseModel):
|
|
73
|
+
mcp_servers: Optional[List[AgentMCPServerConfig]] = None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class AgentMCPServerConfig(BaseModel):
|
|
77
|
+
name: str # Reference to MCPServerConfig
|
|
78
|
+
url: Optional[str] = None
|
|
79
|
+
type: Optional[str] = None
|
|
80
|
+
include_tools: Optional[List[str]] = None
|
|
81
|
+
exclude_tools: Optional[List[str]] = None
|
|
82
|
+
# Additional parameters for the MCP server
|
|
83
|
+
additional_params: Optional[Dict[str, Any]] = None
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class AgentConfig(BaseModel):
|
|
87
|
+
agent: AgentInfo
|
|
88
|
+
configuration: Optional[AgentConfiguration] = None
|
|
89
|
+
connections: Optional[AgentConnections] = None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class AvailableAgents:
|
|
93
|
+
"""Collection of configured agents."""
|
|
94
|
+
|
|
95
|
+
def __init__(self, agents: Optional[Dict[str, AgentConfig]] = None) -> None:
|
|
96
|
+
"""Create an `AvailableAgents` object."""
|
|
97
|
+
self.agents: Dict[str, AgentConfig] = agents or {}
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def read_from_folder(cls, sub_agents_folder: str) -> AvailableAgents:
|
|
101
|
+
"""Read the different agents from the given folder."""
|
|
102
|
+
agents: Dict[str, AgentConfig] = {}
|
|
103
|
+
|
|
104
|
+
if not os.path.isdir(sub_agents_folder):
|
|
105
|
+
if sub_agents_folder != DEFAULT_AGENTS_CONFIG_FOLDER:
|
|
106
|
+
# User explicitly specified a folder, it should exist
|
|
107
|
+
raise ValidationError(
|
|
108
|
+
code="agent.sub_agents_folder_not_found",
|
|
109
|
+
event_info=f"The specified agents config folder "
|
|
110
|
+
f"'{sub_agents_folder}' does not exist or is not a "
|
|
111
|
+
f"directory.",
|
|
112
|
+
details={"folder": sub_agents_folder},
|
|
113
|
+
)
|
|
114
|
+
else:
|
|
115
|
+
# We are using the default folder, it may not be created yet
|
|
116
|
+
# Init with an empty agents in this case
|
|
117
|
+
structlogger.debug(
|
|
118
|
+
f"Default agents config folder '{sub_agents_folder}' does not "
|
|
119
|
+
f"exist. Agent configurations won't be loaded."
|
|
120
|
+
)
|
|
121
|
+
return cls(agents)
|
|
122
|
+
|
|
123
|
+
# First, load all agent configs into a temporary list for validation
|
|
124
|
+
agent_configs: List[AgentConfig] = []
|
|
125
|
+
for agent_name in os.listdir(sub_agents_folder):
|
|
126
|
+
agent_folder = os.path.join(sub_agents_folder, agent_name)
|
|
127
|
+
if not os.path.isdir(agent_folder):
|
|
128
|
+
raise ValidationError(
|
|
129
|
+
code="agent.invalid_directory_structure",
|
|
130
|
+
event_info=f"Invalid structure: '{agent_folder}' is not a folder. "
|
|
131
|
+
f"Each agent must be stored in its own folder inside "
|
|
132
|
+
f"'{sub_agents_folder}'. Expected structure: "
|
|
133
|
+
f"{sub_agents_folder}/<agent_name>/config.yml",
|
|
134
|
+
details={
|
|
135
|
+
"agent_name": agent_name,
|
|
136
|
+
"sub_agents_folder": sub_agents_folder,
|
|
137
|
+
},
|
|
138
|
+
)
|
|
139
|
+
config_path = os.path.join(agent_folder, "config.yml")
|
|
140
|
+
if not os.path.isfile(config_path):
|
|
141
|
+
raise ValidationError(
|
|
142
|
+
code="agent.missing_config_file",
|
|
143
|
+
event_info=f"Missing config file for agent '{agent_name}'. "
|
|
144
|
+
f"Expected file: '{config_path}'. "
|
|
145
|
+
f"Each agent folder must contain a 'config.yml' file.",
|
|
146
|
+
details={
|
|
147
|
+
"agent_name": agent_name,
|
|
148
|
+
"expected_config_file": config_path,
|
|
149
|
+
"sub_agents_folder": sub_agents_folder,
|
|
150
|
+
},
|
|
151
|
+
)
|
|
152
|
+
try:
|
|
153
|
+
agent_config = cls._read_agent_config_file(config_path)
|
|
154
|
+
if not isinstance(agent_config, AgentConfig):
|
|
155
|
+
raise ValueError(f"Invalid agent config type for {agent_name}")
|
|
156
|
+
agent_configs.append(agent_config)
|
|
157
|
+
except Exception as e:
|
|
158
|
+
raise ValidationError(
|
|
159
|
+
code="agent.load_failed",
|
|
160
|
+
event_info=f"Failed to load agent '{agent_name}': {e}",
|
|
161
|
+
details={
|
|
162
|
+
"agent_name": agent_name,
|
|
163
|
+
"sub_agents_folder": sub_agents_folder,
|
|
164
|
+
"error": str(e),
|
|
165
|
+
},
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Validate agent names are unique before adding to dictionary
|
|
169
|
+
from rasa.agents.validation import validate_agent_names_unique
|
|
170
|
+
|
|
171
|
+
validate_agent_names_unique(agent_configs)
|
|
172
|
+
|
|
173
|
+
for agent_config in agent_configs:
|
|
174
|
+
agents[agent_config.agent.name] = agent_config
|
|
175
|
+
|
|
176
|
+
structlogger.info(f"Loaded agent configs: {[k for k in agents.keys()]}")
|
|
177
|
+
return cls(agents)
|
|
178
|
+
|
|
179
|
+
@staticmethod
|
|
180
|
+
def from_dict(data: Dict[str, Any]) -> AgentConfig:
|
|
181
|
+
"""Parse the agent config from raw data into Pydantic models.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
data: Raw data from the config file as a dictionary.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
The parsed AgentConfig as a Pydantic model.
|
|
188
|
+
|
|
189
|
+
Raises:
|
|
190
|
+
ValueError: If the data structure is invalid for Pydantic models.
|
|
191
|
+
"""
|
|
192
|
+
return AgentConfig(
|
|
193
|
+
agent=AgentInfo(**data.get("agent", {})),
|
|
194
|
+
configuration=AgentConfiguration(**data.get("configuration", {}))
|
|
195
|
+
if data.get("configuration")
|
|
196
|
+
else None,
|
|
197
|
+
connections=AgentConnections(**data.get("connections", {}))
|
|
198
|
+
if data.get("connections")
|
|
199
|
+
else None,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
@classmethod
|
|
203
|
+
def _read_agent_config_file(cls, config_path: str) -> AgentConfig:
|
|
204
|
+
"""Read the agent config from a yaml file into Pydantic models.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
config_path: Path to the config file.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
The parsed AgentConfig.
|
|
211
|
+
|
|
212
|
+
Raises:
|
|
213
|
+
yaml.YAMLError: If the YAML file is invalid.
|
|
214
|
+
ValidationError: If the data structure is invalid for Pydantic models.
|
|
215
|
+
"""
|
|
216
|
+
data = read_config_file(config_path)
|
|
217
|
+
return cls.from_dict(data)
|
|
218
|
+
|
|
219
|
+
def as_json_list(self) -> List[Dict[str, Any]]:
|
|
220
|
+
"""Convert the available agents to a JSON-serializable list."""
|
|
221
|
+
return [
|
|
222
|
+
{
|
|
223
|
+
"name": agent_name,
|
|
224
|
+
"agent": agent_config.agent.model_dump(),
|
|
225
|
+
"configuration": agent_config.configuration.model_dump()
|
|
226
|
+
if agent_config.configuration
|
|
227
|
+
else None,
|
|
228
|
+
"connections": agent_config.connections.model_dump()
|
|
229
|
+
if agent_config.connections
|
|
230
|
+
else None,
|
|
231
|
+
}
|
|
232
|
+
for agent_name, agent_config in self.agents.items()
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
def get_agent_config(self, agent_id: str) -> Optional[AgentConfig]:
|
|
236
|
+
return self.agents.get(agent_id)
|
|
237
|
+
|
|
238
|
+
def has_agents(self) -> bool:
|
|
239
|
+
return len(self.agents) > 0
|
rasa/core/brokers/broker.py
CHANGED
|
@@ -66,7 +66,7 @@ class EventBroker:
|
|
|
66
66
|
raise NotImplementedError("Event broker must implement the `publish` method.")
|
|
67
67
|
|
|
68
68
|
def is_ready(self) -> bool:
|
|
69
|
-
"""Determine whether
|
|
69
|
+
"""Determine whether the event broker is ready.
|
|
70
70
|
|
|
71
71
|
Returns:
|
|
72
72
|
`True` by default, but this may be overridden by subclasses.
|
rasa/core/brokers/kafka.py
CHANGED
|
@@ -6,13 +6,19 @@ import threading
|
|
|
6
6
|
import time
|
|
7
7
|
from asyncio import AbstractEventLoop
|
|
8
8
|
from functools import cached_property
|
|
9
|
-
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Union
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
|
|
10
10
|
|
|
11
11
|
import structlog
|
|
12
12
|
|
|
13
13
|
import rasa.shared.utils.common
|
|
14
14
|
from rasa.core.brokers.broker import EventBroker
|
|
15
|
+
from rasa.core.constants import KAFKA_SERVICE_NAME
|
|
15
16
|
from rasa.core.exceptions import KafkaProducerInitializationError
|
|
17
|
+
from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
|
|
18
|
+
IAMCredentialsProviderInput,
|
|
19
|
+
SupportedServiceType,
|
|
20
|
+
create_iam_credentials_provider,
|
|
21
|
+
)
|
|
16
22
|
from rasa.shared.core.events import ErrorHandled
|
|
17
23
|
from rasa.shared.utils.io import DEFAULT_ENCODING
|
|
18
24
|
from rasa.utils.endpoints import EndpointConfig
|
|
@@ -93,6 +99,12 @@ class KafkaEventBroker(EventBroker):
|
|
|
93
99
|
self.ssl_keyfile = ssl_keyfile
|
|
94
100
|
self.queue_size = kwargs.get("queue_size")
|
|
95
101
|
self.ssl_check_hostname = "https" if ssl_check_hostname else None
|
|
102
|
+
self.iam_credentials_provider = create_iam_credentials_provider(
|
|
103
|
+
IAMCredentialsProviderInput(
|
|
104
|
+
service_type=SupportedServiceType.EVENT_BROKER,
|
|
105
|
+
service_name=KAFKA_SERVICE_NAME,
|
|
106
|
+
)
|
|
107
|
+
)
|
|
96
108
|
|
|
97
109
|
# PII management attributes
|
|
98
110
|
self.stream_pii = kwargs.get("stream_pii", True)
|
|
@@ -134,8 +146,8 @@ class KafkaEventBroker(EventBroker):
|
|
|
134
146
|
try:
|
|
135
147
|
self._check_kafka_connection()
|
|
136
148
|
logger.debug("Connection to kafka successful.")
|
|
137
|
-
except KafkaException:
|
|
138
|
-
logger.debug("Failed to connect kafka
|
|
149
|
+
except KafkaException as exc:
|
|
150
|
+
logger.debug(f"Failed to connect to kafka: {exc}")
|
|
139
151
|
return
|
|
140
152
|
while retries:
|
|
141
153
|
try:
|
|
@@ -215,7 +227,31 @@ class KafkaEventBroker(EventBroker):
|
|
|
215
227
|
KafkaException: if Kafka is disconnected.
|
|
216
228
|
"""
|
|
217
229
|
if self.producer is not None:
|
|
218
|
-
|
|
230
|
+
structlogger.debug(
|
|
231
|
+
"rasa.core.brokers.kafka.KafkaEventBroker.check_kafka_connection",
|
|
232
|
+
)
|
|
233
|
+
# we have to poll to trigger the oauth_cb if using IAM authentication
|
|
234
|
+
self.producer.poll(0)
|
|
235
|
+
self.producer.list_topics(self.topic, timeout=5)
|
|
236
|
+
|
|
237
|
+
def get_aws_iam_token(
|
|
238
|
+
self, oauth_config: Any
|
|
239
|
+
) -> Tuple[Optional[str], Optional[float]]:
|
|
240
|
+
"""Callback function to fetch AWS IAM token for MSK authentication.
|
|
241
|
+
|
|
242
|
+
The callback function requires this specific signature to work correctly.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
oauth_config: OAuth configuration.
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
A tuple of auth token and expiry time in seconds.
|
|
249
|
+
"""
|
|
250
|
+
if self.iam_credentials_provider is None:
|
|
251
|
+
return None, None
|
|
252
|
+
|
|
253
|
+
temp_credentials = self.iam_credentials_provider.get_temporary_credentials()
|
|
254
|
+
return temp_credentials.auth_token, temp_credentials.expiration
|
|
219
255
|
|
|
220
256
|
def _get_kafka_config(self) -> Dict[Text, Any]:
|
|
221
257
|
config = {
|
|
@@ -246,15 +282,27 @@ class KafkaEventBroker(EventBroker):
|
|
|
246
282
|
}
|
|
247
283
|
elif self.security_protocol == "SASL_SSL":
|
|
248
284
|
authentication_params = {
|
|
249
|
-
"sasl.username": self.sasl_username,
|
|
250
|
-
"sasl.password": self.sasl_password,
|
|
251
285
|
"ssl.ca.location": self.ssl_cafile,
|
|
252
|
-
"ssl.certificate.location": self.ssl_certfile,
|
|
253
|
-
"ssl.key.location": self.ssl_keyfile,
|
|
254
286
|
"ssl.endpoint.identification.algorithm": self.ssl_check_hostname,
|
|
255
287
|
"security.protocol": self.security_protocol,
|
|
256
288
|
"sasl.mechanism": self.sasl_mechanism,
|
|
257
289
|
}
|
|
290
|
+
|
|
291
|
+
if self.iam_credentials_provider is not None:
|
|
292
|
+
authentication_params.update(
|
|
293
|
+
{
|
|
294
|
+
"oauth_cb": self.get_aws_iam_token,
|
|
295
|
+
}
|
|
296
|
+
)
|
|
297
|
+
else:
|
|
298
|
+
authentication_params.update(
|
|
299
|
+
{
|
|
300
|
+
"sasl.username": self.sasl_username,
|
|
301
|
+
"sasl.password": self.sasl_password,
|
|
302
|
+
"ssl.certificate.location": self.ssl_certfile,
|
|
303
|
+
"ssl.key.location": self.ssl_keyfile,
|
|
304
|
+
}
|
|
305
|
+
)
|
|
258
306
|
else:
|
|
259
307
|
raise ValueError(
|
|
260
308
|
f"Cannot initialise `KafkaEventBroker`: "
|
rasa/core/channels/__init__.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# ruff: noqa: I001
|
|
2
|
-
from typing import Text, Dict, List, Type
|
|
2
|
+
from typing import Text, Dict, List, Type, Optional
|
|
3
3
|
|
|
4
4
|
from rasa.core.channels.channel import ( # noqa: F401
|
|
5
5
|
InputChannel,
|
|
@@ -15,54 +15,101 @@ from rasa.core.channels.socketio import SocketIOInput
|
|
|
15
15
|
from rasa.core.channels.botframework import BotFrameworkInput
|
|
16
16
|
from rasa.core.channels.callback import CallbackInput
|
|
17
17
|
from rasa.core.channels.console import CmdlineInput
|
|
18
|
-
from rasa.core.channels.facebook import FacebookInput
|
|
19
18
|
from rasa.core.channels.mattermost import MattermostInput
|
|
20
19
|
from rasa.core.channels.rasa_chat import RasaChatInput
|
|
21
20
|
from rasa.core.channels.rest import RestInput
|
|
22
21
|
from rasa.core.channels.rocketchat import RocketChatInput
|
|
23
|
-
from rasa.core.channels.slack import SlackInput
|
|
24
|
-
from rasa.core.channels.telegram import TelegramInput
|
|
25
|
-
from rasa.core.channels.twilio import TwilioInput
|
|
26
|
-
from rasa.core.channels.voice_ready.twilio_voice import TwilioVoiceInput
|
|
27
22
|
from rasa.core.channels.voice_ready.jambonz import JambonzVoiceReadyInput
|
|
28
23
|
from rasa.core.channels.voice_ready.audiocodes import AudiocodesInput
|
|
29
24
|
from rasa.core.channels.voice_stream.browser_audio import BrowserAudioInputChannel
|
|
30
|
-
from rasa.core.channels.webexteams import WebexTeamsInput
|
|
31
25
|
from rasa.core.channels.hangouts import HangoutsInput
|
|
32
|
-
from rasa.core.channels.vier_cvg import CVGInput
|
|
33
|
-
from rasa.core.channels.voice_stream.twilio_media_streams import (
|
|
34
|
-
TwilioMediaStreamsInputChannel,
|
|
35
|
-
)
|
|
36
26
|
from rasa.core.channels.voice_stream.genesys import GenesysInputChannel
|
|
37
27
|
from rasa.core.channels.studio_chat import StudioChatInput
|
|
38
28
|
from rasa.core.channels.voice_stream.audiocodes import AudiocodesVoiceInputChannel
|
|
39
29
|
from rasa.core.channels.voice_stream.jambonz import JambonzStreamInputChannel
|
|
40
30
|
|
|
31
|
+
# Type annotations for channels with optional dependencies
|
|
32
|
+
FacebookInput: Optional[Type[InputChannel]]
|
|
33
|
+
SlackInput: Optional[Type[InputChannel]]
|
|
34
|
+
TelegramInput: Optional[Type[InputChannel]]
|
|
35
|
+
TwilioInput: Optional[Type[InputChannel]]
|
|
36
|
+
TwilioVoiceInput: Optional[Type[InputChannel]]
|
|
37
|
+
TwilioMediaStreamsInputChannel: Optional[Type[InputChannel]]
|
|
38
|
+
WebexTeamsInput: Optional[Type[InputChannel]]
|
|
39
|
+
CVGInput: Optional[Type[InputChannel]]
|
|
40
|
+
|
|
41
|
+
# Channels with optional dependencies - import with try-except
|
|
42
|
+
try:
|
|
43
|
+
from rasa.core.channels.facebook import FacebookInput
|
|
44
|
+
except ImportError:
|
|
45
|
+
FacebookInput = None
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
from rasa.core.channels.slack import SlackInput
|
|
49
|
+
except ImportError:
|
|
50
|
+
SlackInput = None
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
from rasa.core.channels.telegram import TelegramInput
|
|
54
|
+
except ImportError:
|
|
55
|
+
TelegramInput = None
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
from rasa.core.channels.twilio import TwilioInput
|
|
59
|
+
except ImportError:
|
|
60
|
+
TwilioInput = None
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
from rasa.core.channels.voice_ready.twilio_voice import TwilioVoiceInput
|
|
64
|
+
except ImportError:
|
|
65
|
+
TwilioVoiceInput = None
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
from rasa.core.channels.voice_stream.twilio_media_streams import (
|
|
69
|
+
TwilioMediaStreamsInputChannel,
|
|
70
|
+
)
|
|
71
|
+
except ImportError:
|
|
72
|
+
TwilioMediaStreamsInputChannel = None
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
from rasa.core.channels.webexteams import WebexTeamsInput
|
|
76
|
+
except ImportError:
|
|
77
|
+
WebexTeamsInput = None
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
from rasa.core.channels.vier_cvg import CVGInput
|
|
81
|
+
except ImportError:
|
|
82
|
+
CVGInput = None
|
|
83
|
+
|
|
41
84
|
input_channel_classes: List[Type[InputChannel]] = [
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
c
|
|
86
|
+
for c in [
|
|
87
|
+
CmdlineInput,
|
|
88
|
+
FacebookInput,
|
|
89
|
+
SlackInput,
|
|
90
|
+
TelegramInput,
|
|
91
|
+
MattermostInput,
|
|
92
|
+
TwilioInput,
|
|
93
|
+
TwilioVoiceInput,
|
|
94
|
+
RasaChatInput,
|
|
95
|
+
BotFrameworkInput,
|
|
96
|
+
RocketChatInput,
|
|
97
|
+
CallbackInput,
|
|
98
|
+
RestInput,
|
|
99
|
+
SocketIOInput,
|
|
100
|
+
WebexTeamsInput,
|
|
101
|
+
HangoutsInput,
|
|
102
|
+
AudiocodesInput,
|
|
103
|
+
CVGInput,
|
|
104
|
+
JambonzVoiceReadyInput,
|
|
105
|
+
TwilioMediaStreamsInputChannel,
|
|
106
|
+
BrowserAudioInputChannel,
|
|
107
|
+
GenesysInputChannel,
|
|
108
|
+
StudioChatInput,
|
|
109
|
+
AudiocodesVoiceInputChannel,
|
|
110
|
+
JambonzStreamInputChannel,
|
|
111
|
+
]
|
|
112
|
+
if c is not None
|
|
66
113
|
]
|
|
67
114
|
|
|
68
115
|
# Mapping from an input channel name to its class to allow name based lookup.
|
rasa/core/channels/channel.py
CHANGED
|
@@ -102,6 +102,9 @@ class UserMessage:
|
|
|
102
102
|
return f"{self.__class__.__name__}({self.text})"
|
|
103
103
|
|
|
104
104
|
|
|
105
|
+
OnNewMessageType = Callable[[UserMessage], Awaitable[Any]]
|
|
106
|
+
|
|
107
|
+
|
|
105
108
|
def register(
|
|
106
109
|
input_channels: List[InputChannel], app: Sanic, route: Optional[Text]
|
|
107
110
|
) -> None:
|
|
@@ -135,9 +138,7 @@ class InputChannel:
|
|
|
135
138
|
def url_prefix(self) -> Text:
|
|
136
139
|
return self.name()
|
|
137
140
|
|
|
138
|
-
def blueprint(
|
|
139
|
-
self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
|
|
140
|
-
) -> Blueprint:
|
|
141
|
+
def blueprint(self, on_new_message: OnNewMessageType) -> Blueprint:
|
|
141
142
|
"""Defines a Sanic blueprint.
|
|
142
143
|
|
|
143
144
|
The blueprint will be attached to a running sanic server and handle
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import time
|
|
4
5
|
from functools import partial
|
|
5
6
|
from typing import (
|
|
6
7
|
TYPE_CHECKING,
|
|
@@ -35,6 +36,7 @@ if TYPE_CHECKING:
|
|
|
35
36
|
from sanic.response import HTTPResponse
|
|
36
37
|
|
|
37
38
|
from rasa.core.channels.channel import UserMessage
|
|
39
|
+
from rasa.core.processor import MessageProcessor
|
|
38
40
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
39
41
|
|
|
40
42
|
from rasa.hooks import hookimpl
|
|
@@ -49,6 +51,7 @@ class DevelopmentInspectorPlugin:
|
|
|
49
51
|
"""Plugin for broadcasting tracker updates to development inspector clients."""
|
|
50
52
|
|
|
51
53
|
def __init__(self, inspector: DevelopmentInspectProxy) -> None:
|
|
54
|
+
"""Initializes the plugin."""
|
|
52
55
|
self.inspector = inspector
|
|
53
56
|
self.tasks: List[asyncio.Task] = []
|
|
54
57
|
|
|
@@ -61,21 +64,23 @@ class DevelopmentInspectorPlugin:
|
|
|
61
64
|
"""Remove tasks that have already completed."""
|
|
62
65
|
self.tasks = [task for task in self.tasks if not task.done()]
|
|
63
66
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"""Broadcasts tracker updates after a new user message."""
|
|
67
|
+
def _create_broadcast_task(self, tracker: DialogueStateTracker) -> None:
|
|
68
|
+
"""Creates a task to broadcast tracker updates."""
|
|
67
69
|
task = asyncio.create_task(self.inspector.on_tracker_updated(tracker))
|
|
68
70
|
self.tasks.append(task)
|
|
69
71
|
self._cleanup_completed_tasks()
|
|
70
72
|
|
|
71
|
-
@hookimpl
|
|
73
|
+
@hookimpl
|
|
74
|
+
def after_new_user_message(self, tracker: DialogueStateTracker) -> None:
|
|
75
|
+
"""Broadcasts tracker updates after a new user message."""
|
|
76
|
+
self._create_broadcast_task(tracker)
|
|
77
|
+
|
|
78
|
+
@hookimpl
|
|
72
79
|
def after_action_executed(self, tracker: DialogueStateTracker) -> None:
|
|
73
80
|
"""Broadcasts tracker updates after an action is executed."""
|
|
74
|
-
|
|
75
|
-
self.tasks.append(task)
|
|
76
|
-
self._cleanup_completed_tasks()
|
|
81
|
+
self._create_broadcast_task(tracker)
|
|
77
82
|
|
|
78
|
-
@hookimpl
|
|
83
|
+
@hookimpl
|
|
79
84
|
def after_server_stop(self) -> None:
|
|
80
85
|
"""Cancels all remaining tasks when the server stops."""
|
|
81
86
|
self._cancel_tasks()
|
|
@@ -93,8 +98,9 @@ class DevelopmentInspectProxy(InputChannel):
|
|
|
93
98
|
super().__init__()
|
|
94
99
|
self.underlying = underlying
|
|
95
100
|
self.is_voice = is_voice
|
|
96
|
-
self.processor = None
|
|
101
|
+
self.processor: Optional[MessageProcessor] = None
|
|
97
102
|
self.tracker_stream = TrackerStream(get_tracker=self.get_tracker_state)
|
|
103
|
+
self._turn_start_times: Dict[Text, float] = {}
|
|
98
104
|
# Register the plugin to get tracker updates
|
|
99
105
|
plugin_manager().register(DevelopmentInspectorPlugin(self))
|
|
100
106
|
|
|
@@ -124,15 +130,18 @@ class DevelopmentInspectProxy(InputChannel):
|
|
|
124
130
|
|
|
125
131
|
return pkg_resources.resource_filename(__name__, INSPECT_TEMPLATE_PATH)
|
|
126
132
|
|
|
127
|
-
async def
|
|
128
|
-
"""Returns the
|
|
133
|
+
async def _get_tracker(self, sender_id: Text) -> DialogueStateTracker:
|
|
134
|
+
"""Returns the tracker for the given sender ID."""
|
|
129
135
|
if not self.processor:
|
|
130
136
|
structlogger.error(
|
|
131
|
-
"development_inspector.
|
|
137
|
+
"development_inspector._get_tracker.agent_not_initialized"
|
|
132
138
|
)
|
|
133
|
-
|
|
139
|
+
raise ValueError("Agent processor is not initialized.")
|
|
140
|
+
return await self.processor.get_tracker(sender_id)
|
|
134
141
|
|
|
135
|
-
|
|
142
|
+
async def get_tracker_state(self, sender_id: str) -> str:
|
|
143
|
+
"""Returns the state of the tracker as a json string."""
|
|
144
|
+
tracker = await self._get_tracker(sender_id)
|
|
136
145
|
state = tracker.current_state(EventVerbosity.AFTER_RESTART)
|
|
137
146
|
return orjson.dumps(state, option=orjson.OPT_SERIALIZE_NUMPY).decode("utf-8")
|
|
138
147
|
|
|
@@ -145,6 +154,10 @@ class DevelopmentInspectProxy(InputChannel):
|
|
|
145
154
|
).decode("utf-8")
|
|
146
155
|
await self.tracker_stream.broadcast(tracker_dump)
|
|
147
156
|
|
|
157
|
+
def _record_turn_start_time(self, sender_id: Text) -> None:
|
|
158
|
+
"""Records the start time of a new turn."""
|
|
159
|
+
self._turn_start_times[sender_id] = time.time()
|
|
160
|
+
|
|
148
161
|
async def on_message_proxy(
|
|
149
162
|
self,
|
|
150
163
|
on_new_message: Callable[["UserMessage"], Awaitable[Any]],
|
|
@@ -162,7 +175,7 @@ class DevelopmentInspectProxy(InputChannel):
|
|
|
162
175
|
self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
|
|
163
176
|
) -> "Blueprint":
|
|
164
177
|
"""Defines a Sanic blueprint."""
|
|
165
|
-
self.
|
|
178
|
+
self.sio_server = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
|
|
166
179
|
underlying_webhook: Blueprint = self.underlying.blueprint(
|
|
167
180
|
partial(self.on_message_proxy, on_new_message)
|
|
168
181
|
)
|
|
@@ -197,7 +210,7 @@ class DevelopmentInspectProxy(InputChannel):
|
|
|
197
210
|
class TrackerStream:
|
|
198
211
|
"""Stream tracker state to connected clients."""
|
|
199
212
|
|
|
200
|
-
def __init__(self, get_tracker: Callable[[str], Awaitable[
|
|
213
|
+
def __init__(self, get_tracker: Callable[[str], Awaitable[str]]) -> None:
|
|
201
214
|
"""Initializes the TrackerStream."""
|
|
202
215
|
self._connected_clients: Set[Websocket] = set()
|
|
203
216
|
self.get_tracker = get_tracker
|
rasa/core/channels/hangouts.py
CHANGED
|
@@ -213,7 +213,7 @@ class HangoutsInput(InputChannel):
|
|
|
213
213
|
# every message. Actual caching depends on response headers.
|
|
214
214
|
# see: https://github.com/googleapis/google-auth-library-python/blob/main/google/oauth2/id_token.py#L15 # noqa: E501
|
|
215
215
|
cached_session = cachecontrol.CacheControl(requests.session())
|
|
216
|
-
self.google_request = google.auth.transport.requests.Request(
|
|
216
|
+
self.google_request = google.auth.transport.requests.Request( # type: ignore[no-untyped-call]
|
|
217
217
|
session=cached_session
|
|
218
218
|
)
|
|
219
219
|
|
|
@@ -267,7 +267,7 @@ class HangoutsInput(InputChannel):
|
|
|
267
267
|
# see https://developers.google.com/chat/how-tos/bots-develop#verifying_bot_authenticity # noqa: E501
|
|
268
268
|
# and https://google-auth.readthedocs.io/en/latest/user-guide.html#identity-tokens # noqa: E501
|
|
269
269
|
try:
|
|
270
|
-
decoded_token = id_token.verify_token(
|
|
270
|
+
decoded_token = id_token.verify_token( # type: ignore[no-untyped-call]
|
|
271
271
|
bot_token,
|
|
272
272
|
self.google_request,
|
|
273
273
|
audience=self.project_id,
|