rasa-pro 3.13.11__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/direct_custom_actions_executor.py +9 -2
- 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/licensing.py +21 -10
- 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.11.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +583 -271
- 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.11.dist-info/METADATA +0 -192
- {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
- {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
- {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Custom exceptions for the prompt-to-bot service."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class PromptToBotError(Exception):
|
|
7
|
+
"""Base exception for prompt-to-bot service."""
|
|
8
|
+
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ValidationError(PromptToBotError):
|
|
13
|
+
"""Raised when Rasa project validation fails."""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self, message: str, validation_logs: Optional[List[Dict[str, Any]]] = None
|
|
17
|
+
):
|
|
18
|
+
super().__init__(message)
|
|
19
|
+
self.validation_logs = validation_logs or []
|
|
20
|
+
|
|
21
|
+
def get_logs(self, log_levels: Optional[List[str]]) -> List[Dict[str, Any]]:
|
|
22
|
+
"""Get logs filtered by given log levels."""
|
|
23
|
+
if len(self.validation_logs) == 0:
|
|
24
|
+
return []
|
|
25
|
+
|
|
26
|
+
error_log_entries: List[Dict[str, Any]] = []
|
|
27
|
+
for log_entry in self.validation_logs:
|
|
28
|
+
if log_levels is not None and log_entry.get("log_level") in log_levels:
|
|
29
|
+
error_log_entries.append(log_entry)
|
|
30
|
+
|
|
31
|
+
return error_log_entries
|
|
32
|
+
|
|
33
|
+
def get_error_message_with_logs(
|
|
34
|
+
self, log_levels: Optional[List[str]] = None
|
|
35
|
+
) -> str:
|
|
36
|
+
"""Get the error message with validation logs for specified log levels.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
log_levels: List of log levels to include. If None, includes all logs.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Error message with validation logs appended.
|
|
43
|
+
"""
|
|
44
|
+
error_message = str(self)
|
|
45
|
+
|
|
46
|
+
# Include all logs when no specific levels are specified
|
|
47
|
+
logs = self.validation_logs if log_levels is None else self.get_logs(log_levels)
|
|
48
|
+
|
|
49
|
+
if logs:
|
|
50
|
+
logs_text = "\n".join([str(log) for log in logs])
|
|
51
|
+
error_message += f"\n\nValidation Logs:\n{logs_text}\n"
|
|
52
|
+
|
|
53
|
+
return error_message
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class TrainingError(PromptToBotError):
|
|
57
|
+
"""Raised when model training fails."""
|
|
58
|
+
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class LLMGenerationError(PromptToBotError):
|
|
63
|
+
"""Raised when LLM generation fails."""
|
|
64
|
+
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class DocumentRetrievalError(PromptToBotError):
|
|
69
|
+
"""Raised when document retrieval fails."""
|
|
70
|
+
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class SchemaValidationError(PromptToBotError):
|
|
75
|
+
"""Raised when schema validation fails."""
|
|
76
|
+
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class AgentLoadError(PromptToBotError):
|
|
81
|
+
"""Raised when agent loading fails."""
|
|
82
|
+
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class ProjectGenerationError(PromptToBotError):
|
|
87
|
+
"""Raised when project generation fails after retries."""
|
|
88
|
+
|
|
89
|
+
def __init__(self, message: str, attempts: int):
|
|
90
|
+
super().__init__(f"{message} (failed after {attempts} attempts)")
|
|
91
|
+
self.attempts = attempts
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"""Guardrails client implementations."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import os
|
|
5
|
+
import time
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
from contextlib import asynccontextmanager
|
|
8
|
+
from functools import lru_cache
|
|
9
|
+
from typing import Any, AsyncGenerator, Dict, Optional
|
|
10
|
+
|
|
11
|
+
import aiohttp
|
|
12
|
+
import structlog
|
|
13
|
+
|
|
14
|
+
from rasa.builder import config
|
|
15
|
+
from rasa.builder.guardrails.constants import (
|
|
16
|
+
LAKERA_API_KEY_ENV_VAR,
|
|
17
|
+
LAKERA_GUARD_ENDPOINT,
|
|
18
|
+
LAKERA_GUARD_RESULTS_ENDPOINT,
|
|
19
|
+
)
|
|
20
|
+
from rasa.builder.guardrails.exceptions import GuardrailsError
|
|
21
|
+
from rasa.builder.guardrails.models import (
|
|
22
|
+
GuardrailRequest,
|
|
23
|
+
GuardrailResponse,
|
|
24
|
+
LakeraGuardrailRequest,
|
|
25
|
+
LakeraGuardrailResponse,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
structlogger = structlog.get_logger()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class GuardrailsClient(ABC):
|
|
32
|
+
"""Abstract base class for guardrails clients."""
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def guard_endpoint(self) -> str:
|
|
37
|
+
"""Get the guard endpoint for the guardrails API."""
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
async def send_request(self, request: GuardrailRequest) -> GuardrailResponse:
|
|
42
|
+
"""Send a request to the guardrails provider.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
request: The guardrail request to send to the provider.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
GuardrailResponse with the results of the check.
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
GuardrailsError: If the request fails for any reason.
|
|
52
|
+
"""
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
@lru_cache(maxsize=512)
|
|
56
|
+
def schedule_check(
|
|
57
|
+
self,
|
|
58
|
+
request: GuardrailRequest,
|
|
59
|
+
) -> "asyncio.Task[GuardrailResponse]":
|
|
60
|
+
"""Return a cached asyncio.Task that resolves to guardrail response.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
request: The guardrail request to send to the provider.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
An asyncio Task that resolves to a GuardrailResponse.
|
|
67
|
+
"""
|
|
68
|
+
structlogger.debug(
|
|
69
|
+
"guardrails.schedule_check.cache_miss",
|
|
70
|
+
request=request.model_dump(),
|
|
71
|
+
)
|
|
72
|
+
loop = asyncio.get_running_loop()
|
|
73
|
+
return loop.create_task(self.send_request(request))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class LakeraAIGuardrails(GuardrailsClient):
|
|
77
|
+
"""Guardrails provider using Lakera AI."""
|
|
78
|
+
|
|
79
|
+
def __init__(
|
|
80
|
+
self,
|
|
81
|
+
api_key: Optional[str] = None,
|
|
82
|
+
base_url: Optional[str] = None,
|
|
83
|
+
):
|
|
84
|
+
"""Initialize Lakera guardrails provider.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
api_key: Lakera AI API key.
|
|
88
|
+
base_url: Optional base URL for the API. If not provided, the default
|
|
89
|
+
Lakera API URL (https://api.lakera.ai/v2) will be used.
|
|
90
|
+
"""
|
|
91
|
+
self.base_url: str = base_url or config.LAKERA_BASE_URL
|
|
92
|
+
self._api_key: Optional[str] = api_key or os.getenv(LAKERA_API_KEY_ENV_VAR)
|
|
93
|
+
self._session: Optional[aiohttp.ClientSession] = None
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def guard_endpoint(self) -> str:
|
|
97
|
+
"""Get the guard endpoint for the Lakera API."""
|
|
98
|
+
return f"{self.base_url}/{LAKERA_GUARD_ENDPOINT}"
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def guard_results_endpoint(self) -> str:
|
|
102
|
+
"""Get the guard results endpoint for the Lakera API."""
|
|
103
|
+
return f"{self.base_url}/{LAKERA_GUARD_RESULTS_ENDPOINT}"
|
|
104
|
+
|
|
105
|
+
@asynccontextmanager
|
|
106
|
+
async def _get_session(self) -> AsyncGenerator[aiohttp.ClientSession, None]:
|
|
107
|
+
"""Create a fresh ClientSession, yield it, and always close it."""
|
|
108
|
+
session = aiohttp.ClientSession(headers=self._get_headers())
|
|
109
|
+
structlogger.debug("lakera_guardrails._get_session", base_url=self.base_url)
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
yield session
|
|
113
|
+
except Exception as e:
|
|
114
|
+
structlogger.error("lakera_guardrails.session_error", error=str(e))
|
|
115
|
+
raise
|
|
116
|
+
finally:
|
|
117
|
+
try:
|
|
118
|
+
await session.close()
|
|
119
|
+
except Exception as exc:
|
|
120
|
+
structlogger.warning(
|
|
121
|
+
"lakera_guardrails.session_close_error",
|
|
122
|
+
event_info="Failed to close aiohttp client session cleanly.",
|
|
123
|
+
error=str(exc),
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def _get_headers(self) -> Dict[str, str]:
|
|
127
|
+
"""Get the headers for the Lakera API request.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
A dictionary containing the Authorization header with the API key.
|
|
131
|
+
"""
|
|
132
|
+
using_proxy = bool(config.HELLO_LLM_PROXY_BASE_URL)
|
|
133
|
+
|
|
134
|
+
if using_proxy:
|
|
135
|
+
if not config.RASA_PRO_LICENSE:
|
|
136
|
+
raise GuardrailsError(
|
|
137
|
+
"HELLO_LLM_PROXY_BASE_URL is set but RASA_PRO_LICENSE is missing. "
|
|
138
|
+
"Proxy requires a Rasa Pro license token for authentication."
|
|
139
|
+
)
|
|
140
|
+
return {"Authorization": f"Bearer {config.RASA_PRO_LICENSE}"}
|
|
141
|
+
|
|
142
|
+
if not self._api_key:
|
|
143
|
+
raise GuardrailsError(
|
|
144
|
+
"LAKERA_API_KEY is missing. Provide it via env LAKERA_API_KEY or "
|
|
145
|
+
"pass api_key= to LakeraAIGuardrails."
|
|
146
|
+
)
|
|
147
|
+
return {"Authorization": f"Bearer {self._api_key}"}
|
|
148
|
+
|
|
149
|
+
async def send_request(self, request: GuardrailRequest) -> GuardrailResponse:
|
|
150
|
+
"""Send a request to the Lakera API.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
request: The guardrail request to send to the Lakera API.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
GuardrailResponse with the results of the check.
|
|
157
|
+
|
|
158
|
+
Raises:
|
|
159
|
+
GuardrailsError: If the request times out or returns a non-200 status code.
|
|
160
|
+
Exception: If the request fails for any other reason.
|
|
161
|
+
"""
|
|
162
|
+
if not isinstance(request, LakeraGuardrailRequest):
|
|
163
|
+
raise GuardrailsError(
|
|
164
|
+
"LakeraAIGuardrails only supports LakeraGuardrailRequest"
|
|
165
|
+
)
|
|
166
|
+
start_time = time.time()
|
|
167
|
+
try:
|
|
168
|
+
async with self._get_session() as session:
|
|
169
|
+
raw_response = await self._send_http_request(session, request)
|
|
170
|
+
response = LakeraGuardrailResponse.from_raw_response(
|
|
171
|
+
raw_response,
|
|
172
|
+
hello_rasa_user_id=request.hello_rasa_user_id,
|
|
173
|
+
hello_rasa_project_id=request.hello_rasa_project_id,
|
|
174
|
+
)
|
|
175
|
+
processing_time_ms = (time.time() - start_time) * 1000
|
|
176
|
+
response.processing_time_ms = processing_time_ms
|
|
177
|
+
return response
|
|
178
|
+
|
|
179
|
+
# Propagate the GuardrailsError if it occurs.
|
|
180
|
+
except GuardrailsError as e:
|
|
181
|
+
raise e
|
|
182
|
+
|
|
183
|
+
except asyncio.TimeoutError:
|
|
184
|
+
message = "Lakera API request timed out."
|
|
185
|
+
structlogger.error(
|
|
186
|
+
"lakera_guardrails.send_request.timeout_error",
|
|
187
|
+
event_info=message,
|
|
188
|
+
processing_time_ms=(time.time() - start_time) * 1000,
|
|
189
|
+
)
|
|
190
|
+
raise GuardrailsError(message)
|
|
191
|
+
|
|
192
|
+
# Propagate the unexpected exceptions.
|
|
193
|
+
except Exception as e:
|
|
194
|
+
message = "Lakera API request failed."
|
|
195
|
+
structlogger.error(
|
|
196
|
+
"lakera_guardrails.send_request.unexpected_error",
|
|
197
|
+
event_info="Lakera API request failed.",
|
|
198
|
+
request=request,
|
|
199
|
+
error=e,
|
|
200
|
+
processing_time_ms=(time.time() - start_time) * 1000,
|
|
201
|
+
)
|
|
202
|
+
raise e
|
|
203
|
+
|
|
204
|
+
async def _send_http_request(
|
|
205
|
+
self, session: aiohttp.ClientSession, request: LakeraGuardrailRequest
|
|
206
|
+
) -> Dict[str, Any]:
|
|
207
|
+
"""Make an HTTP request to the Lakera API.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
session: The aiohttp session to use for the request.
|
|
211
|
+
request: The guardrail request to send.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
The raw JSON response from the API.
|
|
215
|
+
|
|
216
|
+
Raises:
|
|
217
|
+
GuardrailsError: If the request fails or response parsing fails.
|
|
218
|
+
"""
|
|
219
|
+
# Log the request details for debugging
|
|
220
|
+
json_payload = request.to_json_payload()
|
|
221
|
+
structlogger.debug(
|
|
222
|
+
"lakera_guardrails.send_request.request",
|
|
223
|
+
url=self.guard_endpoint,
|
|
224
|
+
method="POST",
|
|
225
|
+
request_body=json_payload,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
async with session.post(
|
|
229
|
+
self.guard_endpoint,
|
|
230
|
+
json=json_payload,
|
|
231
|
+
) as client_response:
|
|
232
|
+
# Check if the response is successful. If not, raise an error.
|
|
233
|
+
if client_response.status >= 400:
|
|
234
|
+
error_text = await client_response.text()
|
|
235
|
+
message = (
|
|
236
|
+
f"Lakera API request failed with status "
|
|
237
|
+
f"`{client_response.status}`. Error: "
|
|
238
|
+
f"`{error_text}`."
|
|
239
|
+
)
|
|
240
|
+
structlogger.error(
|
|
241
|
+
"lakera_guardrails.send_request.http_error",
|
|
242
|
+
event_info=message,
|
|
243
|
+
url=self.guard_endpoint,
|
|
244
|
+
status=client_response.status,
|
|
245
|
+
error=error_text,
|
|
246
|
+
request_body=json_payload,
|
|
247
|
+
)
|
|
248
|
+
raise GuardrailsError(message)
|
|
249
|
+
|
|
250
|
+
# Parse the response as a dictionary.
|
|
251
|
+
raw_response = await client_response.json()
|
|
252
|
+
structlogger.debug(
|
|
253
|
+
"lakera_guardrails.send_request.response",
|
|
254
|
+
response_body=raw_response,
|
|
255
|
+
)
|
|
256
|
+
return raw_response
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from typing import Literal
|
|
2
|
+
|
|
3
|
+
LAKERA_API_KEY_ENV_VAR = "LAKERA_API_KEY"
|
|
4
|
+
LAKERA_GUARD_ENDPOINT = "guard"
|
|
5
|
+
LAKERA_GUARD_RESULTS_ENDPOINT = "guard/results"
|
|
6
|
+
|
|
7
|
+
# Metadata keys for GuardrailRequestKey
|
|
8
|
+
LAKERA_PROJECT_ID_KEY = "lakera_project_id"
|
|
9
|
+
|
|
10
|
+
BLOCK_SCOPE_USER: Literal["user"] = "user"
|
|
11
|
+
BLOCK_SCOPE_PROJECT: Literal["project"] = "project"
|
|
12
|
+
BlockScope = Literal["user", "project"]
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"""Models for guardrails system."""
|
|
2
|
+
|
|
3
|
+
import copy
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from typing import Any, Dict, List, Optional
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class GuardrailType(Enum):
|
|
12
|
+
"""Types of guardrails that can be applied with Lakera AI."""
|
|
13
|
+
|
|
14
|
+
PROMPT_ATTACK = "prompt_attack"
|
|
15
|
+
CONTENT_VIOLATION = "content_violation"
|
|
16
|
+
DATA_LEAKAGE = "data_leakage"
|
|
17
|
+
MALICIOUS_LINKS = "malicious_content"
|
|
18
|
+
CUSTOM = "custom"
|
|
19
|
+
OTHER = "other"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class GuardrailRequestKey(BaseModel):
|
|
23
|
+
user_text: str
|
|
24
|
+
hello_rasa_user_id: str = ""
|
|
25
|
+
hello_rasa_project_id: str = ""
|
|
26
|
+
# Generic metadata field for provider-specific configurations
|
|
27
|
+
metadata: Dict[str, str] = Field(default_factory=dict)
|
|
28
|
+
|
|
29
|
+
# hashable by value
|
|
30
|
+
model_config = ConfigDict(frozen=True)
|
|
31
|
+
|
|
32
|
+
def __hash__(self) -> int:
|
|
33
|
+
"""Custom hash implementation that handles the metadata dictionary."""
|
|
34
|
+
# Convert metadata dict to a sorted tuple of items for consistent hashing
|
|
35
|
+
metadata_tuple = tuple(sorted(self.metadata.items())) if self.metadata else ()
|
|
36
|
+
hash_tuple = (
|
|
37
|
+
self.user_text,
|
|
38
|
+
self.hello_rasa_user_id,
|
|
39
|
+
self.hello_rasa_project_id,
|
|
40
|
+
tuple(sorted(metadata_tuple)),
|
|
41
|
+
)
|
|
42
|
+
return hash(hash_tuple)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class GuardrailRequest(BaseModel, ABC):
|
|
46
|
+
"""Request for guardrails check."""
|
|
47
|
+
|
|
48
|
+
hello_rasa_user_id: Optional[str] = Field(
|
|
49
|
+
default=None,
|
|
50
|
+
description="Required. User identifier for the Hello Rasa project. ",
|
|
51
|
+
)
|
|
52
|
+
hello_rasa_project_id: Optional[str] = Field(
|
|
53
|
+
default=None,
|
|
54
|
+
description="Required. Project identifier for the Hello Rasa project. ",
|
|
55
|
+
)
|
|
56
|
+
metadata: Optional[Dict[str, Any]] = Field(
|
|
57
|
+
default=None, description="Additional metadata for the guardrails endpoint."
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@abstractmethod
|
|
61
|
+
def to_json_payload(self) -> Dict[str, Any]:
|
|
62
|
+
"""Convert the request to a JSON payload."""
|
|
63
|
+
...
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class LakeraGuardrailRequest(GuardrailRequest):
|
|
67
|
+
"""Request for Lakera guardrails check."""
|
|
68
|
+
|
|
69
|
+
lakera_project_id: str = Field(
|
|
70
|
+
description="Required. Project identifier for the Lakera AI project."
|
|
71
|
+
)
|
|
72
|
+
payload: bool = Field(
|
|
73
|
+
default=True,
|
|
74
|
+
description=(
|
|
75
|
+
"From Lakera AI: When true the response will return a payload object "
|
|
76
|
+
"containing any PII, profanity or custom detector regex matches detected, "
|
|
77
|
+
"along with their location within the contents."
|
|
78
|
+
),
|
|
79
|
+
)
|
|
80
|
+
breakdown: bool = Field(
|
|
81
|
+
default=True,
|
|
82
|
+
description=(
|
|
83
|
+
"From Lakera AI: When true the response will return a breakdown list of "
|
|
84
|
+
"the detectors that were run, as defined in the policy, and whether each "
|
|
85
|
+
"of them detected something or not."
|
|
86
|
+
),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
messages: List[Dict[str, Any]] = Field(
|
|
90
|
+
description=(
|
|
91
|
+
"Required. From Lakera AI: List of messages comprising the interaction "
|
|
92
|
+
"history with the LLM in OpenAI API Chat Completions format. Can be "
|
|
93
|
+
"multiple messages of any role: user, assistant, system, tool, or "
|
|
94
|
+
"developer."
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# Make the model hashable by value for use as cache keys in @lru_cache decorator.
|
|
99
|
+
model_config = ConfigDict(frozen=True)
|
|
100
|
+
|
|
101
|
+
def to_json_payload(self) -> Dict[str, Any]:
|
|
102
|
+
"""Convert the request to a JSON payload to be sent to the Lakera endpoint."""
|
|
103
|
+
metadata = self.metadata or {}
|
|
104
|
+
metadata["hello_rasa_project_id"] = self.hello_rasa_project_id
|
|
105
|
+
metadata["hello_rasa_user_id"] = self.hello_rasa_user_id
|
|
106
|
+
|
|
107
|
+
json_payload: Dict[str, Any] = {
|
|
108
|
+
"messages": self.messages,
|
|
109
|
+
"project_id": self.lakera_project_id,
|
|
110
|
+
"metadata": metadata,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if self.payload:
|
|
114
|
+
json_payload["payload"] = self.payload
|
|
115
|
+
if self.breakdown:
|
|
116
|
+
json_payload["breakdown"] = self.breakdown
|
|
117
|
+
|
|
118
|
+
return json_payload
|
|
119
|
+
|
|
120
|
+
def __hash__(self) -> int:
|
|
121
|
+
"""Custom hash implementation that handles the messages list."""
|
|
122
|
+
# Convert messages list to a tuple for consistent hashing
|
|
123
|
+
if self.messages:
|
|
124
|
+
messages_tuple = tuple(tuple(msg.items()) for msg in self.messages)
|
|
125
|
+
else:
|
|
126
|
+
messages_tuple = ()
|
|
127
|
+
|
|
128
|
+
hash_tuple = (
|
|
129
|
+
self.hello_rasa_user_id,
|
|
130
|
+
self.hello_rasa_project_id,
|
|
131
|
+
self.lakera_project_id,
|
|
132
|
+
self.payload,
|
|
133
|
+
self.breakdown,
|
|
134
|
+
messages_tuple,
|
|
135
|
+
tuple(sorted(self.metadata.items())) if self.metadata else (),
|
|
136
|
+
)
|
|
137
|
+
return hash(hash_tuple)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class GuardrailDetection(BaseModel):
|
|
141
|
+
"""Represents a single guardrail detection."""
|
|
142
|
+
|
|
143
|
+
type: GuardrailType = Field(description="Type of guardrail detection.")
|
|
144
|
+
original_type: str = Field(description="Original detection from the provider.")
|
|
145
|
+
metadata: Optional[Dict[str, Any]] = Field(
|
|
146
|
+
default=None, description="Additional metadata about the detection itself."
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class GuardrailResponse(BaseModel):
|
|
151
|
+
"""Response from guardrails system."""
|
|
152
|
+
|
|
153
|
+
hello_rasa_user_id: Optional[str] = Field(
|
|
154
|
+
default=None,
|
|
155
|
+
description="Required. User identifier for the Hello Rasa project. ",
|
|
156
|
+
)
|
|
157
|
+
hello_rasa_project_id: Optional[str] = Field(
|
|
158
|
+
default=None,
|
|
159
|
+
description="Required. Project identifier for the Hello Rasa project. ",
|
|
160
|
+
)
|
|
161
|
+
flagged: bool = Field(description="Whether any policy violations were detected.")
|
|
162
|
+
detections: List[GuardrailDetection] = Field(
|
|
163
|
+
default_factory=list, description="List of detected policy violations."
|
|
164
|
+
)
|
|
165
|
+
processing_time_ms: Optional[float] = Field(
|
|
166
|
+
default=None, description="Processing time in milliseconds."
|
|
167
|
+
)
|
|
168
|
+
metadata: Optional[Dict[str, Any]] = Field(
|
|
169
|
+
default=None, description="Additional metadata from the provider."
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class LakeraGuardrailResponse(GuardrailResponse):
|
|
174
|
+
"""Response from Lakera AI `/guard` endpoint."""
|
|
175
|
+
|
|
176
|
+
@classmethod
|
|
177
|
+
def from_raw_response(
|
|
178
|
+
cls,
|
|
179
|
+
raw_response: Dict[str, Any],
|
|
180
|
+
hello_rasa_user_id: str,
|
|
181
|
+
hello_rasa_project_id: str,
|
|
182
|
+
) -> "LakeraGuardrailResponse":
|
|
183
|
+
"""Create a LakeraGuardrailResponse from a response."""
|
|
184
|
+
from rasa.builder.guardrails.utils import (
|
|
185
|
+
map_lakera_detector_type_to_guardrail_type,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Get the basic information from the response and create the response object.
|
|
189
|
+
flagged = raw_response.get("flagged", False)
|
|
190
|
+
metadata = raw_response.get("metadata")
|
|
191
|
+
response = cls(
|
|
192
|
+
flagged=flagged,
|
|
193
|
+
metadata=metadata,
|
|
194
|
+
hello_rasa_user_id=hello_rasa_user_id,
|
|
195
|
+
hello_rasa_project_id=hello_rasa_project_id,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# If the response is not flagged, return the response object.
|
|
199
|
+
if not flagged:
|
|
200
|
+
return response
|
|
201
|
+
|
|
202
|
+
# If the response is flagged, parse the breakdown section.
|
|
203
|
+
breakdown = raw_response.get("breakdown", [])
|
|
204
|
+
|
|
205
|
+
# Parse the breakdown.
|
|
206
|
+
detections: List[GuardrailDetection] = []
|
|
207
|
+
for detector in breakdown:
|
|
208
|
+
if detector.get("detected", True):
|
|
209
|
+
detector_type = detector.get("detector_type")
|
|
210
|
+
rasa_detection_type = map_lakera_detector_type_to_guardrail_type(
|
|
211
|
+
detector_type,
|
|
212
|
+
)
|
|
213
|
+
if not rasa_detection_type:
|
|
214
|
+
continue
|
|
215
|
+
# Remove the detector type and the detected flag from the detector.
|
|
216
|
+
# And keep the rest as part of the metadata. In case of a Lakera this
|
|
217
|
+
# will include the message_id, project_id, policy_id, detector_id, etc.
|
|
218
|
+
metadata = copy.deepcopy(detector)
|
|
219
|
+
metadata.pop("detected")
|
|
220
|
+
metadata.pop("detector_type")
|
|
221
|
+
|
|
222
|
+
detections.append(
|
|
223
|
+
GuardrailDetection(
|
|
224
|
+
type=rasa_detection_type,
|
|
225
|
+
original_type=detector_type,
|
|
226
|
+
metadata=metadata,
|
|
227
|
+
)
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# If there are detections, add them to the response.
|
|
231
|
+
if detections:
|
|
232
|
+
response.detections = detections
|
|
233
|
+
|
|
234
|
+
return response
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class ScopeState(BaseModel):
|
|
238
|
+
blocked_until: Optional[float] = Field(
|
|
239
|
+
default=None,
|
|
240
|
+
description="UNIX timestamp in seconds until this scope is blocked.",
|
|
241
|
+
)
|
|
242
|
+
violations: List[float] = Field(
|
|
243
|
+
default_factory=list,
|
|
244
|
+
description="UNIX timestamps in seconds when violations occurred.",
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def is_blocked(self, now: float) -> bool:
|
|
248
|
+
"""Return whether the scope is currently blocked.
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
now: Current time as a UNIX timestamp.
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
True if blocked_until is set and in the future, else False.
|
|
255
|
+
"""
|
|
256
|
+
return self.blocked_until is not None and now < self.blocked_until
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
class ProjectState(BaseModel):
|
|
260
|
+
project: ScopeState = Field(default_factory=ScopeState)
|
|
261
|
+
users: Dict[str, ScopeState] = Field(default_factory=dict)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class BlockResult(BaseModel):
|
|
265
|
+
user_blocked_now: bool = False
|
|
266
|
+
project_blocked_now: bool = False
|