rasa-pro 3.14.0.dev20250818__py3-none-any.whl → 3.14.0.dev20250901__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/builder/README.md +120 -0
- rasa/builder/__init__.py +0 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +91 -0
- rasa/builder/copilot/__init__.py +0 -0
- rasa/builder/copilot/constants.py +28 -0
- rasa/builder/copilot/copilot.py +376 -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 +464 -0
- rasa/builder/copilot/prompts/__init__.py +0 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +771 -0
- rasa/builder/copilot/signing.py +305 -0
- rasa/builder/copilot/telemetry.py +200 -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 +147 -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 +270 -0
- rasa/builder/llm_service.py +246 -0
- rasa/builder/logging_utils.py +265 -0
- rasa/builder/main.py +258 -0
- rasa/builder/models.py +216 -0
- rasa/builder/project_generator.py +462 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/scrape_rasa_docs.py +97 -0
- rasa/builder/service.py +1335 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/training_service.py +124 -0
- rasa/builder/validation_service.py +97 -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/config.yml +27 -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 +9 -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 +63 -0
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -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/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 +21 -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/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/general/assistant_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 +63 -0
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
- rasa/cli/project_templates/telco/actions/__init__.py +0 -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 +27 -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/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/domain_undertand_bill.yml +102 -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 +29 -0
- rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
- rasa/cli/project_templates/telco/domain/network/domain_reboot_router.yml +21 -0
- rasa/cli/project_templates/telco/domain/network/domain_reset_router.yml +12 -0
- rasa/cli/project_templates/telco/domain/network/domain_run_speed_test.yml +25 -0
- rasa/cli/project_templates/telco/domain/network/domain_solve_internet_issue.yml +75 -0
- rasa/cli/project_templates/telco/domain/shared.yml +129 -0
- rasa/cli/project_templates/telco/endpoints.yml +63 -0
- rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/scaffold.py +46 -2
- rasa/core/actions/action.py +0 -1
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +1 -1
- rasa/core/channels/inspector/dist/assets/{arc-1ddec37b.js → arc-18042c22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-18af387c.js → blockDiagram-38ab4fdb-fdd6bcfa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-250127a3.js → c4Diagram-3d4e48cf-f5ae6786.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-c3388b34.js → classDiagram-70f12bd4-81efba3e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9c893a82.js → classDiagram-v2-f2320105-3b6b6a92.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-c111213b.js → createText-2e5e7dd3-31422447.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-812a729d.js → edges-e0da2a9e-518a90db.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-fd5051bc.js → erDiagram-9861fffd-a6d3c25a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-3287ac02.js → flowDb-956e92f1-e048c2be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-692fb0b2.js → flowDiagram-66a62f08-c7474c91.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-008376f1.js → flowchart-elk-definition-4a651766-cb4d8723.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-df330a69.js → ganttDiagram-c361ad54-346636a2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-e03676fb.js → gitGraphDiagram-72cf32ee-7c508874.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-46fad2ba.js → graph-14702d8a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-a484ac55.js → index-3862675e-f18b534b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-a003633f.js → index-4d4bdf3a.js} +231 -231
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-3f9e6ec2.js → infoDiagram-f8f76790-64154b83.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-79f72383.js → journeyDiagram-49397b02-833a5f95.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-aad098e5.js → layout-5a3b2123.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-219ab7ae.js → line-2272a8c7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-2cddbe62.js → linear-35bcf273.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-1d41ed99.js → mindmap-definition-fc14e90a-92dcb0e9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-cc496ee8.js → pieDiagram-8a3498a8-94dbc900.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-84d32884.js → quadrantDiagram-120e2f19-8b7a9c33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-c0deb984.js → requirementDiagram-deff3bca-6f7eab81.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-b9d7fd62.js → sankeyDiagram-04a897e0-f43e581d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-7d517565.js → sequenceDiagram-704730f1-0bcbefc3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-98ef9b27.js → stateDiagram-587899a1-b8a74083.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-cee70748.js → stateDiagram-v2-d93cdb3a-2070218f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-3f9d1c96.js → styles-6aaf32cf-f1d54e34.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-67471923.js → styles-9a916d00-980de489.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-bd093fb7.js → styles-c10674c1-3c03abde.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-675794e8.js → svgDrawCommon-08f97a94-46ba068f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-0ac67617.js → timeline-definition-85554ec2-901f5e3d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-c018dc37.js → xychartDiagram-e933f94c-acbc628a.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 +10 -11
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +12 -3
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +43 -23
- rasa/core/channels/voice_stream/voice_channel.py +5 -3
- rasa/core/policies/enterprise_search_policy.py +4 -7
- rasa/core/policies/flows/flow_executor.py +8 -1
- rasa/core/run.py +13 -3
- rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +1 -1
- rasa/engine/storage/local_model_storage.py +45 -2
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +1 -1
- rasa/model_manager/socket_bridge.py +20 -14
- rasa/model_manager/trainer_service.py +12 -9
- rasa/model_manager/utils.py +1 -29
- rasa/shared/core/domain.py +62 -15
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/steps/call.py +8 -1
- rasa/shared/core/flows/yaml_flows_io.py +16 -8
- rasa/shared/core/slots.py +4 -0
- rasa/shared/importers/importer.py +6 -0
- rasa/shared/importers/utils.py +77 -1
- rasa/shared/providers/_utils.py +60 -44
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
- rasa/studio/upload.py +12 -46
- rasa/telemetry.py +97 -23
- 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/validator.py +7 -3
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/METADATA +9 -10
- {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/RECORD +358 -83
- rasa/core/channels/inspector/dist/assets/channel-59f6d54b.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-26177ddb.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-29c03f5a.js +0 -1
- {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/entry_points.txt +0 -0
|
@@ -17,9 +17,9 @@ from typing import (
|
|
|
17
17
|
Optional,
|
|
18
18
|
Text,
|
|
19
19
|
Tuple,
|
|
20
|
+
Union,
|
|
20
21
|
)
|
|
21
22
|
|
|
22
|
-
import orjson
|
|
23
23
|
import structlog
|
|
24
24
|
|
|
25
25
|
from rasa.core.channels import UserMessage
|
|
@@ -47,7 +47,6 @@ if TYPE_CHECKING:
|
|
|
47
47
|
from sanic import Sanic, Websocket # type: ignore[attr-defined]
|
|
48
48
|
from socketio import AsyncServer
|
|
49
49
|
|
|
50
|
-
from rasa.core.channels.channel import UserMessage
|
|
51
50
|
from rasa.shared.core.trackers import DialogueStateTracker
|
|
52
51
|
|
|
53
52
|
|
|
@@ -56,7 +55,7 @@ structlogger = structlog.get_logger()
|
|
|
56
55
|
|
|
57
56
|
def tracker_as_dump(
|
|
58
57
|
tracker: "DialogueStateTracker", latency: Optional[float] = None
|
|
59
|
-
) -> str:
|
|
58
|
+
) -> Dict[str, Any]:
|
|
60
59
|
"""Create a dump of the tracker state."""
|
|
61
60
|
from rasa.shared.core.trackers import get_trackers_for_conversation_sessions
|
|
62
61
|
|
|
@@ -67,11 +66,14 @@ def tracker_as_dump(
|
|
|
67
66
|
else:
|
|
68
67
|
last_tracker = multiple_tracker_sessions[-1]
|
|
69
68
|
|
|
69
|
+
# TODO: this is a bug: the bridge converts this back to json, but it
|
|
70
|
+
# should be json in the first place
|
|
70
71
|
state = last_tracker.current_state(EventVerbosity.AFTER_RESTART)
|
|
71
72
|
|
|
72
73
|
if latency is not None:
|
|
73
74
|
state["latency"] = {"rasa_processing_latency_ms": latency}
|
|
74
|
-
|
|
75
|
+
|
|
76
|
+
return state
|
|
75
77
|
|
|
76
78
|
|
|
77
79
|
def does_need_action_prediction(tracker: "DialogueStateTracker") -> bool:
|
|
@@ -153,6 +155,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
153
155
|
jwt_key: Optional[Text] = None,
|
|
154
156
|
jwt_method: Optional[Text] = "HS256",
|
|
155
157
|
metadata_key: Optional[Text] = "metadata",
|
|
158
|
+
enable_silence_timeout: bool = False,
|
|
156
159
|
) -> None:
|
|
157
160
|
"""Creates a `StudioChatInput` object."""
|
|
158
161
|
from rasa.core.agent import Agent
|
|
@@ -170,6 +173,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
170
173
|
jwt_key=jwt_key,
|
|
171
174
|
jwt_method=jwt_method,
|
|
172
175
|
metadata_key=metadata_key,
|
|
176
|
+
enable_silence_timeout=enable_silence_timeout,
|
|
173
177
|
)
|
|
174
178
|
|
|
175
179
|
# Initialize the Voice Input Channel
|
|
@@ -210,14 +214,15 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
210
214
|
jwt_key=credentials.get("jwt_key"),
|
|
211
215
|
jwt_method=credentials.get("jwt_method", "HS256"),
|
|
212
216
|
metadata_key=credentials.get("metadata_key", "metadata"),
|
|
217
|
+
enable_silence_timeout=credentials.get("enable_silence_timeout", False),
|
|
213
218
|
)
|
|
214
219
|
|
|
215
|
-
async def emit(self, event: str, data: str, room: str) -> None:
|
|
220
|
+
async def emit(self, event: str, data: Union[Dict, str], room: str) -> None:
|
|
216
221
|
"""Emits an event to the websocket."""
|
|
217
|
-
if not self.
|
|
222
|
+
if not self.sio_server:
|
|
218
223
|
structlogger.error("studio_chat.emit.sio_not_initialized")
|
|
219
224
|
return
|
|
220
|
-
await self.
|
|
225
|
+
await self.sio_server.emit(event, data, room=room)
|
|
221
226
|
|
|
222
227
|
def _register_tracker_update_hook(self) -> None:
|
|
223
228
|
plugin_manager().register(StudioTrackerUpdatePlugin(self))
|
|
@@ -250,15 +255,22 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
250
255
|
|
|
251
256
|
async def on_message_proxy(
|
|
252
257
|
self,
|
|
253
|
-
on_new_message: Callable[[
|
|
254
|
-
message:
|
|
258
|
+
on_new_message: Callable[[UserMessage], Awaitable[Any]],
|
|
259
|
+
message: UserMessage,
|
|
255
260
|
) -> None:
|
|
256
261
|
"""Proxies the on_new_message call to the underlying channel.
|
|
257
262
|
|
|
258
263
|
Triggers a tracker update notification after processing the message.
|
|
259
264
|
"""
|
|
260
265
|
self._record_turn_start_time(message.sender_id)
|
|
261
|
-
|
|
266
|
+
try:
|
|
267
|
+
await on_new_message(message)
|
|
268
|
+
except Exception as e:
|
|
269
|
+
structlogger.exception(
|
|
270
|
+
"studio_chat.on_new_message.error",
|
|
271
|
+
error=str(e),
|
|
272
|
+
sender_id=message.sender_id,
|
|
273
|
+
)
|
|
262
274
|
|
|
263
275
|
if not self.agent or not self.agent.is_ready():
|
|
264
276
|
structlogger.error("studio_chat.on_message_proxy.agent_not_initialized")
|
|
@@ -377,7 +389,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
377
389
|
call_state.is_bot_speaking = True
|
|
378
390
|
return ContinueConversationAction()
|
|
379
391
|
|
|
380
|
-
def
|
|
392
|
+
def _create_output_channel(
|
|
381
393
|
self, voice_websocket: "Websocket", tts_engine: TTSEngine
|
|
382
394
|
) -> VoiceOutputChannel:
|
|
383
395
|
"""Create a voice output channel."""
|
|
@@ -407,7 +419,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
407
419
|
|
|
408
420
|
# Create a websocket adapter for this connection
|
|
409
421
|
ws_adapter = SocketIOVoiceWebsocketAdapter(
|
|
410
|
-
|
|
422
|
+
sio_server=self.sio_server,
|
|
411
423
|
session_id=session_id,
|
|
412
424
|
sid=sid,
|
|
413
425
|
bot_message_evt=self.bot_message_evt,
|
|
@@ -455,12 +467,12 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
455
467
|
task.cancel()
|
|
456
468
|
|
|
457
469
|
def blueprint(
|
|
458
|
-
self, on_new_message: Callable[[
|
|
470
|
+
self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
|
|
459
471
|
) -> SocketBlueprint:
|
|
460
472
|
proxied_on_message = partial(self.on_message_proxy, on_new_message)
|
|
461
473
|
socket_blueprint = super().blueprint(proxied_on_message)
|
|
462
474
|
|
|
463
|
-
if not self.
|
|
475
|
+
if not self.sio_server:
|
|
464
476
|
structlogger.error("studio_chat.blueprint.sio_not_initialized")
|
|
465
477
|
return socket_blueprint
|
|
466
478
|
|
|
@@ -470,12 +482,12 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
470
482
|
) -> None:
|
|
471
483
|
self.agent = app.ctx.agent
|
|
472
484
|
|
|
473
|
-
@self.
|
|
485
|
+
@self.sio_server.on("disconnect", namespace=self.namespace)
|
|
474
486
|
async def disconnect(sid: Text) -> None:
|
|
475
487
|
structlogger.debug("studio_chat.sio.disconnect", sid=sid)
|
|
476
488
|
self._cleanup_tasks_for_sid(sid)
|
|
477
489
|
|
|
478
|
-
@self.
|
|
490
|
+
@self.sio_server.on("session_request", namespace=self.namespace)
|
|
479
491
|
async def session_request(sid: Text, data: Optional[Dict]) -> None:
|
|
480
492
|
"""Overrides the base SocketIOInput session_request handler.
|
|
481
493
|
|
|
@@ -495,7 +507,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
495
507
|
if data and data.get("is_voice", False):
|
|
496
508
|
self._start_voice_session(data["session_id"], sid, proxied_on_message)
|
|
497
509
|
|
|
498
|
-
@self.
|
|
510
|
+
@self.sio_server.on(self.user_message_evt, namespace=self.namespace)
|
|
499
511
|
async def handle_message(sid: Text, data: Dict) -> None:
|
|
500
512
|
"""Overrides the base SocketIOInput handle_message handler."""
|
|
501
513
|
# Handle voice messages
|
|
@@ -506,10 +518,18 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
|
|
|
506
518
|
ws.put_message(data)
|
|
507
519
|
return
|
|
508
520
|
|
|
509
|
-
|
|
510
|
-
|
|
521
|
+
try:
|
|
522
|
+
# Handle text messages
|
|
523
|
+
await self.handle_user_message(sid, data, proxied_on_message)
|
|
524
|
+
except Exception as e:
|
|
525
|
+
structlogger.exception(
|
|
526
|
+
"studio_chat.sio.handle_message.error",
|
|
527
|
+
error=str(e),
|
|
528
|
+
sid=sid,
|
|
529
|
+
)
|
|
530
|
+
await self.emit("error", str(e), room=sid)
|
|
511
531
|
|
|
512
|
-
@self.
|
|
532
|
+
@self.sio_server.on("update_tracker", namespace=self.namespace)
|
|
513
533
|
async def on_update_tracker(sid: Text, data: Dict) -> None:
|
|
514
534
|
await self.handle_tracker_update(sid, data)
|
|
515
535
|
|
|
@@ -555,9 +575,9 @@ class SocketIOVoiceWebsocketAdapter:
|
|
|
555
575
|
"""Adapter to make Socket.IO work like a Sanic WebSocket for voice channels."""
|
|
556
576
|
|
|
557
577
|
def __init__(
|
|
558
|
-
self,
|
|
578
|
+
self, sio_server: "AsyncServer", session_id: str, sid: str, bot_message_evt: str
|
|
559
579
|
) -> None:
|
|
560
|
-
self.
|
|
580
|
+
self.sio_server = sio_server
|
|
561
581
|
self.bot_message_evt = bot_message_evt
|
|
562
582
|
self._closed = False
|
|
563
583
|
self._receive_queue: asyncio.Queue[Any] = asyncio.Queue()
|
|
@@ -576,7 +596,7 @@ class SocketIOVoiceWebsocketAdapter:
|
|
|
576
596
|
async def send(self, data: Any) -> None:
|
|
577
597
|
"""Send data to the client."""
|
|
578
598
|
if not self.closed:
|
|
579
|
-
await self.
|
|
599
|
+
await self.sio_server.emit(self.bot_message_evt, data, room=self.sid)
|
|
580
600
|
|
|
581
601
|
async def recv(self) -> Any:
|
|
582
602
|
"""Receive data from the client."""
|
|
@@ -11,6 +11,11 @@ from sanic import Websocket # type: ignore
|
|
|
11
11
|
from sanic.exceptions import ServerError, WebsocketClosed
|
|
12
12
|
|
|
13
13
|
from rasa.core.channels import InputChannel, OutputChannel, UserMessage
|
|
14
|
+
from rasa.core.channels.constants import (
|
|
15
|
+
USER_CONVERSATION_SESSION_END,
|
|
16
|
+
USER_CONVERSATION_SESSION_START,
|
|
17
|
+
USER_CONVERSATION_SILENCE_TIMEOUT,
|
|
18
|
+
)
|
|
14
19
|
from rasa.core.channels.voice_ready.utils import (
|
|
15
20
|
CallParameters,
|
|
16
21
|
validate_voice_license_scope,
|
|
@@ -48,9 +53,6 @@ from rasa.utils.io import remove_emojis
|
|
|
48
53
|
logger = structlog.get_logger(__name__)
|
|
49
54
|
|
|
50
55
|
# define constants for the voice channel
|
|
51
|
-
USER_CONVERSATION_SESSION_END = "/session_end"
|
|
52
|
-
USER_CONVERSATION_SESSION_START = "/session_start"
|
|
53
|
-
USER_CONVERSATION_SILENCE_TIMEOUT = "/silence_timeout"
|
|
54
56
|
|
|
55
57
|
|
|
56
58
|
@dataclass
|
|
@@ -781,7 +781,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
781
781
|
if not os.path.exists(docs_folder) or not os.path.isdir(docs_folder):
|
|
782
782
|
error_message = (
|
|
783
783
|
f"Document source directory does not exist or is not a "
|
|
784
|
-
f"directory: '{docs_folder}'. "
|
|
784
|
+
f"directory: '{os.path.abspath(docs_folder)}'. "
|
|
785
785
|
"Please specify a valid path to the documents source directory in the "
|
|
786
786
|
"vector_store configuration."
|
|
787
787
|
)
|
|
@@ -1130,8 +1130,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
1130
1130
|
embeddings_config: Dict[Text, Any],
|
|
1131
1131
|
log_source_method: str,
|
|
1132
1132
|
) -> None:
|
|
1133
|
-
"""
|
|
1134
|
-
Perform the health checks using resolved LLM and embeddings configurations.
|
|
1133
|
+
"""Perform the health checks using resolved LLM and embeddings configurations.
|
|
1135
1134
|
Resolved means the configuration is either:
|
|
1136
1135
|
- A reference to a model group that has already been expanded into
|
|
1137
1136
|
its corresponding configuration using the information from
|
|
@@ -1160,8 +1159,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
1160
1159
|
|
|
1161
1160
|
@classmethod
|
|
1162
1161
|
def get_system_default_prompt_based_on_config(cls, config: Dict[str, Any]) -> str:
|
|
1163
|
-
"""
|
|
1164
|
-
Resolves the default prompt template for Enterprise Search Policy based on
|
|
1162
|
+
"""Resolves the default prompt template for Enterprise Search Policy based on
|
|
1165
1163
|
the component's configuration.
|
|
1166
1164
|
|
|
1167
1165
|
- The old prompt is selected when both citation and relevancy check are either
|
|
@@ -1192,8 +1190,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
|
|
|
1192
1190
|
relevancy_check_enabled: bool,
|
|
1193
1191
|
citation_enabled: bool,
|
|
1194
1192
|
) -> str:
|
|
1195
|
-
"""
|
|
1196
|
-
Returns the appropriate default prompt template based on the feature flags.
|
|
1193
|
+
"""Returns the appropriate default prompt template based on the feature flags.
|
|
1197
1194
|
|
|
1198
1195
|
The selection follows this priority:
|
|
1199
1196
|
1. If relevancy check is enabled, return the prompt that includes both relevancy
|
|
@@ -740,7 +740,14 @@ def _run_action_step(
|
|
|
740
740
|
# do not log about non-existing validation actions of collect steps
|
|
741
741
|
utter_action_name = render_template_variables("{{context.utter}}", context)
|
|
742
742
|
if utter_action_name not in available_actions:
|
|
743
|
-
structlogger.warning(
|
|
743
|
+
structlogger.warning(
|
|
744
|
+
"flow.step.run.action.unknown",
|
|
745
|
+
action=action_name,
|
|
746
|
+
event_info=(
|
|
747
|
+
f"The action '{action_name}' is not defined in the domain but "
|
|
748
|
+
f"getting triggered by the flow '{step.flow_id}'."
|
|
749
|
+
),
|
|
750
|
+
)
|
|
744
751
|
return ContinueFlowWithNextStep(events=initial_events)
|
|
745
752
|
|
|
746
753
|
|
rasa/core/run.py
CHANGED
|
@@ -42,10 +42,20 @@ from rasa.utils import licensing
|
|
|
42
42
|
logger = logging.getLogger() # get the root logger
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
def
|
|
45
|
+
def create_input_channels(
|
|
46
46
|
channel: Optional[Text], credentials_file: Optional[Text]
|
|
47
47
|
) -> List[InputChannel]:
|
|
48
|
-
"""Instantiate the chosen input channel.
|
|
48
|
+
"""Instantiate the chosen input channel.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
channel (optional): The name of the specific input channel to create.
|
|
52
|
+
credentials_file: Path to the credentials file containing channel credentials.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
A list of instantiated input channels. If a specific channel is provided,
|
|
56
|
+
it returns a list with that single channel. If no channel is specified,
|
|
57
|
+
it returns a list of all channels defined in the credentials file.
|
|
58
|
+
"""
|
|
49
59
|
if credentials_file:
|
|
50
60
|
all_credentials = read_config_file(credentials_file)
|
|
51
61
|
else:
|
|
@@ -253,7 +263,7 @@ def serve_application(
|
|
|
253
263
|
if not channel and not credentials:
|
|
254
264
|
channel = "cmdline"
|
|
255
265
|
|
|
256
|
-
input_channels =
|
|
266
|
+
input_channels = create_input_channels(channel, credentials)
|
|
257
267
|
|
|
258
268
|
if inspect:
|
|
259
269
|
logger.info("Starting development inspector.")
|
|
@@ -219,11 +219,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
|
|
|
219
219
|
if self.vector_store is not None:
|
|
220
220
|
with self._model_storage.write_to(self._resource) as model_path:
|
|
221
221
|
self.vector_store.save_local(model_path)
|
|
222
|
-
else:
|
|
223
|
-
structlogger.warning(
|
|
224
|
-
"flow_retrieval.persist_vector_store.not_initialized",
|
|
225
|
-
event_info="Vector store is None, not persisted.",
|
|
226
|
-
)
|
|
227
222
|
|
|
228
223
|
def _persist_config(self) -> None:
|
|
229
224
|
with self._model_storage.write_to(self._resource) as path:
|
|
@@ -249,6 +244,16 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
|
|
|
249
244
|
)
|
|
250
245
|
|
|
251
246
|
flows_to_embedd = flows.exclude_link_only_flows()
|
|
247
|
+
|
|
248
|
+
if not flows_to_embedd:
|
|
249
|
+
structlogger.debug(
|
|
250
|
+
"flow_retrieval.populate_vector_store.no_flows_to_embed",
|
|
251
|
+
event_info=(
|
|
252
|
+
"No flows to embed in the vector store, skipping population."
|
|
253
|
+
),
|
|
254
|
+
)
|
|
255
|
+
return
|
|
256
|
+
|
|
252
257
|
embeddings = self._create_embedder(self.config)
|
|
253
258
|
documents = self._generate_flow_documents(flows_to_embedd, domain)
|
|
254
259
|
try:
|
|
@@ -420,10 +425,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
|
|
|
420
425
|
The top k documents with similarity scores.
|
|
421
426
|
"""
|
|
422
427
|
if self.vector_store is None:
|
|
423
|
-
structlogger.error(
|
|
424
|
-
"flow_retrieval.query_vector_store.vector_store_not_configured",
|
|
425
|
-
event_info="Vector store is not configured",
|
|
426
|
-
)
|
|
427
428
|
return []
|
|
428
429
|
try:
|
|
429
430
|
documents_with_scores = (
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
import os
|
|
4
5
|
import shutil
|
|
5
6
|
import sys
|
|
7
|
+
import tarfile
|
|
6
8
|
import tempfile
|
|
7
9
|
import uuid
|
|
8
10
|
from contextlib import contextmanager
|
|
9
11
|
from datetime import datetime
|
|
10
12
|
from pathlib import Path
|
|
11
|
-
from typing import Generator, Optional, Text, Tuple, Union
|
|
13
|
+
from typing import Callable, Generator, Optional, Text, Tuple, Union
|
|
12
14
|
|
|
13
15
|
from tarsafe import TarSafe
|
|
14
16
|
|
|
@@ -57,6 +59,35 @@ def windows_safe_temporary_directory(
|
|
|
57
59
|
yield temporary_directory
|
|
58
60
|
|
|
59
61
|
|
|
62
|
+
def filter_normpath(member: tarfile.TarInfo, dest_path: str) -> tarfile.TarInfo:
|
|
63
|
+
"""Normalize tar member paths for safe extraction"""
|
|
64
|
+
if member.name:
|
|
65
|
+
member.name = os.path.normpath(member.name)
|
|
66
|
+
return member
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
FilterFunction = Callable[[tarfile.TarInfo, str], Optional[tarfile.TarInfo]]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def create_combined_filter(existing_filter: Optional[FilterFunction]) -> FilterFunction:
|
|
73
|
+
"""Create a filter that combines existing filter with path normalization"""
|
|
74
|
+
|
|
75
|
+
def combined_filter(
|
|
76
|
+
member: tarfile.TarInfo, dest_path: str
|
|
77
|
+
) -> Optional[tarfile.TarInfo]:
|
|
78
|
+
"""Apply existing filter first, then path normalization"""
|
|
79
|
+
if existing_filter is not None:
|
|
80
|
+
filtered_member = existing_filter(member, dest_path)
|
|
81
|
+
if filtered_member is None:
|
|
82
|
+
return None # Rejected by existing filter
|
|
83
|
+
member = filtered_member # Use the filtered result
|
|
84
|
+
|
|
85
|
+
# Apply our path normalization
|
|
86
|
+
return filter_normpath(member, dest_path)
|
|
87
|
+
|
|
88
|
+
return combined_filter
|
|
89
|
+
|
|
90
|
+
|
|
60
91
|
class LocalModelStorage(ModelStorage):
|
|
61
92
|
"""Stores and provides output of `GraphComponents` on local disk."""
|
|
62
93
|
|
|
@@ -122,7 +153,19 @@ class LocalModelStorage(ModelStorage):
|
|
|
122
153
|
# this restriction in environments where it's not possible
|
|
123
154
|
# to override this behavior, mostly for internal policy reasons
|
|
124
155
|
# reference: https://stackoverflow.com/a/49102229
|
|
125
|
-
|
|
156
|
+
try:
|
|
157
|
+
# Use extraction filter to normalize paths for compatibility
|
|
158
|
+
# before trying the \\?\ prefix approach first
|
|
159
|
+
prev_filter = getattr(tar, "extraction_filter", None)
|
|
160
|
+
tar.extraction_filter = create_combined_filter(prev_filter)
|
|
161
|
+
tar.extractall(f"\\\\?\\{temporary_directory}")
|
|
162
|
+
except Exception:
|
|
163
|
+
# Fallback for Python versions with tarfile security fix
|
|
164
|
+
logger.warning(
|
|
165
|
+
"Failed to extract model archive with long path support. "
|
|
166
|
+
"Falling back to regular extraction."
|
|
167
|
+
)
|
|
168
|
+
tar.extractall(temporary_directory)
|
|
126
169
|
else:
|
|
127
170
|
tar.extractall(temporary_directory)
|
|
128
171
|
LocalModelStorage._assert_not_rasa2_archive(temporary_directory)
|
rasa/model_manager/model_api.py
CHANGED
|
@@ -39,11 +39,9 @@ from rasa.model_manager.trainer_service import (
|
|
|
39
39
|
update_training_status,
|
|
40
40
|
)
|
|
41
41
|
from rasa.model_manager.utils import (
|
|
42
|
-
InvalidPathException,
|
|
43
42
|
get_logs_content,
|
|
44
43
|
logs_base_path,
|
|
45
44
|
models_base_path,
|
|
46
|
-
subpath,
|
|
47
45
|
)
|
|
48
46
|
from rasa.model_manager.warm_rasa_process import (
|
|
49
47
|
initialize_warm_rasa_process,
|
|
@@ -53,6 +51,7 @@ from rasa.server import ErrorResponse
|
|
|
53
51
|
from rasa.shared.exceptions import InvalidConfigException
|
|
54
52
|
from rasa.shared.utils.yaml import dump_obj_as_yaml_to_string
|
|
55
53
|
from rasa.studio.upload import build_calm_import_parts
|
|
54
|
+
from rasa.utils.io import InvalidPathException, subpath
|
|
56
55
|
|
|
57
56
|
dotenv.load_dotenv()
|
|
58
57
|
|
|
@@ -571,10 +570,10 @@ def external_blueprint() -> Blueprint:
|
|
|
571
570
|
"""Create a blueprint for the model manager API."""
|
|
572
571
|
from rasa.core.channels.socketio import SocketBlueprint
|
|
573
572
|
|
|
574
|
-
|
|
575
|
-
bp = SocketBlueprint(
|
|
573
|
+
sio_server = AsyncServer(async_mode="sanic", cors_allowed_origins="*")
|
|
574
|
+
bp = SocketBlueprint(sio_server, "", "model_api_external")
|
|
576
575
|
|
|
577
|
-
create_bridge_server(
|
|
576
|
+
create_bridge_server(sio_server, running_bots)
|
|
578
577
|
|
|
579
578
|
@bp.get("/health")
|
|
580
579
|
async def health(request: Request) -> response.HTTPResponse:
|
|
@@ -15,11 +15,11 @@ from rasa.model_manager import config
|
|
|
15
15
|
from rasa.model_manager.utils import (
|
|
16
16
|
logs_path,
|
|
17
17
|
models_base_path,
|
|
18
|
-
subpath,
|
|
19
18
|
write_encoded_data_to_file,
|
|
20
19
|
)
|
|
21
20
|
from rasa.model_manager.warm_rasa_process import start_rasa_process
|
|
22
21
|
from rasa.studio.prompts import handle_prompts
|
|
22
|
+
from rasa.utils.io import subpath
|
|
23
23
|
|
|
24
24
|
structlogger = structlog.get_logger()
|
|
25
25
|
|
|
@@ -19,7 +19,7 @@ socket_proxy_clients = {}
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
async def socketio_websocket_traffic_wrapper(
|
|
22
|
-
|
|
22
|
+
sio_server: AsyncServer,
|
|
23
23
|
running_bots: Dict[str, BotSession],
|
|
24
24
|
sid: str,
|
|
25
25
|
auth: Optional[Dict],
|
|
@@ -55,7 +55,9 @@ async def socketio_websocket_traffic_wrapper(
|
|
|
55
55
|
structlogger.error("model_runner.bot_not_alive", deployment_id=deployment_id)
|
|
56
56
|
raise ConnectionRefusedError("model_runner.bot_not_alive")
|
|
57
57
|
|
|
58
|
-
client = await create_bridge_client(
|
|
58
|
+
client = await create_bridge_client(
|
|
59
|
+
sio_server, bot.internal_url, sid, deployment_id
|
|
60
|
+
)
|
|
59
61
|
|
|
60
62
|
if client.sid is not None:
|
|
61
63
|
structlogger.debug(
|
|
@@ -70,20 +72,24 @@ async def socketio_websocket_traffic_wrapper(
|
|
|
70
72
|
raise ConnectionRefusedError("model_runner.bot_connection_failed")
|
|
71
73
|
|
|
72
74
|
|
|
73
|
-
def create_bridge_server(
|
|
75
|
+
def create_bridge_server(
|
|
76
|
+
sio_server: AsyncServer, running_bots: Dict[str, BotSession]
|
|
77
|
+
) -> None:
|
|
74
78
|
"""Create handlers for the socket server side.
|
|
75
79
|
|
|
76
80
|
Forwards messages coming from the user to the bot.
|
|
77
81
|
"""
|
|
78
82
|
|
|
79
|
-
@
|
|
83
|
+
@sio_server.on("connect")
|
|
80
84
|
async def socketio_websocket_traffic(
|
|
81
85
|
sid: str, environ: Dict, auth: Optional[Dict]
|
|
82
86
|
) -> bool:
|
|
83
87
|
"""Bridge websockets between user chat socket and bot server."""
|
|
84
|
-
return await socketio_websocket_traffic_wrapper(
|
|
88
|
+
return await socketio_websocket_traffic_wrapper(
|
|
89
|
+
sio_server, running_bots, sid, auth
|
|
90
|
+
)
|
|
85
91
|
|
|
86
|
-
@
|
|
92
|
+
@sio_server.on("disconnect")
|
|
87
93
|
async def disconnect(sid: str) -> None:
|
|
88
94
|
"""Disconnect the bot connection."""
|
|
89
95
|
structlogger.debug("model_runner.bot_disconnect", sid=sid)
|
|
@@ -91,7 +97,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
|
|
|
91
97
|
await socket_proxy_clients[sid].disconnect()
|
|
92
98
|
del socket_proxy_clients[sid]
|
|
93
99
|
|
|
94
|
-
@
|
|
100
|
+
@sio_server.on("*")
|
|
95
101
|
async def handle_message(event: str, sid: str, data: Dict[str, Any]) -> None:
|
|
96
102
|
"""Bridge messages between user and bot.
|
|
97
103
|
|
|
@@ -108,7 +114,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
|
|
|
108
114
|
|
|
109
115
|
|
|
110
116
|
async def create_bridge_client(
|
|
111
|
-
|
|
117
|
+
sio_server: AsyncServer, url: str, sid: str, deployment_id: str
|
|
112
118
|
) -> AsyncClient:
|
|
113
119
|
"""Create a new socket bridge client.
|
|
114
120
|
|
|
@@ -123,36 +129,36 @@ async def create_bridge_client(
|
|
|
123
129
|
structlogger.debug(
|
|
124
130
|
"model_runner.bot_session_confirmed", deployment_id=deployment_id
|
|
125
131
|
)
|
|
126
|
-
await
|
|
132
|
+
await sio_server.emit("session_confirm", room=sid)
|
|
127
133
|
|
|
128
134
|
@client.event # type: ignore[misc]
|
|
129
135
|
async def bot_message(data: Dict[str, Any]) -> None:
|
|
130
136
|
structlogger.debug("model_runner.bot_message", deployment_id=deployment_id)
|
|
131
|
-
await
|
|
137
|
+
await sio_server.emit("bot_message", data, room=sid)
|
|
132
138
|
|
|
133
139
|
@client.event # type: ignore[misc]
|
|
134
140
|
async def error(data: Dict[str, Any]) -> None:
|
|
135
141
|
structlogger.debug(
|
|
136
142
|
"model_runner.bot_error", deployment_id=deployment_id, data=data
|
|
137
143
|
)
|
|
138
|
-
await
|
|
144
|
+
await sio_server.emit("error", data, room=sid)
|
|
139
145
|
|
|
140
146
|
@client.event # type: ignore[misc]
|
|
141
147
|
async def tracker(data: Dict[str, Any]) -> None:
|
|
142
|
-
await
|
|
148
|
+
await sio_server.emit("tracker", json.loads(data), room=sid)
|
|
143
149
|
|
|
144
150
|
@client.event # type: ignore[misc]
|
|
145
151
|
async def disconnect() -> None:
|
|
146
152
|
structlogger.debug(
|
|
147
153
|
"model_runner.bot_connection_closed", deployment_id=deployment_id
|
|
148
154
|
)
|
|
149
|
-
await
|
|
155
|
+
await sio_server.emit("disconnect", room=sid)
|
|
150
156
|
|
|
151
157
|
@client.event # type: ignore[misc]
|
|
152
158
|
async def connect_error() -> None:
|
|
153
159
|
structlogger.error(
|
|
154
160
|
"model_runner.bot_connection_error", deployment_id=deployment_id
|
|
155
161
|
)
|
|
156
|
-
await
|
|
162
|
+
await sio_server.emit("disconnect", room=sid)
|
|
157
163
|
|
|
158
164
|
return client
|
|
@@ -14,7 +14,6 @@ from rasa.model_manager.utils import (
|
|
|
14
14
|
ensure_base_directory_exists,
|
|
15
15
|
logs_path,
|
|
16
16
|
models_base_path,
|
|
17
|
-
subpath,
|
|
18
17
|
write_encoded_data_to_file,
|
|
19
18
|
)
|
|
20
19
|
from rasa.model_manager.warm_rasa_process import (
|
|
@@ -22,6 +21,7 @@ from rasa.model_manager.warm_rasa_process import (
|
|
|
22
21
|
)
|
|
23
22
|
from rasa.model_training import generate_random_model_name
|
|
24
23
|
from rasa.studio.prompts import handle_prompts
|
|
24
|
+
from rasa.utils.io import subpath
|
|
25
25
|
|
|
26
26
|
structlogger = structlog.get_logger()
|
|
27
27
|
|
|
@@ -53,6 +53,15 @@ class TrainingSession(BaseModel):
|
|
|
53
53
|
"""Check if the training is running."""
|
|
54
54
|
return self.status == TrainingSessionStatus.RUNNING
|
|
55
55
|
|
|
56
|
+
def has_just_finished(self) -> bool:
|
|
57
|
+
if not self.is_status_indicating_alive():
|
|
58
|
+
# skip if the training is not running
|
|
59
|
+
return False
|
|
60
|
+
if self.process.poll() is None:
|
|
61
|
+
# process is still running
|
|
62
|
+
return False
|
|
63
|
+
return True
|
|
64
|
+
|
|
56
65
|
def model_path(self) -> str:
|
|
57
66
|
"""Return the path to the model."""
|
|
58
67
|
return subpath(models_base_path(), f"{self.model_name}.tar.gz")
|
|
@@ -89,14 +98,8 @@ def terminate_training(training: TrainingSession) -> None:
|
|
|
89
98
|
|
|
90
99
|
|
|
91
100
|
def update_training_status(training: TrainingSession) -> None:
|
|
92
|
-
if
|
|
93
|
-
|
|
94
|
-
return
|
|
95
|
-
if training.process.poll() is None:
|
|
96
|
-
# process is still running
|
|
97
|
-
return
|
|
98
|
-
|
|
99
|
-
complete_training(training)
|
|
101
|
+
if training.has_just_finished():
|
|
102
|
+
complete_training(training)
|
|
100
103
|
|
|
101
104
|
|
|
102
105
|
def complete_training(training: TrainingSession) -> None:
|