rasa-pro 3.14.0.dev6__py3-none-any.whl → 3.14.0.dev8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/agents/agent_manager.py +1 -1
- rasa/agents/constants.py +2 -2
- rasa/agents/exceptions.py +31 -1
- rasa/agents/protocol/a2a/a2a_agent.py +385 -227
- rasa/agents/protocol/mcp/mcp_base_agent.py +37 -19
- rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
- rasa/agents/protocol/mcp/mcp_task_agent.py +33 -10
- rasa/agents/schemas/agent_output.py +1 -1
- rasa/agents/utils.py +95 -1
- rasa/agents/validation.py +484 -0
- rasa/api.py +9 -6
- rasa/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +92 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +31 -0
- rasa/builder/copilot/copilot.py +450 -0
- rasa/builder/copilot/copilot_response_handler.py +522 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
- rasa/builder/copilot/exceptions.py +32 -0
- rasa/builder/copilot/models.py +500 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
- rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +210 -0
- rasa/builder/copilot/templated_messages/__init__.py +0 -0
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
- rasa/builder/document_retrieval/__init__.py +0 -0
- rasa/builder/document_retrieval/constants.py +15 -0
- rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
- rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
- rasa/builder/document_retrieval/models.py +62 -0
- rasa/builder/download.py +140 -0
- rasa/builder/exceptions.py +91 -0
- rasa/builder/guardrails/__init__.py +1 -0
- rasa/builder/guardrails/constants.py +9 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/lakera.py +206 -0
- rasa/builder/guardrails/models.py +231 -0
- rasa/builder/guardrails/store.py +238 -0
- rasa/builder/guardrails/utils.py +328 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +282 -0
- rasa/builder/llm_service.py +246 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +243 -0
- rasa/builder/models.py +216 -0
- rasa/builder/project_generator.py +458 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/scrape_rasa_docs.py +97 -0
- rasa/builder/service.py +1345 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/template_cache.py +244 -0
- rasa/builder/training_service.py +194 -0
- rasa/builder/validation_service.py +97 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/interactive.py +2 -0
- rasa/cli/project_templates/basic/README.md +23 -0
- rasa/cli/project_templates/basic/actions/__init__ +0 -0
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
- rasa/cli/project_templates/basic/actions/actions.md +10 -0
- rasa/cli/project_templates/basic/config.yml +29 -0
- rasa/cli/project_templates/basic/credentials.yml +33 -0
- rasa/cli/project_templates/basic/data/data.md +9 -0
- rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
- rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
- rasa/cli/project_templates/basic/data/general/help.yml +6 -0
- rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/basic/docs/docs.md +5 -0
- rasa/cli/project_templates/basic/docs/template.txt +28 -0
- rasa/cli/project_templates/basic/domain/domain.md +8 -0
- rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
- rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
- rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
- rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
- rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
- rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
- rasa/cli/project_templates/basic/endpoints.yml +67 -0
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
- rasa/cli/project_templates/default/config.yml +4 -0
- rasa/cli/project_templates/default/endpoints.yml +4 -0
- rasa/cli/project_templates/finance/README.md +25 -0
- rasa/cli/project_templates/finance/actions/__init__.py +46 -0
- rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
- rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
- rasa/cli/project_templates/finance/actions/actions.md +15 -0
- rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
- rasa/cli/project_templates/finance/actions/database.py +277 -0
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
- rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
- rasa/cli/project_templates/finance/config.yml +23 -0
- rasa/cli/project_templates/finance/credentials.yml +32 -0
- rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
- rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
- rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
- rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
- rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
- rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
- rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
- rasa/cli/project_templates/finance/csvs/users.csv +4 -0
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
- rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
- rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
- rasa/cli/project_templates/finance/data/data.md +11 -0
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
- rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
- rasa/cli/project_templates/finance/data/general/help.yml +9 -0
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
- rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
- rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
- rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
- rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
- rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
- rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
- rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
- rasa/cli/project_templates/finance/domain/domain.md +10 -0
- rasa/cli/project_templates/finance/domain/general/agent_details.yml +12 -0
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
- rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
- rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
- rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
- rasa/cli/project_templates/finance/endpoints.yml +66 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
- rasa/cli/project_templates/telco/README.md +25 -0
- rasa/cli/project_templates/telco/actions/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/actions.md +12 -0
- rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
- rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
- rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
- rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
- rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
- rasa/cli/project_templates/telco/config.yml +29 -0
- rasa/cli/project_templates/telco/credentials.yml +33 -0
- rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
- rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
- rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
- rasa/cli/project_templates/telco/data/data.md +11 -0
- rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
- rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
- rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
- rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
- rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
- rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
- rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
- rasa/cli/project_templates/telco/docs/docs.md +5 -0
- rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
- rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
- rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
- rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
- rasa/cli/project_templates/telco/domain/domain.md +14 -0
- rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
- rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
- rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
- rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
- rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
- rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
- rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
- rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
- rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
- rasa/cli/project_templates/telco/domain/shared.yml +129 -0
- rasa/cli/project_templates/telco/endpoints.yml +67 -0
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/scaffold.py +46 -2
- rasa/cli/train.py +2 -0
- rasa/cli/utils.py +85 -1
- rasa/core/actions/action.py +2 -7
- rasa/core/available_agents.py +49 -26
- rasa/core/available_endpoints.py +17 -2
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +2 -22
- rasa/core/channels/inspector/README.md +26 -14
- rasa/core/channels/inspector/dist/assets/{arc-63212852.js → arc-edef10dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-eecf6b13.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-8f798a9a.js → c4Diagram-3d4e48cf-313c08e6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-63aa27d1.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-df71a04c.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9b275968.js → classDiagram-v2-f2320105-f346068d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-5566bae8.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-1c669cad.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b1553799.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-112388d6.js → erDiagram-9861fffd-9813e81c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-fdebec47.js → flowDb-956e92f1-d8ba0870.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-6280ede1.js → flowDiagram-66a62f08-51f0db4d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-32936074.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-e1dc03e5.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-83f68c51.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-22f8666f.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-ca9e6217.js → graph-790ef78b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-c5ceb692.js → index-3862675e-ecdce073.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-d705da80.js +1352 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-faa9999b.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c4dda8d9.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-d4307784.js → layout-837fd3aa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-0567aaa7.js → line-7e05afcb.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-c11b95cf.js → linear-162eb295.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-0c7d3ca9.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-34b433fa.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-4cab816e.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-8c22fa9e.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-70ce9e8e.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-fbcd7fc9.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-45f05ea6.js → stateDiagram-587899a1-41529fd5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-beab1ea6.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-2f29dbd5.js → styles-6aaf32cf-b5b53234.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-951eac83.js → styles-9a916d00-13d138e5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-897fbfdd.js → styles-c10674c1-94cbde3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d667fac1.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e3205144.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-4abeb0e2.js → xychartDiagram-e933f94c-376af5f0.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +2 -2
- rasa/core/channels/inspector/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +42 -44
- rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +8 -8
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
- rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
- rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/types.ts +49 -7
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +59 -57
- rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
- rasa/core/channels/voice_stream/asr/azure.py +6 -3
- rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
- rasa/core/channels/voice_stream/audiocodes.py +3 -0
- rasa/core/channels/voice_stream/browser_audio.py +53 -3
- rasa/core/channels/voice_stream/genesys.py +2 -1
- rasa/core/channels/voice_stream/jambonz.py +9 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
- rasa/core/channels/voice_stream/voice_channel.py +66 -3
- rasa/core/constants.py +6 -0
- rasa/core/iam_credentials_providers/__init__.py +0 -0
- rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +66 -0
- rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
- rasa/core/policies/enterprise_search_policy.py +4 -7
- rasa/core/policies/flows/flow_executor.py +66 -36
- rasa/core/policies/ted_policy.py +7 -5
- rasa/core/processor.py +32 -0
- rasa/core/redis_connection_factory.py +411 -0
- rasa/core/run.py +13 -3
- rasa/core/tracker_stores/redis_tracker_store.py +32 -14
- rasa/core/tracker_stores/sql_tracker_store.py +57 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +2 -81
- rasa/dialogue_understanding/commands/start_flow_command.py +18 -113
- rasa/dialogue_understanding/commands/utils.py +118 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +10 -5
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +10 -5
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +20 -12
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +19 -12
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +6 -35
- rasa/dialogue_understanding/patterns/cancel.py +27 -6
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +185 -114
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +18 -24
- rasa/dialogue_understanding/processor/command_processor.py +35 -0
- rasa/dialogue_understanding/stack/utils.py +43 -4
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/engine/graph.py +5 -1
- rasa/engine/recipes/default_components.py +78 -10
- rasa/engine/recipes/default_recipe.py +41 -1
- rasa/engine/storage/local_model_storage.py +83 -3
- rasa/graph_components/validators/default_recipe_validator.py +153 -135
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +1 -1
- rasa/model_manager/socket_bridge.py +20 -15
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/model_manager/warm_rasa_process.py +1 -1
- rasa/model_training.py +22 -6
- rasa/nlu/classifiers/diet_classifier.py +22 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +18 -0
- rasa/nlu/extractors/extractor.py +1 -2
- rasa/shared/agents/auth/__init__.py +0 -0
- rasa/shared/agents/auth/agent_auth_factory.py +74 -0
- rasa/shared/agents/auth/agent_auth_manager.py +86 -0
- rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
- rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
- rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
- rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
- rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +159 -0
- rasa/shared/agents/auth/constants.py +11 -0
- rasa/shared/agents/auth/types.py +11 -0
- rasa/shared/constants.py +3 -0
- rasa/shared/core/constants.py +6 -6
- rasa/shared/core/domain.py +58 -11
- rasa/shared/core/events.py +2 -0
- rasa/shared/core/flows/constants.py +5 -0
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +6 -0
- rasa/shared/core/flows/steps/call.py +15 -12
- rasa/shared/core/flows/validation.py +238 -44
- rasa/shared/core/flows/yaml_flows_io.py +15 -6
- rasa/shared/core/slots.py +4 -0
- rasa/shared/exceptions.py +12 -0
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/utils.py +77 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
- rasa/shared/providers/_utils.py +60 -44
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
- rasa/shared/providers/llm/_base_litellm_client.py +2 -2
- rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
- rasa/shared/providers/llm/llm_response.py +4 -4
- rasa/shared/utils/common.py +24 -0
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +2 -1
- rasa/shared/utils/mcp/server_connection.py +108 -27
- rasa/shared/utils/mcp/utils.py +20 -0
- rasa/studio/upload.py +16 -47
- rasa/telemetry.py +97 -23
- rasa/tracing/config.py +38 -12
- rasa/tracing/instrumentation/attribute_extractors.py +5 -1
- rasa/tracing/instrumentation/instrumentation.py +85 -8
- rasa/utils/common.py +1 -1
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +5 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/tensorflow/__init__.py +29 -0
- rasa/utils/tensorflow/callback.py +1 -1
- rasa/utils/tensorflow/crf.py +1 -1
- rasa/utils/tensorflow/data_generator.py +21 -8
- rasa/utils/tensorflow/layers.py +11 -4
- rasa/utils/tensorflow/metrics.py +7 -3
- rasa/utils/tensorflow/models.py +41 -6
- rasa/utils/tensorflow/rasa_layers.py +6 -4
- rasa/utils/tensorflow/transformer.py +2 -3
- rasa/utils/train_utils.py +68 -38
- rasa/validator.py +18 -16
- rasa/version.py +1 -1
- rasa_pro-3.14.0.dev8.dist-info/METADATA +199 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +486 -173
- rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-3e293924.js +0 -1353
- rasa_pro-3.14.0.dev6.dist-info/METADATA +0 -190
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from functools import lru_cache
|
|
3
|
+
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
from rasa.builder.config import (
|
|
8
|
+
ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
9
|
+
COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
10
|
+
)
|
|
11
|
+
from rasa.builder.copilot.constants import ROLE_COPILOT, ROLE_USER
|
|
12
|
+
from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
|
|
13
|
+
from rasa.builder.copilot.models import (
|
|
14
|
+
CopilotChatMessage,
|
|
15
|
+
CopilotContext,
|
|
16
|
+
GeneratedContent,
|
|
17
|
+
ResponseCategory,
|
|
18
|
+
)
|
|
19
|
+
from rasa.builder.guardrails.models import (
|
|
20
|
+
GuardrailRequestKey,
|
|
21
|
+
GuardrailResponse,
|
|
22
|
+
LakeraGuardrailRequest,
|
|
23
|
+
)
|
|
24
|
+
from rasa.builder.llm_service import llm_service
|
|
25
|
+
from rasa.builder.shared.tracker_context import (
|
|
26
|
+
AssistantConversationTurn,
|
|
27
|
+
TrackerContext,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from rasa.builder.guardrails.models import GuardrailType
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
structlogger = structlog.get_logger()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def map_lakera_detector_type_to_guardrail_type(
|
|
38
|
+
lakera_detector_type: str,
|
|
39
|
+
) -> Optional["GuardrailType"]:
|
|
40
|
+
"""Map a Lakera detector type to a Rasa guardrail type."""
|
|
41
|
+
from rasa.builder.guardrails.models import GuardrailType
|
|
42
|
+
|
|
43
|
+
# Check for exact matches first
|
|
44
|
+
LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING = {
|
|
45
|
+
"prompt_attack": GuardrailType.PROMPT_ATTACK,
|
|
46
|
+
"unknown_links": GuardrailType.MALICIOUS_LINKS,
|
|
47
|
+
"custom": GuardrailType.CUSTOM,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Check for exact match first
|
|
51
|
+
if lakera_detector_type in LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING:
|
|
52
|
+
return LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING[
|
|
53
|
+
lakera_detector_type
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
# Check for subtypes that start with specific prefixes
|
|
57
|
+
# https://docs.lakera.ai/docs/policies/self-hosted-policies#detectors-section
|
|
58
|
+
if lakera_detector_type.startswith("moderated_content"):
|
|
59
|
+
return GuardrailType.CONTENT_VIOLATION
|
|
60
|
+
if lakera_detector_type.startswith("pii"):
|
|
61
|
+
return GuardrailType.DATA_LEAKAGE
|
|
62
|
+
|
|
63
|
+
# If no match found, return OTHER
|
|
64
|
+
return GuardrailType.OTHER
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@lru_cache(maxsize=512)
|
|
68
|
+
def _schedule_guardrails_check(
|
|
69
|
+
user_text: str,
|
|
70
|
+
hello_rasa_user_id: str,
|
|
71
|
+
hello_rasa_project_id: str,
|
|
72
|
+
lakera_project_id: str,
|
|
73
|
+
) -> "asyncio.Task[GuardrailResponse]":
|
|
74
|
+
"""Return a cached asyncio.Task that resolves to Lakera's response.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
user_text: The user message text to check for policy violations.
|
|
78
|
+
hello_rasa_user_id: The user ID for the conversation.
|
|
79
|
+
hello_rasa_project_id: The project ID for the conversation.
|
|
80
|
+
lakera_project_id: The Lakera project ID to use for this check.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
An asyncio Task that resolves to a GuardrailResponse.
|
|
84
|
+
"""
|
|
85
|
+
structlogger.debug("guardrails.cache_miss", text=user_text)
|
|
86
|
+
|
|
87
|
+
loop = asyncio.get_running_loop()
|
|
88
|
+
request = LakeraGuardrailRequest(
|
|
89
|
+
lakera_project_id=lakera_project_id,
|
|
90
|
+
hello_rasa_user_id=hello_rasa_user_id,
|
|
91
|
+
hello_rasa_project_id=hello_rasa_project_id,
|
|
92
|
+
messages=[{"role": ROLE_USER, "content": user_text}],
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
return loop.create_task(llm_service.guardrails.send_request(request))
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
async def _detect_flagged_user_indices(
|
|
99
|
+
items: List[Tuple[int, str]],
|
|
100
|
+
*,
|
|
101
|
+
hello_rasa_user_id: Optional[str],
|
|
102
|
+
hello_rasa_project_id: Optional[str],
|
|
103
|
+
lakera_project_id: str,
|
|
104
|
+
log_prefix: str,
|
|
105
|
+
) -> Set[int]:
|
|
106
|
+
"""Run guardrail checks for provided (index, user_text) pairs.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
items: List of tuples containing (index, user_text) to check.
|
|
110
|
+
hello_rasa_user_id: The user ID for the conversation.
|
|
111
|
+
hello_rasa_project_id: The project ID for the conversation.
|
|
112
|
+
lakera_project_id: The Lakera project ID to use for this check.
|
|
113
|
+
log_prefix: Prefix for logging messages.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
A set of indices that were flagged by the guardrails.
|
|
117
|
+
"""
|
|
118
|
+
if not items:
|
|
119
|
+
return set()
|
|
120
|
+
|
|
121
|
+
# 1) Group indices by logical request key (hashable by value)
|
|
122
|
+
indices_by_key: Dict[GuardrailRequestKey, List[int]] = {}
|
|
123
|
+
for idx, text in items:
|
|
124
|
+
key = GuardrailRequestKey(
|
|
125
|
+
user_text=(text or "").strip(),
|
|
126
|
+
hello_rasa_user_id=hello_rasa_user_id or "",
|
|
127
|
+
hello_rasa_project_id=hello_rasa_project_id or "",
|
|
128
|
+
lakera_project_id=lakera_project_id,
|
|
129
|
+
)
|
|
130
|
+
if not key.user_text:
|
|
131
|
+
continue
|
|
132
|
+
indices_by_key.setdefault(key, []).append(idx)
|
|
133
|
+
|
|
134
|
+
if not indices_by_key:
|
|
135
|
+
return set()
|
|
136
|
+
|
|
137
|
+
# 2) Create one task per logical key
|
|
138
|
+
tasks_by_key: Dict[GuardrailRequestKey, asyncio.Task[GuardrailResponse]] = {}
|
|
139
|
+
for key in indices_by_key:
|
|
140
|
+
tasks_by_key[key] = _schedule_guardrails_check(
|
|
141
|
+
user_text=key.user_text,
|
|
142
|
+
hello_rasa_user_id=key.hello_rasa_user_id,
|
|
143
|
+
hello_rasa_project_id=key.hello_rasa_project_id,
|
|
144
|
+
lakera_project_id=key.lakera_project_id,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# 3) Await unique tasks once
|
|
148
|
+
keys = list(tasks_by_key.keys())
|
|
149
|
+
tasks = [tasks_by_key[k] for k in keys]
|
|
150
|
+
responses = await asyncio.gather(*tasks, return_exceptions=True)
|
|
151
|
+
|
|
152
|
+
# 4) Map results back to all corresponding indices
|
|
153
|
+
flagged: Set[int] = set()
|
|
154
|
+
for key, response in zip(keys, responses):
|
|
155
|
+
if isinstance(response, Exception):
|
|
156
|
+
structlogger.warning(f"{log_prefix}.request_failed", error=str(response))
|
|
157
|
+
continue
|
|
158
|
+
if response.flagged: # type: ignore[union-attr]
|
|
159
|
+
flagged.update(indices_by_key.get(key, []))
|
|
160
|
+
|
|
161
|
+
return flagged
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
async def check_assistant_chat_for_policy_violations(
|
|
165
|
+
tracker_context: TrackerContext,
|
|
166
|
+
hello_rasa_user_id: Optional[str],
|
|
167
|
+
hello_rasa_project_id: Optional[str],
|
|
168
|
+
) -> TrackerContext:
|
|
169
|
+
"""Return a sanitised TrackerContext with unsafe turns removed.
|
|
170
|
+
|
|
171
|
+
Only user messages are moderated – assistant messages are assumed safe.
|
|
172
|
+
LRU cache is used, so each unique user text is checked once.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
tracker_context: The TrackerContext containing conversation turns.
|
|
176
|
+
hello_rasa_user_id: The user ID for the conversation.
|
|
177
|
+
hello_rasa_project_id: The project ID for the conversation.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
TrackerContext with unsafe turns removed.
|
|
181
|
+
"""
|
|
182
|
+
# Collect (turn_index, user_text) for all turns with a user message
|
|
183
|
+
items: List[Tuple[int, str]] = []
|
|
184
|
+
for idx, turn in enumerate(tracker_context.conversation_turns):
|
|
185
|
+
user_message = turn.user_message
|
|
186
|
+
if not user_message:
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
text = (user_message.text or "").strip()
|
|
190
|
+
if not text:
|
|
191
|
+
continue
|
|
192
|
+
|
|
193
|
+
items.append((idx, text))
|
|
194
|
+
|
|
195
|
+
flagged_turns = await _detect_flagged_user_indices(
|
|
196
|
+
items,
|
|
197
|
+
hello_rasa_user_id=hello_rasa_user_id,
|
|
198
|
+
hello_rasa_project_id=hello_rasa_project_id,
|
|
199
|
+
lakera_project_id=ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
200
|
+
log_prefix="assistant_guardrails",
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
if not flagged_turns:
|
|
204
|
+
return tracker_context
|
|
205
|
+
|
|
206
|
+
structlogger.info(
|
|
207
|
+
"assistant_guardrails.turns_flagged",
|
|
208
|
+
count=len(flagged_turns),
|
|
209
|
+
turn_indices=sorted(flagged_turns),
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# Build a filtered TrackerContext
|
|
213
|
+
safe_turns: List[AssistantConversationTurn] = [
|
|
214
|
+
turn
|
|
215
|
+
for idx, turn in enumerate(tracker_context.conversation_turns)
|
|
216
|
+
if idx not in flagged_turns
|
|
217
|
+
]
|
|
218
|
+
|
|
219
|
+
new_tracker_context = tracker_context.copy(deep=True)
|
|
220
|
+
new_tracker_context.conversation_turns = safe_turns
|
|
221
|
+
return new_tracker_context
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def _annotate_flagged_user_messages(
|
|
225
|
+
history: List[CopilotChatMessage], flagged_user_indices: Set[int]
|
|
226
|
+
) -> None:
|
|
227
|
+
"""Mark flagged user messages in-place on the original history.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
history: The copilot chat history containing messages.
|
|
231
|
+
flagged_user_indices: Set of indices of user messages that were flagged.
|
|
232
|
+
"""
|
|
233
|
+
if not flagged_user_indices:
|
|
234
|
+
return
|
|
235
|
+
|
|
236
|
+
total = len(history)
|
|
237
|
+
for uidx in flagged_user_indices:
|
|
238
|
+
if 0 <= uidx < total and history[uidx].role == ROLE_USER:
|
|
239
|
+
history[
|
|
240
|
+
uidx
|
|
241
|
+
].response_category = ResponseCategory.GUARDRAILS_POLICY_VIOLATION
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
async def check_copilot_chat_for_policy_violations(
|
|
245
|
+
context: CopilotContext,
|
|
246
|
+
hello_rasa_user_id: Optional[str],
|
|
247
|
+
hello_rasa_project_id: Optional[str],
|
|
248
|
+
) -> Optional[GeneratedContent]:
|
|
249
|
+
"""Check the copilot chat history for guardrail policy violations.
|
|
250
|
+
|
|
251
|
+
Only user messages are moderated – assistant messages are assumed safe.
|
|
252
|
+
LRU cache is used, so each unique user text is checked once.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
context: The CopilotContext containing the copilot chat history.
|
|
256
|
+
hello_rasa_user_id: The user ID for the conversation.
|
|
257
|
+
hello_rasa_project_id: The project ID for the conversation.
|
|
258
|
+
|
|
259
|
+
Returns:
|
|
260
|
+
Returns a default violation response if the system flags any user message,
|
|
261
|
+
otherwise return None.
|
|
262
|
+
"""
|
|
263
|
+
history = context.copilot_chat_history
|
|
264
|
+
|
|
265
|
+
# Collect (index, text) for user messages; skip ones already marked as violations
|
|
266
|
+
items: List[Tuple[int, str]] = []
|
|
267
|
+
for idx, message in enumerate(history):
|
|
268
|
+
if message.response_category == ResponseCategory.GUARDRAILS_POLICY_VIOLATION:
|
|
269
|
+
continue
|
|
270
|
+
if message.role != ROLE_USER:
|
|
271
|
+
continue
|
|
272
|
+
formatted_message = message.to_openai_format()
|
|
273
|
+
text = (formatted_message.get("content") or "").strip()
|
|
274
|
+
if not text:
|
|
275
|
+
continue
|
|
276
|
+
items.append((idx, text))
|
|
277
|
+
|
|
278
|
+
flagged_user_indices = await _detect_flagged_user_indices(
|
|
279
|
+
items,
|
|
280
|
+
hello_rasa_user_id=hello_rasa_user_id,
|
|
281
|
+
hello_rasa_project_id=hello_rasa_project_id,
|
|
282
|
+
lakera_project_id=COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
|
|
283
|
+
log_prefix="copilot_guardrails",
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
_annotate_flagged_user_messages(history, flagged_user_indices)
|
|
287
|
+
|
|
288
|
+
if not flagged_user_indices:
|
|
289
|
+
return None
|
|
290
|
+
|
|
291
|
+
# Identify the latest user message index in the current request
|
|
292
|
+
last_user_idx: Optional[int] = None
|
|
293
|
+
for i in range(len(history) - 1, -1, -1):
|
|
294
|
+
if getattr(history[i], "role", None) == ROLE_USER:
|
|
295
|
+
last_user_idx = i
|
|
296
|
+
break
|
|
297
|
+
|
|
298
|
+
# Remove flagged user messages and their next copilot messages
|
|
299
|
+
indices_to_remove: Set[int] = set()
|
|
300
|
+
total = len(history)
|
|
301
|
+
for uidx in flagged_user_indices:
|
|
302
|
+
indices_to_remove.add(uidx)
|
|
303
|
+
next_idx = uidx + 1
|
|
304
|
+
if (
|
|
305
|
+
next_idx < total
|
|
306
|
+
and getattr(history[next_idx], "role", None) == ROLE_COPILOT
|
|
307
|
+
):
|
|
308
|
+
indices_to_remove.add(next_idx)
|
|
309
|
+
|
|
310
|
+
# Apply sanitization
|
|
311
|
+
filtered_history = [
|
|
312
|
+
msg for i, msg in enumerate(history) if i not in indices_to_remove
|
|
313
|
+
]
|
|
314
|
+
if len(filtered_history) != len(history):
|
|
315
|
+
structlogger.info(
|
|
316
|
+
"copilot_guardrails.history_sanitized",
|
|
317
|
+
removed_indices=sorted(indices_to_remove),
|
|
318
|
+
removed_messages=len(history) - len(filtered_history),
|
|
319
|
+
kept_messages=len(filtered_history),
|
|
320
|
+
)
|
|
321
|
+
context.copilot_chat_history = filtered_history
|
|
322
|
+
|
|
323
|
+
# Block only if the latest user message in this request was flagged
|
|
324
|
+
if last_user_idx is not None and last_user_idx in flagged_user_indices:
|
|
325
|
+
return CopilotResponseHandler.respond_to_guardrail_policy_violations()
|
|
326
|
+
|
|
327
|
+
# Otherwise proceed (following messages are respected)
|
|
328
|
+
return None
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import time
|
|
3
|
+
import uuid
|
|
4
|
+
from typing import AsyncGenerator, ClassVar, Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field, PrivateAttr
|
|
7
|
+
|
|
8
|
+
from rasa.builder.models import JobStatusEvent, ServerSentEventType
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class JobInfo(BaseModel):
|
|
12
|
+
"""Information about a job being processed by the worker."""
|
|
13
|
+
|
|
14
|
+
id: str
|
|
15
|
+
status: str = ""
|
|
16
|
+
error: Optional[str] = None
|
|
17
|
+
created_at: float = Field(default_factory=time.time)
|
|
18
|
+
|
|
19
|
+
_history: List[JobStatusEvent] = PrivateAttr(default_factory=list)
|
|
20
|
+
_queue: asyncio.Queue = PrivateAttr(default_factory=asyncio.Queue)
|
|
21
|
+
|
|
22
|
+
class Config:
|
|
23
|
+
arbitrary_types_allowed = True
|
|
24
|
+
|
|
25
|
+
async def put(self, event: JobStatusEvent) -> None:
|
|
26
|
+
"""Put an event onto the job's queue.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
event: The JobStatusEvent to put onto the queue.
|
|
30
|
+
"""
|
|
31
|
+
await self._queue.put(event)
|
|
32
|
+
|
|
33
|
+
async def event_stream(self) -> AsyncGenerator[JobStatusEvent, None]:
|
|
34
|
+
"""Yield events as they are put on the queue by the worker task.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
An async generator that yields JobStatusEvent objects.
|
|
38
|
+
"""
|
|
39
|
+
# 1) Replay history and stop if EOF recorded
|
|
40
|
+
for sse in self._history:
|
|
41
|
+
if (
|
|
42
|
+
isinstance(sse, JobStatusEvent)
|
|
43
|
+
and sse.event == ServerSentEventType._EOF.value
|
|
44
|
+
):
|
|
45
|
+
return
|
|
46
|
+
yield sse
|
|
47
|
+
|
|
48
|
+
# 2) Stream live events and stop on EOF
|
|
49
|
+
while True:
|
|
50
|
+
sse = await self._queue.get()
|
|
51
|
+
self._history.append(sse)
|
|
52
|
+
if (
|
|
53
|
+
isinstance(sse, JobStatusEvent)
|
|
54
|
+
and sse.event == ServerSentEventType._EOF.value
|
|
55
|
+
):
|
|
56
|
+
return
|
|
57
|
+
yield sse
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class JobManager:
|
|
61
|
+
"""Very small in-memory job registry (single-process only)."""
|
|
62
|
+
|
|
63
|
+
_jobs: ClassVar[Dict[str, JobInfo]] = {}
|
|
64
|
+
|
|
65
|
+
def create_job(self) -> JobInfo:
|
|
66
|
+
job_id = uuid.uuid4().hex
|
|
67
|
+
job = JobInfo(id=job_id)
|
|
68
|
+
self._jobs[job_id] = job
|
|
69
|
+
return job
|
|
70
|
+
|
|
71
|
+
def get_job(self, job_id: str) -> Optional[JobInfo]:
|
|
72
|
+
return self._jobs.get(job_id)
|
|
73
|
+
|
|
74
|
+
@staticmethod
|
|
75
|
+
def mark_done(job: JobInfo, *, error: Optional[str] = None) -> None:
|
|
76
|
+
"""Mark a job as done.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
job: The JobInfo instance to mark as done.
|
|
80
|
+
error: Optional error message if the job failed.
|
|
81
|
+
"""
|
|
82
|
+
job.error = error
|
|
83
|
+
eof = JobStatusEvent.eof()
|
|
84
|
+
job._queue.put_nowait(eof)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
job_manager = JobManager()
|
rasa/builder/jobs.py
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
from typing import Any, Optional
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from sanic import Sanic
|
|
5
|
+
|
|
6
|
+
from rasa.builder import config
|
|
7
|
+
from rasa.builder.exceptions import (
|
|
8
|
+
LLMGenerationError,
|
|
9
|
+
ProjectGenerationError,
|
|
10
|
+
TrainingError,
|
|
11
|
+
ValidationError,
|
|
12
|
+
)
|
|
13
|
+
from rasa.builder.job_manager import JobInfo, job_manager
|
|
14
|
+
from rasa.builder.models import (
|
|
15
|
+
JobStatus,
|
|
16
|
+
JobStatusEvent,
|
|
17
|
+
)
|
|
18
|
+
from rasa.builder.project_generator import ProjectGenerator
|
|
19
|
+
from rasa.builder.training_service import (
|
|
20
|
+
train_and_load_agent,
|
|
21
|
+
try_load_existing_agent,
|
|
22
|
+
update_agent,
|
|
23
|
+
)
|
|
24
|
+
from rasa.builder.validation_service import validate_project
|
|
25
|
+
from rasa.cli.scaffold import ProjectTemplateName
|
|
26
|
+
|
|
27
|
+
structlogger = structlog.get_logger()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def push_job_status_event(
|
|
31
|
+
job: JobInfo, status: JobStatus, message: Optional[str] = None
|
|
32
|
+
) -> None:
|
|
33
|
+
event = JobStatusEvent.from_status(status=status.value, message=message)
|
|
34
|
+
job.status = status.value
|
|
35
|
+
await job.put(event)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
async def run_prompt_to_bot_job(
|
|
39
|
+
app: Any,
|
|
40
|
+
job: JobInfo,
|
|
41
|
+
prompt: str,
|
|
42
|
+
) -> None:
|
|
43
|
+
"""Run the prompt-to-bot job in the background.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
app: The Sanic application instance.
|
|
47
|
+
job: The job information instance.
|
|
48
|
+
prompt: The natural language prompt for bot generation.
|
|
49
|
+
"""
|
|
50
|
+
project_generator: ProjectGenerator = app.ctx.project_generator
|
|
51
|
+
|
|
52
|
+
await push_job_status_event(job, JobStatus.received)
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
# 1. Generating
|
|
56
|
+
await push_job_status_event(job, JobStatus.generating)
|
|
57
|
+
bot_files = await project_generator.generate_project_with_retries(
|
|
58
|
+
prompt,
|
|
59
|
+
template=ProjectTemplateName.BASIC,
|
|
60
|
+
)
|
|
61
|
+
await push_job_status_event(job, JobStatus.generation_success)
|
|
62
|
+
|
|
63
|
+
# 2. Training
|
|
64
|
+
await push_job_status_event(job, JobStatus.training)
|
|
65
|
+
agent = await train_and_load_agent(project_generator.get_training_input())
|
|
66
|
+
update_agent(agent, app)
|
|
67
|
+
await push_job_status_event(job, JobStatus.train_success)
|
|
68
|
+
|
|
69
|
+
structlogger.info(
|
|
70
|
+
"bot_builder_service.prompt_to_bot.success",
|
|
71
|
+
files_generated=list(bot_files.keys()),
|
|
72
|
+
)
|
|
73
|
+
await push_job_status_event(job, JobStatus.done)
|
|
74
|
+
job_manager.mark_done(job)
|
|
75
|
+
|
|
76
|
+
except TrainingError as exc:
|
|
77
|
+
structlogger.debug(
|
|
78
|
+
"prompt_to_bot_job.training_error", job_id=job.id, error=str(exc)
|
|
79
|
+
)
|
|
80
|
+
await push_job_status_event(job, JobStatus.train_error, message=str(exc))
|
|
81
|
+
job_manager.mark_done(job, error=str(exc))
|
|
82
|
+
|
|
83
|
+
except ValidationError as exc:
|
|
84
|
+
# Log levels to include in the error message
|
|
85
|
+
log_levels = ["error"]
|
|
86
|
+
if config.VALIDATION_FAIL_ON_WARNINGS:
|
|
87
|
+
log_levels.append("warning")
|
|
88
|
+
|
|
89
|
+
structlogger.debug(
|
|
90
|
+
"prompt_to_bot_job.validation_error",
|
|
91
|
+
job_id=job.id,
|
|
92
|
+
error=str(exc),
|
|
93
|
+
all_validation_logs=exc.validation_logs,
|
|
94
|
+
included_log_levels=log_levels,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
error_message = exc.get_error_message_with_logs(log_levels=log_levels)
|
|
98
|
+
await push_job_status_event(
|
|
99
|
+
job, JobStatus.validation_error, message=error_message
|
|
100
|
+
)
|
|
101
|
+
job_manager.mark_done(job, error=error_message)
|
|
102
|
+
|
|
103
|
+
except (ProjectGenerationError, LLMGenerationError) as exc:
|
|
104
|
+
structlogger.debug(
|
|
105
|
+
"prompt_to_bot_job.generation_error", job_id=job.id, error=str(exc)
|
|
106
|
+
)
|
|
107
|
+
await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
|
|
108
|
+
job_manager.mark_done(job, error=str(exc))
|
|
109
|
+
|
|
110
|
+
except Exception as exc:
|
|
111
|
+
# Capture full traceback
|
|
112
|
+
structlogger.exception(
|
|
113
|
+
"prompt_to_bot_job.unexpected_error", job_id=job.id, error=str(exc)
|
|
114
|
+
)
|
|
115
|
+
await push_job_status_event(job, JobStatus.error, message=str(exc))
|
|
116
|
+
job_manager.mark_done(job, error=str(exc))
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
async def run_template_to_bot_job(
|
|
120
|
+
app: "Sanic",
|
|
121
|
+
job: JobInfo,
|
|
122
|
+
template_name: ProjectTemplateName,
|
|
123
|
+
) -> None:
|
|
124
|
+
"""Run the template-to-bot job in the background.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
app: The Sanic application instance.
|
|
128
|
+
job: The job information instance.
|
|
129
|
+
template_name: The name of the template to use for bot generation.
|
|
130
|
+
"""
|
|
131
|
+
project_generator: ProjectGenerator = app.ctx.project_generator
|
|
132
|
+
|
|
133
|
+
await push_job_status_event(job, JobStatus.received)
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
# 1) Generating
|
|
137
|
+
await push_job_status_event(job, JobStatus.generating)
|
|
138
|
+
await project_generator.init_from_template(template_name)
|
|
139
|
+
bot_files = project_generator.get_bot_files()
|
|
140
|
+
await push_job_status_event(job, JobStatus.generation_success)
|
|
141
|
+
|
|
142
|
+
# 2) Training
|
|
143
|
+
await push_job_status_event(job, JobStatus.training)
|
|
144
|
+
agent = await try_load_existing_agent(project_generator.project_folder)
|
|
145
|
+
if agent is None:
|
|
146
|
+
agent = await train_and_load_agent(project_generator.get_training_input())
|
|
147
|
+
else:
|
|
148
|
+
structlogger.info(
|
|
149
|
+
"bot_builder_service.template_to_bot.agent_loaded_from_cache",
|
|
150
|
+
)
|
|
151
|
+
update_agent(agent, app)
|
|
152
|
+
await push_job_status_event(job, JobStatus.train_success)
|
|
153
|
+
|
|
154
|
+
# 3) Done
|
|
155
|
+
structlogger.info(
|
|
156
|
+
"bot_builder_service.template_to_bot.success",
|
|
157
|
+
files_generated=list(bot_files.keys()),
|
|
158
|
+
)
|
|
159
|
+
await push_job_status_event(job, JobStatus.done)
|
|
160
|
+
job_manager.mark_done(job)
|
|
161
|
+
|
|
162
|
+
except TrainingError as exc:
|
|
163
|
+
structlogger.debug(
|
|
164
|
+
"template_to_bot_job.training_error",
|
|
165
|
+
job_id=job.id,
|
|
166
|
+
error=str(exc),
|
|
167
|
+
)
|
|
168
|
+
await push_job_status_event(job, JobStatus.train_error, message=str(exc))
|
|
169
|
+
job_manager.mark_done(job, error=str(exc))
|
|
170
|
+
|
|
171
|
+
except ValidationError as exc:
|
|
172
|
+
# Log levels to include in the error message
|
|
173
|
+
log_levels = ["error"]
|
|
174
|
+
if config.VALIDATION_FAIL_ON_WARNINGS:
|
|
175
|
+
log_levels.append("warning")
|
|
176
|
+
|
|
177
|
+
structlogger.debug(
|
|
178
|
+
"template_to_bot_job.validation_error",
|
|
179
|
+
job_id=job.id,
|
|
180
|
+
error=str(exc),
|
|
181
|
+
all_validation_logs=exc.validation_logs,
|
|
182
|
+
included_log_levels=log_levels,
|
|
183
|
+
)
|
|
184
|
+
error_message = exc.get_error_message_with_logs(log_levels=log_levels)
|
|
185
|
+
await push_job_status_event(
|
|
186
|
+
job, JobStatus.validation_error, message=error_message
|
|
187
|
+
)
|
|
188
|
+
job_manager.mark_done(job, error=error_message)
|
|
189
|
+
|
|
190
|
+
except ProjectGenerationError as exc:
|
|
191
|
+
structlogger.debug(
|
|
192
|
+
"template_to_bot_job.generation_error",
|
|
193
|
+
job_id=job.id,
|
|
194
|
+
error=str(exc),
|
|
195
|
+
)
|
|
196
|
+
await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
|
|
197
|
+
job_manager.mark_done(job, error=str(exc))
|
|
198
|
+
|
|
199
|
+
except Exception as exc:
|
|
200
|
+
# Capture full traceback
|
|
201
|
+
structlogger.exception(
|
|
202
|
+
"template_to_bot_job.unexpected_error",
|
|
203
|
+
job_id=job.id,
|
|
204
|
+
error=str(exc),
|
|
205
|
+
)
|
|
206
|
+
await push_job_status_event(job, JobStatus.error, message=str(exc))
|
|
207
|
+
job_manager.mark_done(job, error=str(exc))
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
async def run_replace_all_files_job(
|
|
211
|
+
app: "Sanic",
|
|
212
|
+
job: JobInfo,
|
|
213
|
+
bot_files: dict,
|
|
214
|
+
) -> None:
|
|
215
|
+
"""Run the replace-all-files job in the background.
|
|
216
|
+
|
|
217
|
+
This replaces all bot files with the provided files and deletes any files
|
|
218
|
+
not included in the request (excluding .rasa/ and models/ directories).
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
app: The Sanic application instance.
|
|
222
|
+
job: The job information instance.
|
|
223
|
+
bot_files: Dictionary of file names to content for replacement.
|
|
224
|
+
"""
|
|
225
|
+
project_generator = app.ctx.project_generator
|
|
226
|
+
await push_job_status_event(job, JobStatus.received)
|
|
227
|
+
|
|
228
|
+
try:
|
|
229
|
+
project_generator.replace_all_bot_files(bot_files)
|
|
230
|
+
|
|
231
|
+
# 1. Validating
|
|
232
|
+
await push_job_status_event(job, JobStatus.validating)
|
|
233
|
+
training_input = project_generator.get_training_input()
|
|
234
|
+
validation_error = await validate_project(training_input.importer)
|
|
235
|
+
if validation_error:
|
|
236
|
+
raise ValidationError(validation_error)
|
|
237
|
+
await push_job_status_event(job, JobStatus.validation_success)
|
|
238
|
+
|
|
239
|
+
# 2. Training
|
|
240
|
+
await push_job_status_event(job, JobStatus.training)
|
|
241
|
+
agent = await train_and_load_agent(training_input)
|
|
242
|
+
update_agent(agent, app)
|
|
243
|
+
await push_job_status_event(job, JobStatus.train_success)
|
|
244
|
+
|
|
245
|
+
await push_job_status_event(job, JobStatus.done)
|
|
246
|
+
job_manager.mark_done(job)
|
|
247
|
+
|
|
248
|
+
except ValidationError as exc:
|
|
249
|
+
log_levels = ["error"]
|
|
250
|
+
if config.VALIDATION_FAIL_ON_WARNINGS:
|
|
251
|
+
log_levels.append("warning")
|
|
252
|
+
structlogger.debug(
|
|
253
|
+
"replace_all_files_job.validation_error",
|
|
254
|
+
job_id=job.id,
|
|
255
|
+
error=str(exc),
|
|
256
|
+
validation_logs=exc.validation_logs,
|
|
257
|
+
included_log_levels=log_levels,
|
|
258
|
+
)
|
|
259
|
+
error_message = exc.get_error_message_with_logs(log_levels=log_levels)
|
|
260
|
+
await push_job_status_event(
|
|
261
|
+
job, JobStatus.validation_error, message=error_message
|
|
262
|
+
)
|
|
263
|
+
job_manager.mark_done(job, error=error_message)
|
|
264
|
+
|
|
265
|
+
except TrainingError as exc:
|
|
266
|
+
structlogger.debug(
|
|
267
|
+
"replace_all_files_job.train_error",
|
|
268
|
+
job_id=job.id,
|
|
269
|
+
error=str(exc),
|
|
270
|
+
)
|
|
271
|
+
await push_job_status_event(job, JobStatus.train_error, message=str(exc))
|
|
272
|
+
job_manager.mark_done(job, error=str(exc))
|
|
273
|
+
|
|
274
|
+
except Exception as exc:
|
|
275
|
+
# Capture full traceback for anything truly unexpected
|
|
276
|
+
structlogger.exception(
|
|
277
|
+
"replace_all_files_job.unexpected_error",
|
|
278
|
+
job_id=job.id,
|
|
279
|
+
error=str(exc),
|
|
280
|
+
)
|
|
281
|
+
await push_job_status_event(job, JobStatus.error, message=str(exc))
|
|
282
|
+
job_manager.mark_done(job, error=str(exc))
|