rasa-pro 3.14.0.dev4__py3-none-any.whl → 3.14.0.dev5__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/api.py +0 -5
- rasa/builder/README.md +120 -0
- rasa/builder/auth.py +176 -0
- rasa/builder/config.py +115 -0
- rasa/builder/copilot/constants.py +25 -0
- rasa/builder/copilot/copilot.py +372 -0
- rasa/builder/copilot/copilot_response_handler.py +487 -0
- rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
- rasa/builder/copilot/exceptions.py +20 -0
- rasa/builder/copilot/models.py +431 -0
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +726 -0
- rasa/builder/copilot/telemetry.py +195 -0
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +26 -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 +55 -0
- rasa/builder/guardrails/__init__.py +1 -0
- rasa/builder/guardrails/constants.py +3 -0
- rasa/builder/guardrails/exceptions.py +4 -0
- rasa/builder/guardrails/lakera.py +206 -0
- rasa/builder/guardrails/models.py +199 -0
- rasa/builder/guardrails/utils.py +305 -0
- rasa/builder/job_manager.py +87 -0
- rasa/builder/jobs.py +234 -0
- rasa/builder/llm_service.py +246 -0
- rasa/builder/logging_utils.py +209 -0
- rasa/builder/main.py +174 -0
- rasa/builder/models.py +197 -0
- rasa/builder/project_generator.py +450 -0
- rasa/builder/project_info.py +72 -0
- rasa/builder/scrape_rasa_docs.py +97 -0
- rasa/builder/service.py +1142 -0
- rasa/builder/shared/tracker_context.py +212 -0
- rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
- rasa/builder/training_service.py +132 -0
- rasa/builder/validation_service.py +93 -0
- rasa/cli/arguments/default_arguments.py +0 -12
- rasa/cli/arguments/run.py +0 -2
- rasa/cli/dialogue_understanding_test.py +0 -4
- rasa/cli/e2e_test.py +0 -4
- rasa/cli/inspect.py +0 -3
- rasa/cli/llm_fine_tuning.py +0 -5
- rasa/cli/project_templates/basic/actions/action_api.py +15 -0
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +44 -0
- rasa/cli/project_templates/basic/config.yml +23 -0
- rasa/cli/project_templates/basic/credentials.yml +34 -0
- rasa/cli/project_templates/basic/data/general/feedback.yml +20 -0
- rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
- rasa/cli/project_templates/basic/data/general/hello.yml +7 -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/welcome.yml +9 -0
- rasa/cli/project_templates/basic/data/system/pattern_completed.yml +7 -0
- rasa/cli/project_templates/basic/data/system/pattern_correction.yml +7 -0
- rasa/cli/project_templates/basic/data/system/pattern_search.yml +8 -0
- rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +8 -0
- rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +65 -0
- rasa/cli/project_templates/basic/docs/template.txt +7 -0
- rasa/cli/project_templates/basic/domain/general/assistant_details.yml +12 -0
- rasa/cli/project_templates/basic/domain/general/bot_identity.yml +5 -0
- rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +5 -0
- rasa/cli/project_templates/basic/domain/general/feedback.yml +28 -0
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +7 -0
- rasa/cli/project_templates/basic/domain/general/help.yml +5 -0
- rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +35 -0
- rasa/cli/project_templates/basic/domain/general/utils.yml +13 -0
- rasa/cli/project_templates/basic/domain/general/welcome.yml +7 -0
- rasa/cli/project_templates/basic/endpoints.yml +73 -0
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
- rasa/cli/project_templates/finance/actions/__init__.py +46 -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/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/actions_billing.py +204 -0
- rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +48 -0
- rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +28 -0
- rasa/cli/project_templates/telco/actions/actions_session_start.py +18 -0
- rasa/cli/project_templates/telco/config.yml +25 -0
- rasa/cli/project_templates/telco/credentials.yml +33 -0
- rasa/cli/project_templates/telco/csvs/billing.csv +10 -0
- rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
- rasa/cli/project_templates/telco/data/flows/flow_global.yml +5 -0
- rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +8 -0
- rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +7 -0
- rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +73 -0
- rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +45 -0
- rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +7 -0
- rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +6 -0
- rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +7 -0
- rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +9 -0
- rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +1 -0
- rasa/cli/project_templates/telco/docs/restart_router.txt +6 -0
- rasa/cli/project_templates/telco/docs/run_speed_test.txt +6 -0
- rasa/cli/project_templates/telco/domain/domain_global.yml +29 -0
- rasa/cli/project_templates/telco/domain/domain_patterns.yml +17 -0
- rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +20 -0
- rasa/cli/project_templates/telco/domain/domain_reset_router.yml +11 -0
- rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +24 -0
- rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +74 -0
- rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +102 -0
- rasa/cli/project_templates/telco/endpoints.yml +60 -0
- rasa/{dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 → cli/project_templates/telco/prompts/command-generator.jinja2} +3 -7
- rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +62 -0
- rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +130 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +68 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +13 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +47 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +21 -0
- rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +15 -0
- rasa/cli/project_templates/tutorial/config.yml +2 -1
- rasa/cli/run.py +0 -4
- rasa/cli/scaffold.py +46 -2
- rasa/cli/shell.py +0 -3
- rasa/constants.py +0 -6
- rasa/core/actions/action.py +10 -56
- rasa/core/agent.py +0 -16
- rasa/core/available_endpoints.py +0 -30
- rasa/core/channels/channel.py +4 -3
- rasa/core/channels/constants.py +3 -0
- rasa/core/channels/development_inspector.py +4 -4
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/dist/assets/{arc-63212852.js → arc-18042c22.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-eecf6b13.js → blockDiagram-38ab4fdb-fdd6bcfa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-8f798a9a.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-df71a04c.js → classDiagram-70f12bd4-81efba3e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9b275968.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-1c669cad.js → createText-2e5e7dd3-31422447.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b1553799.js → edges-e0da2a9e-518a90db.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-112388d6.js → erDiagram-9861fffd-a6d3c25a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-fdebec47.js → flowDb-956e92f1-e048c2be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-6280ede1.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-e1dc03e5.js → flowchart-elk-definition-4a651766-cb4d8723.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-83f68c51.js → ganttDiagram-c361ad54-346636a2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-22f8666f.js → gitGraphDiagram-72cf32ee-7c508874.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-ca9e6217.js → graph-14702d8a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-c5ceb692.js → index-3862675e-f18b534b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +1335 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-faa9999b.js → infoDiagram-f8f76790-64154b83.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c4dda8d9.js → journeyDiagram-49397b02-833a5f95.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-d4307784.js → layout-5a3b2123.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-0567aaa7.js → line-2272a8c7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-c11b95cf.js → linear-35bcf273.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-0c7d3ca9.js → mindmap-definition-fc14e90a-92dcb0e9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-34b433fa.js → pieDiagram-8a3498a8-94dbc900.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-4cab816e.js → quadrantDiagram-120e2f19-8b7a9c33.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-8c22fa9e.js → requirementDiagram-deff3bca-6f7eab81.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-70ce9e8e.js → sankeyDiagram-04a897e0-f43e581d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-fbcd7fc9.js → sequenceDiagram-704730f1-0bcbefc3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-45f05ea6.js → stateDiagram-587899a1-b8a74083.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-beab1ea6.js → stateDiagram-v2-d93cdb3a-2070218f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-2f29dbd5.js → styles-6aaf32cf-f1d54e34.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-951eac83.js → styles-9a916d00-980de489.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-897fbfdd.js → styles-c10674c1-3c03abde.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d667fac1.js → svgDrawCommon-08f97a94-46ba068f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e3205144.js → timeline-definition-85554ec2-901f5e3d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-4abeb0e2.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/inspector/src/components/DialogueStack.tsx +4 -6
- rasa/core/channels/inspector/src/helpers/formatters.ts +3 -24
- rasa/core/channels/inspector/src/theme/base/styles.ts +1 -19
- rasa/core/channels/inspector/src/types.ts +0 -4
- rasa/core/channels/socketio.py +212 -51
- rasa/core/channels/studio_chat.py +49 -29
- rasa/core/channels/voice_stream/genesys.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +5 -3
- rasa/core/constants.py +0 -4
- rasa/core/policies/enterprise_search_policy.py +6 -11
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/flow_executor.py +45 -456
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/unexpected_intent_policy.py +0 -1
- rasa/core/processor.py +15 -18
- rasa/core/run.py +14 -11
- rasa/core/tracker_stores/tracker_store.py +7 -3
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +16 -16
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +1 -21
- rasa/dialogue_understanding/commands/__init__.py +0 -8
- rasa/dialogue_understanding/commands/cancel_flow_command.py +4 -97
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +0 -11
- rasa/dialogue_understanding/commands/clarify_command.py +0 -10
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +0 -11
- rasa/dialogue_understanding/commands/start_flow_command.py +8 -164
- rasa/dialogue_understanding/commands/utils.py +2 -6
- rasa/dialogue_understanding/generator/command_parser.py +0 -4
- rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +12 -50
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +6 -7
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +6 -7
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +2 -41
- rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -163
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +8 -52
- rasa/dialogue_understanding/processor/command_processor.py +15 -31
- rasa/dialogue_understanding/stack/dialogue_stack.py +2 -123
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +0 -57
- rasa/dialogue_understanding/stack/utils.py +2 -17
- rasa/dialogue_understanding_test/du_test_runner.py +2 -7
- rasa/e2e_test/e2e_test_runner.py +2 -12
- rasa/engine/caching.py +2 -2
- rasa/engine/recipes/default_components.py +18 -10
- rasa/engine/storage/local_model_storage.py +45 -2
- rasa/graph_components/validators/default_recipe_validator.py +134 -134
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/model_api.py +4 -5
- rasa/model_manager/runner_service.py +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/model_manager/warm_rasa_process.py +1 -1
- rasa/nlu/extractors/extractor.py +1 -2
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_manager.py +2 -11
- rasa/server.py +2 -14
- rasa/shared/constants.py +0 -5
- rasa/shared/core/constants.py +1 -12
- rasa/shared/core/domain.py +58 -11
- rasa/shared/core/events.py +0 -327
- rasa/shared/core/flows/flow_step.py +7 -1
- rasa/shared/core/flows/flows_list.py +2 -2
- rasa/shared/core/flows/flows_yaml_schema.json +186 -112
- rasa/shared/core/flows/steps/call.py +5 -53
- rasa/shared/core/flows/validation.py +7 -46
- rasa/shared/core/flows/yaml_flows_io.py +17 -9
- rasa/shared/core/slots.py +6 -2
- rasa/shared/core/trackers.py +2 -5
- rasa/shared/exceptions.py +0 -4
- 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/_base_litellm_client.py +7 -39
- rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +4 -8
- rasa/shared/providers/llm/llm_client.py +3 -7
- rasa/shared/providers/llm/llm_response.py +0 -49
- rasa/shared/providers/llm/self_hosted_llm_client.py +4 -8
- rasa/shared/utils/llm.py +5 -28
- rasa/shared/utils/schemas/events.py +0 -42
- rasa/shared/utils/yaml.py +1 -3
- rasa/studio/upload.py +16 -47
- rasa/telemetry.py +97 -23
- rasa/tracing/instrumentation/instrumentation.py +10 -12
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/utils/common.py +0 -79
- rasa/utils/io.py +27 -9
- rasa/utils/json_utils.py +6 -1
- rasa/utils/log_utils.py +6 -2
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/openapi.py +144 -0
- rasa/utils/tensorflow/rasa_layers.py +1 -1
- rasa/utils/train_utils.py +15 -15
- rasa/validator.py +21 -19
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/METADATA +17 -14
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/RECORD +431 -200
- rasa/agents/agent_factory.py +0 -122
- rasa/agents/agent_manager.py +0 -162
- rasa/agents/constants.py +0 -40
- rasa/agents/core/agent_protocol.py +0 -107
- rasa/agents/core/types.py +0 -70
- rasa/agents/exceptions.py +0 -8
- rasa/agents/protocol/__init__.py +0 -5
- rasa/agents/protocol/a2a/a2a_agent.py +0 -662
- rasa/agents/protocol/mcp/mcp_base_agent.py +0 -676
- rasa/agents/protocol/mcp/mcp_open_agent.py +0 -276
- rasa/agents/protocol/mcp/mcp_task_agent.py +0 -469
- rasa/agents/schemas/__init__.py +0 -12
- rasa/agents/schemas/agent_input.py +0 -38
- rasa/agents/schemas/agent_output.py +0 -26
- rasa/agents/schemas/agent_tool_result.py +0 -51
- rasa/agents/schemas/agent_tool_schema.py +0 -134
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +0 -15
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +0 -17
- rasa/agents/utils.py +0 -72
- rasa/core/available_agents.py +0 -199
- 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/core/policies/flows/mcp_tool_executor.py +0 -277
- rasa/dialogue_understanding/commands/continue_agent_command.py +0 -91
- rasa/dialogue_understanding/commands/restart_agent_command.py +0 -162
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +0 -61
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +0 -81
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +0 -81
- rasa/shared/agents/utils.py +0 -35
- rasa/shared/utils/mcp/server_connection.py +0 -157
- /rasa/{agents → builder}/__init__.py +0 -0
- /rasa/{agents/core → builder/copilot}/__init__.py +0 -0
- /rasa/{agents/protocol/a2a → builder/copilot/prompts}/__init__.py +0 -0
- /rasa/{agents/protocol/mcp → builder/copilot/templated_messages}/__init__.py +0 -0
- /rasa/{agents/templates → builder/document_retrieval}/__init__.py +0 -0
- /rasa/{shared/agents → cli/project_templates/finance/actions/accounts}/__init__.py +0 -0
- /rasa/{shared/utils/mcp → cli/project_templates/finance/actions/cards}/__init__.py +0 -0
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/entry_points.txt +0 -0
|
@@ -5,26 +5,25 @@ import {
|
|
|
5
5
|
useColorModeValue,
|
|
6
6
|
useToast,
|
|
7
7
|
} from '@chakra-ui/react'
|
|
8
|
-
import { useEffect, useState, useCallback } from 'react'
|
|
9
8
|
import axios from 'axios'
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
9
|
+
import queryString from 'query-string'
|
|
10
|
+
import { useCallback, useEffect, useState } from 'react'
|
|
11
|
+
import useWebSocket, { ReadyState } from 'react-use-websocket'
|
|
12
|
+
import { Chat } from './components/Chat'
|
|
13
|
+
import { DiagramFlow } from './components/DiagramFlow'
|
|
13
14
|
import { DialougeInformation } from './components/DialogueInformation'
|
|
15
|
+
import { DialogueStack } from './components/DialogueStack'
|
|
14
16
|
import { LoadingSpinner } from './components/LoadingSpinner'
|
|
15
|
-
import { DiagramFlow } from './components/DiagramFlow'
|
|
16
17
|
import { RecruitmentPanel } from './components/RecruitmentPanel'
|
|
18
|
+
import { Welcome } from './components/Welcome'
|
|
17
19
|
import { formatSlots } from './helpers/formatters'
|
|
18
|
-
import { Slot, Stack, Event, Flow, SelectedStack, Tracker } from './types'
|
|
19
20
|
import {
|
|
20
21
|
createHistoricalStack,
|
|
21
22
|
flowStepTrail,
|
|
22
23
|
updatedActiveFrame,
|
|
23
24
|
} from './helpers/utils'
|
|
24
|
-
import
|
|
25
|
-
import {
|
|
26
|
-
import { LatencyDisplay } from './components/LatencyDisplay'
|
|
27
|
-
import useWebSocket, { ReadyState } from 'react-use-websocket'
|
|
25
|
+
import { useOurTheme } from './theme'
|
|
26
|
+
import { Event, Flow, SelectedStack, Slot, Stack, Tracker } from './types'
|
|
28
27
|
|
|
29
28
|
export function App() {
|
|
30
29
|
const toast = useToast()
|
|
@@ -252,6 +251,7 @@ export function App() {
|
|
|
252
251
|
slots={slots}
|
|
253
252
|
events={events}
|
|
254
253
|
story={story}
|
|
254
|
+
latency={latency}
|
|
255
255
|
/>
|
|
256
256
|
</Grid>
|
|
257
257
|
</GridItem>
|
|
@@ -265,7 +265,6 @@ export function App() {
|
|
|
265
265
|
</GridItem>
|
|
266
266
|
<GridItem overflow="hidden">
|
|
267
267
|
<Grid sx={rightColumnSx}>
|
|
268
|
-
<LatencyDisplay latency={latency} sx={boxSx} />
|
|
269
268
|
{shouldShowTranscript && (
|
|
270
269
|
<GridItem sx={chatContainerSx}>
|
|
271
270
|
<Chat events={events || []} />
|
|
@@ -13,13 +13,14 @@ import {
|
|
|
13
13
|
useTab,
|
|
14
14
|
useToast,
|
|
15
15
|
} from '@chakra-ui/react'
|
|
16
|
+
import { useEffect } from 'react'
|
|
16
17
|
import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
|
|
18
|
+
import { useCopyToClipboard } from 'usehooks-ts'
|
|
19
|
+
import { formatTestCases } from '../helpers/formatters'
|
|
17
20
|
import { useOurTheme } from '../theme'
|
|
18
21
|
import { Event, Slot } from '../types'
|
|
19
|
-
import { formatTestCases } from '../helpers/formatters'
|
|
20
|
-
import { useCopyToClipboard } from 'usehooks-ts'
|
|
21
|
-
import { useEffect } from 'react'
|
|
22
22
|
import { FullscreenButton } from './FullscreenButton'
|
|
23
|
+
import { LatencyDisplay } from './LatencyDisplay'
|
|
23
24
|
import { SlotTable, Slots } from './Slots'
|
|
24
25
|
|
|
25
26
|
interface Props extends FlexProps {
|
|
@@ -27,6 +28,7 @@ interface Props extends FlexProps {
|
|
|
27
28
|
events: Event[]
|
|
28
29
|
story: string
|
|
29
30
|
slots: Slot[]
|
|
31
|
+
latency: any
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
export const DialougeInformation = ({
|
|
@@ -35,6 +37,7 @@ export const DialougeInformation = ({
|
|
|
35
37
|
events,
|
|
36
38
|
story,
|
|
37
39
|
slots,
|
|
40
|
+
latency,
|
|
38
41
|
...props
|
|
39
42
|
}: Props) => {
|
|
40
43
|
const toast = useToast()
|
|
@@ -105,6 +108,7 @@ export const DialougeInformation = ({
|
|
|
105
108
|
<CustomTab>Slots</CustomTab>
|
|
106
109
|
<CustomTab>End-2-end test</CustomTab>
|
|
107
110
|
<CustomTab>Tracker state</CustomTab>
|
|
111
|
+
<CustomTab>Latency</CustomTab>
|
|
108
112
|
</TabList>
|
|
109
113
|
<TabPanels height="100%" overflow="hidden">
|
|
110
114
|
<TabPanel sx={tabPanelSx}>
|
|
@@ -160,6 +164,11 @@ export const DialougeInformation = ({
|
|
|
160
164
|
</FullscreenButton>
|
|
161
165
|
</HStack>
|
|
162
166
|
</TabPanel>
|
|
167
|
+
<TabPanel sx={tabPanelSx}>
|
|
168
|
+
<Box sx={overflowBox}>
|
|
169
|
+
<LatencyDisplay latency={latency} />
|
|
170
|
+
</Box>
|
|
171
|
+
</TabPanel>
|
|
163
172
|
</TabPanels>
|
|
164
173
|
</Tabs>
|
|
165
174
|
</Flex>
|
|
@@ -52,8 +52,6 @@ function StackRow({
|
|
|
52
52
|
},
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
const agentOrStep = stack.agent_id ?? stack.step_id;
|
|
56
|
-
|
|
57
55
|
return (
|
|
58
56
|
<Tr
|
|
59
57
|
sx={
|
|
@@ -67,12 +65,12 @@ function StackRow({
|
|
|
67
65
|
</Tooltip>
|
|
68
66
|
</Td>
|
|
69
67
|
<Td>
|
|
70
|
-
{shouldShowTooltip(
|
|
71
|
-
<Tooltip label={
|
|
72
|
-
<Text noOfLines={1}>{
|
|
68
|
+
{shouldShowTooltip(stack.step_id) ? (
|
|
69
|
+
<Tooltip label={stack.step_id} hasArrow>
|
|
70
|
+
<Text noOfLines={1}>{stack.step_id}</Text>
|
|
73
71
|
</Tooltip>
|
|
74
72
|
) : (
|
|
75
|
-
<Text noOfLines={1}>{
|
|
73
|
+
<Text noOfLines={1}>{stack.step_id}</Text>
|
|
76
74
|
)}
|
|
77
75
|
</Td>
|
|
78
76
|
</Tr>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {rasaColors} from '../theme/base/colors'
|
|
2
|
-
import type {Event, Flow, Slot, Stack} from '../types'
|
|
1
|
+
import { rasaColors } from '../theme/base/colors'
|
|
2
|
+
import type { Event, Flow, Slot, Stack } from '../types'
|
|
3
3
|
|
|
4
4
|
export function formatSlots(slots: { [key: string]: unknown }) {
|
|
5
5
|
if (!slots) {
|
|
@@ -13,7 +13,7 @@ export function formatSlots(slots: { [key: string]: unknown }) {
|
|
|
13
13
|
slotDuple[0] !== 'flow_hashes' &&
|
|
14
14
|
slotDuple[1] != null,
|
|
15
15
|
)
|
|
16
|
-
.map((slotDuple) => ({name: slotDuple[0], value: slotDuple[1]}))
|
|
16
|
+
.map((slotDuple) => ({ name: slotDuple[0], value: slotDuple[1] }))
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export const formatTestCases = (events: Event[], sessionId: string) => {
|
|
@@ -85,14 +85,11 @@ export const formatFlow = (
|
|
|
85
85
|
`flowchart TD
|
|
86
86
|
classDef collect stroke-width:1px
|
|
87
87
|
classDef action fill:#FBFCFD,stroke:#A0B8CF
|
|
88
|
-
classDef noop fill:#FBFCFD
|
|
89
|
-
classDef callstep fill:#FBFCFD
|
|
90
88
|
classDef link fill:#f43
|
|
91
89
|
classDef slot fill:#e8f3db,stroke:#c5e1a5
|
|
92
90
|
classDef endstep fill:#ccc,stroke:#444
|
|
93
91
|
classDef previous stroke:${rasaColors.rasaOrange[400]},stroke-width:1px
|
|
94
92
|
classDef active stroke:${rasaColors.rasaOrange[400]},stroke-width:3px,fill:${rasaColors.warning[50]}
|
|
95
|
-
classDef pulse animation:pulse 2s infinite
|
|
96
93
|
`,
|
|
97
94
|
]
|
|
98
95
|
try {
|
|
@@ -213,24 +210,6 @@ function renderStepSequence(
|
|
|
213
210
|
)}"]:::slot\n`
|
|
214
211
|
}
|
|
215
212
|
|
|
216
|
-
if (step.call) {
|
|
217
|
-
const isAgentWaitingOnInput = !!currentStack?.agent_id && currentStack?.state === 'waiting_for_input'
|
|
218
|
-
mermaidTextFragment += `${mermaidId}["${encodeDoubleQuotes(
|
|
219
|
-
stepId,
|
|
220
|
-
)} 🤖"]:::callstep\n`
|
|
221
|
-
|
|
222
|
-
if (isAgentWaitingOnInput) {
|
|
223
|
-
mermaidTextFragment += `class ${mermaidId} pulse\n`
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (step.noop) {
|
|
228
|
-
mermaidTextFragment += `${mermaidId}["${parseFieldUsingStack(
|
|
229
|
-
stepId,
|
|
230
|
-
currentStack
|
|
231
|
-
)}"]:::noop\n`
|
|
232
|
-
}
|
|
233
|
-
|
|
234
213
|
if (activeStep && stepId === activeStep) {
|
|
235
214
|
mermaidTextFragment += `class ${mermaidId} active\n`
|
|
236
215
|
} else if (stepTrail?.includes(stepId)) {
|
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
import {mode, StyleFunctionProps} from '@chakra-ui/theme-tools'
|
|
2
|
-
import {keyframes} from "@chakra-ui/react";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const pulse = keyframes`
|
|
6
|
-
0% {
|
|
7
|
-
opacity: 1;
|
|
8
|
-
}
|
|
9
|
-
50% {
|
|
10
|
-
opacity: 0.5;
|
|
11
|
-
}
|
|
12
|
-
100% {
|
|
13
|
-
opacity: 1;
|
|
14
|
-
}
|
|
15
|
-
`;
|
|
16
|
-
|
|
1
|
+
import { mode, StyleFunctionProps } from '@chakra-ui/theme-tools'
|
|
17
2
|
|
|
18
3
|
export const styles = {
|
|
19
4
|
global: {
|
|
@@ -24,8 +9,5 @@ export const styles = {
|
|
|
24
9
|
fontSize: theme.rasaFontSizes.md,
|
|
25
10
|
letterSpacing: '0.025rem',
|
|
26
11
|
}),
|
|
27
|
-
'.pulse': {
|
|
28
|
-
animation: `${pulse} 2s infinite`,
|
|
29
|
-
},
|
|
30
12
|
},
|
|
31
13
|
}
|
|
@@ -40,8 +40,6 @@ export interface Stack {
|
|
|
40
40
|
collect?: string
|
|
41
41
|
utter?: string
|
|
42
42
|
ended: boolean
|
|
43
|
-
agent_id?: string
|
|
44
|
-
state?: "waiting_for_input" | "interrupted"
|
|
45
43
|
}
|
|
46
44
|
|
|
47
45
|
export interface LatencyData {
|
|
@@ -97,6 +95,4 @@ interface Step {
|
|
|
97
95
|
reset_after_flow_ends: boolean
|
|
98
96
|
utter: string
|
|
99
97
|
set_slots?: unknown
|
|
100
|
-
call?: string
|
|
101
|
-
noop?: boolean
|
|
102
98
|
}
|
rasa/core/channels/socketio.py
CHANGED
|
@@ -1,34 +1,54 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
1
4
|
import inspect
|
|
2
5
|
import json
|
|
3
|
-
import logging
|
|
4
6
|
import uuid
|
|
7
|
+
from asyncio import Task
|
|
8
|
+
from dataclasses import dataclass
|
|
5
9
|
from typing import Any, Awaitable, Callable, Dict, Iterable, List, Optional, Text
|
|
6
10
|
|
|
11
|
+
import structlog
|
|
7
12
|
from sanic import Blueprint, Sanic, response
|
|
8
13
|
from sanic.request import Request
|
|
9
14
|
from sanic.response import HTTPResponse
|
|
10
15
|
from socketio import AsyncServer
|
|
11
16
|
|
|
12
|
-
import rasa.core.channels.channel
|
|
13
17
|
import rasa.shared.utils.io
|
|
14
|
-
from rasa.core.channels.channel import
|
|
18
|
+
from rasa.core.channels.channel import (
|
|
19
|
+
InputChannel,
|
|
20
|
+
OnNewMessageType,
|
|
21
|
+
OutputChannel,
|
|
22
|
+
UserMessage,
|
|
23
|
+
)
|
|
24
|
+
from rasa.core.channels.constants import USER_CONVERSATION_SILENCE_TIMEOUT
|
|
25
|
+
from rasa.shared.core.constants import SILENCE_TIMEOUT_SLOT
|
|
26
|
+
|
|
27
|
+
logger = structlog.getLogger(__name__)
|
|
28
|
+
|
|
15
29
|
|
|
16
|
-
|
|
30
|
+
@dataclass
|
|
31
|
+
class SilenceTimeout:
|
|
32
|
+
sender_id: str
|
|
33
|
+
timeout: float
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
UserSilenceHandlerType = Callable[[SilenceTimeout], Awaitable[Any]]
|
|
17
37
|
|
|
18
38
|
|
|
19
39
|
class SocketBlueprint(Blueprint):
|
|
20
40
|
"""Blueprint for socketio connections."""
|
|
21
41
|
|
|
22
42
|
def __init__(
|
|
23
|
-
self,
|
|
43
|
+
self, sio_server: AsyncServer, socketio_path: Text, *args: Any, **kwargs: Any
|
|
24
44
|
) -> None:
|
|
25
|
-
"""Creates a :class:`sanic.Blueprint` for routing socketio
|
|
45
|
+
"""Creates a :class:`sanic.Blueprint` for routing socketio connections.
|
|
26
46
|
|
|
27
|
-
:param
|
|
47
|
+
:param sio_server: Instance of :class:`socketio.AsyncServer` class
|
|
28
48
|
:param socketio_path: string indicating the route to accept requests on.
|
|
29
49
|
"""
|
|
30
50
|
super().__init__(*args, **kwargs)
|
|
31
|
-
self.ctx.
|
|
51
|
+
self.ctx.sio_server = sio_server
|
|
32
52
|
self.ctx.socketio_path = socketio_path
|
|
33
53
|
|
|
34
54
|
def register(self, app: Sanic, options: Dict[Text, Any]) -> None:
|
|
@@ -42,7 +62,7 @@ class SocketBlueprint(Blueprint):
|
|
|
42
62
|
path = self.ctx.socketio_path
|
|
43
63
|
else:
|
|
44
64
|
path = options.get("url_prefix", "/socket.io")
|
|
45
|
-
self.ctx.
|
|
65
|
+
self.ctx.sio_server.attach(app, path)
|
|
46
66
|
super().register(app, options)
|
|
47
67
|
|
|
48
68
|
|
|
@@ -51,14 +71,45 @@ class SocketIOOutput(OutputChannel):
|
|
|
51
71
|
def name(cls) -> Text:
|
|
52
72
|
return "socketio"
|
|
53
73
|
|
|
54
|
-
def __init__(
|
|
74
|
+
def __init__(
|
|
75
|
+
self,
|
|
76
|
+
input_channel: SocketIOInput,
|
|
77
|
+
sio_server: AsyncServer,
|
|
78
|
+
bot_message_evt: Text,
|
|
79
|
+
) -> None:
|
|
55
80
|
super().__init__()
|
|
56
|
-
self.
|
|
81
|
+
self._input_channel = input_channel
|
|
82
|
+
self.sio_server = sio_server
|
|
57
83
|
self.bot_message_evt = bot_message_evt
|
|
58
84
|
|
|
59
85
|
async def _send_message(self, socket_id: Text, response: Any) -> None:
|
|
60
86
|
"""Sends a message to the recipient using the bot event."""
|
|
61
|
-
await self.
|
|
87
|
+
await self.sio_server.emit(self.bot_message_evt, response, room=socket_id)
|
|
88
|
+
if self.tracker_state and self._input_channel.enable_silence_timeout:
|
|
89
|
+
silence_timeout = self.tracker_state["slots"][SILENCE_TIMEOUT_SLOT]
|
|
90
|
+
|
|
91
|
+
logger.debug(
|
|
92
|
+
"socketio_channel.silence_timeout_updated",
|
|
93
|
+
sender_id=socket_id,
|
|
94
|
+
silence_timeout=silence_timeout,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
silence_timeout_counts = self.tracker_state["slots"][
|
|
98
|
+
"consecutive_silence_timeouts"
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
logger.debug(
|
|
102
|
+
"socketio_channel.consecutive_silence_timeouts_updated",
|
|
103
|
+
sender_id=socket_id,
|
|
104
|
+
silence_timeout_counts=silence_timeout_counts,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
self._input_channel.reset_silence_timeout(
|
|
108
|
+
SilenceTimeout(
|
|
109
|
+
sender_id=socket_id,
|
|
110
|
+
timeout=silence_timeout,
|
|
111
|
+
),
|
|
112
|
+
)
|
|
62
113
|
|
|
63
114
|
async def send_text_message(
|
|
64
115
|
self, recipient_id: Text, text: Text, **kwargs: Any
|
|
@@ -123,9 +174,11 @@ class SocketIOOutput(OutputChannel):
|
|
|
123
174
|
"""Sends custom json to the output."""
|
|
124
175
|
if "data" in json_message:
|
|
125
176
|
json_message.setdefault("room", recipient_id)
|
|
126
|
-
await self.
|
|
177
|
+
await self.sio_server.emit(self.bot_message_evt, **json_message)
|
|
127
178
|
else:
|
|
128
|
-
await self.
|
|
179
|
+
await self.sio_server.emit(
|
|
180
|
+
self.bot_message_evt, json_message, room=recipient_id
|
|
181
|
+
)
|
|
129
182
|
|
|
130
183
|
async def send_attachment( # type: ignore[override]
|
|
131
184
|
self, recipient_id: Text, attachment: Dict[Text, Any], **kwargs: Any
|
|
@@ -133,26 +186,38 @@ class SocketIOOutput(OutputChannel):
|
|
|
133
186
|
"""Sends an attachment to the user."""
|
|
134
187
|
await self._send_message(recipient_id, {"attachment": attachment})
|
|
135
188
|
|
|
189
|
+
async def hangup(self, recipient_id: Text, **kwargs: Any) -> None:
|
|
190
|
+
"""Hangs up the call for the given sender."""
|
|
191
|
+
# This method is not applicable for socket.io, but we implement it
|
|
192
|
+
# to satisfy the OutputChannel interface.
|
|
193
|
+
logger.debug(
|
|
194
|
+
"socketio_channel.output.hangup",
|
|
195
|
+
message=f"Hanging up call for user {recipient_id}.",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
self._input_channel.disconnect(recipient_id)
|
|
199
|
+
|
|
136
200
|
|
|
137
201
|
class SocketIOInput(InputChannel):
|
|
138
202
|
"""A socket.io input channel."""
|
|
139
203
|
|
|
140
204
|
@classmethod
|
|
141
|
-
def name(cls) ->
|
|
205
|
+
def name(cls) -> str:
|
|
142
206
|
return "socketio"
|
|
143
207
|
|
|
144
208
|
@classmethod
|
|
145
209
|
def from_credentials(cls, credentials: Optional[Dict[Text, Any]]) -> InputChannel:
|
|
146
210
|
credentials = credentials or {}
|
|
147
211
|
return cls(
|
|
148
|
-
credentials.get("user_message_evt", "user_uttered"),
|
|
149
|
-
credentials.get("bot_message_evt", "bot_uttered"),
|
|
150
|
-
credentials.get("namespace"),
|
|
151
|
-
credentials.get("session_persistence", False),
|
|
152
|
-
credentials.get("socketio_path", "/socket.io"),
|
|
153
|
-
credentials.get("jwt_key"),
|
|
154
|
-
credentials.get("jwt_method", "HS256"),
|
|
155
|
-
credentials.get("metadata_key", "metadata"),
|
|
212
|
+
user_message_evt=credentials.get("user_message_evt", "user_uttered"),
|
|
213
|
+
bot_message_evt=credentials.get("bot_message_evt", "bot_uttered"),
|
|
214
|
+
namespace=credentials.get("namespace"),
|
|
215
|
+
session_persistence=credentials.get("session_persistence", False),
|
|
216
|
+
socketio_path=credentials.get("socketio_path", "/socket.io"),
|
|
217
|
+
jwt_key=credentials.get("jwt_key"),
|
|
218
|
+
jwt_method=credentials.get("jwt_method", "HS256"),
|
|
219
|
+
metadata_key=credentials.get("metadata_key", "metadata"),
|
|
220
|
+
enable_silence_timeout=credentials.get("enable_silence_timeout", False),
|
|
156
221
|
)
|
|
157
222
|
|
|
158
223
|
def __init__(
|
|
@@ -165,6 +230,7 @@ class SocketIOInput(InputChannel):
|
|
|
165
230
|
jwt_key: Optional[Text] = None,
|
|
166
231
|
jwt_method: Optional[Text] = "HS256",
|
|
167
232
|
metadata_key: Optional[Text] = "metadata",
|
|
233
|
+
enable_silence_timeout: bool = False,
|
|
168
234
|
):
|
|
169
235
|
"""Creates a ``SocketIOInput`` object."""
|
|
170
236
|
self.bot_message_evt = bot_message_evt
|
|
@@ -172,15 +238,18 @@ class SocketIOInput(InputChannel):
|
|
|
172
238
|
self.user_message_evt = user_message_evt
|
|
173
239
|
self.namespace = namespace
|
|
174
240
|
self.socketio_path = socketio_path
|
|
175
|
-
self.
|
|
241
|
+
self.sio_server: Optional[AsyncServer] = None
|
|
176
242
|
self.metadata_key = metadata_key
|
|
243
|
+
self.enable_silence_timeout = enable_silence_timeout
|
|
177
244
|
|
|
178
245
|
self.jwt_key = jwt_key
|
|
179
246
|
self.jwt_algorithm = jwt_method
|
|
247
|
+
self.on_new_message: Optional[OnNewMessageType] = None
|
|
248
|
+
self.sender_silence_map: Dict[str, Task] = {}
|
|
180
249
|
|
|
181
|
-
def get_output_channel(self) -> Optional[
|
|
250
|
+
def get_output_channel(self) -> Optional[OutputChannel]:
|
|
182
251
|
"""Creates socket.io output channel object."""
|
|
183
|
-
if self.
|
|
252
|
+
if self.sio_server is None:
|
|
184
253
|
rasa.shared.utils.io.raise_warning(
|
|
185
254
|
"SocketIO output channel cannot be recreated. "
|
|
186
255
|
"This is expected behavior when using multiple Sanic "
|
|
@@ -189,7 +258,7 @@ class SocketIOInput(InputChannel):
|
|
|
189
258
|
"scenarios."
|
|
190
259
|
)
|
|
191
260
|
return None
|
|
192
|
-
return SocketIOOutput(self.
|
|
261
|
+
return SocketIOOutput(self, self.sio_server, self.bot_message_evt)
|
|
193
262
|
|
|
194
263
|
async def handle_session_request(
|
|
195
264
|
self, sid: Text, data: Optional[Dict] = None
|
|
@@ -200,23 +269,26 @@ class SocketIOInput(InputChannel):
|
|
|
200
269
|
if "session_id" not in data or data["session_id"] is None:
|
|
201
270
|
data["session_id"] = uuid.uuid4().hex
|
|
202
271
|
if self.session_persistence:
|
|
203
|
-
if inspect.iscoroutinefunction(self.
|
|
204
|
-
await self.
|
|
272
|
+
if inspect.iscoroutinefunction(self.sio_server.enter_room): # type: ignore[union-attr]
|
|
273
|
+
await self.sio_server.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
|
|
205
274
|
else:
|
|
206
275
|
# for backwards compatibility with python-socketio < 5.10.
|
|
207
276
|
# previously, this function was NOT async.
|
|
208
|
-
self.
|
|
209
|
-
await self.
|
|
210
|
-
logger.debug(
|
|
277
|
+
self.sio_server.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
|
|
278
|
+
await self.sio_server.emit("session_confirm", data["session_id"], room=sid) # type: ignore[union-attr]
|
|
279
|
+
logger.debug(
|
|
280
|
+
"socketio_channel.input.handle_session_request",
|
|
281
|
+
message=f"User {sid} connected to socketIO endpoint.",
|
|
282
|
+
)
|
|
211
283
|
|
|
212
284
|
async def handle_user_message(
|
|
213
285
|
self,
|
|
214
286
|
sid: Text,
|
|
215
287
|
data: Dict,
|
|
216
|
-
on_new_message:
|
|
288
|
+
on_new_message: OnNewMessageType,
|
|
217
289
|
) -> None:
|
|
218
290
|
"""Handles user messages received from the client."""
|
|
219
|
-
output_channel =
|
|
291
|
+
output_channel = self.get_output_channel()
|
|
220
292
|
|
|
221
293
|
if self.session_persistence:
|
|
222
294
|
if not data.get("session_id"):
|
|
@@ -232,38 +304,44 @@ class SocketIOInput(InputChannel):
|
|
|
232
304
|
else:
|
|
233
305
|
sender_id = sid
|
|
234
306
|
|
|
307
|
+
# We cancel silence timeout when a new message is received
|
|
308
|
+
# to prevent sending a silence timeout message
|
|
309
|
+
# if the user sends a message after the silence timeout
|
|
310
|
+
self._cancel_silence_timeout(sender_id)
|
|
311
|
+
|
|
235
312
|
metadata = data.get(self.metadata_key, {})
|
|
236
313
|
if isinstance(metadata, Text):
|
|
237
314
|
metadata = json.loads(metadata)
|
|
238
315
|
|
|
239
316
|
message = UserMessage(
|
|
240
|
-
data.get("message", ""),
|
|
241
|
-
output_channel,
|
|
242
|
-
sender_id,
|
|
317
|
+
text=data.get("message", ""),
|
|
318
|
+
output_channel=output_channel,
|
|
319
|
+
sender_id=sender_id,
|
|
243
320
|
input_channel=self.name(),
|
|
244
321
|
metadata=metadata,
|
|
245
322
|
)
|
|
246
323
|
await on_new_message(message)
|
|
247
324
|
|
|
248
|
-
def blueprint(
|
|
249
|
-
self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
|
|
250
|
-
) -> SocketBlueprint:
|
|
325
|
+
def blueprint(self, on_new_message: OnNewMessageType) -> SocketBlueprint:
|
|
251
326
|
"""Defines a Sanic blueprint."""
|
|
252
327
|
# Workaround so that socketio works with requests from other origins.
|
|
253
328
|
# https://github.com/miguelgrinberg/python-socketio/issues/205#issuecomment-493769183
|
|
254
|
-
|
|
329
|
+
sio_server = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
|
|
255
330
|
socketio_webhook = SocketBlueprint(
|
|
256
|
-
|
|
331
|
+
sio_server, self.socketio_path, "socketio_webhook", __name__
|
|
257
332
|
)
|
|
258
333
|
|
|
259
|
-
# make
|
|
260
|
-
self.
|
|
334
|
+
# make sio_server object static to use in get_output_channel
|
|
335
|
+
self.sio_server = sio_server
|
|
336
|
+
# We need to store the on_new_message callback
|
|
337
|
+
# so that we can call it when a silence timeout occurs
|
|
338
|
+
self.on_new_message = on_new_message
|
|
261
339
|
|
|
262
340
|
@socketio_webhook.route("/", methods=["GET"])
|
|
263
341
|
async def health(_: Request) -> HTTPResponse:
|
|
264
342
|
return response.json({"status": "ok"})
|
|
265
343
|
|
|
266
|
-
@
|
|
344
|
+
@sio_server.on("connect", namespace=self.namespace)
|
|
267
345
|
async def connect(sid: Text, environ: Dict, auth: Optional[Dict]) -> bool:
|
|
268
346
|
if self.jwt_key:
|
|
269
347
|
jwt_payload = None
|
|
@@ -273,24 +351,107 @@ class SocketIOInput(InputChannel):
|
|
|
273
351
|
)
|
|
274
352
|
|
|
275
353
|
if jwt_payload:
|
|
276
|
-
logger.debug(
|
|
354
|
+
logger.debug(
|
|
355
|
+
"socketio_channel.input.connect.jwt",
|
|
356
|
+
message=f"User {sid} connected to socketIO endpoint.",
|
|
357
|
+
)
|
|
358
|
+
# Store the chat state for this user
|
|
277
359
|
return True
|
|
278
360
|
else:
|
|
279
361
|
return False
|
|
280
362
|
else:
|
|
281
|
-
logger.debug(
|
|
363
|
+
logger.debug(
|
|
364
|
+
"socketio_channel.input.connect",
|
|
365
|
+
message=f"User {sid} connected to socketIO endpoint.",
|
|
366
|
+
)
|
|
367
|
+
# Store the chat state for this user
|
|
282
368
|
return True
|
|
283
369
|
|
|
284
|
-
@
|
|
370
|
+
@sio_server.on("disconnect", namespace=self.namespace)
|
|
285
371
|
async def disconnect(sid: Text) -> None:
|
|
286
|
-
logger.debug(
|
|
372
|
+
logger.debug(
|
|
373
|
+
"socketio_channel.input.disconnect",
|
|
374
|
+
message=f"User {sid} disconnected from socketIO endpoint.",
|
|
375
|
+
)
|
|
287
376
|
|
|
288
|
-
@
|
|
377
|
+
@sio_server.on("session_request", namespace=self.namespace)
|
|
289
378
|
async def session_request(sid: Text, data: Optional[Dict]) -> None:
|
|
379
|
+
logger.debug(
|
|
380
|
+
"socketio_channel.input.session_request",
|
|
381
|
+
message=f"User {sid} requested a session.",
|
|
382
|
+
)
|
|
290
383
|
await self.handle_session_request(sid, data)
|
|
291
384
|
|
|
292
|
-
@
|
|
385
|
+
@sio_server.on(self.user_message_evt, namespace=self.namespace)
|
|
293
386
|
async def handle_message(sid: Text, data: Dict) -> None:
|
|
387
|
+
logger.debug(
|
|
388
|
+
"socketio_channel.input.handle_message",
|
|
389
|
+
message=f"User {sid} sent a message.",
|
|
390
|
+
data=data,
|
|
391
|
+
)
|
|
294
392
|
await self.handle_user_message(sid, data, on_new_message)
|
|
295
393
|
|
|
296
394
|
return socketio_webhook
|
|
395
|
+
|
|
396
|
+
def reset_silence_timeout(self, silence_timeout: SilenceTimeout) -> None:
|
|
397
|
+
self._cancel_silence_timeout(silence_timeout.sender_id)
|
|
398
|
+
|
|
399
|
+
self.sender_silence_map[silence_timeout.sender_id] = (
|
|
400
|
+
asyncio.get_event_loop().create_task(
|
|
401
|
+
self._monitor_silence_timeout(
|
|
402
|
+
silence_timeout,
|
|
403
|
+
)
|
|
404
|
+
)
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
def disconnect(self, sender_id: str) -> None:
|
|
408
|
+
"""Disconnects the user with the given sender ID."""
|
|
409
|
+
self._cancel_silence_timeout(sender_id)
|
|
410
|
+
if self.sio_server:
|
|
411
|
+
asyncio.get_event_loop().create_task(self.sio_server.disconnect(sender_id))
|
|
412
|
+
logger.debug(
|
|
413
|
+
"socketio_channel.input.disconnect",
|
|
414
|
+
message=f"User {sender_id} disconnected from socketIO endpoint.",
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
async def _monitor_silence_timeout(self, silence_timeout: SilenceTimeout) -> None:
|
|
418
|
+
logger.debug(
|
|
419
|
+
"socketio_channel.input.silence_timeout_watch_started",
|
|
420
|
+
sender_id=silence_timeout.sender_id,
|
|
421
|
+
timeout=silence_timeout.timeout,
|
|
422
|
+
)
|
|
423
|
+
await asyncio.sleep(silence_timeout.timeout)
|
|
424
|
+
|
|
425
|
+
# once the timer is up, we call the handler
|
|
426
|
+
# to notify the user about the silence timeout
|
|
427
|
+
# this is important if monitoring trask is cancelled while handler is executed
|
|
428
|
+
asyncio.get_event_loop().create_task(
|
|
429
|
+
self._handle_silence_timeout(silence_timeout)
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
logger.debug(
|
|
433
|
+
"socketio_channel.input.silence_timeout_tripped",
|
|
434
|
+
sender_id=silence_timeout.sender_id,
|
|
435
|
+
silence_timeout=silence_timeout.timeout,
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
async def _handle_silence_timeout(self, event: SilenceTimeout) -> None:
|
|
439
|
+
if self.on_new_message:
|
|
440
|
+
output_channel = self.get_output_channel()
|
|
441
|
+
message = UserMessage(
|
|
442
|
+
text=USER_CONVERSATION_SILENCE_TIMEOUT,
|
|
443
|
+
output_channel=output_channel,
|
|
444
|
+
sender_id=event.sender_id,
|
|
445
|
+
input_channel=self.name(),
|
|
446
|
+
)
|
|
447
|
+
await self.on_new_message(message)
|
|
448
|
+
|
|
449
|
+
def _cancel_silence_timeout(self, sender_id: str) -> None:
|
|
450
|
+
"""Cancels the silence timeout task for the given sender."""
|
|
451
|
+
task = self.sender_silence_map.pop(sender_id, None)
|
|
452
|
+
if task and not task.done():
|
|
453
|
+
logger.debug(
|
|
454
|
+
"socketio_channel.input.silence_timeout_cancelled",
|
|
455
|
+
sender_id=sender_id,
|
|
456
|
+
)
|
|
457
|
+
task.cancel()
|